From fa335392aff3d62403ee610c8906003f5a8e7b95 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 13 Apr 2026 00:20:38 +0200 Subject: [PATCH] avr: improved beeper code dont start beeper already when setting timer because it might be quite some time until the timer is called again which could make the beeper beep an anoyingly long time. --- avr/modules/beeper_simple/main.asm | 52 ++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/avr/modules/beeper_simple/main.asm b/avr/modules/beeper_simple/main.asm index 1bce73e..077a945 100644 --- a/avr/modules/beeper_simple/main.asm +++ b/avr/modules/beeper_simple/main.asm @@ -17,6 +17,7 @@ beeperSimpleTimer: .byte 1 beeperSimpleOnTime: .byte 1 beeperSimpleOffTime: .byte 1 +beeperSimpleRepeat: .byte 1 @@ -43,6 +44,7 @@ BeeperSimple_Init: sts beeperSimpleTimer, r16 sts beeperSimpleOnTime, r16 sts beeperSimpleOffTime, r16 + sts beeperSimpleRepeat, r16 sec ret @@ -56,17 +58,32 @@ BeeperSimple_Init: BeeperSimple_Every100ms: lds r16, beeperSimpleTimer tst r16 - breq BeeperSimple_Every100ms_ret + brne BeeperSimple_Every100ms_dec + lds r17, beeperSimpleRepeat + tst r17 + brne BeeperSimple_Tick_restartTimer + rjmp BeeperSimple_Every100ms_ret +BeeperSimple_Every100ms_dec: dec r16 - brne BeeperSimple_Every100ms_setTimer - - sbis BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; skip next op if beeper is on + breq BeeperSimple_Every100ms_zero + rjmp BeeperSimple_Every100ms_setTimer +BeeperSimple_Every100ms_zero: + sbis BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; skip next op if BEEPER is on rjmp BeeperSimple_Tick_isOff ; is on cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off lds r16, beeperSimpleOffTime rjmp BeeperSimple_Every100ms_setTimer BeeperSimple_Tick_isOff: + lds r16, beeperSimpleRepeat + tst r16 + breq BeeperSimple_Every100ms_setTimer ; no repeat, go stop timer + dec r16 + sts beeperSimpleRepeat, r16 + brne BeeperSimple_Tick_restartTimer + ; repeat counter reached 0, stop timer + rjmp BeeperSimple_Every100ms_setTimer +BeeperSimple_Tick_restartTimer: sbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; on lds r16, beeperSimpleOnTime BeeperSimple_Every100ms_setTimer: @@ -77,24 +94,39 @@ BeeperSimple_Every100ms_ret: +; --------------------------------------------------------------------------- +; @routine BeeperSimple_BeepShort @global +; +; Short beep. +; +; @clobbers R18, R19, R20 + +BeeperSimple_BeepShort: + ldi r18, 2 + ldi r19, 1 + ldi r20, 1 + rjmp BeeperSimple_SetTiming +; @end + + + ; --------------------------------------------------------------------------- ; @routine BeeperSimple_SetTiming @global ; ; Set blinking timing for LED. Switch LED on. ; @param r18 ontime (in 1/10s) ; @param r19 offtime (in 1/10s) -; @clobbers none +; @param r20 repeat counter +; @clobbers r16 ; BeeperSimple_SetTiming: cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off sts beeperSimpleOnTime, r18 - sts beeperSimpleTimer, r18 sts beeperSimpleOffTime, r19 - tst r18 - breq BeeperSimple_SetTiming_ret - sbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; on -BeeperSimple_SetTiming_ret: + sts beeperSimpleRepeat, r20 + clr r16 + sts beeperSimpleTimer, r16 ret ; @end