Voraussetzungen für die Auslösung von Interrupts:
  1. Globale Freischaltung von Interrupts: Das Interrupt-Flag im Status-Register muss gesetzt werden, in C mit der Anweisung sei();. Löschen dieses Flags: cli();

  2. 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);

  3. 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.

Zuletzt geändert: Freitag, 21. Januar 2022, 11:25