Files
aqhomecontrol/avr/main.asm
Martin Preuss 0c87d3fc4d build: Reorganized code.
Most MCU-dependent variable definitions ist now put into node-specific files.
Makes it easier to maintain code for different node types.
2023-02-02 00:44:50 +01:00

228 lines
4.4 KiB
NASM

.cseg
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
; ldi r16, 1
; sts twiMasterScanEnabled, r16
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:
#ifdef MODULES_TIMER
rcall Timer_Init
#endif
#ifdef MODULES_LED
ldi zl, LOW(ledA3Flash)
ldi zh, HIGH(ledA3Flash)
ldi yl, LOW(ledA3Sram)
ldi yh, HIGH(ledA3Sram)
rcall Led_Init
#endif
#ifdef MODULES_COM
rcall Com_Init
#endif
#ifdef MODULES_TWI_MASTER
rcall TWI_Master_Init
#endif
#ifdef MODULES_LCD
rcall LCD_Init
#endif
#ifdef MODULES_BMP280
rcall BMP280_Init
#endif
#ifdef MODULES_SI7021
rcall SI7021_Init
#endif
; done
ret
; ---------------------------------------------------------------------------
; runModulesUntilIdle
;
; Call run functions of the used modules. Add your routine calls here.
;
; IN:
; - nothing
; OUT:
; - nothing
; USED: depending on called routines
runModulesUntilIdle:
#ifdef MODULES_TIMER
; TIMER module
rcall Timer_Run
#endif
#ifdef MODULES_COM
; COM module (call until carry flag cleared but at most 10 times to not starve other modules)
ldi r16, 10
runModulesUntilIdle_Com:
push r16
rcall Com_Run
pop r16
brcc runModulesUntilIdle_ComEnd
dec r16
brne runModulesUntilIdle_Com
runModulesUntilIdle_ComEnd:
#endif
; add more modules here
ret
printSendStats:
push r15
in r15, SREG ; debug
cli
#ifdef MODULES_SI7021
ldi r18, 0
ldi r19, 1
rcall LCD_SetCursor
ldi zl, LOW(textSi7021Firmware)
ldi zh, HIGH(textSi7021Firmware)
rcall LCD_PrintFromFlash
lds r16, si7021Flags
rcall LCD_PrintHexByte
ldi r16, 32
rcall LCD_PrintChar
lds r18, si7021LastTemp
lds r19, si7021LastTemp+1
rcall LCD_PrintHexWord
ldi r16, 32
rcall LCD_PrintChar
lds r18, si7021LastHumidity
lds r19, si7021LastHumidity+1
rcall LCD_PrintHexWord
#endif
ldi r18, 0
ldi r19, 2
rcall LCD_SetCursor
ldi zl, LOW(textStatsPacketsIn)
ldi zh, HIGH(textStatsPacketsIn)
rcall LCD_PrintFromFlash
lds r18, comStatsPacketsIn
lds r19, comStatsPacketsIn+1
rcall LCD_PrintHexWord
ldi r18, 0
ldi r19, 3
rcall LCD_SetCursor
ldi zl, LOW(textStatsPacketsRecvErr)
ldi zh, HIGH(textStatsPacketsRecvErr)
rcall LCD_PrintFromFlash
lds r18, comStatsRecvErrs
lds r19, comStatsRecvErrs+1
rcall LCD_PrintHexWord
ldi r18, 0
ldi r19, 5
rcall LCD_SetCursor
ldi zl, LOW(textStatsPacketsOut)
ldi zh, HIGH(textStatsPacketsOut)
rcall LCD_PrintFromFlash
lds r18, comStatsPacketsOut
lds r19, comStatsPacketsOut+1
rcall LCD_PrintHexWord
ldi r18, 0
ldi r19, 6
rcall LCD_SetCursor
ldi zl, LOW(textStatsCollisions)
ldi zh, HIGH(textStatsCollisions)
rcall LCD_PrintFromFlash
lds r18, comStatsCollisions
lds r19, comStatsCollisions+1
rcall LCD_PrintHexWord
ldi r18, 0
ldi r19, 7
rcall LCD_SetCursor
ldi zl, LOW(textStatsAborted)
ldi zh, HIGH(textStatsAborted)
rcall LCD_PrintFromFlash
lds r18, comStatsAborted
lds r19, comStatsAborted+1
rcall LCD_PrintHexWord
pop r15
out SREG, r15
ret
textSi7021Firmware: .db "SI: ", 0, 0
textStatsPacketsIn: .db "In : ", 0
textStatsPacketsRecvErr: .db "RecvErr: ", 0
textStatsPacketsOut: .db "Out : ", 0
textStatsCollisions: .db "Coll : ", 0
textStatsAborted: .db "Aborted: ", 0