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
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