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;
}
Impressum

Valid HTML 4.01 Transitional