Praktika abgeschlossen

This commit is contained in:
WieErWill 2022-01-27 18:51:58 +01:00
parent 725e148e23
commit 6434405e8a
2 changed files with 86 additions and 110 deletions

Binary file not shown.

View File

@ -357,9 +357,9 @@ anf:
out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren
lo1: lo1:
sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt
jmp blue rjmp blue
sbis PINB,PB3 // Abfrage TASTER2, Skip Folgebefehl wenn nicht gedrückt sbis PINB,PB3 // Abfrage TASTER2, Skip Folgebefehl wenn nicht gedrückt
jmp green rjmp green
rjmp lo1 // Sprung zum Schleifenbeginn rjmp lo1 // Sprung zum Schleifenbeginn
blue: blue:
sbi PORTB,0 // Einschalten der LED (blau) sbi PORTB,0 // Einschalten der LED (blau)
@ -381,6 +381,7 @@ anf:
ldi r16,0x18 ldi r16,0x18
out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren
ldi r17,0x01 // Zähler ldi r17,0x01 // Zähler
ldi r18,0x01 // Vergleicher
lo1: lo1:
sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt sbis PINB,PB4 // Abfrage TASTER1, Skip Folgebefehl wenn nicht gedrückt
rjmp up rjmp up
@ -389,46 +390,53 @@ lo1:
rjmp lo1 // Sprung zum Schleifenbeginn rjmp lo1 // Sprung zum Schleifenbeginn
up: up:
inc r17 inc r17
cmp r17, 0x07 ldi r18, 0x01
jnz blue cp r17, r18
brne blue
ldi r17, 0x00 ldi r17, 0x00
rjmp blue rjmp blue
down: down:
dec r17 dec r17
cmp r17, 0x00 ldi r18, 0x00
jnz blue cp r17, r18
brne blue
ldi r17, 0x06 ldi r17, 0x06
blue: blue:
cmp r17, 0x01 ldi r18, 0x01
jnz cyan cp r17, r18
brne cyan
sbi PORTB,0 // Einschalten der LED (blau) sbi PORTB,0 // Einschalten der LED (blau)
cbi PORTB,1 // Ausschalten der LED (grün) cbi PORTB,1 // Ausschalten der LED (grün)
cbi PORTB,2 // Ausschalten der LED (rot) cbi PORTB,2 // Ausschalten der LED (rot)
rjmp lo1 rjmp lo1
cyan: cyan:
cmp r17, 0x02 ldi r18, 0x02
jnz green cp r17, r18
brne green
sbi PORTB,0 // Einschalten der LED (blau) sbi PORTB,0 // Einschalten der LED (blau)
sbi PORTB,1 // Einschalten der LED (grün) sbi PORTB,1 // Einschalten der LED (grün)
cbi PORTB,2 // Ausschalten der LED (rot) cbi PORTB,2 // Ausschalten der LED (rot)
rjmp lo1 rjmp lo1
green: green:
cmp r17, 0x03 ldi r18, 0x01
jnz yellow cp r17, r18
brne yellow
cbi PORTB,0 // Ausschalten der LED (blau) cbi PORTB,0 // Ausschalten der LED (blau)
sbi PORTB,1 // Einschalten der LED (grün) sbi PORTB,1 // Einschalten der LED (grün)
cbi PORTB,2 // Ausschalten der LED (rot) cbi PORTB,2 // Ausschalten der LED (rot)
rjmp lo1 rjmp lo1
yellow: yellow:
cmp r17, 0x04 ldi r18, 0x01
jnz red cp r17, r18
brne red
cbi PORTB,0 // Ausschalten der LED (blau) cbi PORTB,0 // Ausschalten der LED (blau)
sbi PORTB,1 // Einschalten der LED (grün) sbi PORTB,1 // Einschalten der LED (grün)
sbi PORTB,2 // Einschalten der LED (rot) sbi PORTB,2 // Einschalten der LED (rot)
rjmp lo1 rjmp lo1
red: red:
cmp r17, 0x05 ldi r18, 0x01
jnz violett cp r17, r18
brne violett
cbi PORTB,0 // Ausschalten der LED (blau) cbi PORTB,0 // Ausschalten der LED (blau)
cbi PORTB,1 // Ausschalten der LED (grün) cbi PORTB,1 // Ausschalten der LED (grün)
sbi PORTB,2 // Einschalten der LED (rot) sbi PORTB,2 // Einschalten der LED (rot)
@ -440,6 +448,9 @@ violett:
rjmp lo1 rjmp lo1
\end{lstlisting} \end{lstlisting}
Hinweis zur Verbesserung: das Prellen der Taster wird nicht berücksichtigt. Baue z.B. einen Delay ein.
\newpage
\subsection*{Aufgabe 2: Blinken der LED} \subsection*{Aufgabe 2: Blinken der LED}
Das Programm soll die LED fortlaufend blinken lassen. Diese Funktion wird mit einem Zähler/Zeitgeber-Interrupt realisiert. Das Programm soll die LED fortlaufend blinken lassen. Diese Funktion wird mit einem Zähler/Zeitgeber-Interrupt realisiert.
@ -494,110 +505,76 @@ tab: rjmp anf // Programmstart nach Reset ("Interrupt" 1)
reti reti
reti reti
reti reti
rjmp timer_compare // Timer 0 Compare A Interrupt (Interrupt 11) rjmp i_11 // Timer 0 Compare A Interrupt (Interrupt 11)
reti reti
reti reti
reti reti
reti // Tabellenende (Interrupt 15) reti // Tabellenende (Interrupt 15)
// Initialisierungsteil und Hintergrundprogramm: // Initialisierungsteil und Hintergrundprogramm:
anf: [...] // Weitere Initialisierungen anf:
// Initialisierung von Timer/Counter 0 ; LED config
ldi r16, high( 40000 - 1 ) ldi r16,0x07
out OCR1AH, r16 out DDRB,r16 // Port B: Richtungseinstellung
ldi r16, low( 40000 - 1 ) ldi r16,0x18
out OCR1AL, r16 out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren
// CTC Modus einschalten, Vorteiler auf 1 ; timer config
ldi r16, ( 1 << WGM12 ) | ( 1 << CS10 ) ldi r16, 0x00
out TCCR1B, r16 out TCCR0A, r16
// OCIE1A: Interrupt bei Timer Compare ldi r16, (1<<CS00)|(1<<CS02)
ldi r16, 1 << OCIE1A out TCCR0B, r16
out TIMSK, r16 sei
ldi r16, 0
out TCNT0, r16
ldi r16, 0x10
out TIMSK, r16
ldi r17, 0x00
ldi r18, 0x00
sei // Globale Interruptfreigabe
//ldi r16,0x10
//out TIMSK,r16 // Freigabe von Interrupt 11 (Timer 0 Compare A)
ldi r16,0x07
out DDRB,r16 // Port B: Richtungseinstellung
ldi r16,0x18
out PORTB,r16 // Port B: Pull-up für Taster-Eingänge aktivieren
ldi r17, 0x00 // Zähler
lo2: lo2:
rjmp lo2 // Leere Hintergrundschleife rjmp lo2 // Leere Hintergrundschleife
i_11:
// Interruptserviceroutine: in r25, SREG
timer_compare: cp r17, r18
in r25,SREG // Flags retten (weitere Rettungen nach Bedarf) brne ledon
inc r17 ldi r17, 0x01
cmp r17, 0x02 cbi PORTB, 0
jnz on rjmp end
off: ledon:
ldi r17, 0x00 ldi r17, 0x00
cbi PORTB,0 // Ausschalten der LED (blau) sbi PORTB, 0
rjmp close end:
on: out SREG, r25
sbi PORTB,0 // Einschalten der LED (blau) reti
close:
out SREG,r25 // Flags restaurieren
reti // Routine beenden
\end{lstlisting} \end{lstlisting}
Alternativ Alternativ
\begin{lstlisting}[basicstyle=\tiny] \begin{lstlisting}[basicstyle=\tiny]
init: .equ wait = 5000
; Modus 14: ldi r25, HIGH(wait)
ldi r17, 1<<COM1A1 | 1<<WGM11 ldi r24, low(wait)
out TCCR1A, r17 ; LED config
ldi r17, 1<<WGM13 | 1<<WGM12 | 1<<CS12 ldi r16,0x07
out TCCR1B, r17 out DDRB,r16 ; Port B: Richtungseinstellung
ldi r16,0x18
ldi r17, 0x6F out PORTB,r16 ; Port B: Pull-up für Taster-Eingänge aktivieren
out ICR1H, r17 ldi r17, 0x00
ldi r17, 0xFF ldi r18, 0x00
out ICR1L, r17 loop:
sbiw r24, 1 ; 16-bit Register dezimieren
; der Compare Wert brne loop
ldi r17, 0x3F cp r17, r18
out OCR1AH, r17 brne ledon
ldi r17, 0xFF ldi r17, 0x01
out OCR1AL, r17 cbi PORTB, 0
rjmp end
; Den Pin OC1A auf Ausgang schalten ledon:
ldi r17, 0x02 ldi r17, 0x00
out DDRB, r17 sbi PORTB, 0
main: end:
rjmp main ldi r25, HIGH(wait)
\end{lstlisting} ldi r24, LOW(wait)
rjmp loop
Alternativ
\begin{lstlisting}[basicstyle=\tiny]
init:
LDI r16, 0x07
STS DDRB, r16
LDI r17, 0x18
OUT PORTB, r17
LDI r16, 0x00
STS TCCR1A, r16
RET
main:
LDI r16, 0xF0
STS TCNT1H, r16
LDI r16, 0xBC
STS TCNT1L, r16
LDI r16, 0x05
STS TCCR1B, r16
loop: LDS R0, TIFR1
SBRS R0, 0
RJMP loop
LDI r16, 0x00
STS TCCR1B, r16
LDI r16, 0x01
STS TIFR1, r16
COM r17
STS PORTB, r17
RET
\end{lstlisting} \end{lstlisting}
\subsubsection*{Schritt b: Erweitertes Blinken} \subsubsection*{Schritt b: Erweitertes Blinken}
@ -652,6 +629,7 @@ t2:
RJMP loop RJMP loop
\end{lstlisting} \end{lstlisting}
\newpage
\subsection*{Aufgabe 3: Einfaches Dimmen der LED mittels PWM} \subsection*{Aufgabe 3: Einfaches Dimmen der LED mittels PWM}
Stelle die Helligkeit der LED mittels PWM (pulse width modulation, Pulsbreitenmodulation) auf wählbare Zwischenwerte ein. Stelle die Helligkeit der LED mittels PWM (pulse width modulation, Pulsbreitenmodulation) auf wählbare Zwischenwerte ein.
@ -689,7 +667,7 @@ dly4:
ret ret
\end{lstlisting} \end{lstlisting}
\newpage
\subsubsection*{Schritt b: Helligkeitseinstellung mit Tastern} \subsubsection*{Schritt b: Helligkeitseinstellung mit Tastern}
Nun sollen die beiden Taster als Bedienelemente zum Auf- und Abdimmen verwendet werden. Werte dabei die Dauer der Tastendrücke aus, nicht deren Anzahl. Die Helligkeit soll bei gedrückt gehaltenem Taster stetig zu- oder abnehmen. Bei losgelassenen Tastern soll die Helligkeit konstant bleiben. Nun sollen die beiden Taster als Bedienelemente zum Auf- und Abdimmen verwendet werden. Werte dabei die Dauer der Tastendrücke aus, nicht deren Anzahl. Die Helligkeit soll bei gedrückt gehaltenem Taster stetig zu- oder abnehmen. Bei losgelassenen Tastern soll die Helligkeit konstant bleiben.
@ -733,8 +711,6 @@ dly4:
\newpage \newpage
\subsection*{Zusatzaufgabe: Fortlaufendes Auf- und Abdimmen der LEDs} \subsection*{Zusatzaufgabe: Fortlaufendes Auf- und Abdimmen der LEDs}
Diese Aufgabe soll als Anregung für weiterführende Experimente nach eigenen Ideen dienen. Die Helligkeit der LED soll in einer geeigneten Geschwindigkeit stetig herauf- und heruntergeregelt werden, so dass ein ,,weiches Blinken'' entsteht. Dazu muss einen Mechanismus implementiert werden, der den Helligkeitswert nach einem geeigneten Zeitschema verändert. Diese Aufgabe soll als Anregung für weiterführende Experimente nach eigenen Ideen dienen. Die Helligkeit der LED soll in einer geeigneten Geschwindigkeit stetig herauf- und heruntergeregelt werden, so dass ein ,,weiches Blinken'' entsteht. Dazu muss einen Mechanismus implementiert werden, der den Helligkeitswert nach einem geeigneten Zeitschema verändert.
Realisiere weitere Lichteffekte dieser Art, bei denen nun auch mehrere Leuchtfarben beteiligt sind.
Realisiere eine Umschaltung zwischen unterschiedlichen Lichteffekten.
Realisiere weitergehende Funktionen nach eigenen Ideen. Realisiere weitergehende Funktionen nach eigenen Ideen.
\begin{lstlisting}[basicstyle=\tiny] \begin{lstlisting}[basicstyle=\tiny]