Erlnov95__enthält weitere informationen
Interrupts
1 Allgemein 2
1.1 Polling 2
1.2 Interrupts 2
1.3 Abarbeiten einer Unterbrechung 2
1.3.1 Abfragetechnik 3
1.
3.2 Daisy-chain Technik 3
1.3.3 Interruptvektoren 3
1.3.4 Interruptcontroller 3
1.
4 Interruptantwort eines 8085 Prozessor 4
1.5 Interruptantwort eines 8086 Prozessors 5
2 Interruptquellen der 8051 Familie 5
2.1 Externe Interrupts INT0, INT1 6
2.2 Timer 0 bzw. Timer 1 Overflow 6
2.3 Serielles Port SIO0 7
3 Interrupt Verarbeitung 8
3.
1 Interrupt Response Time 8
3.2 Interruptablaufdiagramm 10
4 Interruptanwendungen 11
4.1 Einzelschrittbetrieb 11
4.2 Simulieren eines dritten Prioritätslevels 11
5 Interrupt Arbeitsblatt 12
6 Erläuterungen zur Interrupt Logik 13
Allgemein
Prinzipiell gibt es zwei Möglichkeiten um ein Peripheriegerät zu bedienen. Entweder durch Polling, d.h.
ständiges Abfragen der Geräte, oder durch einen Interrupt, bei dem sich das Gerät selbst meldet, wenn es bedient werden muß.
POLLING
Die Abfragetechnik oder Polling hat zwei Einschränkungen:
Prozessorzeit wird verschwendet beim unnötigen Durchtesten des Status aller peripheren Einheiten in jedem Durchlauf.
Sie ist vom Prinzip her langsam, da der Status aller E/A-Einheiten getestet werden muß, bevor man zur Abarbeitung einer bestimmten Anfrage kommt. Das kann in einem Echtzeitsystem, in dem man eine Peripherieeinheit, in einem festgelegtem Zeitabschnitt bearbeitet werden muß, echte Schwierigkeiten bereiten. Insbesondere, wenn schnelle Peripherieeinheiten an das System angeschlossen sind, kann die Abfragetechnik einfach nicht schnell genug sein, um noch eine rechtzeitige Bearbeitung der Anfrage zu gewährleisten.
Die Abfragetechnik ist ein synchroner Mechanismus, bei dem die einzelnen Einheiten nacheinander bearbeitet werden.
INTERRUPTS
Programmunterbrechungen, kurz Unterbrechungen (Interrupts), sind ein asynchroner Mechanismus. Jede E/A-Einheit oder ihr Steuerbaustein ist an eine Unterbrechungsleitung angeschlossen. Diese Leitung überträgt eine Unterbrechungsanforderung (interrupt request) an den Mikroprozessor. Jedesmal, wenn eine der E/A-Einheiten bedient werden muß, erzeugt sie einen Impuls oder einen bestimmten Pegel auf dieser Leitung, um den Mikroprozessor auf sich aufmerksam zu machen.
Ein Mikroprozessor testet am Ende jedes Befehlszyklus, ob eine Unterbrechungsanfrage vorliegt. Ist dies der Fall, wird die Unterbrechung durchgeführt.
Ist keine Anfrage vorhanden, wird der nächste Befehl übernommen. Dies ist in untenstehendem Flußdiagramm dargestellt.
Werden kritische Prozesse bearbeitet, muß sichergestellt sein, daß die Programmabarbeitung nicht durch eine Unterbrechung gestört wird. Jedesmal, wenn das Maskierungsbit eingeschaltet ist, werden die Unterbrechungsanforderungen nicht beachtet. Die „Maskierungsfähigkeit“ wird oft als „Aktivierung“ (enable) bezeichnet. Eine Unterbrechung ist aktiviert, d.
h. ermöglicht, wenn sie nicht maskiert ist.
ABARBEITEN EINER UNTERBRECHUNG
Wenn die Unterbrechungsanforderung empfangen und entgegengenommen ist, muß die zugehörige Einheit bedient werden. Um dies zu tun, arbeitet der Mikroprozessor eine spezielle Bedienungsroutine (Interrupt Service Routine) ab. Dabei ergeben sich zwei Probleme:
Zum einen muß der Status des gerade abzuarbeitenden Programms zum Zeitpunkt, in dem die Unterbrechungsanforderung entgegengenommen wurde, gerettet werden. Das beinhaltet, daß alle Registerinhalte im Mikroprozessor abgesichert werden müssen.
Diese Register werden auf dem Stapel (stack) abgespeichert. Zumindest muß der Programmzähler auf den Stapel gebracht werden, da an seine Stelle die Anfangsadresse der Unterbrechungsroutine gesetzt werden muß. Das Retten der restlichen Register kann mittels Hardware geschehen oder liegt in der Hand der Interrupt Service Routine. Wenn der Programmzähler (und eventuell die anderen Register) auf den Stapel gebracht ist, springt der Mikroprozessor zu der Unterbrechungsroutine. An dieser Stelle ergibt sich das zweite Problem:
Eine ganze Reihe von E/A-Einheiten kann an dieselbe Unterbrechungsleitung angeschlossen sein. Wohin soll der Mikroprozessor springen, um die richtige Einheit zu bedienen? Das Problem liegt darin, die Einheit, die die Unterbrechung anforderte, ausfindig zu machen.
Diese Ermittlung kann durch Hardware, durch Software oder eine Kombination von beidem geschehen.
ABFRAGETECHNIK
Ist die vom Hardwarestandpunkt einfachste Routine. Hier ist eine Softwareroutine nötig, um die Einheit herauszufinden, die die Unterbrechung anforderte. Hierbei wird die Abfragetechnik benutzt. Die Identifizierungsroutine fragt jede an das System angeschlossene Einheit ab. Eine Möglichkeit wäre, daß jede Einheit einen Porteingang am mC hat, daß bedeutet aber das bei vielen Interrupts viele Eingänge belegt sind.
Durch die Reihenfolge der Abfrage ergibt sich eine bestimmte Priorität. In solchen Systemen wird der Vorrang einer Einheit durch Software festgestellt (software-priority scheme), falls mehrere Einheiten zugleich eine Unterbrechung angefordert haben. Ein Nachteil dieser Methode ist natürlich die lange Reaktionszeit auf einen Interrupt.
DAISY-CHAIN TECHNIK
Eine zweite softwareorientierte Methode arbeitet mit Hardwareunterstützung und ist deutlich schneller. Hier wird, wie unten dargestellt, ein Bestätigungssignal (ACK) für die Unterbrechung durch die verschiedenen Einheiten durchgeschleift, die sogenannte daisy-chain (Gänse-blümchenkette). Alle Einheiten hängen auf einer Interruptleitung.
Wenn eine Einheit einen Interrupt anfordert, so öffnet sie den Schalter und sendet auf der Interruptleitung die Interrupt-anforderung. Der Prozessor muß bei Eintreffen der Interruptanforderung zumindest den Programmzähler am Stapel absichern. Danach erzeugt der Mikroprozessor ein besonderes Bestätigungssignal (acknowledge auch INTA, d.h. Interrupt Acknowledge) genannt), daß er die Unterbrechung entgegengenommen hat. Dieses Bestätigungssignal erreicht nun die Einheit, die den Interrupt angefordert hat.
Diese Einheit setzt nun eine Erkennungsnummer auf den Datenbus, von dem sie der Mikroprozessor einliest. Anhand dieser Erkennungsnummer weiß der mP, welche Interrupt Service Routine er ausführen muß. Wenn mehrere Einheiten einen Interrupt angefordert haben, dann ergibt sich durch die Verbindung vom Acknowledge Signal für jede Einheit eine bestimmte Priorität.
Diese Technik kommt z.B. bei der 8080/8085 Familie zur Anwendung.
Da es sich bei der 8051 Familie um Mikrocontroller handelt sind die meisten früheren externen Interruptquellen (Timer od. serielle Schnittstelle) bereits integriert und werden über Interruptvektoren behandelt.
INTERRUPTVEKTOREN
Die schnellste Methode arbeitet mit Unterbrechungszeigern und wird daher als vectored interrupt bezeichnet. Hier hat die E/A-Einheit die Aufgabe, sowohl die Unterbrechungsanforderung zu erzeugen und die Sprungadresse zu der Bedienungsroutine zur Verfügung zu stellen. Wenn die entsprechende Steuerung nur eine Identifikationsnummer zur Verfügung stellt, ist es eine einfache Sache der Software, in einer Tabelle die zugehörige Sprungadresse zu finden. Das ist vom Hardwarestandpunkt aus einfacher, aber ergibt nicht die größtmögliche Leistung.
Die größte Leistung erhält man folgendermaßen: Wenn der Mikroprozessor die Unterbrechungsanforderung erhält, muß er den Programmzähler auf dem Stapel absichern und dann ein Acknowledge Signal aussenden. Danach muß die EA-Einheit die Interrupt Vektor Adresse auf den Adressbus legen, von wo sie der mP einliest und in den Programmzähler schreibt. Dadurch kann der mP unmittelbar zu der Speicherzelle springen und mit der Bedienung der Einheit anfangen.
INTERRUPTCONTROLLER
Ein Interruptcontroller ist ein Baustein, der aus einem Interrupteingang am mP mehrere Interrupteingänge macht. Er hat für jede E/A-Einheit einen eigenen Interrupteingang. Deshalb weiß der Interruptcontroller sofort, welche Einheit die Unterbrechung angefordert hat und kann dann eine Interrupt Vektor Adresse auf den Datenbus legen.
Der Vorteil gegenüber der Daisy-Chain Technik ist, daß hier nur der Interruptcontroller „intelligent“ sein muß. Bei der Daisy-Chain Technik muß jede Peripherieeinheit eine Logik eingebaut haben, die es ermöglicht die Interrupt Vektor Adresse auf den Datenbus zu legen.
INTERRUPTANTWORT EINES 8085 PROZESSOR
Nachdem der Interrupt erkannt wird, startet der Mikroprozessor einen speziellen Befehlszyklus, den Interrupt Acknowledge Machine Cycle (INA). Das spezielle an diesem Befehlszyklus ist, daß anstelle von /RD /INTA ausgesendet wird. Am Adreßbus wird trotzdem der Inhalt des Programmzählers gelegt, dies bewirkt jedoch nichts. Wenn /INTA ausgesendet wird, muß die externe Logik den Opcode des auszuführenden Befehls auf den Datenbus legen.
Wenn der Opcode das erste Byte eines Mehrbyte-Befehls ist, dann werden zusätzliche /INTA Impulse erzeugt. Ein logischer Befehl wäre z.B. ein Call Befehl, da der Prozessor bei diesem Befehl den Programmzähler am Stapel absichert, bevor er zur angegebenen Adresse springt. Dieser Call-Befehl könnte vom 8259A, einem programmierbarem Interruptcontroller (im 85er mode programmiert) angelegt werden.
Signale
M2 (MR)
M1 (INA)
M2 (INA)
M3 (INA)
M4 (MW)
M5 (MW)
M1 (OF)
T2
T3
T1
T2
T3
T4
T5
T6
T1
T2
T3
T1
T2
T3
T1
T2
T3
T1
T2
T3
T1
T2
CLK
INTR
/INTA
(1,1,1)
(0,0,1)
(0,1,1)
(0,0,1)
(1,1,1)
(1,1,1)
(0,1,0)
IO /M, S1,S0
OUT
OUT
OUT
OUT
OUT
OUT
OUT
OUT
IN
IN
IN
IN
PCH(B3)
(SP-1)H
(SP-2)H
PCH
PCH
PCH
(PC-1)H
A8-A15
D0-D7 (PCL)
D0-D7 (PCH)
D0-D7 (B3)
B2
(SP-2)L
(SP-1)L
PCL
D0-D7 (B2)
PCL
D0-D7 (Call)
PCL
D0-D7
AD0-AD7
ALE
/RD
/WR
Timing Diagramm bei Verwendung eines 8085 Prozessors und eines 8259A InterruptcontrollersNachdem der Prozessor den Opcode erhalten hat, beschließt er in unserem Fall, daß der Call-Befehl 2 weitere Bytes benötigt.
Deshalb sind die nächsten Befehlszyklen 2 weitere INA-Zyklen, um das zweite und dritte Byte des Befehls zu lesen. Da nun der gesamte Befehl eingelesen ist, wird dieser ausgeführt. Als Befehl kann jeder beliebige Befehl außer enable oder disable Interrupt verwendet werden. Die logischsten Befehle wäre ein RESTART oder CALL Befehl, da hier der Programmzähler automatisch abgesichert wird. Innerhalb der 3 INA Zyklen wurde ein erhöhen des Programmzählers verhindert, d.h.
der korrekte Wert kann während M4 und M5 abgesichert werden.
Während M4 und M5 führt die CPU Memory Write machine cycles aus, um das höher- und niederwertigere Byte des Programmzählers abzusichern. Danach werden die zwei Bytes, die in M2 und M3 eingelesen wurden in den Programmzähler geschrieben. Das hat den gleichen Effekt, wie ein Sprung zu dieser Adresse.
INTERRUPTANTWORT EINES 8086 PROZESSORS
Bei Verwendung eines 8086 Prozessors wird bei einem Interrupt im Prozessor intern ein Call-Befehl ausgelöst. Der Interrupt-Controller legt beim zweiten /INTA Impuls eine 8bit Vektor Adresse auf den Datenbus, die mit der positiven Flanke übernommen wird und den Sprung zur Interrupt Service Routine bewirkt.
Signale
INTR
/INTA
Datenbus
Timing Diagramm bei Verwendung eines 8086 Prozessors und eines 8259A Interruptcontrollers
Interruptquellen der 8051 Familie
Der 80552 besitzt 15 verschiedene Interruptquellen. Die Interrupts können einer Prioritätsebene zugeordnet werden (0 oder 1). Innerhalb einer Prioritätsebene gelten bei gleichzeitig auftretenden Interrupts folgende Prioritäten:
Interruptquelle
Name
Vector Address
Priorität innerhalb Prioritätsebene
Externer Interrupt 0
X0
0003h
SIO1 (I²C)
S1
002Bh
ADC completion
ADC
0053h
Timer 0 overflow
T0
000Bh
Timer 2 capture 0
CT0
0033h
Timer 2 compare 0
CM0
005Bh
Externer Interrupt 1
X1
0013h
Timer 2 capture 1
CT1
003Bh
Timer 2 compare 1
CM1
0063h
Timer 1 overflow
T1
001Bh
Timer 2 capture 2
CT2
0043h
Timer 2 compare 2
CM2
006Bh
SIO0 (UART)
S0
0023h
Timer 2 capture 3
CT3
004Bh
Timer T2 overflow
T2
0073h
grau unterlegt: auch beim 8051 vorhanden; Vektor Adressen identisch
EXTERNE INTERRUPTS INT0, INT1
TCON
8F
8E
8D
8C
8B
8A
89
88
88h
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Timer Control Register TCON
IEN0
AF
AE
AD
AC
AB
AA
A9
A8
A8h
EA
EAD
ES1
ES0
ET1
EX1
ET0
EX0
Interrupt Enable Register IEN0
IP0
BF
BE
BD
BC
BB
BA
B9
B8
B8h
-
PAD
PS1
PS0
PT1
PX1
PT0
PX0
Interrupt Priority Register IP0
Externer Interr
upt 0
Die externen Interrupts /INT0 und /INT1 werden über EX0 und EX1 enabled bzw. disabled.
Mit IT0 und IT1 kann zwischen pegelaktiv und flankenaktiv ausgewählt werden. Wenn ITx 1 ist, dann reagiert der mP auf eine negative Flanke; wenn ITx 0 ist, dann reagiert der mP auf einen Low-Pegel.
IE0 und IE1 sind die Interrupt Request Flags, die gesetzt werden, wenn ein Interrupt aufgetreten ist.
Da die externen Interrupts nach jedem Maschinenzyklus abgefragt werden, sollte ein High- oder Low-Signal mindestens 12 Oszillator Perioden gehalten werden, um sicherzustellen, daß das Signal richtig erkannt wird.
Flankenaktiv:
Damit der Interrupt erkannt wird, muß die externe Spannungsquelle den Interrupt Request Pin für mindestens einen Zyklus auf 1 und für mindestens einen Zyklus auf 0 halten, damit der Übergang von 1 auf 0 erkannt wird. IEx wird automatisch gelöscht, wenn die ISR aufgerufen wird.
Pegelaktiv:
Hier muß der Interrupt Request Pin mindestens einen Maschinenzyklus auf 0 gehalten werden, damit er erkannt wird. Wenn der Interrupt aus irgendeinem Grund erst später behandelt werden kann (siehe 3.
1 Interrupt Response Time), dann kann es passieren, daß der Interrupt verloren geht. Die externe Logik bzw. die Interrupt Service Routine müssen dafür sorgen, daß die Interruptanforderung zumindest bis zum Sprung in die Interrupt Service Routine und höchstens bis zum beenden der ISR aktiv bleibt.
Die Bits PX0 und PX1 legen die Priorität des Interrupts fest (0-low priority; 1-high priority).
TIMER 0 BZW. TIMER 1 OVERFLOW
TCON
8F
8E
8D
8C
8B
8A
89
88
88h
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Timer Control Register TCON
IEN0
AF
AE
AD
AC
AB
AA
A9
A8
A8h
EA
EAD
ES1
ES0
ET1
EX1
ET0
EX0
Interrupt Enable Register IEN0
IP0
BF
BE
BD
BC
BB
BA
B9
B8
B8h
-
PAD
PS1
PS0
PT1
PX1
PT0
PX0
Interrupt Priority Register IP0
Timer 1 Overflow Interrupt
TF0 und TF1 werden bei einem Überlauf von Timer 0 bzw.
Timer 1 gesetzt (außer bei Timer 0 Mode 3), sie werden bei Aufruf der Interrupt Service Routine wieder rückgesetzt. Die Priorität der Interrupts wird über PT0 und PT1 gesetzt. Über ET0 und ET1 können die Interrupts enabled bzw. disabled werden.
SERIELLES PORT SIO0
S0CON
9F
9E
9D
9C
9B
9A
99
98
98h
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
Serial Port Control Register S0CON
IEN0
AF
AE
AD
AC
AB
AA
A9
A8
A8h
EA
EAD
ES1
ES0
ET1
EX1
ET0
EX0
Interrupt Enable Register IEN0
IP0
BF
BE
BD
BC
BB
BA
B9
B8
B8h
-
PAD
PS1
PS0
PT1
PX1
PT0
PX0
Interrupt Priority Register IP0
SIO 0 Interrupt
Der Interrupt wird durch eine ODER-Verknüpfung von RI (Receive Interrupt) und TI (Transmit Interrupt) ausgelöst, d.h.
der Prozessor „weiß“ beim Sprung in die Interrupt Service Routine nicht, durch was der Interrupt ausgelöst wurde. In der ISR müssen RI und TI überprüft und rückgesetzt werden, da sonst bei beenden der ISR ein neuer Interrupt ausgelöst werden würde.
Interrupt Verarbeitung
INTERRUPT RESPONSE TIME
Zum Zeitpunkt S5P2 in jedem Maschinenzyklus werden die Interrupts abgefragt und in ein Latch gespeichert. Nachdem der Interrupt anerkannt wurde, ist der nächste Befehl ein Call-Befehl zur Interrupt Service Routine. Dieser Call Befehl benötigt selbst 2 Maschinenzyklen. Das heißt, bis der erste Befehl der Interrupt Service Routine ausgeführt wird vergehen mindestens 3 Maschinenzyklen.
Kürzeste Reaktionszeit auf einen Interrupt, wenn C2 der letzte Befehlszyklus eines Befehls außer RETI oder eines Zugriffes auf IE oder IP ist [7p39]Die Interrupts werden in jedem Maschinenzyklus während S5P2 gelatched, die gelatchten Zustände werden aber erst im darauffolgenden Maschinenzyklus abgefragt. Dann erst kann der Prozessor entsprechend den im vorigen Zyklus gelatchten Zuständen reagieren.
Anm.: Da in jedem Zyklus gelatched und die alten Werte vom vorigen Zyklus gepolled werden, müssen die Werte doppelt gespeichert werden, oder vor S5P2 gepolled werden.
Wiederholung: Taktperiode (T-State, Phase) / Schritt (State, besteht aus 2 Taktperioden P1, P2) /
Maschinenzyklus (cycle, besteht aus 6 States) / Befehlszyklus (instruction cycle, besteht aus 1 bis 4 cycles)
Þ 12 MHz Takt – 1 Maschinenzyklus = 1 ms
Eine längere Reaktionszeit kann aus mehreren Gründen vorkommen:
Wenn ein Interrupt gleicher oder höherer Priorität gerade in Arbeit ist, dann hängt die Reaktionszeit von der Interrupt Service Routine des anderen Interrupts ab.
Wenn der gerade ausgeführte Befehl im Augenblick des Pollings nicht den letzten Maschinenzyklus ausführt, dann kann die zusätzliche Verzögerung maximal 3 Zyklen sein, da die längsten Befehle (MUL und DIV) 4 Zyklen lang sind.
Bei einem Zugriff auf IE oder IP oder beim Befehl RETI wird, bevor die Interrupt Service Routine gestartet wird noch ein zusätzlicher Befehl ausgeführt, da möglicherweise gerade der Interrupt gesperrt worden ist und deshalb die Interrupts neu gepollt werden müssen. Dadurch ergibt sich eine zusätzliche Wartezeit von maximal 5 Maschinenzyklen (bei MUL oder DIV Befehl).
Aus diesen Gründen beträgt die Interrupt Response Time immer mehr als 3, aber immer weniger als 9 Maschinenzyklen (falls gerade kein anderer Interrupt abgearbeitet wird).
Die Zuordnung zu einer Priorität wird in jedem Maschinenzyklus wiederholt, und die verglichenen Werte sind diejenigen, die während S5P2 des vorangegangenen Maschinenzyklus vorhanden waren. Ist ein Interrupt-Kennzeichnungsbit gesetzt, das aber wegen einer der obigen Sperrbedingungen nicht bedient werden kann, und ist es bei Aufhebung der Sperrbedingungen nicht mehr gesetzt, so wird der zurückgewiesene Interrupt nicht mehr ausgeführt. Mit anderen Worten: Das System erinnert sich nicht daran, daß das Kennzeichnungsbit gesetzt war, aber nicht bedient wurde.
Jeder Zyklus, in dem eine Prioritätenzuordnung erfolgt, muß in diesem Sinn für sich betrachtet werden.
Genaue Zusammenfassung der Interruptreaktionszeit:
3 Perioden + letzter Zyklus eines Befehls + 2 Zyklen CALL-Befehl =
Min. Zeit. 3 Perioden + 3 Zyklen ≙ 3.25 ms
3 Perioden + ( bis 3 + 1 Zyklen) + 2 Zyklen Polling nicht während letzem Maschinenzyklus eines Befehls
3 Perioden + 4-6 Zyklen ≙ 4.25-6.
25 ms
Spezialfall: 3 Perioden + 2 Zyklen RETI + 4 Zyklen (MUL/DIV) + 2 Zyklen CALL =
3 Perioden + 8 Zyklen ≙ 8.25 ms
Eine beliebige Zeit kann noch hinzukommen, wenn gerade ein Interrupt gleicher oder höherer Priorität abgearbeitet wird, da dieser nicht unterbrochen werden kann. Dies läßt sich durch den Einbau eines zusätzlichen Prioritätslevel verhindern (siehe 4.2 Simulieren eines dritten Prioritätslevels)
Anm.: Die hier berechnete Reaktionszeit geht immer von dem Zeitpunkt aus, in dem der Interrupt eingelatched wird.
INTERRUPTABLAUFDIAGRAMM
zeitbezogen
programm (adreß) bezogen
ì
ì
ë
ë
ì
ë
INT-1
INT-2
ISR2RETI
ISR1RETI
INT-3
ISR3RETI
SP
-
SP
SP
SP
SP
SP
«
«
«
RA-1 low
RA-1 low
RA-1 low
RA-3 low
«
RA-1 high
RA-1 high
«
RA-1 high
«
RA-3 high
RA-2 low
«
RA-2 high
HP.
..Hauptprogramm
Interruptannahme:
1 Setzen des IIP-FF ( Interrupt In Progress )
2 Retten der Rücksprungadresse auf Stack [ PUSH (PC)]
3 Sprung entsprechend aktuellem Interruptvektor
(Sprung zur Interrupt Service Routine ISR )
Rückkehr von der ISR:
( Ausgelöst d. RETI am Ende der ISR )
1 IIP-FF rücksetzen
2 Rücksprungadresse vom Stack holen [ POP (PC) ]
3 und Programm das vom INT unterbrochen wurde fortsetzen
A) Tritt während Interrupt in Progress ein Interrupt der selben Prioritätsebe auf, so kann dieser ( selbst wenn er innerhalb dieser Prioritätsebene eine höhere Priorität besitzt ) den laufenden Interrupt nicht unterbrechen. Erst nachdem der laufende Interrupt fertig abgearbeitet ist, reagiert das System auf den Interrupt. Dabei muß ein Befehl des Programmes, das durch den vorigen Interrupt unterbrochen wurde ausgeführt werden.
In obigem Ablaufdiagramm tritt dieser Fall bei der Reaktion auf INT-3 (TIMER1OFL) auf. Man erkennt, daß die Reaktionszeit auf einen Interrupt relativ groß sein kann. Vor allem ist sie nicht vorhersagbar, da man nicht weiß, wieviele Interrupts höherer Priorität schon warten. Schnelle vorhersagbare Reaktion ist nur mit dem Interrupt höchster Priorität möglich.
Interruptanwendungen
EINZELSCHRITTBETRIEB
Die Interrupt-Struktur des 8051 gestattet Einzelschrittbetrieb mit sehr geringem zusätzlichem Software-Aufwand. Wie bereits oben dargelegt, wird eine Interrupt-Anforderung solange nicht bedient, wie ein Interrupt gleicher oder höherer Priorität läuft, oder bis nach einem Befehl RETI wenigstens ein weiterer Befehl ausgeführt worden ist.
Somit kann, sobald eine Interrupt Service Routine begonnen hat, sie nicht erneut einsetzen, bevor nicht wenigstens ein Befehl des unterbrochenen Programms ausgeführt wurde. Eine Möglichkeit, diese Tatsache für den Einzelschrittbetrieb zu nutzen besteht darin, einen der externen Interrupt-Anschlüsse (z.B. /INT) so zu programmieren, daß er pegelaktiviert ist. Die Interrupt-Routine wird dann mit folgender Codierung abgeschlossen:
JNB P3.2,$ ;Warte hier, bis INT0 high ist
JB P3.
2,$ ;Warte jetzt hier, bis INT0 low ist
RETI ;Springe zurück und führe einen Befehl aus
Wird jetzt der Anschluß /INT0 (gleich dem Anschluß P3.2) normalerweise auf LOW gehalten, so startet die Zentraleinheit die durch den externen Interrupt 0 ausgelöste Routine und bleibt so lange in dieser, bis INT0 gepulst wird (von LOW nach HIGH und von dort nach LOW). Dann führt die Zentraleinheit den Befehl RETI aus, geht ins Hauptprogramm zurück, führt dort einen einzigen Befehl aus und beginnt sofort erneut mit der Routine des externen Interrupts 0, um auf den nächsten Puls von P3.2 zu warten. Bei jedem Puls an P3.2 führt die Zentraleinheit einen Schritt des Hauptprogramms aus.
SIMULIEREN EINES DRITTEN PRIORITÄTSLEVELS5
Manche Anwendungen benötigen mehr als 2 Prioritätslevel. In solchen Fällen kann eine relativ einfache Routine geschrieben werden um einen dritten Prioritätslevel zu simulieren. Zuerst müssen Interrupts, die eine höhere Priorität als 1 haben sollen im Interrupt Priority Register auf 1 gesetzt werden. Die Interrupt Service Routine für Priorität 1, die durch Interrupts der Priorität 2 unterbrochen werden kann muß folgenden Code enthalten:
PUSH IE
MOV IE,#MASK
CALL LABEL
***************************
(Ausführung der Service Routine)
***************************
POP IE
RET
LABEL: RETI
Sobald ein Interrupt der Priorität 1 auftritt werden alle Interrupts der Priorität 0 und 1 disabled. Der CALL to LABEL Befehl bewirkt die Ausführung des RETI Befehls und damit ein Löschen des Interrupt in Progress Flip Flop der Priorität 1. Zu diesem Zeitpunkt kann jeder Interrupt bedient werden, aber es sind nur Interrupts der Priorität 2 enabled
POPing IE stellt das original Enable Byte wieder her.
Danach wird ein normaler RET Befehl (nicht RETI) verwendet um die Interrupt Service Routine abzuschließen. Diese zusätzliche Software verlängert die ISR von Interrupts der Priorität 1 um 10ms.
Interrupt Arbeitsblatt
Erläuterungen zur Interrupt Logik
Prioritäts-level
Haupt-
programm
ISR 1 + 2
S1
R1
S0*
R0
/Q1.S0
Q1
Q0
Interrupt-annahme
0
0
0
0
0
0
0
0
Low
0
0
1
1-0
0
1
0
1
1
High
1
1-0
0
1-0
0
0
1
1
1
Low
1-0
0
1
0
0
1
1
1
0
1
1
0
1
0
1
1
0
0
1
1
1
0
0*
0
0
0
1
0
1
0
1
1
0
0
0
1
0
0
0
0
Prioritäts-level
Haupt-
programm
ISR 1 + 2
S1
R1
S0*
R0
/Q1.S0
Q1
Q0
Interrupt-annahme
0
0
0
0
0
0
0
0
Low
0
0
1
1-0
0
1
0
1
1
High
1
1-0
0
1-0
0
0
1
1
1
Low
1-0
0
1
0
0
1
1
1
0
1
1
0
1
0
1
1
0
0
1
1
1
0
0*
0
0
0
1
0
1
0
1
1
0
0
0
1
0
0
0
0
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com