Speichere Zwischenstand

This commit is contained in:
2025-06-01 19:46:34 +02:00
parent c58acf3524
commit bb92ec7bd5

124
main.asm
View File

@@ -10,6 +10,13 @@
.def setter = R16 .def setter = R16
.def overflows = R17 .def overflows = R17
.def active_led = R18 .def active_led = R18
.def btn_status = R19
.def cur_direction = R20
.equ L2R = 0x01
.equ R2L = 0b00000100
.equ RBTN_PRESSED = 0b00000100
.equ LBTN_PRESSED = 0b00000001
.org 0x0000 .org 0x0000
rjmp init rjmp init
@@ -23,7 +30,18 @@ init:
; Output Ports definieren ; Output Ports definieren
;---- ;----
ser setter ser setter
out DDRD, setter ; Alle LEDs standardmäßig aus out DDRD, setter ; Alle PortD Pins als OUTPUT
;--
; Taster Pins definieren
;----
; ldi setter, 0b11111010
ser setter
out DDRB, setter ; PB0 und PB2 als Inputs definieren
; ldi setter, 0b00000101
; out PORTB, setter ; Interne Pullups aktivieren
clr setter
out PORTB, setter
;-- ;--
; Timer/Counter konfigurieren ; Timer/Counter konfigurieren
@@ -40,20 +58,108 @@ init:
ldi setter, 0 ldi setter, 0
out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren
ldi setter, 0b00000001 ldi setter, 0b00000001
out PORTD, setter out PORTD, setter ; erste LED einschalten
clr btn_status ; initialer Status = kein Taster gedrückt
ldi cur_direction, L2R ; initial mit Laufrichtung von links nach rechts starten
main: loop:
;-- ;--
; Dreh Dräumchen und lass den Timer-Interrupt die Show leiten ; Dreh Dräumchen und lass den Timer-Interrupt die Show leiten
;---- ;----
rjmp main rjmp loop
overflow_handler: overflow_handler:
inc overflows inc overflows
cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms
brne overflow_handler_exit ; early Return wenn Schwellenwert noch nicht erreicht brne ret_overflow_handler ; early Return wenn Schwellenwert noch nicht erreicht
clr overflows ; Überlaufzähler kontrolliert zurücksetzen clr overflows ; Überlaufzähler kontrolliert zurücksetzen
right_to_left active_led in btn_status, PINB
overflow_handler_exit:
cpi btn_status, 0
breq run_animation
cp cur_direction, btn_status
breq run_animation
;--
; Setze definierten Start für den
; Laufrichtungswechsel
;----
cpi btn_status, LBTN_PRESSED
brne PC+3
ldi setter, 0b10000000
ldi cur_direction, L2R
cpi btn_status, RBTN_PRESSED
brne PC+3
ldi setter, 0b00000001
ldi cur_direction, R2L
out PORTD, setter
; mov cur_direction, btn_status
; ldi setter, 0b10000000
; cpi btn_status, RBTN_PRESSED
; breq PC+2
; ldi setter, 0b00000001
; out PORTD, setter
;------
run_animation:
cpi cur_direction, L2R
brne PC+3
left_to_right active_led
reti
cpi cur_direction, R2L
brne PC+3
right_to_left active_led
reti
ldi setter, 0b00011000
out PORTD, setter
;====================
; cpi btn_status, R2L_PRESSED
; brne PC+3
; ldi active_led, 0b00000001
; right_to_left active_led
;
; cpi btn_status, R2L_PRESSED
; brne PC+3
; ldi active_led, 0b10000000
; left_to_right active_led
;
; cpi btn_status, 0xFF
; brne PC+3
; ldi active_led, 0b00000001
; left_to_right active_led
;====================
; cpi btn_status, 0x00
; brne PC+4
; ldi setter, 0b10101010
; out PORTD, setter
; rjmp ret_overflow_handler
;
; cpi btn_status, RBTN_PRESSED
; brne PC+5
; ldi setter, 0b00000001
; out PORTD
; right_to_left active_led
; rjmp ret_overflow_handler
;
; cpi btn_status, LBTN_PRESSED
; brne PC+4
; ldi active_led, 0b00100000
; ; left_to_right active_led
; out PORTD, active_led
; rjmp ret_overflow_handler
;
; ser setter
; out PORTD, setter
ret_overflow_handler:
reti reti