Код: Выделить всё
...
...
...
ldi r16, 0b00100111 ; VCC as VREF, ADC left, вход ADC7 (PA7)
out ADMUX, r16
ldi r16, 0b11000011 ; Enable ADС, Prescale = 1/8
out ADCSR, r16
adc_cnv_DT:
sbic ADCSR, 6
rjmp adc_cnv_DT
in r16, ADCL ; читаем код АЦП
in r17, ADCH ;
ldi ZL, low(ADC_TEMP_3900) ; Характеристика датчика
ldi ZH, high(ADC_TEMP_3900);
add ZH, ZH
add ZL, ZL
brcc ZH_no_inc
inc ZH
ZH_no_inc:
ldi r24, 170+20 ; Ищем диапазон характеристики датчика
low_ADC:
subi r24, 10
lpm r20,Z+
lpm r21,Z+
cp r21, r17
brlo low_ADC
brne hig_ADC
cp r20, r16
brlo low_ADC ; r17:r16 измеренное значение ADC
hig_ADC:
sbiw ZL, 4
lpm r18,Z+ ; наименьшая точка диапазона ADCmin
lpm r19,Z+ ;
;
sub r21,r19
sub r20,r18
brcc r21_nopDT
dec r21 ; ширина диапазона ADC
r21_nopDT:
sub r17,r19
sub r16,r18
brcc r17_nopDT
dec r17 ; смещение точки
r17_nopDT: ; измеренного значения в диапазоне ADC
ldi r22, 10
mul r24, r22 ; температура наим. точки диапазона ADC
ldi r23, 50 ;
ldi r24, $ff ;
div_r2120:
inc r24 ;
sub r20, r23 ;
brcc div_r2120 ;
subi r21, 1 ;
brcc div_r2120 ;
add r20, r23 ;
lsr r23
sub r20, r23
brcs no_corect
inc r24 ;
no_corect:
add r17, r17 ;
add r16, r16
brcc r17_nopDT1
inc r17
r17_nopDT1:
ldi r20, $ff ;
div_r1716:
inc r20 ;
sub r16, r24 ;
brcc div_r1716 ;
subi r17, 1 ;
brcc div_r1716 ;
add r16, r24 ;
lsr r24
sub r16, r24
brcs no_corect1
inc r20 ;
no_corect1:
sub r0, r20 ;
brcc r1_nopDT ;
dec r1 ;
r1_nopDT:
mov r16, r0
mov r17, r1
subi r16, $f4 ;
brcc r17_nopDT2 ;
dec r17 ;
r17_nopDT2:
subi r17, $01 ; На выходе r17:r16 температура в hex, шкала 0.1*C
...
...
...
ADC_TEMP_3900: ; Material Constant = 3900
.dw $0544,$0640
.dw $0802,$0ac0,$0e4a,$1360,$1a40,$2440,$31c0,$4440
.dw $5c40,$7900,$9880,$b700,$d0c0,$e3c0,$efc0,$f6c8
.dw $4f80 ; АЦП при t=25*C