Hinher Lauflicht Ideal Loesung
Hinher Lauflicht
Beschreibung der Aufgabe
Entwickelt werden soll ein Lauflicht, dessen Aktionsbereich mit jeder Runde zunimmt und wenn es am rechten Rand angekommen ist, wieder abnimmt und immer so weiter.
Beschreibung des Problems
Das Programm muss Entscheidungen treffen können, um dieses Ergebnis zu erhalten. Befehle wie breq, brne, cp, cpi sind daher unerlässlich.
Code
.include "8515def.inc"
; Hinher Lauflicht von unknown name
; Nicht böse sein, es kann sein, dass ich hier
; Befehle benutzt habe, die noch nicht im
; Unterricht vorgekommen sind!!!
.def hinher =R16 ; Dieses Register enthält das Ergebnis
.def weite =R17 ; Dieses wie weit das Lauflicht laufen darf
ser hinher
out DDRA, hinher ; Das zählt nicht!!! => -2 Wörter = 21 Wörter!!!
ldi hinher, 0b10000000
ldi weite, 0b10000000 ; klar!!!
loop_weite_r:
lsr weite ; Das Lauflicht darf eins weiter laufen
rcall loop_hinher_r ; Das Lauflicht laufen lassen
cpi weite, 0b00000001
brne loop_weite_r ; Überprüfen, ob das Lauflicht schon am rechten Rand
; angekommen ist, wenn ja, nächster Loop, wenn nicht,
; Loop noch mal. Hier spart die Verwendung von brne
; ein Wort
loop_weite_l:
lsl weite ; Das Lauflicht muss eins weniger laufen
rcall loop_hinher_r ; s.o.
cpi weite, 0b10000000
breq loop_weite_r ; Überprüfen, ob das Lauflicht schon am linkem Rand
; angekommen ist, wenn ja, vorheriger Loop
rjmp loop_weite_l ; ist im Grunde klar!!
loop_hinher_r:
out PORTA, hinher ; Lauflicht anzeigen
cp hinher, weite
breq sprung_l ; Überprüfen, ob das Lauflicht so weit ist, wie es
; darf, sonst nächster Loop
lsr hinher ; Lauflicht läuft nacht rechts
rjmp loop_hinher_r ; klar!!!
loop_hinher_l:
lsl hinher ; Lauflicht läuft nach links. lsl ist hier vor dem
; out, weil es ein Wort spart
out PORTA, hinher ; s.o.
sprung_l: ; neuer Einstiegspunkt für den Loop. Spart ein Wort
; unter Verwendung von brne
cpi hinher, 0b10000000
brne loop_hinher_l ; Überprüfen, ob das Lauflicht wieder links angekommen
; ist, Wenn nicht, Loop nochmal, sonst:
ret ; Springt zurück zu dem Punkt, wo rcall aufgerufen wurde
page revision: 2, last edited: 10 Oct 2012 22:51