Worum geht's?

Die Verwendung von Interrupts ist ein gängiges Konzept um zeitkritische Aufgaben zu bearbeiten. Sie ist nicht speziell für die Programmierung von Microcontrollern.

In einem "gewöhnlichen" PC ist es die Aufgabe des Betriebssystem sich mit der Bearbeitung von Interrupts zu beschäftigen. Die Vorgänge sind hier zwar im wesentlichen die gleichen, als Programmierer kommt man mit ihnen aus dem genannten Grund in der Regel aber nicht in Kontakt.

Anders liegen die Dinge bei der Programmierung eines Microcontrollers. Hier gibt es kein Betriebssystem, das diese Aufgabe abnimmt. Man muss sich bei der Programmierung also selbst darum kümmern.

Da es sich beim Arbeiten mit Interrupts um ein ungewohntes Tätigkeitsfeld handeln kann, ist ihnen hier ein eigenes Kapitel gewidmet.

Interrupts

Mit Interrupts ist es möglich auf Ereignisse zu reagieren, die nicht durch den Programmablauf hervorgerufen werden. Dabei kann es sich z.B. um den Ablauf eines Timers, eine Zustandsänderung eines Pins, etc. handeln.

Die besonderen Ereignisse sind durch die Hardware des Microcontrollers vorgegeben. Jedem Ereignis ist eine eindeutige Zahl zugeordnet.

Für jedes besondere Ereignis kann eine Routine eingerichtet werden, die beim Eintreffen des Ereignisses aufgerufen wird. Eine solche Routine wird auch als Interrupt Service Routine oder kurz ISR bezeichnet.

AVR Micorcontroller

Alle Interrupts haben enable bits.

Interrupt Vektoren liegen direkt nach RESET am Beginn des Programmspeichers.

Je geringer die Adresse, desto höher die Priorität.

Die Header Datei <avr/interrupts.h> der AVR Libc enthält Funktionen und Makros um mit Interrupts zu arbeiten.

Vorsicht! Das Statusregister SREG wird beim Betreten von Interrupt Routinen nicht automatisch von der Hardware gesichert und am Ende wieder hergestellt. Das muss in Software gemacht werden. Diese Aufgabe übernimmt der Compiler. Mit dem Makro ISR_NAKED

In der Regel findet immer zuerst eine Rückkehr ins Hauptprogramm statt, bevor auf andere Interrupts geprüft wird. Mit dem Makro ISR_NOBLOCK kann dafür gesorgt werden, dass nach dem Betreten der ISR die Zustellung von Interrupts so schnell wie möglich wieder aktiviert wird. Auf diese Weise können geschachtelt ablaufende Interrupts realisiert werden. Achtung!: Stacküberlauf, etc ...

Typen

Es gibt 2 Typen von Interrupts.

  • Interrupts, die durch Flags gesteuert werden
  • Interrupts, die durch Zustände gesteuert werden

Bei Interrupts, die durch Flags gesteuert werden, wird das zugehörige Flag beim Ausführen der Service Routine gelöscht. Flags können auch durch Schreiben von 1 in das zugehörige Bit gelöscht werden.

Wenn eine Interrupt-Bedingung eintrifft während der Interrupt nicht aktiviert ist, wird das zugehörige Flag gesetzt. Das Interrupt Request wird in diesem Fall ausgelöst, sobald der Interrupt wieder aktiviert wird.

Für Interrupts, die durch Zustände gesteuert werden, muss es nicht notwendiger Weise auch ein Flag geben. Wenn der Interrupt beim Eintreten der Bedingung deaktiviert ist, wird er nicht behalten.

atomare Zugriffe

Bei der Programmierung von Interrupt Service Routinen müssen einige Dinge beachtet werden.


Übersicht

Für einen AtMega28p gibt es die folgenden Interrupts

QuelleAVR Libc MakroInterrupt EnableInterrupt Flag
1RESET-
2INT0INT0_vectEIFR.INTF0
3INT1INT1_vectEIFR.INTF1
4PCINT0PCINT0_vectPCMSK0.PCINT7...PCINT0PCIFR.PCIF0
5PCINT1PCINT1_vectPCMSK1.PCINT14...PCINT8PCIFR.PCIF1
6PCINT2PCINT2_vectPCMSK0.PCINT23...PCINT16PCIFR.PCIF2
7WDTWDT_vect
8TIMER2 COMPATIMER2_COMPA_vectTIMSK2.OCIEATIFR2.OCFA
9TIMER2 COMPBTIMER2_COMPB_vectTIMSK2.OCIEBTIFR2.OCFB
10TIMER2 OVFTIMER2_OVF_vectTIMSK2.TOIETIFR2.TOV
11TIMER1 CAPTTIMER1_CAPT_vectTIMSK1.ICIETIFR1.ICF
12TIMER1 COMPATIMER1_COMPA_vectTIMSK1.OCIEATIFR1.OCFA
13TIMER1 COMPBTIMER1_COMPB_vectTIMSK1.OCIEBTIFR1.OCFB
14TIMER1 OVFTIMER1_OVF_vectTIMSK1.TOIETIFR.TOV
15TIMER0 COMPATIMER0_COMPA_vectTIMSK0.OCIEATIFR0.OCFA
16TIMER0 COMPBTIMER0_COMPB_vectTIMSK0.OCIEBTIFR0.OCFB
17TIMER0 OVFTIMER0_OVF_vectTIMSK0.TOIETIFR0.TOV
18SPI, STCSPI_STC_vect
19USART, RXUSART_RX_vectUCSR0B.RXCIE0UCSR0A.RXC0
20USART, UDREUSART_UDRE_vectUCSR0B.UDRIE0UCSR0A.UDRE0
21USART, TXUSART_TX_vectUCSR0B.TXCIE0UCSR0A.TXC0
22ADCADC_vect
23EE READYEE_READY_vect
24ANALOG COMPANALOG_COMP_vect
25TWITWI_vectTWCR.TWIETWCR.TWINT
26SPM READYSPM_READY_vect

Fußnoten


    This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.