Warteschleife und Lauflicht

Transcrição

Warteschleife und Lauflicht
MC SS2016 - Aufgabenblatt 6 - Übung 2
Warteschleife und Lauflicht
In diesem Versuch sollen Sie lernen Warteschleifen zu programmieren. Eine Anwendung dieser
Warteschleifen ist das Erzeugen von Blinksignalen und Lauflichtern.
$NOMOD51
$INCLUDE (reg515.inc)
org 0
init:
mov p1,#00H
; alle Leuchtdioden einschalten
start:
mov r1,#100 ; äußere
warten2: mov r0,#250 ; innere
warten1: nop
nop
djnz r0, warten1
;
djnz r1, warten2
;
mov a,p1
cpl a
mov p1,a
Schleife 100 mal abarbeiten
Schleife 250 mal abarbeiten
4 Zyklen * 250 = 1000 Zyklen
100 * 1000 Zyklen = 100000 Zyklen
; Zustand des Port 1 lesen
; Zustand der Leuchtdioden invertieren
; neuen Zustand in das Port 1 schreiben
jmp start
end
Aufgabe 1:
•
•
Testen Sie das Beispielprogramm. Berechnen Sie, wie lange es dauert, bis der Zustand der
Leuchtdioden umgeschaltet wird ( = Dauer der zweifach verschachtelten Warteschleife).
8051 mit 12MHz Quarz
→ 1µs Zykluszeit
→ Warteschleife: ca. 100ms
AT89C5131 mit 16MHz Quarz → 12/16µs = 3/4µs = 0.75µs → Warteschleife: ca. 75ms
***
Aufgabe 2:
Ändern Sie das Beispielprogramm so ab, dass die LEDs mit einer Frequenz von 0,5 Hz
blinken, d.h. die Warteschleife eine Dauer von 1 Sekunde hat.
Seite 1 / 5
Aufgabe 2:
Ändern Sie das Beispielprogramm so ab, dass die LEDs mit einer Frequenz von 0,5 Hz
blinken, d.h. die Warteschleife eine Dauer von 1 Sekunde hat.
$NOMOD51
$INCLUDE (reg515.inc)
org 0
init:
mov p1,#00H
start:
warten3:
warten2:
warten1:
mov r3,#133 ; weitere Schleife 100 * 4/3 = 133 mal
mov r1,#10 ; äußere Schleife 10 mal abarbeiten
mov r0,#250 ; innere Schleife 250 mal abarbeiten
nop
nop
djnz r0,warten1
; 4 Zyklen * 250 = 1000 Zyklen
djnz r1,warten2
; 10 * 1000Zyklen = 10000 Zyklen
djnz r3,warten3
; 133 * 10000Zyklen → 1s (AT89C5131-Platine)
mov a,p1
cpl a
mov p1,a
; alle Leuchtdioden einschalten
; Zustand des Port 1 lesen
; Zustand der Leuchtdioden invertieren
; neuen Zustand in das Port 1 schreiben
jmp start
end
Seite 2 / 5
1. Zeilen 9 & 13 werden 100x ausgeführt → 300 Zyklen
2. Zeilen 6, 8 & 9 liefern einen einmaligen Beitrag von 3 Zyklen → 303 Zyklen
3. Gesamtverzögerung der dreifachen Schleife → 100000 Zyklen (siehe Kommentar)
4. genauer → 100303 Gesamtzykluszeit (s.o. Debug-Protokoll !)
***
Aufgabe 3: Schreiben Sie ein Programm, das ein „Lauflicht“ auf den 8 Leuchtdioden erzeugt. Es soll
dabei immer nur eine Leuchtdiode eingeschaltet sein. Nach ca. einer Sekunde soll diese LED
dann ausgeschaltet und die benachbarte Leuchtdiode eingeschaltet werden, usw.
Das Umschalten der Leuchtdioden kann am einfachsten mit einem Schiebebefehl erreicht
werden. Eine LED muss allerdings zu Beginn des Programms eingeschaltet werden.
Seite 3 / 5
Aufgabe 3: Schreiben Sie ein Programm, das ein „Lauflicht“ auf den 8 Leuchtdioden erzeugt. Es soll
dabei immer nur eine Leuchtdiode eingeschaltet sein. Nach ca. einer Sekunde soll diese LED
dann ausgeschaltet und die benachbarte Leuchtdiode eingeschaltet werden, usw.
Das Umschalten der Leuchtdioden kann am einfachsten mit einem Schiebebefehl erreicht
werden. Eine LED muss allerdings zu Beginn des Programms eingeschaltet werden.
$NOMOD51
$INCLUDE (reg515.inc)
org 0
init:
mov p1,#11111110B
start:
call warte1s ; 1s warten
mov a,p1
rl a
mov p1,a
; nur LED0 einschalten
; Zustand des Port 1 lesen
; Zustand der Leuchtdioden invertieren
; neuen Zustand in das Port 1 schreiben
jmp start
warte1s:
warten3:
warten2:
warten1:
mov r3,#133 ; weitere Schleife 100 * 4/3 = 133 mal
mov r1,#10 ; äußere Schleife 10 mal abarbeiten
mov r0,#250 ; innere Schleife 250 mal abarbeiten
nop
nop
djnz r0,warten1
; 4 Zyklen * 250 = 1000 Zyklen
djnz r1,warten2
; 10 * 1000Zyklen = 10000 Zyklen
djnz r3,warten3
; 133 * 10000Zyklen → 1s (AT89C5131-Platine)
ret
end
* * *
Aufgabe 4: „Knight Rider“
Legen Sie das Lauflicht so an, daß es zunächst nach links läuft.
Wenn LED7 erreicht wird, soll die Laufrichtung nach rechts umgeschaltet werden.
Wenn LED0 wieder erreicht wird, soll der Vorgang von neuem in der Gegenrichtung laufen.
Seite 4 / 5
Aufgabe 4: „Knight Rider“
Legen Sie das Lauflicht so an, daß es zunächst nach links läuft.
Wenn LED7 erreicht wird, soll die Laufrichtung nach rechts umgeschaltet werden.
Wenn LED0 wieder erreicht wird, soll der Vorgang von neuem in der Gegenrichtung laufen.
$NOMOD51
$INCLUDE (reg515.inc)
org 0
init:
mov p1,#11111110B
mov r4,#7
; nur LED0 einschalten
; Laufzähler = 7
links:
mov a,p1
rl a
mov p1,a
call warte1s
djnz r4,links
mov r4,#7
; 1s warten
; Laufzähler = 0 ?
; Laufzähler = 7 und weiter
mov a,p1
rr a
mov p1,a
call warte1s
djnz r4,rechts
mov r4,#7
jmp links
;
;
;
;
rechts:
warte1s:
warten3:
warten2:
warten1:
1s warten
Laufzähler = 0 ?
Laufzähler = 7
neuer Durchlauf ...
mov r3,#133 ; weitere Schleife 100 * 4/3 = 133 mal
mov r1,#10 ; äußere Schleife 10 mal abarbeiten
mov r0,#250 ; innere Schleife 250 mal abarbeiten
nop
nop
djnz r0,warten1
; 4 Zyklen * 250 = 1000 Zyklen
djnz r1,warten2
; 10 * 1000Zyklen = 10000 Zyklen
djnz r3,warten3
; 133 * 10000Zyklen ? 1s (AT89C5131-Platine)
ret
end
Seite 5 / 5