2021
Lauflicht

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

block-erweitert

Erweiterte Anforderungen

Zustandsdiagramm

Grundanforderungen

zustandsdiagramm

Erweiterte Anforderungen

zustandsdiagramm-erweitert

Flussdiagramm

flussdiagramm

Struktogramm

Programmcode

programmcode

Allgemeines

struktogramm

Prinzipskizze

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.TestfallVerantwortungErwartungErgebnisWeiteres VorgehenPriorität
1Drücken von Keil SoftwareKayLauflicht 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
2Drücken von S0 bei laufenden LEDsKayDie LEDs bleiben stehen. Somit wird also das Lauflicht pausiert.funktioniert-muss
3Drücken von S0 bei stehenden LEDsKayDas 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
4Drücken von S1KayBeim Drücken dieses Buttons wird der Prozess gestoppt. Im Gegensatz zum Pausieren leuchtet hier kein LED. Das Lauflicht wird also abgebrochen.funktioniert-muss
5Drücken von S2 bei langsamer GeschwindigkeitKayBewegen 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
7Drücken von S3 bei Bewegung nach linksKayDie 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
9Drücken von S4KayDie 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

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.