Impressum
< PAPs in Assembler umsetzen Inhalt Unterprogramme >

Zeitschleifen

Der Maschinenzyklus eines 8051 Controllers benötigt 12 Takte des angeschlossenen Quarzes. Im Weiteren gehen wir von einem Takt von 12 MHz aus. Somit hat ein Maschinenzyklus eine Dauer von 1μs (=10-6s).

Warum Zeit vertun?

Realisiert man ein Lauflicht, bei welchem der Mikrocontoller die Bitmuster 0000 0001 bis 1000 0000 ausgibt, stellt man fest, dass alle angeschlossenen LEDs leuchten.
mov A, #01 main: mov P0, A rl A jmp main
Dies liegt daran, dass alle 4μs eine der Zustand des Lauflichts wechselt, dies entspricht 4.000.000 Zustandswechsel pro Sekunde. Das Auge erkennt somit nicht die einzelnen Zustände, sondern nimmt alle Leuchtdioden als leuchten wahr evtl. mit verminderter Leuchtintensität.
Es ist hier also erforderlich, die Arbeitsgeschwindigkeit des Mikrocontrollers auszubremsen. Auch bei anderen Abläufen wie der Realisierung von zeitgesteuerten Protokollen ist es oft nötig eine bestimmte Zeit verstreichen zu lassen.
Hierzu kann zum einen eine Folge von nop Befehlen verwendet werden, allerdings lassen sich hiermit keine langen Wartezeiten realisieren (maximal 216μs=0,065536s). Für längere Wartezeiten werden Zeitschleifen verwendet.

Zeitschleifen

Eine Zeitschleife hat die Aufgabe eine gewisse Zeit zu „verschwenden“. Eine mögliche Realisierung ist in z.B. R1 einen Wert zu speichern und ihn in einer Schleife so lange um eins zu vermindern, bis 0 erreicht ist. Der entsprechende PAP ist in Abbildung 1 dargestellt.
Einfache Zeitschleife
Abb. 1: Einfache Zeitschleife
Eine bequeme Realisierung dieser Schleife ist mit dem djnz Befehl möglich, da er sowohl die Verminderung um eins, als auch den Vergleich mit 0 druchführt.
Beispiel 1: Eine einfache Zeitschleife:
	mov R1, #255;
L1:	djnz R1, L1;
Die Anweisung mov R1, #255; schreibt den Wert 255 in R1. Die Zeile L1:djnz R1, L1; stellt die eigenliche Schleife dar. Der djnz Befehl zieht zuerst eins von R1 ab und sprigt dann an den Zeilenanfang, wenn R1 nicht 0 ist. Jeder diesr Sprünge benötigt 2μs.
Somit ergibt sich eine Laufzeit von 1+2*255 = 511μs.
Um längere Wartezeiten zu erreichen werden Schleifen ineinander verschachtelt.
Beispiel 2: Zwei verschachtelte Schleife: Hier sind zwei Schleifen ineinander verschachtelt. Die inner Schleife ist die aus Bsp. 1. Die äußere Schleife wiederholt diese 255 mal.
	mov R2, #255	;------ äußere Schleife		
L2:	mov R1, #255	; innere    |
L1:	djnz R1, L1	; Schleife  |
	djnz R2, L2	;------------
Die innere Schleife ist aus dem obigen Beispiel bekannt und hat eine Dauer von 511μs. Die äußere Schleife wird 255 mal druchlaufen, wobei bei jedem Druchlauf die innere Schleife ein weiteres Mal druchlaufen wird.
Die Laufzeit beträgt 1+511*255 +2*255=130 816 MZ=0,130816s.
Hierbei kommt die 1 von mov R2, #255 die 511*255 von der inneren Schleife, welche 255 mal durchlaufen wird und die 2*255 von der Zeile djnz R2, L2 der äußeren Schleife.
Beispiel 3: Drei verschachtelte Schleife: Hier sind drei Schleifen ineinander verschachtelt. Es wurde das Bsp. 2 um eine weitere Schleife ergänzt. Die Druchläufe der äußersten Schleife sind hier als x angegeben. In Abbildung 2 ist der zugehörige PAP abgebildet.
Zeitschleife 3fach verschachtelt
Abb. 2: Zeitschleife mit 3 Schleifen
Der Assembler-Code zu Abbildung 2 sieht wie folgt aus:
	mov R3, #x	;--- äußerste Schleife		
L3:	mov R2, #255	;--         |
L2:	mov R1, #255	; | innere  |
L1:	djnz R1, L1	; |Schleifen|
	djnz R2, L2	;--         |	
	djnz R3, L3	;------------
Die inneren Schleifen benötigen (s.Bsp. 2) 130 816 Mz, durch die äußere Schleife kommen hier 2 MZ (durch djnz R3, L3 hinzu. Somit werden 130 818*x MZ +1 benötigt (+1 durch mov R3, #x).
Abhängig von x ergeben sich unterschiedliche Laufzeiten. Eine Auswahl hiervon ist in der folgenden Tabelle dargestellt:
xLaufzeit
101,308181s
202,616361s
10013,081801s
25533,358591s
033,489409s
Anmerkung:
Verwendet man in den obigen Beispielen keine Register, sondern direkt adressierbare Speicherzellen, so benötigen die mov Befehle zwei anstatt einem Maschinenzyklus. Somit kommt man bei drei verschachtelten Schleifen auf maximal (((2*256)+2+2)*256+2+2)*256+2 = 33,81s.
Selbstvertändlich können Zeitschleifen auch mit Befehlen wie jnz oder cjne realisiert werden. Die unterschiedlichen Schleifen können auch vermischt zum Einsatz kommen. Da eine verlängerte Laufzeit der innerste Schleife eine Laufzeitverlängerung von bis zu 65536 MZ (bei 3 Schleifen) bewirkt, ist es auch denkbar, die innerste Schleife mit nop Operationen anzureichern.
Vier Schleifen nach obigem Prinzip laufen bis zu 2,4 Stunden, fünf bis zu 25,6 Tage und sechs Schleifen fast 18 Jahre. Ein schwierigeres Problem stellt sich, wenn man eine exakte Zeit (z.B. genau 1s) warten will und dafür passende Werte sucht. Hierfür kann jedoch bei der heutigen Rechenleistung ein Computerprogramm geschrieben werden, welches alle Wertkombinationen druchprobiert und die passenste ausgibt.