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: jan
Subject: Re: [avr-gcc-list] Simple but wrong code
Date: Tue, 14 Jan 2014 18:02:26 +0100

Do debounce in software instead.

On Tue, 14 Jan 2014 17:54:19 +0100
dfx <address@hidden> 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.
> 
> 



reply via email to

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