moved multiplication function to "common" dir, added divide routine.
This commit is contained in:
@@ -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
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user