- •«Инструментальные средства разработки аппаратно-программных систем»
- •Оглавление
- •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
Ext_l: ldi r17, X ;х – число внутренних циклов
INT_L: DEC R17 ;
BRNE INT_L ; внутренний цикл.
DEC R16 ;
BRNE EXT_L ; внешний цикл.
RET
Сначала выполняется внутренний цикл циклическим уменьшением содержимого регистра R17. При обнулении регистра R17, происходит уменьшение содержимого регистра внешнего цикл R16 на 1. Если его содержимое не равно 0 (команда BRNE , EXT_L), то выполняется переход по метке EXT_L и снова выполняется внутренний цикл.
Если процедура является подпрограммой, то длительность задержки в тактах рассчитывается по формуле:
N = (3*X+3)*Y+7, тактов. (4)
(Число 3 – время выполнения команд BRNE EXT_L и LDI R17, X ).
Из этой формулы могут быть определены значения X и Y.
Максимальная задержка составляет (3*255 + 3)*255+7 = 195847 тактов.
Для получения задержек больших по величине используют циклы двойной, тройной и т.д. вложенности. При использовании циклов двойной вложенности длительность задержки в тактах вычисляется по формуле:
N = [ (3*X+3)*Y+3]*Z + 7. (5)
Пример Рассчитать значение констант X и Y для получения временной задержки равной 103 мкс, если тактовая частота микроконтроллера равна 16мГц.
Время задержки в тактах:
N = tsek*Fтакт = 103*10-6*16*106 = 1648 тактов.
Для получения такой задержки требуется процедура с вложенными циклами.
Подставляем в формулу значения:
N = (3*X+3)*Y+7; 1648=(3*Х+3)*Y+7, или 1641=(3*Х+3)*Y.
Уменьшаем N на единицу 1640=(3*Х+3)*Y, тогда можно взять Y=10.
Далее: 1640=(3*Х+3)*10. → 164=3*Х+3 → 161=3*Х.
Выбираем ближайшее целое (на два меньшее) 159=3*Х → Х=53.
При таких заменах время задержки не будет равно заданному. Поэтому во внешний цикл необходимо вставить команду NOP, а за пределами циклов вставить две команды NOP, т.е. получится фактически формула
N = (3*X+3+2)*Y+7+1.
Подставив в нее значения Х и Y получим N равное 1648.
Текст подпрограммы для примера:
DELAY: LDI R16, 10 ;Загрузка в R16 константы внешнего цикла
Ext_l: ldi r17, 53 ;Загрузка в r17 константы внутреннего цикла
INT_L: DEC R17 ; Уменьшение на 1 значения в R17
BRNE INT_L ; Если R17 ≠ 0, то переход на команду по метке
;иначе будет выполняться следующ. команда
NOP
DEC R16 ; Уменьшение на 1 значения в R16
BRNE EXT_L ; Если R16 ≠ 0, то переход на команду по метке
;иначе будет выполняться следующ. команда
NOP
NOP
RET
При необходимости уменьшения значения на значительную величину Nд (использование значительного числа команд NOP) рекомендуется вместо команд NOP добавить в подпрограмму задержки одиночный цикл со значением, рассчитанным по формуле: Nд=3X.
Недостатком формирования временных интервалов программным способом является не выполнение требований к основным функциям микроконтроллера: измерение параметров, обработка данных и формирование сигналов управления. В приведенных примерах микроконтроллер выполняет функцию двоичного счетчика.
Формирование временных интервалов с использованием таймера\счетчика
При использовании таймера\счетчика подсчет тактовых (временных) импульсов производится таймером, а в это время программой микроконтроллера будут выполняться его основные функции.
Для формирования временных интервалов удобно применять режим “Сброса по совпадению”. Рассмотрим вариант использования таймера Т0.
Напомним, что в режиме сброса по совпадению значение таймера/счетчика Т0 сравнивается в цифровом компараторе со значением в специальном регистре сравнения OCR0. При равенстве их значений устанавливается флаг прерывания по совпадению OCF0 и может быть вызвана подпрограмма прерывания по совпадению (если эти прерывания разрешены).
Таким образом, от момента включения таймера Т0 до момента совпадения проходит временной интервал, равный произведению значения в регистре совпадения на длительность периода входных импульсов (см. рис.2).
tинт = (OCR0 – 1)* Твх . (6)
При изменении значения в регистре совпадения изменяется величина временного интервала.
На вход таймера Т0 поступают импульсы от тактового генератора через делитель частоты. Коэффициент деления делителя К может принимать одно из значений 1,8,64,256,1024. Таким образом, соотношение между периодом импульсов тактового генератора и периодом импульсов на входе таймера:
Твх = Ттакт * К.
Подставив это соотношение в формулу (6), получим:
tинт = (OCR0 – 1) * Ттакт * К.
Отсюда находится значение, которое необходимо поместить в регистр совпадения OCR0, для получения заданного временного интервала.
OCR0 = tинт /Ттакт / К - 1 (8)
Пример Рассчитать значение, которое надо поместить в регистр совпадения для получения временного интервала 320 мксек. Коэффициент деления делителя частоты К = 256. Тактовая частота микроконтроллера Fтакт =16мГц .
Значение периода импульсов тактового генератора:
Ттакт = 1/ Fтакт = 1/16*106 = 2-4*10-6 сек.
Значение регистра совпадения по формуле (8):
OCR0 = tинт /Ттакт * К - 1 = 320*10-6/ 2-4*10-6 * 256 - 1= 19.
Для загрузки этого значения используются команды:
LDI R16,19 ;загрузка значения в регистр R16
OUT OCR0,R16 ;содержимое R16 выводится в TCCR0
Максимальное значение временного интервала будет, если коэффициент деления делителя частоты равен 1024 и значение в регистре совпадения равно 255. При значении тактовой частоты 16 мГц:
tинт_мах = Ттакт * К * 256 = 2-4*10-6 * 210 * 28) = 0,01630 сек.
.Include "m16def.inc"
|
.Org 0 |
|
|
Rjmр Start |
|
|
.Org 0х26 |
;Адрес вектора прерывания по ;совпадению Т0 |
|
Rjmp timer0_COMP |
|
Start: |
ldi r16,4 |
;Организация cтека ATMega16 |
|
Out SPL,r16 |
;(начало стека- последняя ячейка ОЗУ) |
|
ldi r16,0х5F |
|
|
out SPH,r16 |
|
|
SEI
|
;Разрешить все прерывания. |
|
LDI R16,0b00000010
|
;Разрешить прерывания по совпадению Т0 |
|
OUT TIMSK,R16 |
|
|
LDI R16, ...........
|
;В регистр сравнения загружается байт, ;соответствующий временному интервалу |
|
OUT OCR0,R16
|
|
|
LDI R16,0B00001001
|
;Разряды 6 и 3 (01) - режим “Сброс по ;совпадению”, мл. разряды 001 – коэфф. ;деления =1 и пуск Т0 (начала времен. ;интервала) |
|
OUT TCCR0,R16
|
|
|
. . .
|
;Работает Т0 и программа ;микроконтроллера |
Timer0_COMP: |
|
;Окончание временного интервала (начало ;подпрограммы прерываний) |
Для больших временных интервалов можно использовать 16-разрядный таймер Т1.
По директиве ассемблера .Include "m16def.inc" в текст программы включается файл m16def.inc, в котором определены (прописаны) имена регистров ввода-вывода, векторов, битов и др. Благодаря этому в командах можно использовать не адреса регистров ввода-вывода, а их имена.
По директиве .Org 0 следующая за ней команда RJMP Start будет при компиляции помещена в нулевую ячейку программной памяти.
В директиве .Org 0х26 определен адрес вектора прерывания по совпадению таймера Т0. В ячейку $26 помещается команда перехода к подпрограмме обработки прерываний Rjmp timer0_COMP (вектор). Командами ldi r16,4 Out SPL,r16 ldi r16,$5f Оut SPH,r16 организован стек с начальным адресом 45F (адрес старшей ячейки ОЗУ).
Далее следуют команды общего разрешения прерывания, разрешения прерывания по совпадению Т0 и загрузки в регистр сравнения значения, соответствующего длительности временного интервала. После загрузки в регистр управления TCCR0 значения 00001001, таймер Т0 настраивается в режим сброса по совпадению, устанавливается значение коэффициента деления входного делителя и происходит включение таймера. С этого момента таймером производится счет импульсов от тактового генератора и сравнение значения в таймере со значением в регистре совпадения, а программа выполняет заданные функции. При наступлении равенства значений (окончен временной интервал) устанавливается флаг прерывания по совпадению OCF0 и вызывается подпрограмма по метке timer0_COMP, в которой фиксируется окончание временного интервала. При вызове подпрограммы содержимое счетчика команд сохраняется в двух ячейках стека, а в счетчик помещается значение $26. Следовательно, будет считываться из памяти и выполняться команда Rjmp timer0_COMP. Содержимое счетчика команд загружается в стек за 4 такта, а команда перехода выполняется за 2 такта. Таким образом, от момента пуска таймера до входа в подпрограмму проходит время на 6 тактов большее, чем время по значению в регистре совпадения.