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.
This commit is contained in:
Martin Preuss
2026-04-13 00:20:38 +02:00
parent f63eb308b3
commit fa335392af

View File

@@ -17,6 +17,7 @@
beeperSimpleTimer: .byte 1 beeperSimpleTimer: .byte 1
beeperSimpleOnTime: .byte 1 beeperSimpleOnTime: .byte 1
beeperSimpleOffTime: .byte 1 beeperSimpleOffTime: .byte 1
beeperSimpleRepeat: .byte 1
@@ -43,6 +44,7 @@ BeeperSimple_Init:
sts beeperSimpleTimer, r16 sts beeperSimpleTimer, r16
sts beeperSimpleOnTime, r16 sts beeperSimpleOnTime, r16
sts beeperSimpleOffTime, r16 sts beeperSimpleOffTime, r16
sts beeperSimpleRepeat, r16
sec sec
ret ret
@@ -56,17 +58,32 @@ BeeperSimple_Init:
BeeperSimple_Every100ms: BeeperSimple_Every100ms:
lds r16, beeperSimpleTimer lds r16, beeperSimpleTimer
tst r16 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 dec r16
brne BeeperSimple_Every100ms_setTimer breq BeeperSimple_Every100ms_zero
rjmp BeeperSimple_Every100ms_setTimer
sbis BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; skip next op if beeper is on BeeperSimple_Every100ms_zero:
sbis BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; skip next op if BEEPER is on
rjmp BeeperSimple_Tick_isOff rjmp BeeperSimple_Tick_isOff
; is on ; is on
cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off
lds r16, beeperSimpleOffTime lds r16, beeperSimpleOffTime
rjmp BeeperSimple_Every100ms_setTimer rjmp BeeperSimple_Every100ms_setTimer
BeeperSimple_Tick_isOff: 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 sbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; on
lds r16, beeperSimpleOnTime lds r16, beeperSimpleOnTime
BeeperSimple_Every100ms_setTimer: 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 ; @routine BeeperSimple_SetTiming @global
; ;
; Set blinking timing for LED. Switch LED on. ; Set blinking timing for LED. Switch LED on.
; @param r18 ontime (in 1/10s) ; @param r18 ontime (in 1/10s)
; @param r19 offtime (in 1/10s) ; @param r19 offtime (in 1/10s)
; @clobbers none ; @param r20 repeat counter
; @clobbers r16
; ;
BeeperSimple_SetTiming: BeeperSimple_SetTiming:
cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off cbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; off
sts beeperSimpleOnTime, r18 sts beeperSimpleOnTime, r18
sts beeperSimpleTimer, r18
sts beeperSimpleOffTime, r19 sts beeperSimpleOffTime, r19
tst r18 sts beeperSimpleRepeat, r20
breq BeeperSimple_SetTiming_ret clr r16
sbi BEEPER_SIMPLE_PORT, BEEPER_SIMPLE_PINNUM ; on sts beeperSimpleTimer, r16
BeeperSimple_SetTiming_ret:
ret ret
; @end ; @end