Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 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