;========================== ; Author: Marcel Schirmer ; Date: 31.05.2025 ;========================== .nolist .include "./m328Pdef.inc" .list .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 .org 0x0020 rjmp overflow_handler .include "./macros.inc" init: ;-- ; Output Ports definieren ;---- ser setter 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 ;---- ldi setter, 0b00000011 out TCCR0B, setter ; CLK/1024 ergibt 250.000 Timer-Ticks/Sekunde ldi setter, 0b00000001 sts TIMSK0, setter ; Timer-Interupt aktivieren sei ; globale Interrups aktivieren ;-- ; Definiere Startzustand ;---- ldi setter, 0 out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren ldi setter, 0b00000001 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 loop: ;-- ; Dreh Dräumchen und lass den Timer-Interrupt die Show leiten ;---- rjmp loop overflow_handler: inc overflows 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