Files
01_atmega328_lauflicht/main.asm

129 lines
3.3 KiB
NASM

;==========================
; 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 early_exit ; early Return wenn Schwellenwert noch nicht erreicht
clr overflows ; Überlaufzähler kontrolliert zurücksetzen
in btn_status, PINB ; Aktuellen Button Zustand einlesen
;--
; Geh direkt zur Animationslogik wenn
; kein Button gedrückt
; oder
; wenn der gedrückt Button dem der aktuellen
; Animation entspricht
;----
cpi btn_status, 0
breq run_animation ; kein Button gedrückt
cp cur_direction, btn_status
breq run_animation ; Animation bildet aktuellen Button-Status bereit ab
;------
;--
; 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
;------
run_animation:
cpi cur_direction, L2R
brne check_r2l
left_to_right active_led
reti
check_r2l:
cpi cur_direction, R2L
brne show_err_code
right_to_left active_led
reti
early_exit:
reti
show_err_code:
ldi setter, 0b00011000
out PORTD, setter
reti