Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1575
Скачиваний: 1
выдать коды выключения индикаторов и затем отключить интерфейс. Да лее приводится текст программы, реализующий этот алгоритм работы.
;Программа управления температурой
.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