diff --git a/main.asm b/main.asm index 982782c..e4e5b36 100644 --- a/main.asm +++ b/main.asm @@ -10,6 +10,13 @@ .def setter = R16 .def overflows = R17 .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 rjmp init @@ -23,7 +30,18 @@ init: ; Output Ports definieren ;---- 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 @@ -40,20 +58,108 @@ init: ldi setter, 0 out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren 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 ;---- - rjmp main + rjmp loop overflow_handler: inc overflows - 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 - clr overflows ; Überlaufzähler kontrolliert zurücksetzen - right_to_left active_led - overflow_handler_exit: + cpi overflows, 246 ; bei ~980 Überläufe/Sekunde entsprechen 245 Überläufe ca. 250ms + brne ret_overflow_handler ; early Return wenn Schwellenwert noch nicht erreicht + clr overflows ; Überlaufzähler kontrolliert zurücksetzen + in btn_status, PINB + + 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