|
; Масштабирование отсчета АЦП. r19r18 = ADC*r21r20/1024
scale:
sbi ADMUX,ADLAR ; Устанавливаем левое выравнивание - сэкономим далее 6 сдвигов
in r22,ADCL ; Читаем отсчет АЦП - он уже умножен на 64, как заказано выше
in r23,ADCH ;
ldi r20,#low(5005) ; Грузим коэффициент пересчета
ldi r21,#high(5005) ;
rcall mulu16x16 ; Умножаем отсчет на коэффициент и получаем масштабированный отсчет в r19r18
ret
; Подпрограмма беззнакового умножения, r19:r18:r17:r16 = r23:r22 * r21:r20. 17 тактов + rcall/ret
mulu16x16:
clr r2
mul r23,r21
movw r18,r0
mul r22,r20
movw r16,r0
mul r23,r20
add r17,r0
adc r18,r1
adc r19,r2
mul r21,r22
add r17,r0
adc r18,r1
adc r19,r2
ret