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