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.
|