Interrupts: Auslösung
Voraussetzungen für die Auslösung von Interrupts:
Globale Freischaltung von Interrupts: Das Interrupt-Flag im Status-Register muss gesetzt werden, in C mit der Anweisung sei();. Löschen dieses Flags: cli();
Der jeweilige Interrupt muss freigeschaltet sein, indem das zugehörige Flag im Register gesetzt wird (Interrupt Enable Flag).
Beispiel aus der vorhergehenden Seite: Freischaltung des Timer1-Overflow-Interrupts: TIMSK |= (1<<TOIE1);Das Interrupt auslösende Ereignis muss eintreten. Im obigen Beispiel ist dies das Erreichen des Overflows im Timer1-Modul.
Lokale und globale Interruptsteuerung
Wie alle Funktionen können auch Interrupts modular angesteuert werden.
Einzeln werden die Interrupts durch die lokale Interruptsteuerung geschaltet. Dabei werden die entsprechenden Maskenbits gesetzt oder gelöscht.
Wenn alle Interrupts
z.B. wegen zeitkritischer Abläufe ausgesetzt werden sollen, empfiehlt es sich,
die globale Interruptsteuerung zu
verwenden. Dabei werden alle
Interrupts durch ein Statusbit geschaltet. Das Statusbit wird durch die Funktion sei(); gesetzt und durch
cli(); gelöscht. Fallen Interrupt-auslösende Ereignisse an, während das
Statusbit = 0 die Interrupts inaktiv gesetzt hat, so werden diese nach
erneuter Aktivierung durch das Statusbit ausgeführt. Wenn allerdings mehrere
Interrupt-auslösende Ereignisse desselben Typs in der inaktiven Zeit auftreten, werden Interrupts verloren
gehen. Das Gleiche passiert auch, wenn die Sperrzeit zu groß ist.