Код:
make1: ;прием кода
in templ, ADCL ; младший байт кода АЦП
in temph, ADCH ; старший байт кода АЦП
lsr temph
ror templ
lsr temph ; двукратный сдвиг вправо с переносом
ror templ ; для преобразования в 8-битовый формат
in temph, ADMUX ;номер канала ?
tst temph ;
brne tmtr ;перейти к обработке
sbi ADMUX, MUX0 ;установить канал РА1
sbi ADCSR, ADSC ; запустить преобразование в АЦП
sts Madc, templ ; сохранить код канала РА0
EEwrite:
sbic EECR, EEWE ; ждем готовности памяти к записи, крутимся в цикле
rjmp EEWrite ; до тех пор пока не очистится флаг EEWE
cli ; затем запрещаем прерывания
out EEARL,R16 ; загружаем адресс нужной ячейки
out EEARH, R17 ; старший и младший байт адресса
out EEDR, R21 ; и сами данные
sbi EECR, EEMWE ; взводим предохранитель
sbi EECR. EEWE ; записываем байт
sei ; разрешаем прерывания
reti ; вовзрат из процедуры
EERead:
sbic EECR,EEWE ; ждем пока будет завершена прошлая запись
rjmp EEread ; также крутимся в цикле
out EEARL, r16 ; загружаем адресс нужной ячейки
out EEARH, r17 ; его старшие и младшие байты
sbi EECR, EERE ; выставляем бит чтения
in r21, EEDR ; забираем из регистра данных результат
reti
tmtr: ;
lds temph, Madc
;считать из RAM код PA0
sub temph, templ ;вычесть коды РА0 и РА1, получив ошибку
rol temph ;сдвинуть влево с переносом вычитания
ldi r18,32 ; загружаем константу 32 в регистр 18
mul r17,r18 ; умножаем ошибку которая находится в регистре r17 на константу хранящуюся в регистре r18
mul r17,EEDR; умножаем полученное выражение на число хранящимся в EEPROM
mul r17, temph
EEDR * temph/800
;анализ кода температуры
cpi templ, 28 ; допустимый порог
brcs thresh1 ;перейти к следующему порогу, если <
rcall Pump1 ;включить насос1
rjmp bcdt ;завершить анализ
thresh1:
cpi templ, 25 ; порог выключения Pump1
brcc bcdt ; завершить анализ, если >
thresh2:
cpi templ, 23 ; порог включения pump2
rcall Pump2 ;включить подогрев
rjmp bcdt ;завершить анализ
;включение Pump1
Pump1:
sbis PINA, PA7 ;пропустить, если включено
sbi PORTA, PA7 ;включить
ret ;возврат
;включение Pump2
Pump2:
sbis PINA, PA6 ;пропустить, если включено
sbi PORTA, PA6 ;включить подогрев
ret ;
;выключение Pump1 и Pump2
offch:
sbic PINA, PA7 ; пропустить, если выключено
cbi PORTA, PA7 ; выключить охлаждение
sbic PINA, PA6 ; пропустить, если выключено
cbi PORTA, PA6 ; выключить подогрев
ret ;
;преобразование кода в bcd формат для индикации
bcdt:
clr temph ;очистка регистра для десятичной цифры
hunst: ;определение цифры сотен
cpi templ, 100 ;
brcs hunout ;перейти к сохранению сотен для SPI
subi templ, 100 ;вычесть 100
inc temph ;инкремент сотен
rjmp hunst ;повторить цикл вычислений
hunout: ; код индикации и запись в RAM для SPI
rcall code_ind
decst: clr temph ; очистка регистра для десятичной цифры
cpi templ, 10 ; определение цифры десятков
brcs decout ; перейти к сохранению сотен для SPI
subi templ, 10 ; вычесть 10
inc temph ; инкремент десятков
rjmp decst ; повторить цикл вычислений
decout: ; код индикации и запись в RAM для SPI десятков
rcall code_ind
; код индикации и запись в RAM для SPI десятков
mov temph, templ ;передать цифру единиц
rcall code_ind ;
rjmp str_spi ;перейти к старту SPI
code_ind:
ldi ZL, low(cdind*2) ;
ldi ZH, high(cdind*2) ; адрес FLASH для кодов индикации
add ZL, temph ;смещение адреса по цифре в temph
lpm
;прочитать код индикации для цифры из temph
st -X, r0 ;сохранить код индикации в RAM для SPI
ret ;возврат
;старт SPI для передачи кодов индикации
str_spi:
ldi XL, low(Mind)
ldi XH, high(Mind) ;начальный адрес RAM для кодов SPI
rcall spi_stc ;старт передачи байтов индикации
adc_out: ; завершение с восстановлением из стека флагов и регистров
out SREG, saveF
pop saveF
pop templ
reti
;передача кодов управления индикацией
spi_stc:
push templ
push temph
push saveF
in saveF, SREG
cpi XL, low(Mind+3) ;
breq load ;
ld templ, X+ ;
cpi XL, low(Mind+2) ;
brne skip ;
sbr templ, 0x80 ;
skip:
out SPDR, templ ;
spi_out: ; завершение с восстановлением из стека флагов и регистров
out SREG, saveF
pop saveF
pop templ
reti
load:
cbi PORTB, PB0
nop
nop
nop ;
sbi PORTB, PB0 ;
rjmp spi_out ;
.ORG 0x0800 cdind: ;коды индикации цифр, начиная с нуля
.dB 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
;end of file