Logo

Interrupts auf der AVR® Mikrocontroller-Familie

Bild Interrupt

Prinzip eines Interrupts:
Der Programmablauf wird unterbrochen

Was ist ein Interrupt?

Die meisten Mikrocontroller bieten die Möglichkeit, auf externe oder interne Ereignisse unmittelbar (asynchron) zu reagieren. Bei einem Interrupt wird das laufende Hauptprogramm unterbrochen. Ein Unterprogramm (Interrupt Service Routine) wird ausgeführt. Danach wird das Hauptprogramm dort fortgesetzt, wo es unterbrochen wurde.

Mit Hilfe von Interrupts erlangt der Mikrocontroller also eine gewisse Multitasking-Fähigkeit.

IRQs und ISRs

Das Ereignis, das die Unterbrechung des Hauptprogramms auslöst wird Unterbrechungsanforderung genannt. Gängig ist aber der englische Begriff Interrupt Request (IRQ).

Nach einem IRQ wird ein Unterprogramm, die Interrupt Service Routine (ISR) abgearbeitet.

Interruptprogrammierung in C

Die Programmierung von ISRs in C wird in einem gesonderten Kapitel beschrieben.

Arten von IRQs

IRQs können durch externe Ereignisse, z.B. einem Tastendruck, oder interne Ereignisse, z.B. einem Timer Overflow, ausgelöst werden.

Interruptsteuerung

Ein Mikrocontroller muss wissen, ob und wie er auf einen IRQ reagieren soll. Dazu ist eine Interruptsteuerung notwendig, die je nach Mikrocontroller mehr oder weniger aufwändig ist.

Beim AVR ist die Interruptsteuerung (wie bei den meisten Mikrocontrollern) zweistufig.

Globale Interruptsteuerung

Der AVR besitzt im Statusregister (SREG) das Global Interrupt Enable Bit I.
Ist das I Bit gesetzt können Interrupts verarbeitet werden. Ist es gelöscht wird die Interruptverarbeitung blockiert.

Lokale Interruptsteuerung

Die unterschiedlichen IRQs werden durch Sonderregister gesteuert. Je nach Interrupt Quelle müssen ein oder mehrere Bits in Sonderregistern, entsprechend der gewünschten Funktion, beschrieben werden.

Externe Interrupts

Externe Interrupts werden an dafür vorgesehenen Interrupt-Pins detektiert. Wie viele und welche Pins dafür geeignet sind hängt vom Mikrocontroller Typ ab.

INT0 und INT1 am ATmega328p

Beim ATmega328p bieten die externen Interrupts INT0 an PD2 und INT1 an PD3 unterschiedliche Möglichkeiten, wann ein Logiksignal an diesen Pins einen Interrupt auslösen soll.

Die Funktionalität dieser Pins wird durch das External Interrupt Control Register A (EICRA) festgelegt.

Das External Interrupt Mask Register (EIMSK) legt fest, ob von diesen Pins ein IRQ ausgelöst werden kann.

Um externe Interrupts an PD2 oder PD3 verarbeiten zu können, müssen folgende Voraussetzungen erfüllt sein:

  • EICRA beschreiben
  • EIMSK beschreiben
  • Global Interrupt Enable Bit setzen (SEI)

Timer Interrupts

Die Timer des AVR stellen mehrere Möglichkeiten zur Verfügung, einen IRQ auszulösen. Solche Timer Interrupts eignen sich beispielsweise, um Uhren unabhängig vom Hauptprogramm zu realisieren oder um Delay-Schleifen zu ersetzen.

Timer Interrupts am ATmega328p

Der ATmega328p besitzt drei Timer, die auf unterschiedliche Weise einen IRQ auslösen können.

Dies kann bei einem Timer Overflow oder bei einem Compare Match geschehen.

Die Interruptsteuerung für Timer Interrupts wird durch das Beschreiben der Timer/Counter Interrupt Mask Register (TIMSKn) festgelegt. Jeder der drei Timer hat ein eigenes TIMSK Register.

Um die Interruptverarbeitung für Timer Interrupts zu aktivieren müssen also folgende folgende Voraussetzungen erfüllt sein (siehe auch Timer):

  • TCCRnB beschreiben
  • ggf. OCRnA beschreiben
  • ggf. OCRnB beschreiben
  • TIMSKn beschreiben
  • Global Interrupt Enable Bit setzen (SEI)