valsched: only repeat values in first loop.

This commit is contained in:
Martin Preuss
2025-05-15 00:58:54 +02:00
parent b775c9b6b2
commit 92b7d1bb13

View File

@@ -11,15 +11,16 @@
; ***************************************************************************
; defines
.equ VALSCHED_OFFS_TIMER = 0
.equ VALSCHED_OFFS_FLAGS = 1
.equ VALSCHED_DATA_SIZE = 2
.equ VALSCHED_OFFS_TIMER = 0
.equ VALSCHED_OFFS_FLAGS = 1
.equ VALSCHED_DATA_SIZE = 2
.equ VALSCHED_FLAGS_VALUE_BIT = 0
.equ VALSCHED_FLAGS_TOSEND_BIT = 1
.equ VALSCHED_FLAGS_REPEAT_BIT = 2
.equ VALSCHED_FLAGS_REPEAT0_BIT = 6
.equ VALSCHED_FLAGS_REPEAT1_BIT = 7
.equ VALSCHED_FLAGS_VALUE_BIT = 0
.equ VALSCHED_FLAGS_TOSEND_BIT = 1
.equ VALSCHED_FLAGS_REPEAT_BIT = 2
.equ VALSCHED_FLAGS_FIRSTLOOP_BIT = 3
.equ VALSCHED_FLAGS_REPEAT0_BIT = 6
.equ VALSCHED_FLAGS_REPEAT1_BIT = 7
.equ VALSCHED_REPORTTIME1 = 1 ; report after 100ms
.equ VALSCHED_REPORTTIME2 = 11 ; report after 1100ms
@@ -71,20 +72,26 @@ ValueScheduler_Fini:
; @clobbers r16, r17
ValueScheduler_Every100ms:
ldd r17, Y+VALSCHED_OFFS_FLAGS
ldd r16, Y+VALSCHED_OFFS_TIMER
inc r16
breq ValueScheduler_Every100ms_end ; timer on hold
breq ValueScheduler_Every100ms_end ; timer on hold
std Y+VALSCHED_OFFS_TIMER, r16
cpi r16, VALSCHED_REPORTTIME1
breq ValueScheduler_Every100ms_setSendFlag
sbrs r17, VALSCHED_FLAGS_FIRSTLOOP_BIT
rjmp ValueScheduler_Every100ms_checkInterval ; jump if not first round
cpi r16, VALSCHED_REPORTTIME2
breq ValueScheduler_Every100ms_setSendFlag
cpi r16, VALSCHED_REPORTTIME3
breq ValueScheduler_Every100ms_setSendFlag
ValueScheduler_Every100ms_checkInterval:
cpi r16, VALSCHED_INTERVAL
brne ValueScheduler_Every100ms_end
brcs ValueScheduler_Every100ms_end
; interval finished, check for repeat
ldd r17, Y+VALSCHED_OFFS_FLAGS
cbr r17, (1<<VALSCHED_FLAGS_FIRSTLOOP_BIT) ; not first loop
std Y+VALSCHED_OFFS_FLAGS, r17
clr r16
sbrs r17, VALSCHED_FLAGS_REPEAT_BIT
dec r16 ; bit not set, stop counter after this interval
@@ -159,6 +166,8 @@ ValueScheduler_SetValue_reduced:
breq ValueScheduler_SetValue_set0
; set 1
ldd r17, Y+VALSCHED_OFFS_FLAGS
sbr r17, (1<<VALSCHED_FLAGS_FIRSTLOOP_BIT) ; mark first loop
sbr r17, (1<<VALSCHED_FLAGS_REPEAT_BIT) ; set repeat bit
sbrs r17, VALSCHED_FLAGS_REPEAT1_BIT
cbr r17, (1<<VALSCHED_FLAGS_REPEAT_BIT) ; clear repeat bit if not wanted for "1"
@@ -167,6 +176,7 @@ ValueScheduler_SetValue_reduced:
rjmp ValueScheduler_SetValue_resetTimer
ValueScheduler_SetValue_set0:
ldd r17, Y+VALSCHED_OFFS_FLAGS
sbr r17, (1<<VALSCHED_FLAGS_FIRSTLOOP_BIT) ; mark first loop
sbr r17, (1<<VALSCHED_FLAGS_REPEAT_BIT)
sbrs r17, VALSCHED_FLAGS_REPEAT0_BIT
cbr r17, (1<<VALSCHED_FLAGS_REPEAT_BIT) ; clear repeat bit if not wanted for "0"