Files
aqhomecontrol/avr/main.asm

296 lines
6.0 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:
rcall Utils_Init
#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(textUid)
ldi zh, HIGH(textUid)
rcall LCD_PrintFromFlash
push xh ; 1-4: UID
push xl
rcall Utils_ReadUid ; (R16, X)
pop xl
pop xh
push r18
push r19
mov r18, r20
mov r19, r21
rcall LCD_PrintHexWord
pop r19
pop r18
rcall LCD_PrintHexWord
ldi r18, 0
ldi r19, 3
rcall LCD_SetCursor
ldi zl, LOW(textRandom)
ldi zh, HIGH(textRandom)
rcall LCD_PrintFromFlash
rcall Utils_PseudoRandom
rcall LCD_PrintHexByte
ldi r16, 32
rcall LCD_PrintChar
lds r18, utilsSeed
lds r19, utilsSeed+1
rcall LCD_PrintHexWord
#ifdef MODULES_COM
ldi r18, 0
ldi r19, 4
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, 5
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, 6
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, 7
rcall LCD_SetCursor
ldi zl, LOW(textStatsCollisions)
ldi zh, HIGH(textStatsCollisions)
rcall LCD_PrintFromFlash
lds r18, comStatsCollisions
lds r19, comStatsCollisions+1
rcall LCD_PrintHexWord
#endif
pop r15
out SREG, r15
ret
#ifdef MODULES_SI7021
#ifdef MODULES_COM
Main_SendValueMsg:
; send message for current temp
lds r22, si7021Flags
mov r16, r22
andi r16, SI7021_FLAGS_TEMP_VALID
breq sendValueMsg_checkHum
ldi r16, 0xff ; destination address
ldi r17, VALUE_ID_TEMP1 ; value id
push r22
ldi r22, AQHOME_VALUETYPE_TEMP
lds r18, si7021LastTemp ; value
lds r19, si7021LastTemp+1
ldi r20, 100 ; denominator
clr r21
rcall CPRO_EnqueueValue
pop r22
sendValueMsg_checkHum:
mov r16, r22
andi r16, SI7021_FLAGS_HUM_VALID
breq sendValueMsg_done
ldi r16, 0xff ; destination address
ldi r17, VALUE_ID_HUM1 ; value id
push r22
ldi r22, AQHOME_VALUETYPE_HUMIDITY
lds r18, si7021LastHumidity ; value
lds r19, si7021LastHumidity+1
ldi r20, 1 ; denominator
clr r21
rcall CPRO_EnqueueValue
pop r22
sendValueMsg_done:
ret
#endif
#endif
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
textUid: .db "UID : ", 0
textRandom: .db "RANDOM : ", 0