Files
aqhomecontrol/avr/modules/led_signal/main.asm
Martin Preuss 66ac029a69 avr: introduce two more led modules.
- led_signal: blink 8 status bits (short=0, long=1)
- led_activity: blink for a short period after a trigger, e.g. for network
  activity
2025-08-25 10:19:23 +02:00

157 lines
3.3 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. *
; ***************************************************************************
; ***************************************************************************
; data
.dseg
ledSignalTimer: .byte 1
ledSignalFlags: .byte 1
ledSignalRunFlags: .byte 1
ledSignalBitCounter: .byte 1
; ***************************************************************************
; code
.cseg
LED_SIGNAL_BEGIN:
; ---------------------------------------------------------------------------
; LedSignal_Init
;
; @return CFLAG: set if okay, clear on error
; USED: R1, R2, R3, R4, R16, R17, X
LedSignal_Init:
sbi LED_SIGNAL_DDR, LED_SIGNAL_PINNUM ; out
clr r16
sts ledSignalFlags, r16
ldi r16, 100
sts ledSignalTimer, r16
sec
ret
; ---------------------------------------------------------------------------
; @routine LedSignal_Every100ms @global
;
; @clobbers r16, r17
LedSignal_Every100ms:
lds r16, ledSignalTimer
dec r16
breq LedSignal_Every100ms_timer0
sts ledSignalTimer, r16
cpi r16, 80
brcs LedSignal_Every100ms_checkBit
brne LedSignal_Every100ms_ret
rcall LedSignal_Restart ; (r16, r17)
rjmp LedSignal_Every100ms_ret
LedSignal_Every100ms_checkBit:
lds r17, ledSignalRunFlags
andi r17, 1
brne LedSignal_Every100ms_bit1
LedSignal_Every100ms_bit0:
cpi r16, 8
breq LedSignal_Every100ms_ledOff
rjmp LedSignal_Every100ms_ret
LedSignal_Every100ms_bit1:
cpi r16, 3
breq LedSignal_Every100ms_ledOff
rjmp LedSignal_Every100ms_ret
LedSignal_Every100ms_ledOff:
sbi LED_SIGNAL_PORT, LED_SIGNAL_PINNUM ; off
rjmp LedSignal_Every100ms_ret
LedSignal_Every100ms_timer0:
lds r17, ledSignalBitCounter
dec r17
brne LedSignal_Every100ms_nextBit
ldi r17, 100
sts ledSignalTimer, r17
rjmp LedSignal_Every100ms_ret
LedSignal_Every100ms_nextBit:
sts ledSignalBitCounter, r17
lds r16, ledSignalRunFlags
lsr r16
sts ledSignalRunFlags, r16
ldi r16, 10
sts ledSignalTimer, r16
cbi LED_SIGNAL_PORT, LED_SIGNAL_PINNUM ; on
LedSignal_Every100ms_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine LedSignal_Restart @global
;
; @clobbers r16, r17
LedSignal_Restart:
ldi r16, 8
sts ledSignalBitCounter, r16
ldi r16, 10
sts ledSignalTimer, r16
lds r16, ledSignalFlags
sts ledSignalRunFlags, r16
cbi LED_SIGNAL_PORT, LED_SIGNAL_PINNUM ; on
ret
; @end
; ---------------------------------------------------------------------------
; @routine LedSignal_SetFlag @global
;
; @param r16 flag mask
; @clobbers r17
LedSignal_SetFlag:
lds r17, ledSignalFlags
or r17, r16
sts ledSignalFlags, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine LedSignal_ClrFlag @global
;
; @param r16 flag mask
; @clobbers r17
LedSignal_ClrFlag:
lds r17, ledSignalFlags
com r16
and r17, r16
com r16
sts ledSignalFlags, r17
ret
; @end
LED_SIGNAL_END:
.equ MODULE_SIZE_LED_SIGNAL = LED_SIGNAL_END-LED_SIGNAL_BEGIN