rjmp contPT
prs:
sbrs Flag,1 ;расчет давления
rjmp contPT
ldi r28,pZH ;установка адреса коэфф. Z
ld temp,Y+
mov KoeffH,temp
ld temp,Y
mov KoeffL,temp ;получили коэфф. Z давления
adc AregL,KoeffL
add AregH,KoeffH ;прибавили к величине
ldi r28,pKH ;установка адреса коэфф. К
ld temp,Y+ mov
KoeffH,temp
ld temp,Y
mov KoeffL,temp ;получили коэфф. К давления
rcall Мр16 ;умножили
;деление на 1024
mov AregL,temp1
mov AregH,temp2 ;на 256
lsr AregH ;сдвинули старший
ror AregL ;сдвинули младший
lsr AregH ;сдвинули старший
ror AregL ;сдвинули младший; еще на 4
contPT:
sbrc Flag,0
ldi r28,TdH ;установка адреса — T
sbrc Flag,1
ldi r28,PdH ;установка адреса — P
rcall bin2BCD16 ;преобраз в дв. дес.
st Y+,ResH ;запоминаем в памяти старший BCD
mov temp,ResL ;младший распаковываем
swap temp
andi temp,0b00001111
st Y+,temp
mov temp,ResL
andi temp,0b00001111
st Y,temp ;и тоже сохраняем в памяти
;установка флагов и переменных для следующего цикла
clr count
sbrc Flag,0
rjmp _F0
clr Flag
sbr Flag,0x1 ;был бит 1, устанавливаем бит 0
reti
_F0:
clr Flag ;был бит 0, устанавливаем бит 1
sbr Flag,0x2
reti ;TIME0
readADC: ;чтение АЦП по прерыванию
sbrc Flag,0
ldi r28,Tram ;установка адреса — T
sbrc Flag,1
ldi r28,Pram ;установка адреса — P
ld AregH,Y+
ld AregL,Y
in temp1,ADCL ;получаем младший
in temp,ADCH ;старший
add AregL,tempi ;суммируем
adc AregH,temp
dec r28
st Y+,AregH ;запоминаем сумму
st Y,AregL ;в памяти
reti ;ADC
Мр16: ;умножение двух 16-разрядных величин
;AregL multiplicand low byte
;AregH multiplicand high byte
;KoeffL multiplier low byte
;KoeffH multiplier high byte
;temp result byte 0 (LSB)
;tempi result byte 1
;temp2 result byte 2
clr temp2 ;очистить ставший
mul AregL,KoeffL ;умножаем младшие
mov temp,r0 ;в r0 младший результата операции mul
mov temp1,r1 ;в r01 старший результата операции mul
mul AregH,KoeffL ;умножаем старший на младший
add tempi,r0 ;в r младший результата операции mul
adc temp2,r1 ;в r01 старший результата операции mul
mul AregL,KoeffH ;умножаем младший на старший
add temp1,r0 ;в r0 младший результата операции mul
adc temp2,r1 ;в r01 старший результата операции mul
mul AregH,KoeffH ;умножаем старший на старший
add temp2,r0 ;4-й разряд нам тут не требуется, но он в r01
ret
bin2BCD16: ;преобразование 16-разрядного hex в упакованный BCD
;input: hex value low=AregL hex value high = AregH
;output: BCD value digits 1 and 0 ResL
;BCD value digits 2 and 3(=0) ResH
ldi tempi,16 ;Init loop counter
clr ResH
clr ResL
clr ZH ;clear ZH (not needed for AT90Sxx0x)
bBCDx_1: lsl AregL ;shift input value
rol AregH ;through all bytes
rol ResL;
rol ResH
dec temp1 ;decrement loop counter
brne bBCDx_2 ;if counter not zero
ret ;return
bBCDx_2:ldi r30,AtBCD2+1 ;Z points to result MSB + 1
bBCDx_3:
ld temp, — Z ;get (Z) with pre-decrement
subi temp, — $03 ;add 0x03
sbrc temp,3 ;if bit 3 not clear
st Z, temp ;store back
ld temp, Z ;get (Z)
subi temp, — $30 ;add 0x30
sbrc temp, 7 ;if bit 7 not clear
st Z,temp ;store back
cpi ZL,AtBCDO ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1
bin2bcd8: ;преобразование 8-разрядного hex в неупакованный BCD
;вход hex= temp, выход BCD temp1 — старш.; temp — младш.
;эта процедура работает только для исходного меньше 100
clr tempi ;clear result MSD
bBCD8_1: subi temp,10 ;input = input — 10
brcs bBCD8_2 ;abort if carry set
inc temp1 ;inc MSD
rjmp bBCD8_1 ;loop again
bBCD8_2:subi temp, — 10 ;compensate extra subtraction
ret
RESET: ;точка запуска программы после включения
ldi temp,low(RAMEND) ;загрузка указателя стека
out SPL,temp
ldi temp,high(RAMEND) ;загрузка указателя стека
out SPH,temp
ldi temp,1<
out ACSR,temp ;выкл. аналог, компаратор на всякий
;установка портов вход-выход
ldi temp,0b00111111 ;разряды
out DDRB,temp
ldi temp,0b01111111 ;сегменты
out DDRC,temp
ldi temp,0b10000000 ;знак "минус"
out DDRD,temp
;установка АЦП
ldi temp, 1<<<<
;start ADC 1/32 такт = 128 кГц ;interrupt enable
Читать дальше
Конец ознакомительного отрывка
Купить книгу