Do debounce in software instead. On Tue, 14 Jan 2014 17:54:19 +0100 dfx <d...@dfx.it> 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. > > _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list