;========================== ; Author: Marcel Schirmer ; Date: 31.05.2025 ;========================== .nolist .include "./m328Pdef.inc" .list .def setter = R16 .def overflows = R17 .def active_led = R18 .org 0x0000 rjmp init .org 0x0020 rjmp overflow_handler .macro check_led cpi active_led, @0 brne PC+3 ldi setter, (1<<@0) out PORTD, setter .endmacro init: ;-- ; Output Ports definieren ;---- ser setter out DDRD, setter ; Alle LEDs standardmäßig aus ;-- ; 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 active_led, 0 ldi setter, 0 out TCNT0, setter ; Timer/Counter explizit mit 0 initialisieren main: clr setter out PORTD, setter ; Alle LEDs erstmal aus ;-- ; Schalte aktuell aktive LED gezielt wieder an ;---- check_led 0 check_led 1 check_led 2 check_led 3 check_led 4 check_led 5 check_led 6 check_led 7 rjmp main 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 inc active_led ; nächste LED aktivieren cpi active_led, 8 ; prüfen ob LED-Zähler überzählt wurde brne overflow_handler_exit ; early Return solange die aktive LED im erlaubten Bereich liegt ldi active_led, 0 ; LED-Zähler kontrolliert zurücksetzen overflow_handler_exit: reti