Interrupt (Ereignisserfassung) Der Timer
5.9 Interrupt (Ereignisserfassung)
Ein Interruptprogramm ist einem normalen Unterprogramm sehr ähnlich, allerdings gibt es hier einen ganz wichtigen Punkt zu beachten:
Ein Interrupt kann an jeder ! Stelle im Programm auftreten und das Unterprogramm aufrufen.
Warum ist dies so wichtig ? Nun, bei einem normalen Unterprogramm weiß ich, wann der Aufruf erfolgt und welche Register ich benutzen kann, ohne das dabei eine Information verloren geht. Ein Interrupt löst aus, irgendwo. Mir ist nicht bekannt, welches Register gerade irgendwo bearbeitet wird oder einen wichtigen Wert beinhaltet. Daher ist es erforderlich, jedes in der ISR benutzte Register zu retten.
Wie wird das gemacht ? ganz einfach, in dem man sich den Stack zu Hilfe nimmt. Befehle wie Push und POP sind dafür ausgelegt, Registerwerte auf dem Stack zu sichern. Schauen wir uns einmal eine typische ISR an:
5.10 Der Timer
Es gilt die Reihenfolge zu beachten. First In ist Last Out, daher sagt man auch zum Stack, er ist ein FILO-Speicher (First In – Last Out)
Meine Empfehlung ist daher, bevor eine ISR mit Code gefüllt wird, die Push – und Pop –Befehle zu platzieren. Noch ist der Zusammenhang erkennbar. Die eigentliche Bearbeitung setze ich dann in den Bereich ein, wo jetzt noch Punkte sind.
Hinweis: Unterprogramme, die aus einer ISR aufgerufen werden, müssen ebenfalls verwendete Register sichern. Dies kann hier gleich mit berücksichtigt werden.
Der Timer – Interrupt erledigt alle Zeitverzögerungen dur Zählen der ms und entsprechender Auswertung. So sind z. B. Register definiert, die einen Zeitbereich abdecken. So kann aus diesen Registerwerten jedes Mal bei Erreichen einer Vorgabe ein Flag gesetzt werden, völlig unabhängig vom Programm. Im Hauptprogramm wird dieses erkannt und bearbeitet.
5.9 Interrupt (Ereignisserfassung)
Ein Interruptprogramm ist einem normalen Unterprogramm sehr ähnlich, allerdings gibt es hier einen ganz wichtigen Punkt zu beachten:
Ein Interrupt kann an jeder ! Stelle im Programm auftreten und das Unterprogramm aufrufen.
Warum ist dies so wichtig ? Nun, bei einem normalen Unterprogramm weiß ich, wann der Aufruf erfolgt und welche Register ich benutzen kann, ohne das dabei eine Information verloren geht. Ein Interrupt löst aus, irgendwo. Mir ist nicht bekannt, welches Register gerade irgendwo bearbeitet wird oder einen wichtigen Wert beinhaltet. Daher ist es erforderlich, jedes in der ISR benutzte Register zu retten.
Wie wird das gemacht ? ganz einfach, in dem man sich den Stack zu Hilfe nimmt. Befehle wie Push und POP sind dafür ausgelegt, Registerwerte auf dem Stack zu sichern. Schauen wir uns einmal eine typische ISR an:
5.10 Der Timer
Code:
; ********************************************************
; * Der Timerinterrupt erzeugt einen Impuls alle ms. Dieser wird für die *
; * Zeitmessung zugrunde gelegt. Folgende Register werden benutzt: *
; ********************************************************
isrTimer1: ; Sprungmarke aus der Interrupt Vector Tabelle
Push Temp ; Register 1 sichern
In Temp, SREG ; Statusregister holen
Push Temp ; und auf Stack sichern
Push S_Merker ; 2. register sichern
;….. ; hier ist das eigentliche Programm
;…..
Pop S_Merker ; Register in umgekehrter Reihenfolge aktualisieren
POP Temp ; Statusregister
Out SREG, Temp ; zurückschreiben
POP Temp ; Register 1 aktualisieren
RETI
Meine Empfehlung ist daher, bevor eine ISR mit Code gefüllt wird, die Push – und Pop –Befehle zu platzieren. Noch ist der Zusammenhang erkennbar. Die eigentliche Bearbeitung setze ich dann in den Bereich ein, wo jetzt noch Punkte sind.
Hinweis: Unterprogramme, die aus einer ISR aufgerufen werden, müssen ebenfalls verwendete Register sichern. Dies kann hier gleich mit berücksichtigt werden.
Der Timer – Interrupt erledigt alle Zeitverzögerungen dur Zählen der ms und entsprechender Auswertung. So sind z. B. Register definiert, die einen Zeitbereich abdecken. So kann aus diesen Registerwerten jedes Mal bei Erreichen einer Vorgabe ein Flag gesetzt werden, völlig unabhängig vom Programm. Im Hauptprogramm wird dieses erkannt und bearbeitet.