Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1562
Скачиваний: 1
;прием кода температуры |
|||
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
;включение охлаждения |
||||
cool: |
||||
sbis |
PINA, PA7 |
пропустить, если включено |
||
sbi |
PORTA, PA7 |
;включить охлаждение |
||
ret |
;возврат |
|||
;включение подогрева |
||||
heat: |
||||
sbis |
PINA, PA6 |
пропустить, если включено |
||
sbi |
PORTA, PA6 |
;включить подогрев |
||
ret |
; |
|||
выключение охлаждения и подогрева |
||||
offch: |
||||
sbic |
PINA, PA7 |
; пропустить, если выключено |
||
cbi |
PORTA, PA7 |
; выключить охлаждение |
||
sbic |
PINA, PA6 |
; пропустить, если выключено |
||
cbi |
PORTA, PA6 |
; выключить подогрев |
||
ret |
; |
|||
преобразование кода в bed формат для индикации |
||||
bedt: |
||||
clr |
temph |
;очистка регистра для десятичной цифры |
||
hunst: |
определение цифры сотен |
|||
cpi |
tempi, 100; |
|||
brcs |
hunout |
;перейти к сохранению сотен для SPI |
||
subi |
tempi, 100;вычесть 100 |
|||
inc |
temph |
;инкремент сотен |
||
rjmp |
hunst |
;повторить цикл вычислений |
||
hunout: |
; код индикации и запись в RAM для SP1 |
|||
rcall |
codeind |
|||
decst: |
||||
clr |
temph |
; очистка регистра для десятичной цифры |
||
cpi |
tempi, 10 |
; определение цифры десятков |
||
brcs |
decout |
; перейти к сохранению сотен для SPI |
||
subi |
tempi, 10 |
; вычесть 10 |
||
inc |
temph |
; инкремент десятков |
||
rjmp |
decst |
; повторить цикл вычислений |
||
decout: |
; код индикации и запись в RAM для SPI десятков |
|||
rcall |
code |
ind |
||
115
; код индикации и запись в RAM для SPI десятков |
|||
mov |
temph, 1ешр1;передать цифру единиц |
||
rcall |
code_ind |
; |
|
rjmp |
str_spi |
;перейти к старту SPI |
|
code |
ind: |
||
Idi |
ZL, Iow(cdind*2) ; |
||
Idi |
ZH, high(cdind*2); адрес FLASH для кодов индикации |
||
add |
ZL, temph |
;смещение адреса по цифре в temph |
|
Ipm |
;прочитать код индикации для цифры из temph |
||
st |
-X, гО |
сохранить код индикации в RAM для SPI |
|
ret |
;возврат |
||
;старт SPI для передачи кодов индикации |
|||
strspi: |
|||
Idi |
XL, low(Mind) |
||
Idi |
XH, high(Mind) ;начальный адрес RAM для кодов SPI |
||
rcall |
spi_stc |
;старт передачи байтов индикации |
|
adcout:
; завершение с восстановлением из стека флагов и регистров
out |
SREG, saveF |
pop |
saveF |
pop |
tempi |
reti |
;передача кодов управления индикацией spistc:
push |
tempi |
||
push |
temph |
||
push |
saveF |
||
in |
saveF, SREG |
||
cpi |
XL, low(Mind+3) ; |
||
breq |
load |
; |
|
Id |
tempi, X+ ; |
||
cpi |
XL, low(Mind+2) ; |
||
brne |
skip |
; |
|
sbr |
tempi, 0x80 |
; |
|
skip: |
|||
out |
SPDR, tempi; |
||
116
spiout:
; завершение с восстановлением из стека флагов и регистров
out |
SREG, saveF |
pop |
saveF |
pop |
tempi |
reti |
|
load: |
|
cbi |
PORTB, PBO |
nop |
|
nop |
|
nop |
> |
sbi |
PORTB, PBO |
rjmp |
spiout ; |
.ORG |
0x0800 |
cdind: |
;коды индикации цифр, начиная с нуля |
.dB |
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f |
;endof file
Фрагменты листинга программы, создаваемого компилятором AVR Stu dio, приведены ниже. Первые 5 символов - адрес FLASH, который при сваивается компилятором коду каждой команды в программе. Следующие 4 символа - код команды в hex-формате, далее в каждой строке следует ис ходный текст программы.
.LIST
определить символические имена
.DEF |
tempi = rl 6 |
|||
.DEF |
temph = rl7 |
|||
.DEF |
saveF = r4 |
|||
.DEF |
counT = rl8 |
|||
.DEF |
rent = r 19 |
|||
.EQU |
Mind = 0x100 ; RAM для кодов индикации |
|||
.EQU |
Made = 0x090 ; RAM для кода АЦП |
|||
.CSEG |
||||
; вектора прерываний |
||||
.ORG $000 |
||||
000000 сОЮ |
rjmp |
init |
; прерывание по reset |
|
000001 c035 |
rjmp |
key_cnt |
; прерывание intO |
|
.ORG $009 |
; прерывание таймера 0 для запуска цикла |
|||
000009 c055 |
rjmp |
cycle |
||
00000a c0b2 |
rjmp |
spi_stc |
; прерывание SPI |
|
117
.ORG $00e |
|||||
OOOOOe c05e |
rjmp adc_cmt |
; прерывание АЦП |
|||
.ORG $011 |
|||||
; инициализация |
|||||
000011 e50f |
init: |
ldi tempi, low(RAMEND) |
|||
000012 е012 |
ldi |
temph, high(RAMEND) |
|||
000013 bfle |
out |
SPH, temph |
|||
000014 bfOd |
out |
SPL, tempi |
; |
определить в указателе стека адрес |
|
RAMEND |
|||||
; порты ввода-вывода |
|||||
000015 ec00 |
ldi |
tempi, 0b 11000000 |
|||
000016 2711 |
clr |
temph |
|||
000017 bblb |
out |
PORTA, temph |
|||
000018 bbOa |
out |
DDRA, tempi |
|||
000019 efOf |
sertempl |
||||
00001 a bb08 |
out PORTB, tempi |
||||
00001 b bb07 |
out |
DDRB, tempi |
порт В на вывод |
||
00001 с bb02 |
out PORTD, tempi |
||||
00001 d bb 11 |
out |
DDRD, temph |
; порт D на ввод |
||
; внешнее прерывание INTO |
|||||
0000le e002 |
ldi |
tempi, (1«ISC01)|(0«ISC00) |
|||
00001 f ЬЮ5 |
out MCUCR, tempi |
; INTO по падающему фронту |
|||
000020 e400 |
ldi |
tempi, (1 «INTO) |
|||
000021 ЬЮЬ |
out |
GIMSK, tempi |
; разрешение INTO |
||
; прерывание таймера 0 |
|||||
000022 e001 |
ldi |
tempi, (1 «TOIE0) |
|||
000023 bfl)9 |
out |
TIMSK, tempi |
|||
; параметры SPI |
|||||
000024 ed09 |
ldi |
tempi, Obi 1011001 |
|||
000025 b90d |
out |
SPCR, tempi |
|||
; параметры АЦП |
|||||
000026 2700 |
clr |
tempi |
|||
000027 b907 |
out |
ADMUX, tempi |
; канал РАО для АЦП |
||
000028 e80d |
ldi |
tempi, 0b 10001101 |
|||
000029 b906 |
out |
ADCSR, tempi |
|||
00002a 9478 |
sei |
; общее разрешение прерываний |
|||
00002b d002 |
rcall |
ind_off |
; выключение индикации температуры |
||
; бессодержательный бесконечный цикл, может быть заменен любой про |
|||||
граммой |
|||||
00002с 0000 |
main: |
nop |
|||
00002d cffe |
rjmp |
main |
|||
ind_off:
; вывод нулевых байтов в SPI для отключения индикации 00002е2700 clr tempi
118