Материал: Микропроцессорные устройства систем управления (2005)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

выдать коды выключения индикаторов и затем отключить интерфейс. Да лее приводится текст программы, реализующий этот алгоритм работы.

;Программа управления температурой

.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

Источник: https://studfile.net/preview/16521245/