Externe Interrupts mit dem AVR leicht gemacht
TJ posted in Atmel, C on April 16th, 2009
Die Unterschiede zwischen Polling und Interrupt sind in einem älteren Beitrag schon aufgelistet. Theorie findet man jedoch sehr oft. Hier findet ihr ein einfaches Beispiel wie man einen Taster per Interrupt eine Aktion ausüben lässt. Das Beispiel ist für einen AT90CAN128 mit folgender Hardwarekonfiguration:
- - Taster an PORT E, PIN 7
- - LED an PORT E, PIN 6
Beim Initialisieren aktiviert man die Interrupts und konfiguriert wann dieser ausgelöst werden soll:
// Init Taster EIMSK |= _BV(INT7); // Interrupt fuer Pin 7 aktivieren // Init LED sei(); //activate global interrups
DDRE &= ~_BV(7); // PORT E, PIN 7 als Eingang definieren
EICRB |= _BV(ISC50); // steigende Flanke erzeugt einen INT
EICRB |= _BV(ISC51);
DDRE |= _BV(6); // PORT E, PIN 6 als Ausgang definieren
In der ISR für Signal 7 kann dann eine Aktion erfolgen oder ein selbst erstelltes Flag (in einer Variablen) gesetzt werden.
// ISR Taster // entprellen
SIGNAL(SIG_INTERRUPT7)
{
// LED an
PORTE |= _BV(6);
delay_ms(100);
}
Die beiden Dateien stehen hier zur Verfügung.
Tags: AT90CAN128, Atmel, avr, Interrupt
Leave a Response