Re: Simple but wrong code

<[email protected]>
Newsgroups gmane.comp.hardware.avr.gcc
Message-ID <20140114180226.0841fcc3@igor>
Do debounce in software instead.

On Tue, 14 Jan 2014 17:54:19 +0100
dfx <[email protected]> wrote:

> 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.
> 
>
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.