use a clock and a data line to introduce synchronisation into the protocol to be able to work with the wide range of mcu speeds (no need for exact timing, no need for exact calibration).
263 lines
4.7 KiB
NASM
263 lines
4.7 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2025 by Martin Preuss
|
|
; email : martin@libchipcard.de
|
|
;
|
|
; ***************************************************************************
|
|
; * This file is part of the project "AqHome". *
|
|
; * Please see toplevel file COPYING of that project for license details. *
|
|
; ***************************************************************************
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; code
|
|
|
|
|
|
.cseg
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine main @global
|
|
|
|
main:
|
|
cli
|
|
; 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 watchdogOff ; turn off watchdog timer (sometimes it stays on after reboot)
|
|
|
|
bigcall systemSetSpeed
|
|
bigcall systemInitHardware
|
|
bigcall Utils_Init
|
|
bigcall Utils_SetupUid
|
|
bigcall initModules
|
|
bigcall initApps
|
|
bigcall Utils_InitialWait
|
|
sei ; Enable interrupts
|
|
|
|
bigcall onSystemStart
|
|
|
|
#ifdef MODULES_LED
|
|
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
|
|
#endif
|
|
|
|
main_loop:
|
|
bigcall systemSleep ; system-dependant
|
|
|
|
; run loop as long as some run function returns with CFLAG set
|
|
clr r17
|
|
main_runLoop:
|
|
push r17
|
|
clr r16
|
|
push r16
|
|
bigcall runModules
|
|
pop r16
|
|
sbci r16, 0
|
|
|
|
push r16
|
|
bigcall runApps
|
|
pop r16
|
|
sbci r16, 0
|
|
|
|
push r16
|
|
bigcall onEveryLoop ; call into main app
|
|
pop r16
|
|
pop r17
|
|
|
|
tst r16
|
|
breq main_endRunLoop
|
|
inc r17
|
|
cpi r17, 2
|
|
brcc main_endRunLoop
|
|
brne main_runLoop
|
|
main_endRunLoop:
|
|
|
|
#ifdef MODULES_NETWORK
|
|
#ifndef MAIN_WITHOUT_MSG_HANDLING
|
|
rcall mainHandleMessages
|
|
#endif
|
|
#endif
|
|
|
|
rjmp main_loop
|
|
|
|
main_loop_reboot:
|
|
cli
|
|
bigjmp BOOTLOADER_ADDR
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine onSystemTimerTick
|
|
;
|
|
; Called every 100ms. No arguments, no results.
|
|
|
|
onSystemTimerTick:
|
|
bigcall onEvery100ms
|
|
|
|
#ifdef MODULES_CLOCK
|
|
bigcall Clock_Every100ms ; generates calls to onEverySecond/Minute/Hour/Day
|
|
#endif
|
|
|
|
#ifdef MODULES_LED_SIMPLE
|
|
bigcall LedSimple_Every100ms
|
|
#endif
|
|
|
|
#ifdef MODULES_UART_BITBANG
|
|
bigcall UART_BitBang_Every100ms
|
|
#endif
|
|
|
|
#ifdef MODULES_UART_HW
|
|
bigcall NET_Uart_Every100ms
|
|
#endif
|
|
|
|
#ifdef MODULES_TTYONUART1
|
|
bigcall TtyOnUart1_Periodically
|
|
#endif
|
|
|
|
#ifdef MODULES_COMONUART0
|
|
bigcall ComOnUart0_Periodically
|
|
#endif
|
|
|
|
#ifdef MODULES_COMONUART1
|
|
bigcall ComOnUart1_Periodically
|
|
#endif
|
|
|
|
#ifdef MODULES_COM2W
|
|
bigcall COM2W_Every100ms
|
|
#endif
|
|
|
|
|
|
#ifdef MODULES_COM2W0
|
|
bigcall COM2W0_Periodically
|
|
#endif
|
|
|
|
#ifdef MODULES_COM2W1
|
|
bigcall COM2W1_Periodically
|
|
#endif
|
|
|
|
#ifdef MODULES_TCRT1000
|
|
bigcall TCRT1K_Every100ms
|
|
#endif
|
|
|
|
#ifdef MODULES_BRIGHTNESS
|
|
bigcall Brightness_Every100ms
|
|
#endif
|
|
|
|
#ifdef APPS_NETWORK
|
|
ldi yl, LOW(netInterfaceData)
|
|
ldi yh, HIGH(netInterfaceData)
|
|
bigcall AppNetwork_Every100ms
|
|
#endif
|
|
|
|
#ifdef APPS_MOTION
|
|
bigcall AppMotion_Every100ms
|
|
#endif
|
|
|
|
#ifdef APPS_DOOR
|
|
bigcall AppDoor_Every100ms
|
|
#endif
|
|
|
|
#ifdef APPS_MA_LIGHT
|
|
bigcall AppMotionLight_Every100ms
|
|
#endif
|
|
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
#ifdef MODULES_CLOCK
|
|
|
|
sysOnEverySecond:
|
|
#ifdef MODULES_DS18B20
|
|
bigcall Ds18b20_OnEverySecond
|
|
#endif
|
|
|
|
#ifdef APPS_REPORTSENSORS
|
|
bigcall AppReportSensors_OnEverySecond
|
|
#endif
|
|
|
|
#ifdef MODULES_SGP30
|
|
bigcall SGP30_EverySecond
|
|
#endif
|
|
|
|
bigjmp onEverySecond
|
|
; @end
|
|
|
|
|
|
sysOnEveryMinute:
|
|
#ifdef APPS_STATS
|
|
bigcall AppStats_OnEveryMinute
|
|
#endif
|
|
|
|
#ifdef MODULES_CCS811
|
|
bigcall CCS811_OnEveryMinute
|
|
#endif
|
|
|
|
bigjmp onEveryMinute
|
|
; @end
|
|
|
|
|
|
sysOnEveryHour:
|
|
bigjmp onEveryHour
|
|
; @end
|
|
|
|
|
|
sysOnEveryDay:
|
|
#ifdef APPS_NETWORK
|
|
ldi yl, LOW(netInterfaceData)
|
|
ldi yh, HIGH(netInterfaceData)
|
|
bigcall AppNetwork_EveryDay
|
|
#endif
|
|
|
|
#ifdef APPS_ROUTER
|
|
bigcall AppRouter_EveryDay
|
|
#endif
|
|
|
|
bigjmp onEveryDay
|
|
; @end
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef MODULES_NETWORK
|
|
; ---------------------------------------------------------------------------
|
|
; @routine mainHandleMessages
|
|
|
|
mainHandleMessages:
|
|
bigcall NET_GetNextIncomingMsgNum ; R16=msg num
|
|
brcc mainHandleMessages_end
|
|
bigcall NET_Buffer_Locate ; X=buffer addr (R17)
|
|
adiw xh:xl, 1
|
|
|
|
push r16
|
|
bigcall onMessageReceived
|
|
bigcall mainModulesOnPacketReceived
|
|
bigcall mainAppsOnPacketReceived
|
|
pop r16
|
|
bigcall NET_Buffer_ReleaseByNum
|
|
sec
|
|
mainHandleMessages_end:
|
|
ret
|
|
; @end
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|