Most MCU-dependent variable definitions ist now put into node-specific files. Makes it easier to maintain code for different node types.
228 lines
4.4 KiB
NASM
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
|
|
|
|
|
|
|
|
|