From: Arlet Ottens on
Mike Warren wrote:
> Can someone please offer a suggestion for a way to check if a value
> has changed up or down by at least some threshold. It doesn't matter
> how long it takes but code size and register use are important.
>
> I'm not sure how to handle values lower than ChangeThreshold or
> higher then 255 - ChangeThreshold.
>
> .equ ChangeThreshold = 6
> .def OldValue = R16
> .def NewValue = R17
>
> Available registers R10, R11, R12, R13, R19, R24
>
> CheckForChange:
> ; Determine if NewValue > OldValue + ChangeThreshold
> ; or NewValue < OldValue - ChangeThreshold
> rjmp HasChanged

how about this:

sub r17, r16 ; diff = new - old
brcc new_bigger ;
neg r17 ; if (new < old) diff = old - new
new_bigger:
cpi r17, 6 ; if (diff >= 6 )
brsh HasChanged ; has changed


From: Mike Warren on
Arlet Ottens wrote:

> how about this:
>
> sub r17, r16 ; diff = new - old
> brcc new_bigger ;
> neg r17 ; if (new < old) diff = old - new
> new_bigger:
> cpi r17, 6 ; if (diff >= 6 )
> brsh HasChanged ; has changed

That looks great. Thank you.

--
-Mike