Files
aqhomecontrol/avr/main.asm
Martin Preuss 112e15e41b Initial import.
2023-01-16 23:12:09 +01:00

194 lines
3.5 KiB
NASM

.nolist
.include "include/tn84def.inc" ; Define device ATtiny84
.list
; ***************************************************************************
; code segment
.cseg
.org 000000
; ***************************************************************************
; Reset and interrupt vectors
rjmp main ; Reset vector
reti ; EXT_INT0
reti ; PCI0
reti ; PCI1
reti ; WATCHDOG
reti ; ICP1
reti ; OC1A
reti ; OC1B
reti ; OVF1
rjmp timerIrqOC0A ; OC0A
reti ; OC0B
reti ; OVF0
reti ; ACI
reti ; ADCC
reti ; ERDY
reti ; USI_STR
reti ; USI_OVF
; ***************************************************************************
; includes
.include "timer.asm"
.include "led.asm"
.include "utils.asm"
; ***************************************************************************
; data in SRAM
.dseg
ledA3Sram: .byte LED_SRAM_SIZE
; ***************************************************************************
; data in FLASH
.cseg
ledA3Flash: .db DDRA+0x20, PORTA+0x20, PINA+0x20, (1<<PORTA3)
blinkPattern: .db 5, 5, 5, 5, 5, 10, 0xff, 0xff ; 3 short blinks, 1s pause, restart
main:
; setup stack
.ifdef SPH ; if SPH is defined
ldi r16, High(RAMEND)
out SPH, r16 ; init MSB stack pointer
.endif
ldi r16, Low(RAMEND)
out SPL, r16 ; init LSB stack pointer
rcall initModules
sei ; Enable interrupts
ldi xl, LOW(blinkPattern) ; debug: set blink pattern
ldi xh, HIGH(blinkPattern)
ldi zl, LOW(ledA3Flash)
ldi zh, HIGH(ledA3Flash)
ldi yl, LOW(ledA3Sram)
ldi yh, HIGH(ledA3Sram)
rcall Led_SetPattern
main_loop:
rcall runModulesUntilIdle
; sbi DDRA, PORTA2 ; debug
; sbi PINA, PORTA2 ; debug (toggle)
; cbi PORTA, PORTA2 ; debug (on)
; sbi PORTA, PORTA2 ; debug (off)
; only modify SE, SM1 and SM0
in r16, MCUCR
ldi r17, (1<<SE) | (1<<SM1) | (1<<SM0)
neg r17
and r16, r17
ori r16, (1<<SE) ; sleep mode "idle", enable
out MCUCR, r16
sleep ; sleep, wait for interrupt
rjmp main_loop
; ***************************************************************************
; initModules
;
; Call init functions of the used modules. Add your routine calls here.
;
; IN:
; - nothing
; OUT:
; - nothing
; USED: depending on called routines
initModules:
rcall Timer_Init
ldi zl, LOW(ledA3Flash)
ldi zh, HIGH(ledA3Flash)
ldi yl, LOW(ledA3Sram)
ldi yh, HIGH(ledA3Sram)
rcall Led_Init
ret
; ***************************************************************************
; runModulesUntilIdle
;
; Call run functions of the used modules. Add your routine calls here.
;
; IN:
; - nothing
; OUT:
; - nothing
; USED: depending on called routines
runModulesUntilIdle:
runModulesUntilIdle_Timer: ; repeat this block for every run function
rcall Timer_Run ;
brcs runModulesUntilIdle_Timer ;
ret
; ***************************************************************************
; onEvery100ms
;
; Called every 100ms. Add your routine calls here.
;
; IN:
; - nothing
; OUT:
; - nothing
; USED: depending on called routines
onEvery100ms:
; ticker for LED module
ldi zl, LOW(ledA3Flash)
ldi zh, HIGH(ledA3Flash)
ldi yl, LOW(ledA3Sram)
ldi yh, HIGH(ledA3Sram)
rcall Led_Tick
; add more calls here
ret
; ***************************************************************************
; onEverySecond
;
; Called every second. Add your routine calls here.
;
; IN:
; - nothing
; OUT:
; - nothing
; USED: depending on called routines
onEverySecond:
ret