moved multiplication function to "common" dir, added divide routine.

This commit is contained in:
Martin Preuss
2025-05-10 15:16:05 +02:00
parent c7823d3874
commit 4baa949a77
5 changed files with 133 additions and 53 deletions

View File

@@ -306,7 +306,7 @@ si7021CalcTemp:
mov r21, r19
ldi r23, HIGH(17572)
ldi r22, LOW(17572)
rcall si7021Mulu16x16_32 ; result is in R19:R18:R17:R16, we only use R19-R18 -> /65536
rcall Utils_Mulu16x16_32 ; result is in R19:R18:R17:R16, we only use R19-R18 -> /65536
ldi r16, LOW(4685)
ldi r17, HIGH(4685)
sub r18, r16
@@ -332,7 +332,7 @@ si7021CalcHumidity:
mov r21, r19
clr r23
ldi r22, 125
rcall si7021Mulu16x16_32 ; result is in R19:R18:R17:R16, we only use R19-R18 -> /65536
rcall Utils_Mulu16x16_32 ; result is in R19:R18:R17:R16, we only use R19-R18 -> /65536
ldi r16, 6
clr r17
sub r18, r16
@@ -341,57 +341,6 @@ si7021CalcHumidity:
; ---------------------------------------------------------------------------
; si7021Mulu16x16_32
;
; Multiplies two unsigned 16 bit values resulting in one 32 bit value.
; This is a rather simple but reasonable fast routine working just like you would
; when doing multiplications with pen and paper.
; TODO: adapt for signed values
;
; IN:
; - R21:R20: 16 bit value A
; - R23:R22: 16 bit value B
; OUT:
; - R19:R18:R17:R16: 32 bit result
; USED: R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26
; R19:R18:R17:R16 = R21:R20 * R23:R22
; R19:R18:R17:R16 = R25:R24:R21:R20 * R23:R22
si7021Mulu16x16_32:
clr r19
clr r18
clr r17
clr r16
clr r25
clr r24
ldi r26, 16 ; 16 bit multiplicator
si7021Muls16x16_32_loop:
lsr r23
ror r22
brcc si7021Muls16x16_32_noadd ; current digit in B is 0, don't add shifted A to result
add r16, r22
adc r17, r23
adc r18, r24
adc r19, r25
; brcs si7021Muls16x16_32_overflow ; can't happen
si7021Muls16x16_32_noadd:
dec r26
breq si7021Muls16x16_32_done
lsl r20
rol r21
rol r24
rol r25
; brcs si7021Muls16x16_32_overflow ; can't happen
rjmp si7021Muls16x16_32_loop
si7021Muls16x16_32_done:
clc
ret
;si7021Muls16x16_32_overflow: ; never reached. Multiplying 2 16 bit values can't overflow 32 bit
; sec
; ret
; ---------------------------------------------------------------------------
; @routine SI7021_GetValue @global
;