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