Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 1571

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

; программа примера 2

.NOLIST

.INCLUDE "8535def.inc"

.LIST

.DEFtemp = rl6

; определить символическое имя temp регистру г16

.CSEG

.ORG $000

rjmp

init

; прерывание по reset

.ORG $00e

rjmp

adc

; прерывание по завершению преобразования АЦП

.ORG $011

init: ldi

temp, low(RAMEND)

out SPL, temp

ldi

temp, high(RAMEND)

out SPH, temp ; определить в указателе стека адрес RAMEND

clr

temp

out

DDRA, temp

; определить все биты порта А на ввод

ser

temp

out PORTA, temp

; определить пассивный высокий уровень

; сигнала для всех битов порта А

ldi

temp, ОЫООООЮО

out

ADCSR, temp

; инициализация АЦП

start: clr

XH

ldi

XL, $60 ; занести начальный адрес данных в регистр X

out ADMUX, ХН ; определить номера бита 0 порта А

; в мультиплексоре

sbi ADCSR, ADSC

; запустить преобразование в АЦП

sbi

ADCSR, ADIE; разрешить прерывание АЦП

sei

; общее разрешение прерываний

; бессодержательный бесконечный цикл, может быть заменен любой про­ граммой

main: nop

rjmp main

;п/программа обработки прерывания АЦП

adc: in r20, ADCL ; занести младший байт кода АЦП в г20 in r21, ADCH ; занести старший байт кода АЦП в г21 lsr г21

гог г20

100


lsr

r21

; двукратный сдвиг вправо с переносом

гог

г20

; из старшего байта

; в младший для преобразования в 8-битовый формат

st Х+, г20

; сохранить в ОЗУ по адресу X с постинкрементом

cpi

XL, $64

breq end

; перейти к завершению цикла после РАЗ

mov temp, XL

cbr

temp, $f8

out

ADMUX, temp

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

; текущего канала

sbi

ADCSR, ADSC

; запустить преобразование в АЦП

reti

; завершить прерывание

end: cbi

ADCSR, ADIE ; запретить прерывание АЦП

reti

; завершить прерывание

Пример 3. Реализовать таймер, отображающий с помощью светодиодов в 8-разрядном двоичном коде время замкнутого состояния кон­ тактов кнопки включения с дискретностью 0,5 с, предус­ мотреть возможность сброса таймера в исходное состояние и индикацию переполнения таймера.

Для управления таймером необходим отсчет временных интервалов по 0,5 с. от момента замыкания кнопки включения (в дальнейшем Кн1) до ее размыкания, а также - вторая кнопка (в дальнейшем Кн2) для управления сбросом. Для индикации выходных сигналов таймера светодиоды можно подключить через токоограничивающие резисторы к одному из портов микроконтроллера, например, порту В. Контроль кнопок Кн1 и Кн2 наибо­ лее просто реализуется использованием сигналов внешних прерываний IntO (PD2), Intl (PD3). Полагая, что приоритет сброса выше, подключим замы­ кающий контакт Кн2 между PD2 и общим проводом, а замыкающий кон­ такт Кн1 - между PD3 и общим проводом. Для индикации переполнения таймера дополнительный светодиод можно подключить к свободному биту порта D, например, PD1.

При тактовой частоте микроконтроллера 8 МГц временные интервалы 0,5 с можно получить в канале сравнения А таймера-счетчика 1 с коэффи­ циентом деления тактовой частоты - 1024, кодом канала сравнения А - 3906 ($0f42) и сбросом таймера 1 по сигналу сравнения канала А. Для ини­ циализации этого режима в регистре TCCR1А все биты очищаются, а в ре­ гистре TCCR1B записывается константа ОЬООООЮОО. Запуск таймера про­ изводится установкой трех младших битов TCCR1B, останов таймера очи­ сткой этих же трех битов. Для возврата таймера в исходное состояние не­ обходимо очистить биты регистров TCNT1H, TCNT1L. Используемые век-

101


торы прерываний: IntO ($001), Intl ($002), Timl_CompA ($006). Таким об­ разом, временной интервал 0,5 с и контроль состояния кнопок реализуются аппаратными средствами с использованием соответствующих векторов прерываний, остальные необходимые функции - программно.

; программа примера 3

.NOLIST

.INCLUDE "8535def.inc"

.LIST

.DEFtemp = rl6 ; определить символическое имя temp регистру rl6

.CSEG

.ORG $000

rjmp

init

; прерывание по reset

rjmp

restim

; прерывание по сбросу таймера (intO)

rjmp

timon

; прерывание по включению таймера (intl)

.ORG $006

rjmp

half

; прерывание для формирования

; интервала полсекунды

.ORG $011

init:

Idi

temp, low(RAMEND)

out

SPL, temp

Idi

temp, high(RAMEND)

out

SPH, temp

; определить в указателе стека адрес RAMEND

ser

temp

out

DDRB, temp

; порт В на вывод

out

PORTD, temp ; пассивный высокий в порте D

clr

temp

out PORTB, temp

; очистить биты порта В (сброс)

out

DDRD, temp

; порт D на ввод

sbi

DDRD, PD1

; бит PD1 (переполнение) на вывод

out

MCUCR, temp ; внешние прерывания по низкому уровню

Idi

temp, $08

out

TCCR1B, temp

; разрешение сброса таймера 1 по каналу

Idi

г18, $42

;сравнения А

Idi

rl9,$0f

out OCR1AH, rl9

out

OCR1AL, rl8 ; запись кода сравнения (3906) канала А

Idi

temp, $10

out

TIMSK, temp

; разрешение прерывания канала А

Idi

temp, $c0

out

GIMSK, temp

; разрешение внешних прерываний

102


sei ; общее разрешение прерываний

; бессодержательный бесконечный цикл, может быть заменен любой про­

граммой

main:

nop

rjmp

main

restim:

clr r20

out PORTB, r20

очистить биты порта В (сброс)

cbi

PORTD,PDl

; очистить индикацию переполнения

out

TCNT1H, r20

out

TCNTlL,r20

; сброс таймера 1

stop:: in

temp,TCCRlB

cbr

temp, $07

out

TCCR1B, temp

; остановить таймер 1

reti

; завершить прерывание

timon:

in

temp, TCCR1B

sbr

temp, $07

out

TCCR1B, temp

; запустить таймер 1

reti

; завершить прерывание

half: sbic

PORTD, PD3

; пропустить, если Кн 1 нажата

rjmp

stop

перейти к остановке таймера 1

inc ir20

out

PORTB, r20 ; инкремент индикатора кода таймера

breq carry

перейти к формированию переполнения

reti

завершить прерывание

carry:

sbi

PORTD, P 01

; установить бит индикации переполнения

rjmp

stop

; перейти к остановке таймера 1

В приведенных выше примерах показаны различные варианты про­ граммно-аппаратной реализации некоторых стандартных функций. Эти примеры в определенной мере иллюстрируют возможности микроконтрол­ леров AVR в решении задач управления техническими объектами. Каждая из рассмотренных программ использует только незначительную часть про­ граммно-аппаратных ресурсов микроконтроллера и может рассматриваться как фрагмент более полной и объемной рабочей программы. Это отражено в примерах в виде бессодержательного бесконечного цикла, который может быть заменен какой-либо прикладной программой.

103