adc_conversion:
rcall channel_0 ;włšcz kanał 0
clr zh
ldi zl,adr0
channel_set:
clr licz
clr bin_bl
clr bin_bh
adc_loop:
push licz
push bin_bl
push bin_bh
clr licz
clr bin_bl
clr bin_bh
clr bin_al
clr bin_ah
adc_sum_loop:
clr temp
out adch,temp
out adcl,temp
sbi adcsr,adsc
adc_pending:
sbic adcsr,adsc ;czekaj na zakończenie przetwarzania
rjmp adc_pending
in bin_al,adcl ;zachowaj odczytanš wartoć
in bin_ah,adch
add bin_bl,bin_al
adc bin_bh,bin_ah
inc licz
cpi licz,4 ;sumuj 4 kolejne próbki z adc
brne adc_sum_loop
lsr bin_bh ;podziel sumę przez 2 ---- TO TRZEBA USUNĄĆ?
ror bin_bl ; ---- TO TEŻ?
mov bin_al,bin_bl
mov bin_ah,bin_bh
adc_end:
pop bin_bh
pop bin_bl
pop licz
add bin_bl,bin_al ;sumuj 32 odczyty
adc bin_bh,bin_ah
inc licz
cpi licz,32
brne adc_loop
lsr bin_bh ;podziel sumę przez 32 (urednianie)
ror bin_bl
lsr bin_bh
ror bin_bl
lsr bin_bh
ror bin_bl
lsr bin_bh
ror bin_bl
lsr bin_bh
ror bin_bl
mov bin_al,bin_bl
mov bin_ah,bin_bh
lds bin_bl,offset_l ;załaduj wartoć błędu offsetu
lds bin_bh,offset_h
cpi bin_bh,$ff ;jeżeli offset_h = $ff to znaczy że
brne no_offset_check ;trwa kalibracja
ret
no_offset_check:
cp bin_al,bin_bl
cpc bin_ah,bin_bh
brlo offset_higher_result ;nie pozwól na "przekręcenie" wyniku
sub bin_al,bin_bl ;odejmij błšd offsetu od wyniku
sbc bin_ah,bin_bh
offset_higher_result:
mov bin_bl,bin_al
mov bin_bh,bin_ah
no_offset_error:
in temp,admux
andi temp,$0f
cpi temp,0
brne check_chan_1
st z+,bin_ah
st z+,bin_al
rcall channel_1
rjmp channel_set
check_chan_1: ;odczyty dla kanałów nr. 0,1
cpi temp,1
brne check_chan_2
st z+,bin_ah
st z+,bin_al
rcall channel_2
rjmp channel_set
check_chan_2:
cpi temp,2
brne check_chan_3
lsr bin_ah ;dzielenie przez 2 (ze względu
ror bin_al ;na przedwzmacniacz LM358)
st z+,bin_ah
st z+,bin_al
rcall channel_3
rjmp channel_set
check_chan_3:
cpi temp,3
brne check_chan_4
st z+,bin_ah
st z+,bin_al
rcall channel_4
rjmp channel_set
check_chan_4:
cpi temp,4
brne check_chan_end
st z+,bin_ah
st z,bin_al
check_chan_end:
rcall difvol_set
ret