diff --git a/README.md b/README.md index 4659d1e..e98b15d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Stage 2: -- [ ] Hardcodiertes Lauflicht L2R Richtung +- [x] Hardcodiertes Lauflicht L2R Richtung - [ ] Hardcodiertes Lauflicht R2L Richtung ## Stage 3: diff --git a/main.asm b/main.asm index 5f7cc28..c754c2c 100644 --- a/main.asm +++ b/main.asm @@ -7,12 +7,72 @@ .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: - ser R16 - out DDRD, R16 - out PORTD, R16 + ;-- + ; 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 - rjmp init