From 66ac029a691eec544726e717a39f792c6d271bf1 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 25 Aug 2025 10:19:23 +0200 Subject: [PATCH] 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 --- avr/modules/0BUILD | 2 + avr/modules/led_activity/0BUILD | 11 +++ avr/modules/led_activity/main.asm | 90 +++++++++++++++++ avr/modules/led_signal/0BUILD | 11 +++ avr/modules/led_signal/main.asm | 156 ++++++++++++++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 avr/modules/led_activity/0BUILD create mode 100644 avr/modules/led_activity/main.asm create mode 100644 avr/modules/led_signal/0BUILD create mode 100644 avr/modules/led_signal/main.asm diff --git a/avr/modules/0BUILD b/avr/modules/0BUILD index 781cd54..7c9081f 100644 --- a/avr/modules/0BUILD +++ b/avr/modules/0BUILD @@ -14,7 +14,9 @@ flash lcd led + led_activity led_simple + led_signal ma_light motion owimaster diff --git a/avr/modules/led_activity/0BUILD b/avr/modules/led_activity/0BUILD new file mode 100644 index 0000000..febd367 --- /dev/null +++ b/avr/modules/led_activity/0BUILD @@ -0,0 +1,11 @@ + + + + + + main.asm + + + + + diff --git a/avr/modules/led_activity/main.asm b/avr/modules/led_activity/main.asm new file mode 100644 index 0000000..091e079 --- /dev/null +++ b/avr/modules/led_activity/main.asm @@ -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 + + + diff --git a/avr/modules/led_signal/0BUILD b/avr/modules/led_signal/0BUILD new file mode 100644 index 0000000..febd367 --- /dev/null +++ b/avr/modules/led_signal/0BUILD @@ -0,0 +1,11 @@ + + + + + + main.asm + + + + + diff --git a/avr/modules/led_signal/main.asm b/avr/modules/led_signal/main.asm new file mode 100644 index 0000000..8475d01 --- /dev/null +++ b/avr/modules/led_signal/main.asm @@ -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 + + +