This is an old revision of the document!
Externe Interrupts sind eine der einfachsten Funktionen der Peripheriegeräte, Normalerweise haben AVR's 1 bis 8 spezielle Pins, welche benutzt werden um Interrupts im Programm auszulösen, wenn ihr logischer WErt sich ändert, oder sie ein bestimmten Status haben. Da diese Funktion normalerweisse benutzt wird um externe logische Signale zu überwachen, werden diese Pins auch externe Interrupt-Pins genannt.
Um einen externen Interrupt zu nutzen, muss der Pins als standard IO Input (er kann auch als Output genutzt werden, jedoch kann dann der Interrupt nur vom Controller selbst ausgelöst werden) konfiguriert werden. Es ist notwendig das Emfpangen von Interrupts zu erlauben und man muss die Bedingungen im Externen Interrupt Konfigurationsregister spezifizieren, welche den Interrupt auslösen. Es gibt vier mögliche Bedingungen:
Wenn der Modus auf logische Null gesetzt wurde, wird der Interrupt durchgehend ausgelöst, solange der Pin den Wert Null hat. Während dieser Periode wird das Ausführen des Hauptprogramms gestoppt.
Prinzipiell gibt es zwei Typen von Interrupts: Synchronisierte mit dem Taktgeber des Controllers und asynchrone Interrupts. Synchrone Interrupts funktionieren indem sie den Wert des Inputs behaltens, daher können logische Änderungen gefunden werden in dem die Werte zwischen zwei Taktzyklen verglichen werden. Wenn die logischen Änderungen im Signal schneller passieren als der Tastgrad des Controllers, kann der Interrupt garnicht auslösen oder eine Fehlauslösung unterliegen. Asynchrone Interrupts brauchen den Taktgeber des Controllers nicht und können so schnellere Änderungen im externen Signal erfassen - das logische Level muss jedoch immer noch für mind. 50 ns konstant sein. Der ATmega128 hat 4 synchrone und 4 asynchrone externe Interrupts.
Example
Aufgabe: Der ATmega128 Pin nummer 9 (pin 7 Bus E) soll einen Interrupt auslösen wenn sein Wert sich ändert. Der Pin bezieht sich auf den INT7 externen Interrupt, welcher synchron ist.
#include <avr/interrupt.h> // Der Code des externen Interrupts ISR(INT7_vect) { // macht irgendetwas } int main() { // Andere Pin 7 an Bus E zum Input, indem man bit 7 auf Null setzt. DDRE &= ~(1 << PIN7); // Definiert den Pull-Up Widerstand zu Pin 7 Bus E // um Input Floating zu verhindern. PORTE |= (1 << PIN7); // Stetzt den Interrupt Modus auf logische Änderung für den Interrupt 7 // im externen Interrupt Konfigurationsregister. EICRB = (1 << ISC70); // erlaubt Externen Interrupt 7 EIMSK |= (1 << INT7); // erlaubt global Interrupts sei(); // Endlosschleife while (1) continue; }
Zusätzlich zu einem Interrupt der von einem einzelnen Pin ausgelöst wird, ist es möglich, falls der AVR genug Pins hat, eine ganze Gruppe an Pins zu nutzen, um Interrupts durch logische Wertänderungen auszulösen. Diese Interrupts werden einfach “Pin change Interrupts” genannt. Sie lösen aus, sobald mindestens der Wert von einem Pin in der Gruppe sich ändert.