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

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

;включение охлаждения

 

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

O0002f eOaO

Idi XL, low(Mind)

 

 

000030 eOb 1

Idi XH, high(Mind)

; начальный адрес RAM для кодов SPI

000031 930d

st

X+, tempi

 

 

 

000032 930d

st

X+, tempi

 

 

 

000033 930d

st

X+, tempi

 

 

 

000034 eOaO

idi XL, iow(Mind); восстановление в Х начального адреса

000035 d087

rcall

spi_stc

; старт передачи байтов индикации

000036 9508

ret

 

 

 

 

 

 

;INT0, кнопки управления

 

 

 

key_cnt:

 

 

 

 

 

 

; сохранение в стеке регистров и флагов

000037 930f

push

tempi

 

 

 

000038 93If

push

temph

 

 

 

000039 924f

push

saveF

 

 

 

00003a b64f

in

 

saveF, SREG

 

 

 

; обработка сигналов "Стоп", "Пуск"

00003b ЬЗОб

in

 

tempi, PINB

 

контроль сигнала СТОП

00003c ff02

sbrs

tempi, PB2

 

00003d c012

rjmp

cnt_off

 

перейти к процедуре СТОН

00003effOl

sbrs

tempi, PB1

 

контроль сигнала ПУСК

00003 f c005

rjmp

cnt_on

 

перейти к процедуре ПУСК

 

; если оба сигнала в 1, завершить без изменения режима

 

key_out:

 

 

 

 

 

 

; завершение с восстановлением из стека флагов и регистров

000040 be4f

out

SREG,saveF

 

000041

904f

pop

saveF

 

 

 

000042 91 if

pop

temph

 

 

 

000043 91Of

pop

tempi

 

 

 

000044

9518

reti

 

 

 

 

 

 

cnt

on:

 

 

 

 

 

000045

2333

переход в режим ПУСК

 

 

tst

 

rent

 

 

 

000046 f7c9

brn

keyout

; завершить по признаку режима ПУСК

000047 6830

sbrrcnt, 0x80

; установить признак режима ПУСК в rent

000048 eO15

Idi

 

temph, 0x05

 

 

000049 bfl3

out

TCCR0, temph

; запуск таймера циклов контроля

00004a 2722

clr

 

counT

; сброс счетчика для формирования цикла

00004b

b927

out

 

ADMUX, counT ; канал РАО для АЦП

00004c 9a36

sbi

 

ADCSR, ADSC

; запуск АЦП дня 1 цикла контроля

00004d

98df

cbi

 

PORTA, PA7

; выключение охлаждения

00004e 98de

cbi

 

PORTA, PA6

; выключение подогрева

00004fcff0

rjmp

 

keyout

 

; завершение процедуры

119

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