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
<<attachment: dfx.vcf>>
_______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list