Files
aqhomecontrol/avr/modules/holdtimer/main.asm
Martin Preuss 88a66f6822 avr: add complex fan controller app with base classes to be used by other apps as well.
- add modules
  - holdtimer (keep actor running while triggered)
  - triggeraction (connect actor with holdtimer)
- add app fan_controller
  - uses the modules mentioned above to turn on/off fans in connection
    with e.g. motion sensor nodes
2026-08-06 00:05:50 +02:00

284 lines
7.0 KiB
NASM

; ***************************************************************************
; copyright : (C) 2026 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. *
; ***************************************************************************
#ifndef AQH_AVR_MODULES_HOLDTIMER_MAIN_ASM
#define AQH_AVR_MODULES_HOLDTIMER_MAIN_ASM
; ---------------------------------------------------------------------------
; @routine HTIM_Init @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @return Y pointer to data in RAM
; @clobbers r16, r18, r19
HTIM_Init:
; get RAM ptr
lpm yl, Z+
lpm yh, Z
sbiw zh:zl, 1
; read default reload value
adiw zh:zl, HTIM_FLASH_OFFS_RELOADVAL_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl, (HTIM_FLASH_OFFS_RELOADVAL_LO+1)
; setup RAM data
clr r16
std Y+HTIM_RAM_OFFS_FLAGS, r16
std Y+HTIM_RAM_OFFS_CURRVAL_LO, r16
std Y+HTIM_RAM_OFFS_CURRVAL_HI, r16
std Y+HTIM_RAM_OFFS_RELOAD_LO, r18
std Y+HTIM_RAM_OFFS_RELOAD_HI, r19
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_EnableActor @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers R16 (any)
HTIM_EnableActor:
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
sbr r16, (1<<HTIM_FLAGBIT_ACTORENABLED)
std Y+HTIM_RAM_OFFS_FLAGS, r16
sbrs r16, HTIM_FLAGBIT_ACTIVE
rjmp HTIM_EnableActor_ret
sbrc r16, HTIM_FLAGBIT_STATE
rcall htimCallActorOn ; turn on actor if state is ON
HTIM_EnableActor_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_DisableActor @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers R16
HTIM_DisableActor:
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
cbr r16, (1<<HTIM_FLAGBIT_ACTORENABLED)
std Y+HTIM_RAM_OFFS_FLAGS, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_Start @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers R16
HTIM_Start:
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
sbr r16, (1<<HTIM_FLAGBIT_ACTIVE)
std Y+HTIM_RAM_OFFS_FLAGS, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_Stop @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers R16
HTIM_Stop:
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
cbr r16, (1<<HTIM_FLAGBIT_ACTIVE)
std Y+HTIM_RAM_OFFS_FLAGS, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_Trigger @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers Y
HTIM_Trigger:
rjmp htimReloadTimer
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_OnEveryTick @global
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers r16, r16, r24, r25 (any)
HTIM_OnEveryTick:
ldd r17, Y+HTIM_RAM_OFFS_FLAGS
sbrs r17, HTIM_FLAGBIT_ACTIVE
rjmp HTIM_OnEveryTick_ret
; active
ldd r24, Y+HTIM_RAM_OFFS_CURRVAL_LO
ldd r25, Y+HTIM_RAM_OFFS_CURRVAL_HI
mov r16, r24 ; value 0?
or r16, r25
breq HTIM_OnEveryTick_ret ; yes, nothing to do
sbiw r25:r24, 1
std Y+HTIM_RAM_OFFS_CURRVAL_LO, r24 ; store new value
std Y+HTIM_RAM_OFFS_CURRVAL_HI, r25
brne HTIM_OnEveryTick_ret ; jmp if not 0
; just became zero, turn actor off
sbrc r17, HTIM_FLAGBIT_STATE
rcall htimCallActorOff ; only call if ON
HTIM_OnEveryTick_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_ReadEepromAt
;
; @param Z pointer to data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @param X EEPROM address
; @return X EEPROM address after the data handled by this routine
; @clobbers r16, r17, Y
HTIM_ReadEepromAt:
push yl
push yh
adiw yh:yl, HTIM_RAM_OFFS_RELOAD_LO ; start at reload value
ldi r17, HTIM_EE_SIZE
bigcall Eeprom_ReadBytes ; (r16, r17, X, Y)
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine HTIM_WriteEepromAt
;
; @param Z pointer to data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @param X EEPROM address
; @return X EEPROM address after the data handled by this routine
; @clobbers r16, r17, r18, Y
HTIM_WriteEepromAt:
push yl
push yh
adiw yh:yl, HTIM_RAM_OFFS_RELOAD_LO ; start at reload value
ldi r17, HTIM_EE_SIZE
bigcall Eeprom_WriteBytes ; (r16, r17, r18, X, Y)
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine htimCallActorOn
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers any (!Y, !Z)
htimCallActorOn:
ldd r17, Y+HTIM_RAM_OFFS_FLAGS
sbr r17, (1<<HTIM_FLAGBIT_STATE)
std Y+HTIM_RAM_OFFS_FLAGS, r17
adiw zh:zl, HTIM_FLASH_OFFS_ON_PTR_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl,(HTIM_FLASH_OFFS_ON_PTR_LO+1)
mov r16, r18
or r16, r19
breq htimCallActorOn_ret
push r18 ; jmp via stack
push r19
htimCallActorOn_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine htimCallActorOff
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers any (!Y, !Z)
htimCallActorOff:
ldd r17, Y+HTIM_RAM_OFFS_FLAGS
cbr r17, (1<<HTIM_FLAGBIT_STATE)
std Y+HTIM_RAM_OFFS_FLAGS, r17
adiw zh:zl, HTIM_FLASH_OFFS_OFF_PTR_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl,(HTIM_FLASH_OFFS_OFF_PTR_LO+1)
mov r16, r18
or r16, r19
breq htimCallActorOff_ret
push r18 ; jmp via stack
push r19
htimCallActorOff_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine htimReloadTimer
;
; @param Z pointer to timer data in FLASH (byte address for lpm!)
; @param Y pointer to data in RAM
; @clobbers none
htimReloadTimer:
ldd r17, Y+HTIM_RAM_OFFS_FLAGS
sbrs r17, HTIM_FLAGBIT_ACTIVE
rjmp htimReloadTimer_ret ; jmp if not active
; really reload timer
ldd r16, Y+HTIM_RAM_OFFS_RELOAD_LO
std Y+HTIM_RAM_OFFS_CURRVAL_LO, r16
ldd r16, Y+HTIM_RAM_OFFS_RELOAD_HI
std Y+HTIM_RAM_OFFS_CURRVAL_HI, r16
; switch fans ON
sbrc r17, HTIM_FLAGBIT_ACTORENABLED
rcall htimCallActorOn ; turn on actor
htimReloadTimer_ret:
ret
; @end
#endif