close

Вход

Забыли?

вход по аккаунту

?

MPS 2013 Lab 5

код для вставкиСкачать
Министерство образования и науки РФ
Государственное бюджетное образовательное учреждение высшего профессионального образования
"Тверской Государственный Технический Университет"
(ГБОУ ВПО "ТвГТУ")
Кафедра ЭВМ
Реализация временных функций в микропроцессорных системах. Генерация периодических сигналов на примере синтеза музыкальных произведений.
Часть 2. Использование таймеров.
Методические указания к лабораторной работе №5 по курсу
"Микропроцессорные системы"
для студентов специальности 230101
"Вычислительные машины, комплексы, системы и сети"
Тверь
2013
Методическое указание разработано в соответствии с рабочей программой по дисциплине "Микропроцессорные системы" для студентов специальности 230101 и предназначено для оказания помощи студентам в подготовке к выполнению лабораторных работ по данной дисциплине.
Составил:к.т.н. Быков П.В.
(c) Тверской государственный технический университет
Содержание
Введение4
Теоретическая часть.5
Система таймеров МК AtMega165
Выводы МК, задействованные для работы с таймерами.5
Таймер 06
Задание режима работы таймера 0. Управляющие регистры9
Распределение управляющих бит в регистрах МК10
Таймер 111
Особенности доступа к 16 разрядным счетчикам12
Задание режима работы таймера 1. Управляющие регистры13
Распределение управляющих бит в регистрах МК15
Таймер 216
Задание режима работы таймера 2. Управляющие регистры17
Распределение управляющих бит в регистрах МК17
Примеры инициализации таймеров.17
Система прерываний микроконтроллера18
Способы формирования тональных сигналов с использованием МК с помощью таймеров20
С использованием одного таймера20
С использованием двух таймеров22
Определение загрузки ядра МК25
Описание лабораторного оборудования. Плата пьезоизлучателя25
Практическая часть27
Цель работы27
Задачи27
Методика выполнения задания27
Меры безопасности28
Варианты заданий28
Требование к содержанию и оформлению отчета30
Контрольные вопросы31
Список литературы31
Введение
В предыдущей лабораторной работе мы познакомились с одним из способов формирования временных задержек и практически использовали их для формирования звуковых последовательностей. Надо заметить, что данный способ не единственный и далеко не самый лучший для формирования временных задержек. Его удобно применять для формирования небольших таймаутов при невысоких требований к их точности. Наиболее же часто для решения подобных задач широко применяют интегрированные на кристалл МК таймеры - счетчики. Именно знакомству с ними, а также механизмом обработки прерываний посвящена данная лабораторная работа.
Теоретическая часть. Система таймеров МК AtMega16
Устройства AtMega16 оснащены тремя таймерами/счетчиками общего назначения - двумя 8-разрядными и одним 16-разрядным. Таймер/счетчик 2 дополнительно может тактироваться асинхронно от внешнего генератора. Этот генератор оптимизирован под использование кварцевого кристалла на частоту 32.768 кГц, что позволяет использовать таймер/счетчик 2 как часы реального времени (RealTimeClock-RTC). Таймеры/счетчики 0 и 1 используют общий 10-разрядный предварительный делитель опорной частоты. Таймер/счетчик 2 оснащен своим собственным предварительным делителем. Эти таймеры/счетчики можно использовать как таймеры с встроенной временной базой или как счетчик, переключаемый по состоянию на внешнем выводе.
Выводы МК, задействованные для работы с таймерами.
В данном МК имеется ряд выводов, которые могут быть использованы блоками таймеров-счетчиков. В частности, это: T1, OC0, OC1A, OC1B, ICP1, TOSC1, TOSC2, OC2. Их назначение будет пояснено далее, по ходу работы. Обозначение МК AtMega16 и его выводов представлено на Рис. 1.
Рис. 1. Обозначение МК AtMega16 и его выводов.
Таймер 0
Рис. 1. Структурная схема таймера 0 и назначение базовых блоков.
На структурной схеме использовано буквой 'n' обозначен номер таймера-счетчика. Для таймера 0: n = 0. Счетчик выполняет счет импульсов от внутреннего тактового генератора (через предварительный делитель), либо от выбранного фронта сигнала с внешнего входа МК. При переполнении счетчика формируется флаг переполнения (ТOV0), который находится в регистре флагов прерывания таймеров (TIFR). Для выполнения дополнительных функций в структуре счетчика имеется регистр сравнения. Значение счетчика постоянно сравнивается с данным регистром и при совпадении формируется флаг OCF0 (Output compare flag). Установка данного флага кроме прерывания может также использоваться для формирования сигналов на внешнем выводе МК (Waveform generator) и изменения режима счета (обнуление счетчика, изменение направления счета). Установки управляющих сигналов хранятся в регистрах управления таймерами/счетчиками TCCR0. Установка разрешения / запрещения прерываний производится в регистре масок прерываний таймеров/счетчиков TIMSK (Timer/Counter Interrupt Mask Register).
Режимы работы счетчика (наиболее часто используемые):
1. Нормальный режим работы. Таймер ведет счет импульсов от заданного источника. При переполнении счетчика формируется прерывание, а счетчик продолжает счет с 0
2. Обнуление счетчика при совпадении значения с регистром сравнения Clear Timer on Compare Match (CTC) Mode. Отличается от нормального тем, что при совпадении значений счетчик сбрасывается и продолжает счет с 0. При этом устанавливается флаг OCF0. На рис показано использование данного режима для формирования сигналов на выводе OC0, изменением значения уставки регистра сравнения. Для генерации сигнала в режиме CTC выход компаратора OC0 может использоваться для изменения логического уровня при каждом совпадении, для чего необходимо задать режим переключения (COM01, COM00 = 0b01). Значение OC0 будет присутствовать на выводе порта, только если для данного вывода задано выходное направление (порт скофигурирован на вывод данных). Максимальная частота генерируемого сигнала равна fOC0 = fclk_I/O/2, если OCR0 = 0x00. Для других значений OCR0 частоту генерируемого сигнала можно определить по формуле: где переменная N задает коэффициент деления предделителя (1, 8, 32, 64, 128, 256 или 1024).
Рис. 2. Использование режима обнуления счетчика для формирования сигналов на выводе OC0.
3. Fast PWM Mode. Режим быстрой ШИМ (широтно-импульсная модуляция). Счетчик ведет счет от 0 до максимального значения (0xFF), после чего сбрасывается и продолжает сначала. Значение регистра сравнения определяет момент времени сброса в 0 выходного сигнала OC0 (для неинвертирующего ШИМ). Установка сигнала OC0 в 1 производится всегда при переходе значения счетчика из 0xFF в 0. Рис. 3. Временная диаграмма режима быстрой ШИМ.
4. Режим широтно-импульсной модуляции с фазовой коррекцией (ШИМ ФК) (Phase Correct PWM Mode). Режим ШИМ ФК основан на двунаправленной работе таймера-счетчика. Счетчик циклически выполняет счет в направлении от 0 до максимального значения, а затем обратно от максимального значения к 0. Если задан неинвертирующий режим выхода компаратора, то выход OC0 сбрасывается / устанавливается при совпадении значений TCNT0 и OCR0 во время прямого / обратного счета. На рисунке представлены как неинвертированный, так и инвертированный ШИМ-выходы. Короткие горизонтальные линии указывают точки на графике изменения TCNT0, где совпадают значения OCR0 и TCNT0.
Рис. 4. Временная диаграмма режима ШИМ ФК.
Для задания рабочего режима счетчика необходимо соответствующим образом установить разряды управляющих регистров.
Задание режима работы таймера 0. Управляющие регистры
Внимание! Данное описание не претендует на полноту и отражение всех нюансов настройки и работы таймера. Для получения полной информации необходимо обратиться к учебным пособиям [2] или описанию производителя контроллера (datasheet) [3].
Регистры таймера 0:
TCCR0 - регистр режима
TCNT0 - значение счетчика
OCR0 - значение регистра сравнения
Общие регистры для всех таймеров: TIMSK - регистр маскирования запросов прерываний таймеров
TIFR - флаги запросов таймеров.
Для задания режима необходимо задать:
1. источник тактовых импульсов и предделитель
2. режим работы таймера
3. способ формирование выходного сигнала OC0
4. При использовании прерываний разрешить используемые запросы и глобальный флаг разрешения прерывания.
Частота и источник сигнала определяется битами CS02, CS01, CS00:
Таблица 1. Значение битов CS02:00.
CS02CS01CS00Описание000Нет синхронизации. Таймер-счетчик 0 остановлен.001clk (без предделения)010clk/8 (с предделением)011clk/64 (с предделением)100clk/256 (с предделением)101clk/1024 (с предделением)110переход 0 -> 1 с внешнего входа Т0111переход 1 -> 0 с внешнего входа Т0
Режим работы таймера определяется комбинацией бит WGM01, WGM00
Данные биты определяют алгоритм счета счетчика, верхний предел счета и тип генерируемых прямоугольных импульсов. Таблица 2. Описание бит, задающих режим работы таймера-счетчика 0.
Номер режимаWGM01WGM00Наименование режима работы таймера-счетчика 0Верхний предел счетаУсловие обновления содержимого регистра OCR0Условие установки флага TOV0000Нормальный0xFFСразу после записи в регистрДостижение максимального значения (0xFF)101ШИМ с фазовой коррекцией0xFFДостижение верхнего предела счетаДостижение минимального значения (0x00)210Сброс при совпаденииOCR0Сразу после записи в регистрДостижение максимального значения (0xFF)311Быстрая ШИМ0xFFДостижение нижнего предела счетаДостижение максимального значения (0xFF)
Способ формирования выходного сигнала определяется комбинацией бит COM01, COM00 и зависит от выбранного режима работы.
Если значение данных бит ненулевое, то функция вывода контроллера OC0 как обычного порта ввода-вывода заменяется на альтернативную. Однако, следует учитывать, что данная функция активизируется только при назначении данного вывода порта на выход (через регистр направления данных порта В - DDRB). Поэтому, для разрешения альтернативной функции вывода OC0 также необходимо установить бит 4 (OC0) в регистре DDRB!
В таблице приведено назначение бит COM01, COM00 для режима работы таймера-счетчика 0 без ШИМ.
Таблица 3. Режимы формировании выходного сигнала в режимах работы таймера 0 без ШИМ.
COM01COM00Описание00Функция обычного порта ввода-вывода. OC0 отключен.01Переключение (инвертирование) OC0 при каждом совпадении10Сброс OC0 при каждом совпадении11Установка OC0 при каждом совпадении
Распределение управляющих бит в регистрах МК
Определив значения всех управляющих бит для настройки таймера, необходимо сформировать конкретные команды (значения управляющих регистров). Производитель распределяет биты по регистрам на свое усмотрение. Поэтому, опираясь на описание управляющих регистров контроллера, формируют их значения в зависимости от выбранного режима работы.
Ниже приведено описание управляющих регистров таймера 0 для используемого контроллера с указанием начального значения и возможностью чтения / записи отдельных бит.
Таблица 6. Регистр управления таймером-счетчиком 0 - TCCR0.
Разряд76543210 FOC0WGM00COM01COM00WGM01CS02CS01CS00Чтение/записьЧт.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Исх. значение00000000* Разряд 6, 3 - WGM01:0: Режим работы таймера-счетчика 0
* Разряд 5:4 - COM01, COM00: Режим формирования выходного сигнала
* Разряд 2:0 - CS02:0: Настройка частоты синхронизации таймера
Таблица 7. Регистр таймера-счетчика - TCNT0.
Разряд76543210 TCNT0[7:0]Чтение/записьЧт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Исх. значение00000000
Таблица 8. Регистр порога сравнения - OCR0
Разряд76543210 OCR0[7:0]OCR0Чтение/записьЧт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп.Чт./Зп. Исх. значение00000000 Регистр разрешения прерываний таймеров - счетчиков - TIMSK.
Для разрешения формирования прерываний от устанавливаемых событий используется регистр TIMSK, который является общим для всех таймеров контроллера. Установка бита в единицу разрешает формирование флага запроса.
Рис. 5. Регистр разрешения прерываний таймеров-счетчиков TIMSK.
Регистр флагов прерываний таймеров - счетчиков - TIFR
При разрешенном прерывании события таймера (регистр TIMSK) устанавливается соответствующий флаг в регистре флагов TIFR. Данный флаг является запросом прерывания и, если глобально прерывания разрешены, то происходит его обработка в соответствие с приоритетом.
Рис. 6. Регистров флагов прерываний таймеров-счетчиков - TIFR.
Таймер 1
Представляет собой 16 - разрядный таймер / счетчик. Структура его схожа с таймером 0 за исключением нескольких моментов:
* увеличена разрядность счетчика
* имеется 2 блока сравнения (вместо 1 в таймере 0)
* введена схема "захвата" значения счетчика при наступлении внешнего события.
* добавлен режим ШИМ с фазовой и частотной коррекцией.
Рис. 7. Структурная схема таймера 1 и назначение базовых блоков.
Особенности доступа к 16 разрядным счетчикам
Учитывая, что шина данных МК 8 бит, а счетчик - 16 разрядный, то для считывания / записи значения требуется 2 операции (обращения). Для исключения ошибочных ситуаций счетчик снабжен временным регистром для старшего байта счетчика. Значение данного регистра автоматически обновляется / записывается при обращении к младшему байту счетчика. При чтении счетчика сначала надо читать младший байт, затем старший, а при записи - сначала записывать старший, а затем - младший! При использовании высокоуровневых языков программирования компиляторы обычно выполняют данную операцию автоматически!
Рис. 8. Схема организации доступа к 16-ти разрядному счетчику и внешнего счетного входа.
Блок захвата позволяет зафиксировать значение счетчика при наступлении некоторого внешнего события, например, время изменения логического уровня на входе контроллера.
Рис. 9. Структурная схема блока захвата.
Поскольку данный режим не используется в данной работе, желающие могут ознакомиться с ним подробно в литературе.
Задание режима работы таймера 1. Управляющие регистры
Алгоритм задания режима работы аналогичен таймеру 0.
Частота и источник сигнала определяется битами CS12, CS11, CS10:
Таблица 9. Значение битов CS02:00.
CS12CS11CS10Описание000Нет синхронизации. Таймер-счетчик 1 остановлен.001clk (без предделения)010clk/8 (с предделением)011clk/64 (с предделением)100clk/256 (с предделением)101clk/1024 (с предделением)110переход 0 -> 1 с внешнего входа Т0111переход 1 -> 0 с внешнего входа Т0
Режим работы таймера определяется комбинацией бит WGM01, WGM00: данные биты определяют алгоритм счета счетчика, верхний предел счета и тип генерируемых прямоугольных импульсов. Таблица 10. Режимы работы таймера-счетчика (жирным выделены используемые в работе режимы)
РежимWGM13WGM12 WGM11 WGM10 Режим работа таймера-счетчика(1)Верхний пределОбновление OCR1xУстановка флага TOV1 на:00000Нормальный0xFFFFсразу после записиМАКС100018-разр. ШИМ ФК0x00FFна вершине счетанижнем пределе200109-разр. ШИМ ФК0x01FFна вершине счетанижнем пределе3001110-разр. ШИМ ФК0x03FFна вершине счетанижнем пределе40100СТСOCR1Aсразу после записиМАКС501018-разр. быстрая ШИМ0x00FFна нижнем пределена вершине счета601109-разр. быстрая ШИМ0x01FFна нижнем пределена вершине счета7011110-разр. быстрая ШИМ0x03FFна нижнем пределена вершине счета81000ШИМ ФЧКICR1на нижнем пределенижнем пределе91001ШИМ ФЧКOCR1Aна нижнем пределенижнем пределе101010ШИМ ФКICR1на вершине счетанижнем пределе111011ШИМ ФКOCR1Aна вершине счетанижнем пределе121100СТСICR1сразу после записиМАКС.131101(резерв)---141110Быстрая ШИМICR1на нижнем пределена вершине счета151111Быстрая ШИМOCR1Aна нижнем пределена вершине счета
Способ формирования выходного сигнала определяется комбинацией бит COM01, COM00 и аналогичен их использованию в таймере 0.
Распределение управляющих бит в регистрах МК
Рис. 10. Регистр А управления таймером-счетчиком 1 - TCCR1A.
Биты FOC1A, FOC1B управляют ускоренным сравнением значения счетчика с регистрами OCR и установкой выходного сигнала.
Рис. 11. Регистр B управления таймером-счетчиком 1 - TCCR1B.
Разряд 7 - ICNCn: Подавитель шума на входе захвата
Разряд 6 - ICESn: Выбор детектируемого фронта на входе захвата
ICESn = 0 - падающий (отрицательный) фронт приводит к захвату состояния таймера.
ICESn = 1 - нарастающий (положительный) фронт приводит к возникновению захвата.
Рис. 12. Регистр значения таймера-счетчика 1 - TCNT1.
Рис. 13. Регистры сравнения A и B (OCR1A, OCR1B).
Рис. 14. Регистр захвата ICR1.
Таймер 2
Представляет собой 8 - разрядный таймер / счетчик. Структура его схожа с таймером 0 за исключением нескольких моментов:
* добавлена возможность работы от внешнего асинхронного генератора (таймер может быть использован, например, для организации независимого счета времени - "часовой кварц")
* имеется 2 блока сравнения (вместо 1 в таймере 0)
* отсутствует возможность счета внешних импульсов
Рис. 15. Структурная схема таймера 2 и назначение базовых блоков.
Задание режима работы таймера 2. Управляющие регистры
Аналогично инициализации таймера 0.
Частота и источник сигнала определяется битами CS12, CS11, CS10:
Таблица 11. Значение битов CS02:00.
CS22CS21CS20Описание000Нет синхронизации. Таймер-счетчик 2 остановлен.001clk_t2 (без предделения)010clk_t2 /8 (с предделением)011clk_t2 /32 (с предделением)100clk_t2 /64 (с предделением)101clk_t2 /128 (с предделением)110clk_t2 /256 (с предделением)111clk_t2 /1024 (с предделением)clk_t2 - входная частота таймера (по умолчанию - рабочая частота контроллера). При задании асинхронного режима - частота внешнего кварцевого резонатора.
Распределение управляющих бит в регистрах МК
Основные регистры и распределение их бит полностью соответствуют регистрам таймера 0.
Рис. 16. Дополнительный регистр асинхронной работы ASSR.
Бит3 - AS2 - "1" - Включение асинхронного режима работы (тактирование от внешнего кварцевого резонатора).
Примеры инициализации таймеров.
Пример инициализации таймера 0 для генерации периодических прерываний каждые 10 мс при использовании кварцевого резонатора 8 МГц.
1. Выбираем режим работы - наиболее удобным представляется режим Clear Timer on Compare Match (CTC) Mode (сброс счетчика при совпадении с константой) WGM01, WGM00 = 10
2. Определим необходимость и значение предделителя. Учитывая, что счетчик 8 битовый, необходимо, чтобы за 10 мс значение счетчика не превысило 255. Для обеспечения наибольшей точности в то же время, желательно чтобы это значение было как можно большим. Разделим 10 мс на 255 (тем самым мы получим минимально допустимое время следования импульсов (период)). Получим период около 39 мкс -> частота = 1 / 0,000039 = 25641 Гц (максимальная частота на входе счетчика). Значение предделителя = 8000000 / 25641 = 312. Выбираем наиболее близкий из доступных сверху = 1024. CS02 - CS00 = 101.
3. Определяем значение константы для сравнения.
* Определим частоту и период следования счетных импульсов. 8000000 / 1024 = 7812,5 Гц, период = 128 мкс (1/f).
* Определим константу 10мс / 128 мкс = 78,125 - округляем до 78.
Получаем следующий код: OCR0 = 78;// 10ms via 8MHz
TCCR0 = _BV(WGM01) | _BV(CS02) | _BV(CS00); // делитель на 1024, CTC mode, старт
TIMSK |= _BV (OCIE0); // разрешение прерываний по событию (описано ниже)
Пример инициализации таймера 1 для переключения выходного сигнала через заданный временной интервал.
Определяем режим и предделитель аналогично как в предыдущем примере исходя из требуемой частоты и разрядности счетчика. Режим CTC с переключением выхода. WGM13 - WGM10 = 0100
COM1A1 - COM1A0 = 01 - переключение выхода при каждом совпадении.
#define START_T1_DIV80x02 // CS12 - CS10 = 010 доступная частота от 500 кГц до 8 Гц
OCR1A = freqPeriodUs / 2;// половина периода
TCCR1A = _BV(COM1A0) | _BV(FOC1A);// переключение вывода (PD5)
TCCR1B |= _BV(WGM12);// режим сброса в 0 при совпадении, TCCR1B |= START_T1_DIV8;// старт T1
Система прерываний микроконтроллера
Микроконтроллер AtMega16 использует 21 источник запросов прерываний. Векторы прерываний (адреса и наименование) имеют фиксированное значение, расположены в начальной области памяти программ и представлены в таблице:
Таблица 12. Векторы сброса и прерываний.
Vector No.Program AddressSourceInterrupt Definition1. $0000RESETСброс по выводу и сторожевому таймеру (Hardware Pin and Watchdog Reset)2. $0002INT0Запрос внешнего прерывания 0 (External Interrupt Request 0)3. $0004INT1Запрос внешнего прерывания 1 (External Interrupt Request 1)4. $0006TIMER2 COMPСовпадение при сравнении таймера/счетчика 2 (Timer/Counter2 Compare Match)5. $0008TIMER2 OVFПереполнение таймера/счетчика 2 (Timer/Counter2 Overflow)6. $000ATIMER1 CAPTЗахват таймера/счетчика 1 (Timer/Counter1 Capture Event)7. $000CTIMER1 COMPAСовпадение A при сравнении таймера/счетчика 1 (Timer/Counter1 Compare Match A)8. $000ETIMER1 COMPBСовпадение B при сравнении таймера/счетчика 1 (Timer/Counter1 Compare Match B)9. $0010TIMER1 OVFПереполнение таймера/счетчика 1 (Timer/Counter1 Overflow)10. $0012TIMER0 OVFПереполнение таймера/счетчика 0 (Timer/Counter0 Overflow)11. $0014SPI, STCЗавершение пересылки SPI (SPI Ser ial Transfer Complete)12. $0016USART, RXCЗавершение приема UART (UART, Rx Complete)13. $0018USART, UDREРегистр данных UART пуст (UART Data Register Empty)14. $001AUART, TXCЗавершение передачи UART (UART, Tx Complete)15. $001CADCЗавершение ADC преобразования (ADC Conversion Complete)16. $001EEE READYГотовность EEPROM (EEPROM Ready)17. $0020ANA COMPСрабатывание аналогового компаратора (Analog Comparator)18. $0022TWII2C (TWI) интерфейс 19. $0024INT2Запрос внешнего прерывания 2 (External Interrupt Request 2)20. $0026TIMER0 COMPСовпадение при сравнении таймера/счетчика 0 (Timer/Counter0 Compare Match)21. $0028SPM_RDYГотовность памяти программ (при программировании)Расположение векторов в таблице определяет и их приоритет: вектора с меньшими адресами обладают более высоким приоритетом.
Типичное определение векторов (Ассемблер) приведено на рисунке. Рис. 17. Определение векторов на ассемблер.
Каждый запрос прерывания может быть индивидуально замаскирован (запрещен) через регистры периферийных устройств МК (например, TIMSK), и через глобальный регистр General Interrupt Control Register - GICR.
Общее разрешение / запрет обработки прерываний управляется битом I в регистре статуса SREG МК (1 - разрешает обработку прерываний).
Рис. 18. Регистр статуса SREG.
Данный бит автоматически сбрасывается при входе в обработчик прерывания (вложенные прерывания по умолчанию запрещаются) и устанавливается при выходе из прерывания.
Также имеются специальные ассемблерные команды SEI, CLI для установки и сброса данного бита.
На языке С в библиотеке libc имеются функции для управления данным битом:
sei(); cli();
Создание обработчика прерывания с использованием GCC и библиотеки avr-libc происходит по нескольким шаблонам (см. документацию на библиотеку).
Самый распространенный шаблон:
#include <avr/interrupt.h>
ISR (ADC_vect)
{
// user code here
}
Способы формирования тональных сигналов с использованием МК с помощью таймеров
Формирование временной последовательности "0" и "1" может быть осуществлено в микроконтроллерных системах различным образом. Рассмотрим использование таймеров для выполнения данной задачи.
Несмотря на простоту метода, описанного в предыдущей лабораторной работе, у него имеется очень существенный недостаток, который сводит на нет возможность его использования в практических системах. Это связано с тем, что во время воспроизведения мелодии утилизируется 100% ресурсов МК, т.е. он занят отсчетом временных интервалов. При этом прерывания также необходимо запретить, т.к. они обязательно нарушат временной отсчет.
Поэтому, по возможности отсчет временных интервалов надо возлагать на соответствующие подсистемы - таймеры.
С использованием одного таймера
В данном случае, задача функции воспроизведения ноты - задать режим и параметры таймера для отсчета половинной длительности периода тона ноты (с прерыванием по завершению). После чего вернуть управление. При этом необходимо задать функцию обработчика прерывания, в которой выполнять изменение сигнала на выходном порте.
Единственный вопрос в этом случае - каким образом определить завершение длительности ноты? Это можно сделать разными способами: дополнительным таймером, взведенным на указанную длительность ноты или, например, отсчетом периодов частоты ноты.
Для реализации второго способа можно в обработчике прерывания таймера частоты ноты вести отсчет длительности ноты и сравнивать с заданным значением длительности.
Примерные шаблоны функций:
/*
Старт генерации (запуск таймера и задание времени ноты)
*/
void Sound_Play (uint16_t freqPeriodUs, uint32_t timeUs)
{
noteTime = (uint32_t) timeUs;// запомним время длительности ноты в глоб. переменной
playTime = 0;// total note time
// Инициализация таймера Т1: 1мкс тик (/ 8), CTC mode
TCCR1B = 0x00;// стоп T1
OCR1A = freqPeriodUs / 2;// длительность полупериода
TCCR1A = 0x00;
TCCR1B = _BV(WGM12);// СТС mode
TIMSK = _BV (OCIE1A);// разрешим прерывания от таймера
TCCR1B |= 0x02;// старт T1
}
/*
Прерывание на половину периода ноты
- меняем выход
- считаем время ноты
- завершаем работу таймера при окончании времени ноты
- формируем признак события (для main) по окончании ноты */
#define OUT_PORTPORTB
#define OUT_PIN0
ISR (TIMER1_COMPA_vect)
{
OUT_PORT = OUT_PORT ^ _BV(OUT_PIN);// инвертируем выходной сигнал
playTime += OCR1A;// считаем сколько времени уже отыграли
if(playTime >= noteTime){
TCCR1B = 0x00;// останавливаем воспроизведение
OUT_PORT &= ~_BV(OUT_PIN);
endNoteFlag = 1;// укажем главной функции, что нота отыграла (событие)!
}
}
В данной реализации основная программа запускает воспроизведение ноты мелодии, после чего каким либо образом ожидает события ее завершения. Затем запускает следующую ноту и повторяет шаги до завершения мелодии. В следующем примере программа в цикле контролирует событие завершении ноты и при его возникновении - обрабатывает. while (1){
if ((условие_старта_мелодии)){// noteIdx = 0;// запуск мелодии сначала
Sound_Play(Ноты[noteIdx].период, Ноты[noteIdx].длительность);
}
if(endNoteFlag){
noteIdx++;
if(noteIdx >= (количество нот мелодии)){
noteIdx = 0;
}
else{
Sound_Play(Ноты[noteIdx].период, Ноты[noteIdx].длительность);
}
endNoteFlag = 0;
}
}
В данной реализации у МК есть возможность выполнять дополнительные задачи, которые располагаются в цикле while функции main. Недостатком программного опроса события завершения ноты может являться запаздывание реакции системы на данное событие, что будет приводить к незапланированным паузам. Избежать данного недостатка можно путем переноса обработки данного события непосредственно в обработчик прерывания.
С использованием двух таймеров
Еще более снизить загрузку процессора задачей воспроизведения мелодии можно, если воспользоваться режимом работы таймера с аппаратным формированием выходного сигнала (CTC + Waveform generator). Нетрудно заметить, что в предыдущем методе прерывания от таймера частоты возникают достаточно часто, а основная функция - это и есть изменение значение выхода. Переложив эту функцию на генератор сигнала таймера, мы можем сократить издержки ядра на обработку данной задачи. В этом случае возникает другая задача - учет времени длительности ноты. Очевидно, что это придется делать с использованием дополнительного таймера.
Рис. 19. Функциональная блок схема использования двух таймеров для формирования ноты.
В функциях представленных ниже приведен несколько отличный механизм учета времени. Он основан на том, что, как правило, программист заводит один таймер для учета времени системы (системный тик). При этом величина тика выбирается обычно от1 до 10 мс. В прерывании тика ведется инкремент программного счетчика тиков, который доступен всем модулям программы. Анализ прошедшего времени длительности ноты при этом способе можно вести либо непосредственно в обработчике прерывания тика, либо вне прерывания, при обработке данного события в цикле функции main. Пример реализации функций такого варианта приведен ниже:
/*
Таймер 0 используем как системный таймер с прерыванием каждые 10 мс
*/
void sysTimeInit(void)
{
TIMSK |= _BV (OCIE0); OCR0 = 78;// 10ms via 8MHz
TCCR0 = _BV(WGM01) | _BV(CS02) | _BV(CS00); // start timer with 1024 prescaler and CTC mode
}
/*
Обработчик прерывания системного таймера (10 мс) Не будем здесь ничего делать - просто сообщим главной функции, что 10 мс прошло!
На самом деле, здесь лучше инкрементировать переменную тиков (большой разрядности - uint32_t), чтобы не потерять случайно "тики"!
*/
ISR (TIMER0_COMP_vect)
{
timerTickFlag = 1;// }
/*
Старт генерации (запуск таймера и задание времени ноты)
*/
void Sound_Play(unsigned int freqPeriodUs, unsigned int timeMs)
{
playTime = timeMs;// длительность ноты в мс!
// Инициализация таймера T1: 1мкс тик (div8), CTC mode, автоматическое переключение выхода
TCCR1B = 0x00;
OCR1A = freqPeriodUs / 2;// половина периода частоты ноты
TCCR1A = _BV(COM1A0) | _BV(FOC1A);// автоматическое переключение выхода(PD5)
TCCR1B |= _BV(WGM12);// clear to compare match, TCCR1B |= 0x02;// старт T1
}
int main() {
.... (инициализация - не забудьте задать направление на выход для PD5)
sysTimeInit();
sei();
set_sleep_mode(SLEEP_MODE_IDLE);// планируем во время бездействия спать... (до прерывания)
while (1){
// попробуем поспать ...
cli();// защитимся от прерываний для инициализации сна
if (!timerTickFlag && !endNoteFlag)
{
sleep_enable();
sei();
sleep_cpu();// вот здесь собственно засыпаем...
sleep_disable();// а здесь проснемся после первого же прерывания
}
sei();
if ((условие_старта_мелодии)){// key push
noteIdx = 0;//start play
Sound_Play(...);
}
if(timerTickFlag){// событие 10 мс от таймера
timerTickFlag = 0;
tiks10ms++;
if(playTime > 0){
playTime -= 10;// обратный отсчет времени ноты
if(playTime <= 0){ // не пора ли играть следующую ноту?
stopFreq();// останов генерации
endNoteFlag = 1;
}
}
}
if(endNoteFlag){// получен флаг завершения воспроизведения ноты?
noteIdx++;
if(вся_мелодия){
noteIdx = 0;
...
}
else{
Sound_Play(...); // старт следующей ноты
}
endNoteFlag = 0;
} }
}
В такой схеме организации учета времени длительности ноты есть существенный минус - разработчик должен обеспечить итерацию цикла меньше времени одного тика, иначе, как и в предыдущей схеме могут возникать непредвиденные паузы. Решение состоит в переносе требовательных к временной точности функций в обработчики прерывания, что в свою очередь не всегда оправдано и может вызвать существенное "разбухание" обработчика. А это уже может повлечь за собой наложение прерываний и необходимость учета данного факта.
К недостатку данного способа формирования сигнала можно отнести жесткую привязку используемого физического вывода МК.
Обратите внимание, что в приведенном выше примере в случае отсутствия событий в системе, МК уходит в режим пониженного энергопотребления, путем остановки ядра (idle mode). В данном режиме периферийные модули остаются активными и позволяют формировать события для пробуждения микроконтроллера (прерывания). Такая практика позволяет значительно уменьшить энергопотребления контроллера, что особенно важно для схем с батарейным питанием. В то же время использование данного механизма требует повышенной внимательности со стороны программиста.
Определение загрузки ядра МК
Для того чтобы оценить, насколько предложенный способ формирования тональных сигналов эффективен, необходимо знать, насколько загружено ядро микропроцессора выполнением полезных функций (предполагаем, что когда МК выполнил все полезное, он входит в режим сна, что должен обеспечить программист). Самым лучшим способом является профилирование выполняемого кода (определение процента времени нахождения процессора в каждой из функций). Однако, в среде AVR Studio 4 не имеется таких встроенных средств. В этом случае, для примерной оценки данного параметра, можно определить время выполнения кода при старте и смене ноты, а также для варианта с 1 таймером - время обработки прерывания на каждую половину периода частоты. Учитывая количество вызовов этих функций и фрагментов в течение всего времени звучания мелодии, достаточно легко определить примерную степень загрузки ядра МК.
Определить же время выполнения указанных выше фрагментов кода можно, поставив в режиме отладки в необходимых точках программы точки останова. Описание лабораторного оборудования. Плата пьезоизлучателя
Рис. 20. Внешний вид платы пьезоизлучателя.
Плата подключается непосредственно к разъемам портов МК (расположены в правой части платы). Рис. 21. Подключение излучателя к плате.
Порт, с которого производится управление излучателем, выбирается переключателем, установленным на данной плате.
Схема представлена на Рис. 22.
Рис. 22. Схема работы излучателя с платой.
Практическая часть
Цель работы
Целью данной работы является ознакомление с принципом и режимами работы таймеров и организацией системы прерываний МК AtMega16. Задачи
1. Ознакомиться с используемыми в МК таймерами и основными режимами их работы;
2. Научиться конфигурировать таймер в режим периодического прерывания с автозагрузкой.
3. Используя функции, представленные в теоретической части работы, создать каркас программы, позволяющей реагировать на события от таймеров (механизм прерываний) и реализовывать дополнительные функции программы.
4. Ознакомится с различными способами генерации периодических сигналов с использованием микроконтроллеров.
5. Получить практические навыки программирования таймеров на основе предложенных заданий по генерации звуковых сигналов.
Методика выполнения задания
1. Изучить и разобраться в теоретической части лабораторной работы. Представить в отчет основные положения.
2. Создать 2 версии программы, проигрывающие музыкальный фрагмент, определяемый вариантом задания. Используемые таймеры определяются вариантом задания. Порт вывода выбирается произвольно. Отчет должен содержать алгоритмы и тексты программ.
a. Воспроизведение музыкального фрагмента путем использования таймера периода ноты и подсчетом длительности ноты (использовать соответствующие шаблоны функций из теоретической части лабораторной работы).
b. Воспроизведение музыкального фрагмента путем использования таймера периода ноты и таймера длительности ноты.
3. Создать проект. Выполнить компиляцию и отладку проекта в симуляторе. 4. Запустить и отладить программы на средствах стенда. Убедиться в корректности работы программ. При необходимости провести коммутацию портов МК в соответствии с требованиями программ.
5. Определите загрузку ядра МК при использовании различных методик генерации сигналов. Оценку времени отработки функций производить с использованием симулятора.
6. Оформить отчет.
Меры безопасности
Включение и выключение стенда проводить, строго в соответствии с указаниями в лабораторной работе №1.
Изменение аппаратной конфигурации (переключателей) проводить строго при выключенном питании платы.
Не допускать замыкания открытых цепей платы внешними предметами.
Без необходимости не менять положение "джамперов" устройства.
Варианты заданий
1. Длительность ноты - таймер 1
тон ноты -таймер 0.
За горою у колодца
2. Длительность ноты - таймер 2
тон ноты -таймер 0.
Как по матушке, братцы, по Волге
3. Длительность ноты - таймер 0
тон ноты -таймер1.
Вдоль по морю, морю
4. Длительность ноты - таймер 2
тон ноты -таймер 1.
Скакал казак через долину
5. Длительность ноты - таймер 2
тон ноты -таймер 0.
Молодка, молодка, молоденькая
6. Длительность ноты - таймер 0
тон ноты -таймер 2.
Как по морю, да по моречку
7. Длительность ноты - таймер 1
тон ноты -таймер 0.
Я во сад пошла
8. Длительность ноты - таймер 2
тон ноты -таймер 0.
Летел голубь, летел сизой
9. Длительность ноты - таймер 0
тон ноты -таймер1.
Зима
10. Длительность ноты - таймер 2
тон ноты -таймер 1.
Кукушечка
11. Длительность ноты - таймер 2
тон ноты -таймер 0.
Чижик-пыжик
12. Длительность ноты - таймер 0
тон ноты -таймер 2.
Весёлые гуси
13. Длительность ноты - таймер 1
тон ноты -таймер 0.
Василёк
14. Длительность ноты - таймер 2
тон ноты -таймер 0.
Листопад
15. Длительность ноты - таймер 0
тон ноты -таймер1.
Курица
16. Длительность ноты - таймер 2
тон ноты -таймер 1.
Ламбада
17. Длительность ноты - таймер 2
тон ноты -таймер 0.
Заинька
18. Длительность ноты - таймер 0
тон ноты -таймер 2.
Петушок.
19. Длительность ноты - таймер 1
тон ноты -таймер 0.
Ёлочка.
20. Длительность ноты - таймер 2
тон ноты -таймер 0.
Ди-ли-дон
Требование к содержанию и оформлению отчета
Отчет должен быть оформлен в соответствие с требованиями кафедры и включать в себя необходимые описания, листинги программ и скриншоты экранов по каждому пункту задания (конкретизировано в указаниях по выполнению каждого пункта). В конце работы должны быть сделаны общие выводы.
Контрольные вопросы
1. Сколько таймеров используется в архитектуре микроконтроллера AtMega16?
2. В чем основные отличия таймера 0 и таймера 1?
3. Чем отличается таймер 2 от таймера 0?
4. Какие функции могут выполнять таймеры счетчики (примеры решаемых задач)?
5. Объясните работу счетчика в режиме сравнения.
6. Для чего используется Waveform generator, к каким событиям он "привязан", и какие варианты формирования выхода он может реализовывать?
7. Что такое ШИМ? Как реализуется ШИМ на таймерах - счетчиках МК AtMega16? В чем основное отличие быстрого ШИМ от ШИМ с фазовой коррекцией?
8. В чем состоит настройка таймеров?
9. Особенность доступа к 16-ти разрядному таймеру (чтение и запись)?
10. Как можно использовать режим "захвата" таймера? Каков принцип работы таймера в данном режиме?
11. Как построена система прерываний МК AtMega16 (и всей линейки AVR)?
12. Как определяется приоритетность прерываний?
13. Разрешены ли вложенные прерывания?
14. Каким образом маскируются прерывания от периферийных модулей МК?
15. Какие инструкции разрешают / запрещают реакцию МК на прерывания?
16. Какие методы формирования звуковой последовательности используются в МПС?
17. Имеется ли преимущество при использовании таймеров для отсчета интервалов времени.
18. Какой метод дает наименьшую загрузку ядра при воспроизведении музыкальных фрагментов?
19. Как определить загрузку (полезную) ядра МК при выполнении программы?
Список литературы
1. Архитектура 8-разрядных микроконтроллеров семейства AVR - http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/start.htm
2. Справочные книги по микроконтроллерам AVR - http://avr.ru/docs/books/avr
3. Описание контроллера AtMega16 (на англ.) AtMega16.pdf
2
Документ
Категория
Рефераты
Просмотров
85
Размер файла
1 194 Кб
Теги
lab, 2013, mps
1/--страниц
Пожаловаться на содержимое документа