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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.