выдать коды выключения индикаторов и затем отключить интерфейс. Да лее приводится текст программы, реализующий этот алгоритм работы.
;Программа управления температурой
.NOLIST
.INCLUDE "8535def.inc"
.LIST
;определить символические имена
.DEF |
templar 16 |
|
|
||
.DEF |
temph = rl7 |
|
|
||
.DEF |
saveF = r4 |
|
|
||
.DEF |
counT = rl8 |
|
|
||
.DEF |
rcnt = r!9 |
|
|
||
.EQU |
Mind = 0x100 |
|
; RAM для кодов индикации |
||
.EQU |
Made - 0x090 |
|
; RAM для кода АЦП |
||
.CSEG |
|
|
|
|
|
; вектора прерываний |
|
|
|||
.ORG $000 |
|
|
|||
|
rjmp |
ink |
|
; прерывание по reset |
|
|
rjmp |
key_cnt |
|
; прерывание intO |
|
.ORG $009 |
|
|
|||
|
rjmp |
cycle ; прерывание таймера 0 для запуска цикла |
|||
|
rjmp |
spistc |
; прерывание SPI |
||
.ORG $00e |
|
|
|
||
|
rjmp |
adc_cmt |
|
; прерывание АЦП |
|
.ORG $011 |
|
|
|
||
инициализация |
|
|
|||
ink: |
Idi |
tempi, low(RAMEND) |
|||
|
Idi |
temph, high(RAMEND) |
|||
|
out |
SPH, temph |
|
|
|
|
out |
SPL, tempi |
определить в указателе стека адрес RAMEND |
||
;порты ввода-вывода |
|
|
|||
|
Idi |
tempi, Obi 1000000 |
|||
|
clr |
|
temph |
|
|
|
out |
|
PORTA, temph |
||
|
out |
|
DDRA, tempi |
||
|
ser |
tempi |
|
|
|
|
out PORTB, tempi |
|
|||
|
out |
|
DDRB, tempi |
; порт В на вывод |
|
|
out PORTD, tempi |
|
|||
110
out |
DDRD, temph |
; порт D на ввод |
;внешнее прерывание INTO |
||
Idi |
tempi, (1«ISC01)|(0«ISC00) |
|
out |
MCUCR, tempi |
; INTO по падающему фронту |
Idi |
tempi, (1«INT0) |
|
out |
GIMSK, tempi |
; разрешение INTO |
прерывание таймера О |
|
|
Idi |
tempi, (1«ТО1Е0) |
|
out |
TIMSK, tempi |
|
;параметры SPI |
|
|
idi |
tempi Obi 1011001 |
|
out |
SPCR, tempi |
|
;параметры АЦП |
|
|
clr |
tempi |
|
out |
ADMUX, tempi |
;канал РАО для АЦП |
Idi |
tempi, 0Ы000Н01 |
|
out |
ADCSR, tempi |
|
sei |
; общее разрешение прерываний |
|
rcall |
ind_pff ; выключение индикации температуры |
|
; бессодержательный бесконечный цикл, может быть заменен любой граммой
main: nop
rjmp main
indoff:
;вывод нулевых байтов в SPI для отключения индикации
clr |
tempi |
|
Idi |
XL, low(Mind) |
|
Idi |
XH, high(Mind) ;начальный адрес RAM для кодов SPI |
|
st |
X+, tempi |
|
st |
X+, tempi |
|
st |
X+, tempi |
|
idi |
XL, low(Mind) восстановление в Х начального адреса |
|
rcall |
spi_stc |
;старт передачи байтов индикации |
ret |
|
|
;1NT0, кнопки управления keycnt:
сохранение в стеке регистров и флагов push tempi
push temph
push |
saveF |
|
in |
saveF, SREG |
|
;обработка сигналов "Стоп", "Пуск" |
||
in |
tempi, PINB |
; контроль сигнала СТОП |
sbrs |
tempi, PB2 |
|
rjmp |
cnt_off |
; перейти к процедуре СТОП |
sbrs |
tempi, PB1 |
; контроль сигнала ПУСК |
rjmp |
cnt_on |
; перейти к процедуре ПУСК |
;если оба сигнала в 1, завершить без изменения режима
key out:
; завершение с восстановлением из стека флагов и регистров
out |
SREG, saveF |
|
|
pop |
saveF |
|
|
pop |
temph |
|
|
pop |
tempi |
|
|
reti |
|
|
|
cnton: |
|
|
|
щереход в режим ПУСК |
|
||
tst |
rent |
завершить по признаку режима ПУСК |
|
brne |
key_out |
||
sbr |
rent, 0x80 установить признак режима ПУСК в rent |
||
Idi |
temph, 0x05 |
|
|
out |
TCCRO, temph ;запуск таймера циклов контроля |
||
clr |
counT |
;сброс счетчика для формирования цикла |
|
out |
ADMUX, counT - ;канал РАО для АЦП |
||
sbi |
ADCSR, ADSC ;запуск АЦП для 1 цикла контроля |
||
cbi |
PORTA, PA7 |
выключение охлаждения |
|
cbi |
PORTA, PA6 |
выключение подогрева |
|
rjmp |
key_out |
завершение процедуры |
|
cntoff: |
|
|
|
;переход в режим СТОП |
|
||
tst |
rent |
завершить по признаку режима СТОП |
|
breq |
key_out |
||
clr |
rent ;сбросить признаки режима ПУСК в rent |
||
clr |
temph |
|
|
out |
TCCRO, temph ;останов таймера циклов контроля |
||
out |
TCNTO, temph ;сброс таймера циклов контроля |
||
clr |
counT |
;сброс счетчика для формирования цикла |
|
cbi |
PORTA, PA7 |
выключение охлаждения |
|
cbi |
|
PORTA, PA6 |
выключение подофева |
||
waitspi: |
|
|
|
||
cpi |
|
XL, low(Mind) ;контроль вывода байтов индикации |
|||
breq cnt_end |
продолжение процедуры, если вывод завершен |
||||
sei |
|
разрешить прерывания при ожидании |
|||
rjmp |
waitspi ;возврат к контролю завершения цикла вывода |
||||
cntend: |
|
|
|
|
|
rcall |
|
ind_off |
;выключить индикацию температуры для СТОП |
||
rjmp |
key |
out |
завершение процедуры |
||
;периодический запуск цикла управления в режиме ПУСК |
|||||
cycle: |
|
|
|
|
|
push |
|
saveF |
|
|
|
in |
|
saveF, SREG |
|
||
tst |
|
rent |
;контроль режима ПУСК |
||
breq cyc_out |
|
завершить без запуска для СТОП |
|||
cpi |
|
counT, 15 |
;контроль количества прерываний таймера О |
||
breq eyedo |
|
;запуск цикла по 16 прерыванию |
|||
inc |
counT |
|
;инкремент количества прерываний |
||
rjmp |
cyc_out |
;завершить без запуска (<16) |
|||
eyedo: |
|
|
|
|
|
clr |
counT |
|
;очистка счетчика прерываний |
||
out |
ADMUX, counT |
;канал РАО для АЦП |
|||
sbi |
|
ADCSR, ADSC ;запуск АЦП, начало цикла контроля |
|||
завершение с восстановлением флагов |
|||||
cycout: |
|
|
|
|
|
out |
|
SREG, saveF |
|
||
pop |
|
saveF |
|
|
|
reti |
|
|
|
|
|
прерывание по завершению преобразования АЦП |
|||||
adeemt: |
|
|
|
|
|
push |
|
tempi |
|
|
|
push |
|
temph |
|
|
|
push |
|
saveF |
|
|
|
in |
saveF, SREG |
|
|||
tst |
rent |
|
|
|
|
breq |
|
adc_out |
завершить по признаку режима СТОП |
||
113
;прием кода температуры |
|||
in |
tempi, ADCL |
; младший байт кода АЦП |
|
in |
temph, ADCH |
; старший байт кода АЦП |
|
isr |
temph |
|
|
ror |
tempi |
|
|
lsr |
temph |
; двукратный сдвиг вправо с переносом |
|
ror |
tempi |
; для преобразования в 8-битовый формат |
|
in |
temph, ADMUX ;номер канала ? |
||
tst |
temph |
; |
|
brne tmtr |
;перейти к обработке, если PAl (датчик 2) |
||
sbi |
ADMUX, ADMUXO установить канал PAl |
||
sbi |
ADCSR, ADSC |
; запустить преобразование в АЦП |
|
sts |
Made, tempi |
; сохранить код канала РАО (датчик 1) |
|
rjmp |
adc_out |
|
завершить процедуру для повторения АЦП |
tmtr:
; преобразование кода температуры
Ids |
temph, Made ;считать из RAM код РАО |
||
add |
tempi, temph;сложить коды PAl и РАО |
||
ror |
tempi |
;сдвинуть вправо с переносом сложения |
|
;анализ кода температуры |
|||
cpi |
tempi, 230 |
;порог включения охлаждения |
|
brcs |
thresh 1 |
;перейти к следующему порогу, если < |
|
rcall |
cool |
|
;включить охлаждение |
rjmp |
bedt |
|
завершить анализ |
thresh 1: |
|
|
|
cpi |
tempi, 210 |
; порог выключения охлаждения |
|
brcc bedt |
; завершить анализ, если > |
||
hresh2: |
|
|
|
cpi |
tempi, 160 |
; порог включения подогрева |
|
brcc |
thresh3 |
; перейти к следующему порогу, если > |
|
rcall |
cool |
|
;включить подогрев |
rjmp |
bedt |
|
завершить анализ |
hresh3: |
|
|
|
cpi |
tempi, 180 |
; порог выключения подогрева |
|
brcs |
bedt |
|
; завершить анализ, если < |
rcall |
offch |
|
;выключить средства изменения температуры |
rjmp |
bedt |
|
; завершить анализ |
114