; программа примера 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
5.2.Микроконтроллерная система управления температурой
Вкачестве примера реализации всех необходимых функций управления микроконтроллером AT90S8535 рассмотрим задачу поддержания микро климата в помещении, алгоритм решения которой приведен в главе 1 на рис. 3. Подготовка программы для микроконтроллера требует уточнения некоторых деталей и распределения функций между различными средства ми реализации.
Висходных данных задачи приведены только сведения, необходимые для составления общего алгоритма работы. Будем полагать, что управление охлаждением и подогревом производится независимыми стандартными ло гическими сигналами (1 - включено, 0 - выключено). Контролируемая температура измеряется двумя аналоговыми датчиками, оценка температу ры производится по среднему арифметическому значению их двух выход ных сигналов. Параметры аналоговых сигналов и опорное напряжение АЦП обеспечивают формирование кодов температуры в следующем фор мате: старший байт выходного кода АЦП соответствует значению темпера
туры с точностью до 0,1 °С (например, код 215 (0xd7) - 21,5 °С). Пороговые значения температур следующие: tram=17,0 °C, traax==22,0 °C.
Любая система управления должна содержать средства управления и индикации. В минимальном варианте необходимо производить включение и выключение системы кнопками управления, индикацию состояния сис темы и температуры в помещении. Тестовые режимы для проверки работо способности системы рассматривать не будем, хотя реальная система функции диагностики также должна поддерживать.
Кнопки управления можно подключить к свободным линиям параллель ных портов микроконтроллера с формированием общего сигнала внешнего прерывания по схеме, показанной на рис. 7. Такая схема позволяет при не обходимости подключить к "этому сигналу внешнего прерывания и другие
Пуск |
|
_х_ |
-> РВ1 |
_/1 |
-> РВ2 |
Стоп Ж |
Ж |
|
-» PD2 |
Рис. 7. Схема подключения кнопок управления
цепи. При обработке сигналов кнопок необходимо программно определить приоритеты сигналов при одновременном нажатии обеих кнопок ("защита от дурака"). Можно также указать, что в этой задаче применение алгоритма "антидребезга" необязательно, так как первое же замыкание кнопки пере-
104