avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] Simple but wrong code


From: Todd Batzler
Subject: Re: [avr-gcc-list] Simple but wrong code
Date: Tue, 14 Jan 2014 11:02:01 -0600

You're in that isr a long time.  The isr bit that got set that resulted in the 
vector to your isr probably gets cleared upon entry to the isr, but could get 
set again due to switch bounce.  Try clearing the ISR pending flag for that ISR 
before returning.

Todd G. Batzler
Sr Staff Engineer
Technology Development

Miller Electric Mfg. Co.  An ITW Company
1635 West Spencer St.
P.O. Box 1079
Appleton, WI  54912-1079
920-735-4230 Office
920-735-4488 Fax
address@hidden
www.millerwelds.com
Please consider the environment before printing this email.

-----Original Message-----
From: address@hidden [mailto:address@hidden On Behalf Of dfx
Sent: Tuesday, January 14, 2014 10:54 AM
To: address@hidden
Subject: [avr-gcc-list] Simple but wrong code

Please consider this code:

#define KEY_PORT PORTD
#define KEY_DDR DDRD
#define KEY_FUNC_SEL PIND4 // --> first key (Port D pin 4) ....
#define LED_PORT PORTB // Test led, to see action on keypress ....

#define FUNC_SEL_KEY 0x10 // First function --> first key (Port D pin 4) ....

int main() {
   init();

   while (1) {
     // waits indefinitely for keypress
   }
   return (EXIT_SUCCESS); // Never reached }

void init() {
   cli();
   LED_DDR |= (1 << DDB0); // Led out Port B pin 0

   KEY_PORT |= (1 << PORTD4) ; // pull-up resistor
   PCICR |= (1 << PCIE3); // Enable interrupts on PORTD (PCINT31:24)

   PCMSK0 = 0X00; // Disable unnecessary
   PCMSK1 = 0X00;
   PCMSK2 = 0X00;
   PCMSK3 |= (1 << PCINT28); // Enable  key
   sei();
}

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();
}


ISR(BADISR_vect) {
   LED_PORT |= (1 << PORTB0);
   _delay_ms(200);
   LED_PORT &= ~(1 << PORTB0);
   _delay_ms(200);
   LED_PORT |= (1 << PORTB0);
   _delay_ms(200);
   LED_PORT &= ~(1 << PORTB0);
   _delay_ms(200);
   LED_PORT |= (1 << PORTB0);
   _delay_ms(200);
   LED_PORT &= ~(1 << PORTB0);
   _delay_ms(200);
   reti();
}

the button has a capacitor 1uF for debouncing (together with the pull-up from 
10 kohm)

The result is the following:

when I press the button,  are generated two flashes (instead of one),
  and when I release the button  are generated two more flashes.

Similarly, If I comment out the routine (ISR PCINT3_vect),
  the error routine (ISR BADISR_vect) generates double of the expected flashes.

Can anyone help me to understand the problem?

Thank you very much.


--
Domenico



---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! 
Antivirus.
http://www.avast.com

This message (including any attachments) is intended for the sole use of the 
intended recipient/s and may contain material that is CONFIDENTIAL AND PRIVATE 
COMPANY INFORMATION. If you are not the intended recipient of this message, you 
are hereby notified that you must delete the message without disseminating, 
copying or taking any action in reliance upon it. If you have received this 
message in error, please notify the sender via return e-mail. Thank you.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]