- •«Инструментальные средства разработки аппаратно-программных систем»
- •Оглавление
- •7 Инструментальные средства разработки систем управления на
- •Введение. Управляющие системы на микроконтроллерах.
- •Характеристика микроконтроллеров семейства avr
- •1.1 Особенности микроконтроллеров
- •1.2 Характеристики микроконтроллера aTмega16
- •1.3 Условное графическое обозначение микроконтроллера
- •2 Архитектура микроконтроллера
- •2.1 Структура микроконтроллера
- •2.2 Организация программной памяти
- •Организация памяти данных
- •2.4 Арифметико-логическое устройство и регистр состояния процессора
- •Методы адресации. Форматы команд
- •Система команд
- •2.6.1 Команды передачи данных (пересылки)
- •2.6.2 Команды передачи управления
- •2.6.3 Команды арифметики и логики (вычислительные)
- •2.6.4 Команды сдвигов и операций с битами
- •2.7 Функционирование конвейера
- •3 Встроенные устройства
- •3. 1 Параллельные порты ввода/вывода
- •Подсистема прерываний микроконтроллера
- •Регистр флагов прерываний таймеров/счетчиков – tifr
- •Таймеры/счетчики
- •Общие сведения
- •Таймер/счетчик т0.
- •3.3.3 Таймер/счетчик т1.
- •Сторожевой таймер (Watchdog Timer).
- •3.4 Последовательные интерфейсы -spi и uart
- •3.4.1 Последовательный периферийный интерфейс - spi
- •3.4.2 Uart - универсальный последовательный порт
- •3.5 Аналоговый компаратор и ацп
- •3.5.1 Аналоговый компаратор
- •3.5.2 Аналого-цифровой преобразователь
- •3.6 Энергонезависимая память данных
- •4 Ассемблер микроконтроллеров avr
- •5 Взаимодействие микроконтроллера с объектом управления
- •5.1 Формирование временных интервалов (задержек)
- •5.1.1 Программный способ формирования временных интервалов
- •Ext_l: ldi r17, X ;х – число внутренних циклов
- •Ext_l: ldi r17, 53 ;Загрузка в r17 константы внутреннего цикла
- •5.2 Генерация импульсных сигналов управления с использованием программных задержек
- •5.2.1 Генерация последовательности импульсов с использованием программных задержек
- •5.2.2 Генерация пакета импульсов
- •5.2.3 Генератор заданного числа пакетов импульсов
- •Формирование импульсных сигналов управления с использованием таймеров микроконтроллера
- •5.4 Ожидание внешних событий
- •5.5 Обработка динамического дисплея
- •5.6 Особенности схемы дисплея в учебной системе управления.
- •5.7 Часы
- •5.8 Измерение временных параметров импульсов
- •5.9 Обработка клавиатуры
- •6 Программирование микроконтроллеров aТmega16
- •7 Инструментальные средства разработки сисТем управления на микроконтроллерах aTmega16
- •Дубров ф.И. Встроенные системы управления на микроконтроллере aTmega16
5.7 Часы
Для реализации функции часов необходимо сформировать временной интервал длительностью в 1 сек. Временной интервал целесообразно формировать с помощью таймера/счетчика Т1 в режиме сброса по совпадению.
В соответствие с формулой (8), которая справедлива для любого таймера, при условии равенства коэффициента деления входного делителя значению 1024 и при тактовой частоте равной 16 мГц, получим значение в регистре совпадения для интервала в 1сек:
OCR1А = tинт /Ттакт * К = 1*24*106*2-10 = 56 = 15625.
Очевидно, что в качестве исходного текста для обработчика часов, можно использовать копию текста обработчика дисплея.
Ниже приведены фрагменты программы часов реального времени. Функция программы: вывод текущего времени в секундах и минутах в разряды порта микроконтроллера, к которым подключен динамический индикатор.
Так как код четвертого режима (сброса по совпадению Т1) равен 0100, то младшие разряды его установлены в регистре TCCR1A по умолчанию.
.ORG 0
RJMP BEGIN
.ORG $C ;Адрес вектора прерывания по совпадению Т1
RJMP T1_COMP
BEGIN: LDI R16,3
OUT SPL,R16
LDI R16,$FF
OUT SPH,R16
LDI R16,0 ;Обнуление ячеек дисплея
STS $0068,R16
STS $0069,R16
STS $006A,R16
STS $006B,R16
SEI ;Общее разрешение прерываний
LDI R16,0B00010000;Разрешение прерываний сброса по совпадению Т1
OUT TIMSK,R16 ;
LDI R16,$3D ;3D09 = 15625 – константа задержки, соответствующая
OUT OCR1AH,R16 ;интервалу 1сек. К=1024,Fтакт=16мГц
LDI R16,9 ;
OUT OCR1AL,R16 ;
LDI R16,0B00001101;Режим сброса по совпадению Т1(4-й т.е.0100),
OUT TCCR1B,R16 ; К=1024 и пуск таймера
;*********Далее обработчик дисплея********
.
.
.
;***Подпрограмма прерываний по совпадению в Т1. Вызывается каждую секунду***
T1_COMP: LDS R22,$68 ;Ед. сек. в регистр
Inc r22 ;Увеличить значение единиц секунд
STS $68,r22 ;Новое значение в ячейку
CPI r22,10 ;Сравнить значение ед. сек. с 10
Brne Q_reti ;Если не равно 10, то выход из п/п по метке
Ldi r22,0 ;Если 10, то обнулить регистр
STS $68,R22 ;и копию в ячейку
.
. ;Аналогично с другими ячейками дисплея
. ;для десятков секунд, единиц и десятков минут
Q_RETI: RETI
5.8 Измерение временных параметров импульсов
Используется цифровой способ измерения периода импульсов: подсчет числа временных импульсов с эталонным периодом за время длительности измеряемого периода. При измерении периода импульсов с помощью таймера Т1 в режиме захвата требуются минимальные программные ресурсы, поэтому этот способ является предпочтительнее других. Таймер Т1 должен быть настроен в режим захвата с помощью регистра TCCR1B и на выполнение функции таймера. Значение коэффициента деления входного делителя частоты выбрать равным 8. При частоте тактового генератора 16мГц на вход таймера будут поступать импульсы с периодом 0,5мкс. Так период импульсов может быть определен как разность между соседними фронтами или срезами, то соответственно выбирается тип входа захвата (фронт или срез).
Рисунок 63
После включения таймера он начинает счет времени в единицах 0,5мкс. В режиме захвата фронтом измеряемого импульса содержимое таймера (время первого фронта tf1) аппаратно помещается из таймера в регистр захвата ICR1 и вызывается подпрограмма (предварительно прерывания по захвату разрешены), в которой необходимо освободить ICR1 в два регистра РОН. Таймер продолжает счет времени и в момент второго фронта tf2 фиксируется его время наступления в том же регистре захвата и опять вызывается подпрограмма прерывания. Теперь в ней период вычисляется как разность Т= tf2 - tf1.
Так как вход в подпрограмму прерываний производится два раза и, каждый раз выполняются в ней различные действия, то необходимо идентифицировать эти входы. Это может быть осуществлено проверкой значения бита Т в регистре состояния SREG в начале подпрограммы обработки прерываний. Исходное значение этого бита нулевое. Тогда при проверке, если его значение равно нулю, то это первый вход в подпрограмму. Следовательно, нужно сохранить содержимое ICR1, установить бит Т в единице и произвести выход из подпрограммы обработки прерываний. Если значение бита Т равно единице (зафиксировано время второго фронта), то необходимо остановить таймер Т1, запретить прерывание по захвату и выполнить вычитание для получения значения периода.
Значение периода после вычитания получится в единицах по 0,5мкс. Для перевода значения периода в микросекунды необходимо разделить полученное значение на 2. Для этого можно использовать сдвиг вправо значения в двух регистрах.
Для измерения длительности положительного импульса необходимо при первом входе в подпрограмму прерывания по захвату перенастроить вход захвата ICP на захват по срезу импульса.
Ниже приведен текст программы с функцией: измерение периода импульсов в режиме захвата таймера Т1, сравнение измеренного значения с установленным и формирование звукового сигнала, если измеренное значение больше установленного.
.include "m16def.inc"
.org 0
rjmp start
.org $a ;адрес вектора прерывания по захвату Т1
rjmp save
start: ldi r16,4;
out sph,r16
ldi r16,0х5F
out spl,r16
sei ;Общее разрешение прерываний
ldi r16,$20;Разрешение прерывания по захвату Т1
out timsk,r16
ldi r16,0b01000010;Захват по фронту, вх. частота Т1 равна 2мГц
; или период вх. импульсов равен 0,5мкс
out tccr1b,r16
loop: rjmp loop
save: brts save1 ; если бит Т установлен, то второй вход в ПП, иначе
in r1,icr1l ; первый вход и сохраняем момент времени
in r2,icr1h ;первого фронта tf1
set ;установить бит Т
reti
save1: clt
ldi r29,$0 ;Остановить таймер Т1
out tccr1b,r29
out timsk,r29 ;Запретить прерывание по захвату
in r19,icr1l ; Момент времени второго фронта tf2
in r25,icr1h
sub r19,r1;Вычитание Т= tf2 - tf1. Значение периода в 0,5 мксекундах
sbc r25,r2
LSr r25 ;Деление на 2, для получения периода в микросек
ROr r19
ldi r24,50 ;Задержка перед следующим измерением
m2: ldi r27,250
m3: ldi r26,250
m4: dec r26
brne m4
dec r27
brne m3
dec r24
brne m2
sbr r16,0B00100000 ;Сброс флага прерывания по захвату
out tifr,r16
ldi r16,0b01000010;Включение Т1 для след. измерения
out tccr1b,r16
ldi r16,$20 ; Разрешение прерывания для след. измерения
out timsk,r16
sei
reti