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
This commit is contained in:
Martin Preuss
2025-08-25 10:19:23 +02:00
parent bae188ddee
commit 66ac029a69
5 changed files with 270 additions and 0 deletions

View File

@@ -14,7 +14,9 @@
flash
lcd
led
led_activity
led_simple
led_signal
ma_light
motion
owimaster

View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
main.asm
</extradist>
</gwbuild>

View File

@@ -0,0 +1,90 @@
; ***************************************************************************
; 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. *
; ***************************************************************************
.equ LED_ACTIVITY_TIME = 2
; ***************************************************************************
; data
.dseg
ledActivityTimer: .byte 1
; ***************************************************************************
; code
.cseg
LED_ACTIVITY_BEGIN:
; ---------------------------------------------------------------------------
; LedActivity_Init
;
; @return CFLAG: set if okay, clear on error
; USED: R1, R2, R3, R4, R16, R17, X
LedActivity_Init:
sbi LED_ACTIVITY_DDR, LED_ACTIVITY_PINNUM ; out
ldi r16, 50
sts ledActivityTimer, r16 ; keep on for 5s at the beginning
sec
ret
; ---------------------------------------------------------------------------
; @routine LedActivity_Every100ms @global
;
; @clobbers r16, r17
LedActivity_Every100ms:
lds r16, ledActivityTimer
tst r16
breq LedActivity_Every100ms_ret
dec r16
sts ledActivityTimer, r16
brne LedActivity_Every100ms_ret
sbi LED_ACTIVITY_PORT, LED_ACTIVITY_PINNUM ; turn LED off
LedActivity_Every100ms_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine LedActivity_Restart @global
;
; @clobbers r16
LedActivity_Trigger:
lds r16, ledActivityTimer
tst r16
brne LedActivity_Trigger_ledIsOn
cbi LED_ACTIVITY_PORT, LED_ACTIVITY_PINNUM ; turn LED on
LedActivity_Trigger_ledIsOn:
ldi r16, LED_ACTIVITY_TIME
sts ledActivityTimer, r16
ret
; @end
LED_ACTIVITY_END:
.equ MODULE_SIZE_LED_ACTIVITY = LED_ACTIVITY_END-LED_ACTIVITY_BEGIN

View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
main.asm
</extradist>
</gwbuild>

View File

@@ -0,0 +1,156 @@
; ***************************************************************************
; 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