Re: Simple but wrong code
David Kelly <[email protected]>
| Newsgroups | gmane.comp.hardware.avr.gcc |
|---|---|
| Message-ID | <[email protected]> |
On Jan 14, 2014, at 10:54 AM, dfx <[email protected]> wrote: > Please consider this code: [...] > ISR(PCINT3_vect) { // FUNCTION KEY > uint8_t i; > > i = PORTD; > if ((i & FUNC_SEL_KEY) > 0) { // Test a key > LED_PORT |= (1 << PORTB0); > _delay_ms(100); > LED_PORT &= ~(1 << PORTB0); > _delay_ms(300); > } > reti(); > } Why do you reti()? Use of ISR() should handle that for you. Plus your premature reti() prevents stack cleanup. Disassembly of an example I threw together: / // Used to wake from sleep // ISR(INT0_vect) // switch moved into "SET" position { 5fa: 1f 92 push r1 5fc: 0f 92 push r0 5fe: 0f b6 in r0, 0x3f ; 63 600: 0f 92 push r0 602: 11 24 eor r1, r1 EIMSK = 0; // disable once used 604: 1d ba out 0x1d, r1 ; 29 reti(); 606: 18 95 reti } 608: 0f 90 pop r0 60a: 0f be out 0x3f, r0 ; 63 60c: 0f 90 pop r0 60e: 1f 90 pop r1 610: 18 95 reti -- David Kelly N4HHE, [email protected] ============================================================ Whom computers would destroy, they must first drive mad.