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