ATmega1284P int0 interrupción sw0

1

Quiero cambiar el LED3 del microcontrolador cuando se presiona el botón SW0. Desarrollé este código pero no funciona y no sé qué está mal. Busco en la documentación y en muchos foros tratando de encontrar el error, pero todavía no sé qué está mal. Creo que el problema está en la confguración de la interrupción, pero no estoy seguro de esto. ¿Puede alguien ayudarme? Gracias.

int main(){
    EIMSK = 1<<INT0;                    // Enable INT0
    EIFR = (1 << INT0);
    MCUCR |= 1<<ISC01 | 1<<ISC00;   // Trigger INT0 on rising edge
    DDRB = 0x04;//Set port B LED3 as output the other pins as input
    PORTB = 0x04; //Pin3 that is output/led turn off, input pull up

    DDRD &= ~(1<<PIND2); // Set PD2 as output (Used for interrupt INT0)
    PORTD = 1<<PIND2; // Enable PD2 pull-up resistor

    sei();  //Set global interrupt flag, to allow SW0 interrupts

    while(1) {}; //Infinite loop to wait for the interrupt
    return 0; 
}

ISR(INT0_vect) {
    PORTB ^= 1 << 3; //toggle LED3
}
    
pregunta Ana Lasheras

3 respuestas

1

main() configura el bit 2, pero el ISR frobs bit 3. Sea consistente .

DDRB |= _BV(PB3);
PORTB |= _BV(PB3);
 ...
PORTB ^= _BV(PB3); // or PINB |= _BV(PB3);
    
respondido por el Ignacio Vazquez-Abrams
1

Sugiero definir tus pines como:

#define LED3      PB3

#define SW0       PD2

y en el resto de tu código, úsalos siempre que manejes algo relacionado con esos pines.

DDRB |= (1<<LED3);        
PORTB |= (1<<LED3); 
ISR(INT0_vect) {
    PORTB ^= (1<<LED3);
}
    
respondido por el Bence Kaulics
1

Encontré la solución, el problema era que no es posible usar una interrupción externa ahora cuando se presiona el botón SW0 en atmega1284P. Es necesario utilizar la interrupción de cambio de pin PCINT1_vect.

    
respondido por el Ana Lasheras

Lea otras preguntas en las etiquetas