Lauflicht (M242)
Datum: Juni 2021
Lesedauer: 5 Minuten
Einleitung
In diesem Dokument werden die Inhalte der Projektarbeit von C. Damas, M. Müggler und K. Wild aufgeführt.
Hinweise
Der Quellcode ist für den Keil-Simulator ausgelegt. Damit dieser auf dem Mesa-Gerät einwandfrei funktioniert, muss dieser angepasst werden. Die betroffenen Stellen sind im Code mit dem Kommentar "ÄNDERN" gekennzeichnet.
Blockschema
Grundanforderungen
Erweiterte Anforderungen
Zustandsdiagramm
Grundanforderungen
Erweiterte Anforderungen
Flussdiagramm
Struktogramm
Programmcode
Allgemeines
Prinzipskizze
Testen
Testkonzept
Wir testen das Lauflicht, welches auf MESA läuft. Dazu schliessen wir das Board mithilfe des Silicon Laboratories USB Debug Adapters. Danach achten wir genau darauf, wie sich die LEDs bewegen. Auch speziell nach dem Drücken der verschiedenen Knöpfe kontrollieren wir, ob alles ordnungsgemäss funktioniert.
Testfälle
Nr. | Testfall | Verantwortung | Erwartung | Ergebnis | Weiteres Vorgehen | Priorität |
---|---|---|---|---|---|---|
1 | Drücken von Keil Software | Kay | Lauflicht bewegt sich von links nach rechts. Dabei verschiebt es sich im Sekundentakt. Ist die Kette durchgelaufen, beginnt das Ganze von vorne. Somit stoppt das Programm nicht. | funktioniert | - | muss |
2 | Drücken von S0 bei laufenden LEDs | Kay | Die LEDs bleiben stehen. Somit wird also das Lauflicht pausiert. | funktioniert | - | muss |
3 | Drücken von S0 bei stehenden LEDs | Kay | Das Lauflicht läuft dort weiter, wo es pausiert wurde. Wurde das Lauflicht zuvor gestoppt, beginnt es erneut. | Beim Stopp muss man zuerst den Stopp Knopf erneut drücken. Danach kann man es normal starten. Da es nicht anders geht, nehmen wir das in Kauf. | - | muss |
4 | Drücken von S1 | Kay | Beim Drücken dieses Buttons wird der Prozess gestoppt. Im Gegensatz zum Pausieren leuchtet hier kein LED. Das Lauflicht wird also abgebrochen. | funktioniert | - | muss |
5 | Drücken von S2 bei langsamer Geschwindigkeit | Kay | Bewegen sich die Lämpchen langsam, wird mithilfe des S2 Knopfs die Geschwindigkeit erhöht. Das Lauflicht verschiebt sich also schneller. Ein erneutes Drücken sorgt dafür, dass die Geschwindigkeit wieder zurückgesetzt wird. | funktioniert | - | kann |
7 | Drücken von S3 bei Bewegung nach links | Kay | Die Laufrichtung wird umgedreht. Das Lauflicht bewegt sich von links nach rechts. Beim erneuten Drücken der Taste wandern die LEDs wieder von rechts nach links. | funktioniert | - | kann |
9 | Drücken von S4 | Kay | Die Anzahl der LEDs in der Lichterkette erhöht sich. Um wieder weniger Lichter in der Kette zu haben, reicht ein erneutes Drücken. | funktioniert | - | kann |
Bedienungsanleitung
Funktionen
Ist der Keil an die Software angeschlossen, sollte bereits ein Lauflicht sichtbar sein. Ansonsten müssen sie sich an einen Entwickler wenden. Das Lauflicht wird folgendermassen verändert.
Pause - S0
Um das Licht anzuhalten, klickt man einmal auf den Taster S0. Somit bleiben alle LEDs stehen.
Start - S0
Sind die LEDs jeweils angehalten oder auch gestoppt, kann man die Bewegung der Lichter mit S0 wieder starten/fortsetzen.
Stopp - S1
LEDs dunkel. Mit dem Knopf S1 unterbricht man die Lichter. Nach einem Klick auf diesen Knopf sind alle
Geschwindigkeit - S2
Um die Geschwindigkeit anzupassen steht einem S2 zur Verfügung. Bei langsamer (standard) Geschwindigkeit kann diese mit der Taste erhöht werden. Dazu muss man nur den Knopf gedrückt halten.
Laufrichtung - S3
Die Taste S3 ist dazu da, die Richtung der LEDs zu ändern. Wird die Taste gedrückt, läuft die Lichterkette in die entgegengesetzte Richtung. Dies geschieht so lange, bis man den Taster wieder loslässt.
Breite - S4
Die Breite der bewegenden Lichter können ebenfalls verändert werden. Dazu hält man S4 gedrückt. Dabei wird die Grösse der Lichterkette erhöht.
Übersicht der Tasten
Code
;********************************************************************************
; P R O G R A M M
;********************************************************************************
; Source-File: Lauflicht.a51
; Autor: C. Damas, M. Müggler, K. Wild
; Datum: 05.06.2021
; Version: 2.0
; Beschreibung: Lauflicht
; Eingaben: 8 Schalter S0 bis S7
; Ausgaben: 8 LEDs PA0 bis PA7
; HINWEIS Alle Änderungen die noch für das Mesa gemacht werden
; müssen, sind mit dem Keywort "ÄNDERN" gekennzeichnet
;********************************************************************************
$TITLE (Lauflicht)
$NOLIST
$NOMOD51
$INCLUDE (C8051F020.h) ;hier werden alle Bezeichnungen definiert
$LIST
NAME Lauflicht
;----- Deklarationen
input equ P3 ; P3 8 Eingänge
output equ P2 ; P2 8 Ausgänge
llStatus data 20h ; ll -> LaufLichtStatus
dStatus data 21h ; DirectionStatus -> bool-Variable die sagt, ob als letztes das Licht Vor- oder rückwärts gegangen ist
fast data 22h ; deklariert geschwindigkeit -> bool-Variable die entweder schnell oder langsam ist
;----- Intitialisierung
ORG 0000h ; Startadresse
jmp init ; geht zu init
ORG 0100h ; Programmanfang
init: mov WDTCN,#0DEh
mov WDTCN,#0ADh ; deaktiviert Watchdog
mov P2MDOUT,#0FFh ; P2 8 Ausgänge
mov P3MDOUT,#000h ; P3 8 Eingänge
mov XBR2,#040h ; aktiviert crossbar (Koppelfeld)
;------ Hauptprogramm
main: mov output,#00h ; LEDs ausschalten
mov input, #00h ; ÄNDERN --> wenn man es auf dem Mesa laufen lässt muss man diese Zeile entfernen
mov A,#0h
;------ Schleife
loop:
jnb input.2, fastFalse
mov fast, #6h ; ÄNDERN --> Wert für Wait anpassen wenn schnell -> beim Mesa #6h mit #1h ersetzen
jmp fastEnd
fastFalse:
mov fast, #60h; ; ÄNDERN --> Wert für Wait anpassen wenn langsam (standard-geschwindigkeit) -> beim Mesa #60h mit #6h ersetzen
fastEnd:
jb input.3, CBitBack ;Endlosschleife
jmp CBit
;------ Licht anschalten vorwärts
lightsUp:
CALL compare
jnb input.4, lightsUpTrue
rl A
add A, #1h
;------ Licht anschalten vorwärts breit
lightsUpTrue:
rl A
add A, #1h
mov output, A
CALL wait
jmp loop
;------ Licht ausschalten vorwärts
lightsDown:
CALL compare
jnb input.4, lightsDownTrue
rl A
subb A, #1h
;------ Licht ausschalten vorwärts breit
lightsDownTrue:
rl A
subb A, #1h
mov output, A
CALL wait
jmp loop
;------ Licht anschalten rückwärts
lightsUpBack:
CALL compare
jnb input.4, lightsUpBackTrue
add A, #1h
rr A
;------ Licht anschalten rückwärts breit
lightsUpBackTrue:
add A, #1h
rr A
mov output, A
CALL wait
jmp loop
;------ Licht ausschalten rückwärts
lightsDownBack:
CALL compare
jnb input.4, lightsDownBackTrue
subb A, #1h
rr A
;------ Licht ausschalten rückwärts breit
lightsDownBackTrue:
subb A, #1h
rr A
mov output, A
CALL wait
jmp loop
;----- überprüft ob stop oder pasue gedrückt wurde
compare:
JB input.0, compare
JB input.1, reset
RET
;----- überprüft Richtung und wenn Schalter gedrückt geht zu CBitTrue (Wenn vorwärts)
CBit:
jb dStatus.0, CBitTrue
mov A, #0h
mov dStatus, #1h
;----- Setzt neue Richtung (wenn vorwärts)
CBitTrue:
mov llStatus, A
jb llStatus.7, lightsDown
jmp lightsUp
;----- überprüft Richtung und wenn Schalter gedrückt geht zu CBitBackTrue (Wenn rückwärts)
CBitBack:
jnb dStatus.0, CBitBackTrue
mov A, #0h
mov dStatus, #0h
;----- Setzt neue Richtung (wenn rückwärts)
CBitBackTrue:
mov llStatus, A
jb llStatus.0, lightsDownBack
jmp lightsUpBack
;----- Start Delay
wait: mov R5, #0FFh ; mit wait wird der Delay aufgerufen, und hier wird auf das Register verschiedene Werte gesetzt und Schleifen ineinander aufgerufen
wait1: mov R6, #0FFh
wait2: mov R7, #05h
wait3: mov R4, fast ; ÄNDERN --> bei Mesa wait 4 wieder entfernen und "mov R4, fast" beim wait 3
wait4: djnz R4, wait4
djnz R7, wait3
djnz R6, wait2
djnz R5, wait1
ret
;----- Start Reset (Stop)
reset: mov output,#00h ; setzt die LEDs und den Akumulator zurück und geht wider in die Loop
mov A, #0h
jmp loop
END
Quellen
Alle vorkommenden Diagramme, Testfälle, Texte und sonstige Grafiken wurden von unserer Gruppe entworfen.