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.

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.

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:
x | Laufzeit |
10 | 1,308181s |
20 | 2,616361s |
100 | 13,081801s |
255 | 33,358591s |
0 | 33,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.