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 Interrupt
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
https://www.scriru.com/15/93145915595.php
https://www.scriru.com/15/62169647115.php
https://www.scriru.com/15/92852711485.php
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com