diyundso.de
Externe Interrupts am AVR
Ein externer Interrupt kann durch das vorliegen einer bestimmten Bedingung an einem Interrupt-Pin erfolgen. Auslöser können ein LOW-Level, eine steigende Flanke oder auch eine fallende Flanke sein.
Externer Interrupt INTx
Zunächst muss eine Bedingung für den Interrupt gewählt werden:
//Interrupt bei LOW an INTx
MCUCR &= ~((1<<ISCx1)|(1<<ISCx0));
//Interrupt bei fallender Flanke an INTx
MCUCR &= ~(1<<ISCx0); MCUCR |= (1<<ISCx1);
//Interrupt bei steigender Flanke an INTx
MCUCR |= ((1<<ISCx1)|(1<<ISCx0));
INT2
Bei AVRs die über einen INT2 verfügen muss die Bedingung für INT2 im Register MCUCSR gewählt werden.
Dabei gibt es nur steigende und fallende Flanke:
MCUCSR |= (1<<ISC2); //INT2 bei steigender Flanke
MCUCSR &= ~(1<<ISC2); //INT2 bei fallender Flanke
je nach AVR muss der Interrupt im GIMSK oder GICR-Register aktiviert werden:
GIMSK |= (1<<INTx); //Interrupt an INTx aktivieren
GICR |= (1<<INTx); //Interrupt an INTx aktivieren
Beispiel Interrupt an INT0 bei LOW
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(INT0_vect){//Interrupt-Code
cli(); //weitere Interrupts deaktivieren
//CODE AUSFÜHREN
sei(); //Interrupts wieder aktivieren
}
int main (void){
DDRD &= ~(1<<2); //PD2 als Eingang
PORTD|= (1<<2); //Pullup aktivieren
MCUCR &= ~((1<<ISC01)|(1<<ISC00)); //Interrupt bei LOW an INT0
GICR |= (1<<INT0); //Interrupt an INT0 aktivieren
sei(); //Interrupts global aktivieren
while(1){};
return 0;
}