Книга
Книга
А. В. Белов
Микроконтроллеры AVRв радиолюбительскойпрактике
Наука и Техника Санкт-Петербург 2007
Белов А. В.
Микроконтроллеры AYR в радиолюбительской практике. — СПб.: Наука и Техника, 2007. — 352 с.: ил.
ISBN 978-5-94387-365-2
Серия «Радиолюбитель»
Данная книга представляет собой справочник, в котором представлено полное и подробное описание одной конкретной микросхемы - микроконтроллера ATiny2313 семейства AVR фирмы Atmel. Описание построено на основе оригинальной технической документации на микросхему и содержит описание всех регистров, всех видов памяти и всех внутренних систем микроконтроллера.
Имеется и практический раздел для радиолюбителей. Книга содержит описание нескольких практических схем, выполненных с применением данного микроконтроллера. Каждая схема снабжена подробным описанием и примером управляющей программы. Программы приведены в двух вариантах: на Ассемблере и языке СИ. Все программы также подробно описаны.
Книга рассчитана на широкий круг читателей. Она будет полезна разработчикам электронных устройств, работникам ремонтных организаций, радиолюбителям и студентам технических ВУЗов.
ISBN 978-5-94387-365-2ISBN 978-5-94387-365-2Автор и издательство не несут ответственности за возможный ущерб, причиненный в ходе использования материвлов двнной книги.
ISBN 978-5-94387-365-2
ISBN 978-5-94387-365-2
Контактные телефоны издательства
(812) 567-70-25, 567-70-26 (044)516-38-66
Официальный сайт: www.nit.com.ru
© Белов А. В.
© Наука и Техника (оригинал-макет), 2007
ООО «Наука и Техника*.
Лицензия №000350 от 23 декабря 1999 года.198097, г. Санкт-Петербург, ул. Маршала Говорова, д. 29.
Подписано в печать 22.02.07. Формат 60x881 /1в.
Бумага газетная. Печать офсетная. Объем 22 п. л.Тираж 3000 экз. Заказ № 944.
Отпечатано с готовых диапозитивов в ОАО «Техническая книга»
190005, Санкт-Петербург, Измайловский пр., 29
http://librus.ru
Содержание
Уважаемые читатели10
Глава 1. Микроконтроллер ATiny2313/V фирмы ATMEL................12
Основные характеристики и возможности13
Основные характеристики13
Блок-схема микроконтроллера15
Особенности микросхемы ATtiny2313 15
Описание выводов ;19
AVR — центральное ядро процессора.....21
Введение21
Краткая характеристика архитектуры21
АЛУ — арифметико-логическое устройство24
Регистр статуса24
Файл регистров общего назначения26
Х-регистр, Y-регистр и Z-регистр27
Указатель стека 28
Память ATtiny231329
Системная перепрограммируемая Flash-память программ29
Память данных SRAM31
Память данных БЕРНОМ 32
Процесс чтения/записи EEPROM32
Регистр адреса EEPROM — EEAR33
Регистр данных EEPROM — EEDR 34
Регистр управления EEPROM — EECR 34
Атомарное программирование байта....36
Раздельное программирование байта37
Стирание37
Запись...37
Предотвращение ошибок при работе с EEPROM38
Регистры ввода—вывода39
Регистры ввода—вывода общего назначения40
Тактовый генератор41
Система синхронизации и варианты ее конфигурирования41
Источники тактового сигнала42
Источник сигнала по умолчанию43
Кварцевый резонатор44
Встроенный перестраиваемый RC-генератор46
Регистр калибровки генератора —OSCCAL47
Внешний тактовый сигнал49
Внутренний генератор на 128 кГц50
Регистр предварительного делителя частоты — CLKPR51
Управления питанием и режимы сна53
Регистр управления микроконтроллером — MCUCR53
Режим Idle54
■ Режим Power-down55
Режим Standby56
Советы по уменьшению потребляемой мощности57
Система управления и сброса59
Начальный сброс микроконтроллера AVR59
Источники сигнала сброса59
Сброс при включении питания61
Внешний сброс62
Сброс при снижении напряжения питания63
Сброс от сторожевого таймера65
Регистр статуса системы сброса — MCUSR66
Сторожевой (охранный) таймер67
Особенности67
Блок-схема67
Режимы работы68
Регистр управления сторожевым таймером — WDTCSR (WDTCR)70
Прерывания•73
Порты ввода—вывода74
Введение74
Использование портов для цифрового ввода-вывода76
Конфигурация выводов76
Переключение значения разряда порта78
Переключение между выводом и вводом78
Чтение значения на выводе порта79
Разрешение цифрового ввода и режимы низкого потребления (режимы сна) 82
Дополнительные функции портов83
Регистр управления микроконтроллером — MCUCR86
Альтернативные функции порта А86
Альтернативные функции порта В86
Детальное описание альтернативных функций каждого из выводов87
Альтернативные функции порта D91
Подробное описание альтернативных функций91
Описание управляющих регистров портов ввода—вывода93
Внешние прерывания95
Назначение и режимы работы95
Регистр управления микроконтроллером — MCUCR96
Главный регистр маски прерываний — GIMSK98
Регистр флагов внешних прерываний — EIFR99
Регистр маски прерываний по изменению на любом из контактов — PCMSK100
Восьмиразрядный таймер/счетчик с поддержкой режима ШИМ101
Назначение и особенности101
Упрощенная блок-схема 101
Регистры101
Используемые обозначения103
Источники тактового сигнала таймера/счетчика104
Модуль счета'105
Модуль совпадения106
Принудительное изменение состояния выхода совпадения108
Блокировка режима совпадения в момент записи регистра TCNT0108
Использование модуля совпадения108
Модуль вывода сигнала совпадения109
Режим вывода сигнала совпадения и генерация сигналов110
Режимы работы111
Режим «Norma!»111
Режим сброса при совпадении (СТС)112
Режим Fast PWM (быстрый ШИМ)113
ШИМ, корректный по фазе (Phase Correct PWM)115
Регистр А управления таймера/счетчика 0 — TCCR0A 117
Регистр В управления таймера/счетчика 0 — TCCR0B121
Счетный регистр таймера/счетчика 0 — TCNT0123
Регистр совпадения (канал А) — OCR0A123
Регистр совпадения (канал В) — OCR0B124
Регистр маски таймера/счетчика 0 — TIMSK124
Регистр флагов таймера/счетчика 0 — TIFR 125
Предварительные делители таймера/счетчика 0 и таймера/счетчика 1 126
Внутренний источник тактового сигнала 126
Сброс предварительного делителя 126
Внешний источник тактового сигнала'.... 127
Главный регистр управления Таймерами — GTCCR 129
16-разрядный таймер/счетчик (таймер/счетчик 1)130
Основные особенности130
Условные обозначения130
Регистры131
Терминология;134
Совместимость134
Доступ к 16-разрядным регистрам135
Источники тактового сигнала таймера/счетчика136
Модуль счета136
Модуль захвата138
Источники сигнала запуска в режиме захвата140
Схема подавления помех 141
Использование модуля захвата 141
Модуль совпадения142
Принудительное изменение сигнала на выходе совпадения145
Блокировка режима совпадения в момент записи регистра TCNT1145
Использование модуля совпадения146
Модуль вывода сигнала совпадения146
Режимы работы 16-разрядного таймера/счетчика148
Режим Normal148
Режим сброса при совпадении (СТС)149
Режим FastPWM150
Режим phase correct PWM153
Режим phase and frequency correct PWM156
Регистр А управления таймером/счетчиком — TCCR1A156
Регистр В управления таймером/счетчиком — TCCR1В160
Регистр С управления таймером/счетчиком- TCCR1C161
Счетный регистр таймера/счетчика 1 — TCNT1Н и TCNT1L162
Регистр совпадения A — OCR 1 АН и OCR1AL163
Регистр совпадения В —- OCR 1ВН и OCR 1 BL 163
Регистр захвата — ICR1H и ICR 1L 164
Регистр маски прерываний таймера/счетчика —TIMSK 165
Регистр флагов таймера/счетчика 1 — TIFR 166
USART167
Особенности 167
Краткий обзор 167
Совместимость режимов AVR USART nAVRUART169
Тактовый генератор170
■ Внутренняя генерация тактового сигнала — генератор скорости передачи информации172
' 1 Режим удвоенной скорости (U2X)173
■Внешний тактовый сигнал174
'Синхронизация процесса передачи данных175
Форматы кадра175
"Расчет значения бита четности177
Инициализация USART178
Передача данных — передатчик USART180
■Посылка кадра данных длиной от 5 до 8 бит180
Посылка кадра данных длиной 9 бит181
Флаги и прерывания передатчика182
Генератор сигнала четности183
Отключение передатчика183
Прием данных — приемник USART184
Прием кадра данных длиной от 5 до 8 битов184
Прием кадра данных длиной 9 бит185
Флаг готовности приемника и вызов прерывания187
Флаги ошибки приемника187
Схема контроля четности189
Выключение приемника189
Освобождение буфера приемника189
Асинхронный прием данных190
Восстановление тактового сигнала в асинхронном режиме:190
Восстановление данных в асинхронном режиме192
Допустимые отклонения в асинхронном режиме;194
Режим мультипроцессорного обмена"196
Регистр ввода—вывода USART — UDR197
Регистр «А» статуса и управления USART — UCSRA198
Регистр «В» статуса и управления USART — UCSRB200
Регистр С статуса и управления USART — UCSRC202
Регистры скорости обмена информации USART — UBRRLm UBRRH204
Универсальный последовательный интерфейс — USI204
. Назначение и особенности204
Краткое описание205
Описание принципа работы в трехлроводномрежиме207
Пример операции SPI для ведущего устройства210
Пример операции SP1 для ведомого устройства 212
Принцип действия в двухпроводном режиме212
Схема обнаружения стартового условия216
Альтернативное использование USIг217
Полудуплексная асинхронная передача данных217
Регистр данных USI — USIDR217
Регистр состояния USI — USISR219
Регистр управления USI — USICR221
Аналоговый компаратор225
Назначение и особенности225
Регистр статуса и управления аналогового компаратора — ACSR225
Регистр отключения цифрового ввода — DIDR228
Встроенная система отладки программ debugWIRE229
Основные особенности встроенной системы отладки229
Назначение229
. Физический интерфейс230
Точки останова программы231
Ограничения режима debugWIRE231
Специальный регистр ввода—вывода предназначенный для debugWIRE .... 232
Регистр данных debugWire — DWDR232
Автоматическое перепрограммирование памяти программ232
Стирание страницы234
Загрузка страницы (заполнение данными временного буфера)234
Запись страницы235
Адресация памяти программ при автоматическом перепрограммировании 235
Регистр статуса и управления загрузкой программной памяти — SPMCSR . 237
Запись в EEPROM и работа с регистром SPMCSR.7...238
Чтение состояния fuse-переключателей и битов блокировки программным путем239
Предотвращение ошибок при программировании Flash-памяти240
Время программирования Flash-памяти при использовании команды SPM. 241
Программирование памяти242
Биты защиты памяти данных и программ242
Fuse-переключатели243
Фиксирование значений fuse-переключателей245
Байты идентификации245
Байт калибровки245
Размер страницы246
Глава 2. Написание программ для микроконтроллеров AVR247
Музыкальная шкатулка248
Постановка задачи248
Схема249
Алгоритм249
Кодируем мелодии251
Алгоритм работы музыкальной шкатулки252
Программа на Ассемблере253
Описание программы (листинг 2.1)258
Процедура вычисления адреса259
Текст программы «шаг за шагом»259
Особенности программы259
Подрограмма формирования задержки263
Программа на языке СИ265
Описание программы (листинг 2.2)267
Кодовый замок271
Постановка задачи271
Алгоритм 272
Схема275
Программа на Ассемблере276
Описание программы (листинг 2.3)281
Процедура записи ключевой комбинации в EEPROM293
Процедура проверки кода294
Процедура открывания замка295
Программа на языке СИ296
Описание программы (листинг 2.4)296
Кодовый замок с музыкальным звонком309
Постановка задачи309
Алгоритм309
Схема310
Программа на Ассемблере311
Программа на языке СИ323
ПРИЛОЖЕНИЕ329
Список литературы‘337
Список полезных ссылок на ресурсы Интернет337
Уважаемые читатели
Современную микроэлектронику трудно представить без такой важной составляющей, как микроконтроллеры. Микроконтроллеры незаметно завоевал весь мир. В последнее время на помощь человеку пришла целая армия электронных помощников. Мы привыкли к ним, поэтому часто даже не подозреваем, что во многих таких устройствах работает микроконтроллер. Микроконтроллерные технологии очень эффективны.
Одно и то же устройство, которое раньше собиралось на традиционных элементах, будучи собрано с применением микроконтроллеров» становится проще, не требует регулировки и меньше по размерам. Кроме того, с применением микроконтроллеров появляются практически безграничные возможности по добавлению новых потребительских функций и возможностей к уже существующим устройствам. Достаточно просто поменять программу!
Мировая промышленность выпускает огромную номенклатуру микроконтроллеров. Специализированные контроллеры предназначенны для применения в какой-либо одной конкретной области, например:
контроллер для телевизора;
контроллер для модема;
контроллер для компьютерной мышки и т. п. .
Особый же класс составляют универсальные микроконтроллеры. Они не имеют конкретной специализации и могут применяться в самых различных областях микроэлектроники. В частности, при желании их с успехом можно применить для создания перечисленных выше устройств. Но главное в том, что можно создать любое, может даже принципиально новое устройство.
Одна из самых популярных серий универсальных микроконтроллеров — это микроконтроллеры AYR выпускаемые американской фирмой Atmel. Микросхемы AYR широко используются в самых различных конструкциях, описание которых вы можете найти в журналах по микроэлектронике либо в Интернете.
Конечно, можно просто бездумно повторить любую из этих схем. Но гораздо полезнее научится самому разрабатывать микропроцессорные устройства. Для тех, кто хочет:
изучить основные принципы работы микропроцессоров;
понять основы внутренней архитектуры микроконтроллеров серии AYR, рекомендую приобрести новое издание Самоучителя по микропроцессорной технике [3].
Для тех, кто хотел бы получить практический урок разработки схем и программ для микроконтроллеров, рекомендую новую книгу Александра Белова “Создаем устройства на микроконтроллерах” [4].
Для тех, кто прочитал обе вышеперечисленные книги, либо для тех, кто и так знаком с основами, предлагается данная книга. Книга представляет собой полное и подробное описание микроконтроллера ATiny2313 семейства AVR. Книга составлена на основе фирменной документации на данный микроконтроллер и поможет наиболее полно применить все его особенности и свойства.
Описанию микроконтроллера посвящена первая глава. Подробно описываются все регистры микроконтроллера, их свойства, назначение и приемы работы. Описываются все встроенные системы (таймеры, каналы ввода/вывода, память, система прерываний и т. п.). Кроме того, даны советы по правильному применению и хитрости, позволяющие оптимизировать потребляемую энергию, быстродействие и другие параметры.
Во второй главе приведено несколько конкретных примеров применения микроконтроллера. Это несколько практических схем с подробным описанием и примером программ. Причем каждая программа написана в двух вариантах: на Ассемблере и на языке СИ. Все схемы и каждая из программ снабжены подробным описанием. В качестве примеров используются авторские разработки (музыкальная шкатулка и кодовый дверной замок). '
Издательство надеется, что настоящая книга будут полезна широкому кругу начинающих конструкторов электронной техники, радиолюбителей и студентов технических вузов. Автор будет благодарен за любые замечания и комментарии по книге. Все замечания прошу высылать Александру Белову:
по почте: Украина, г. Симферополь, ул. Русская, 194;
или по E-mail: avbelov@by.ru.
Дополнительную информацию об этой, а так же о других книгах Александра Белова, вы можете почерпнуть на специальном сайте поддержки его книг по адресу: http://book.microprocessor.by.ru/.
Ознакомиться с новинками и приобрести книги из любой страны мира можно через официальный сайт и Интернет-магазин издательства Наука и Техника www.nit.com.ru.
Удачи Вам во всем!
Сергей Корякин-Черняк, Главный редактор
ГЛАВА 1
МикроконтроллерATiny2313/V фирмы ATMEL
Глава является авторским переводомфирменной документации (Datasheet) намикроконтроллер типа АТ1пу2313. Глава даетполную информацию по устройству, принципудействця, архитектуре конкретногомикроконтроллера, а также советы по егоиспользованию.
Основные характеристики и возможности
Эта глава написана на основе фирменной документации изготовителя. Источником явились материалы сайта http://www.atmel.com, которые были мной обработаны и переведены.
Основные характеристики
Микросхема ATiny2313 представляет собой восьмиразрядный микроконтроллер с внутренней программируемой Flash-памятью размером 2 Кбайт..
Общие сведения:
использует AVR® RISC архитектуру;
AVR — это высокое быстродействие и специальная RISC-архитектура с низким потреблением;
120 мощных инструкций, большинство из которых выполняется за один машинный цикл;
32 восьмиразрядных регистра общего назначения;
полностью статическая организация (минимальная частота может быть равна 0);
до 20 миллионов операций в секунду (MIPS/Sec) при тактовой частоте 20 МГц.
Сохранение программ и данных при выключенном питании:
2 Кбайт встроенной программируемой Flash-памяти, до 10000 циклов записи/стирания;
128 байт встроенной программируемой энергонезависимой памяти данных (EEPROM);
до 100000 циклов записи/стирания;
128 байт внутреннего ОЗУ (SRAM);
Программируемые биты защиты от чтения и записи программной памяти и EEPROM.
Периферийные устройства:
один 8-разрядный таймер/счетчик с программируемым пред- делителем и режимом совпадения;
один 16-разрядный таймер/счетчик с программируемым пред- делителем, режимом совпадения и режимом захвата;
четыре канала ШИМ (PWM);
встроенный аналоговый компаратор;
программируемый сторожевой таймер и встроенный тактовый генератор;
универсальный последовательный интерфейс USI (Universal Serial Interface);
полнодуплексный USART.
Особенности микроконтроллера: .
специальный вход debugWIRE для управления встроенной системой отладки;
внутрисистемный программируемый последовательный интерфейс SPI;'
поддержка как внешних, так и внутренних источников прерываний;
три режима низкого потребления (Idle, Power-down и ■ Standby);
встроенная система аппаратного сброса при включении питания;
программируемая схема контроля снижения напряжения питания;
внутренний перестраиваемый тактовый генератор;
цепи ввода—вывода и корпус;
18 программируемых линий ввода—вывода;■
три вида корпусов:
PDIP — 20 контактов;
SOIC — 20 контактов;
QFN/MLF — 20 контактных площадок.
Напряжения питания:
1,8 — 5,5 В (для ATtiny2313V);
2,7 — 5,5 В (для ATtiny2313).
Диапазон частот тактового генератора ATtiny2313V:
0—4 МГц при напряжении 1,8—5,5 В;
0—10 МГц при напряжении 2,7—5,5 В.
Диапазон частот тактового генератора ATtiny2313:
0—10 МГц при напряжении 2,7—5,5 В;
0—20 МГц при напряжении 4,5—5,5 В.
Ток потребления в активном режиме:
1 МГц, 1,8 В: 230 мкА;
32 кГц, 1,8 В: 20 мкА (с внутренним генератором).
Ток потребления в режиме низкого потребления:
не более 0,1 мкА при напряжении 1,8 В.
Блок-схема микроконтроллера
Назначение выводов микросхемы ATtiny2313 приведено на рис. 1.1. Блок-схема микроконтроллера ATiny2313 приведена на рис. 1.2.
Ядро AVR имеет большой набор инструкции для работы с 32 регистрами общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (ALU), которое позволяет выполнять одну команду для двух разных регистров за один такт системного генератора. Такая архитектура позволила достигнуть производительности в десять раз большей, чем у традиционных микроконтроллеров, построенных по CISC-технологии.
Особенности микросхемы ATtiny2313
Микросхема ATtiny2313 имеет следующие особенности:
2 Кбайт системной программируемой Flash-памяти программ;
128 байт EEPROM;
128 байт SRAM (ОЗУ);
18 линий ввода—вывода (I/O);
32 рабочих регистра;
однопроводной интерфейс для внутрисхемной отладки;
два многофункциональных таймера/счетчика с функцией совпадения;
поддержка внешних и внутренних прерываний;
последовательный программируемый USART-порт;
универсальный последовательный интерфейс с детектором начала передачи;
программируемый сторожевой таймер с внутренним генератором;
три программно изменяемых режима энергосбережения.
В режиме Idle происходит приостановка центрального процессора, остальные системы продолжают работать. Выход из этого режима возможен как по внешнему прерыванию, так и по внутреннему. Например, при переполнении таймера.
PDIP/SOIC
(RESET/dW) РА2 С 1(RESET/dW) РА2 С 1(RXD) PDO Г(RXD) PDO Г2220 Э VCC19 □ РВ7 (UCSK/SCK/PCINT7)20 Э VCC19 □ РВ7 (UCSK/SCK/PCINT7)(TXD)PD1 С 3 (XTAL2) PAI С 4 (XTALI)PAOC 5(CKOUT/XCK/INTO) PD2 С 6(INT1)PD3C 7 (T0)PD4C 8(TXD)PD1 С 3 (XTAL2) PAI С 4 (XTALI)PAOC 5(CKOUT/XCK/INTO) PD2 С 6(INT1)PD3C 7 (T0)PD4C 81818□ РВ6 (MISO/DO/PCINT6)□ РВ6 (MISO/DO/PCINT6)17 nPB5(MOSI/DI/SDA/PCINT5)17 nPB5(MOSI/DI/SDA/PCINT5)16167Э РВ4 (ОС1B/PCINT4)7Э РВ4 (ОС1B/PCINT4)(ОСОВ)PD5С(ОСОВ)PD5С99GNDC 10GNDC 1015 З РВЗ (OC1A/PCINT3)14 □ РВ2 (OC0A/PCINT2)13 Z3 РВ1 (ANI1/PCINT1)12 3 РВО (ANI0/PCINT0)11 3 PD6 (1SP)15 З РВЗ (OC1A/PCINT3)14 □ РВ2 (OC0A/PCINT2)13 Z3 РВ1 (ANI1/PCINT1)12 3 РВО (ANI0/PCINT0)11 3 PD6 (1SP)
(RESET/dW) РА2 С 1
(RESET/dW) РА2 С 1
(RXD) PDO Г
(RXD) PDO Г
2
2
20 Э VCC
19 □ РВ7 (UCSK/SCK/PCINT7)
20 Э VCC
19 □ РВ7 (UCSK/SCK/PCINT7)
(TXD)PD1 С 3 (XTAL2) PAI С 4 (XTALI)PAOC 5
(CKOUT/XCK/INTO) PD2 С 6
(INT1)PD3C 7 (T0)PD4C 8
(TXD)PD1 С 3 (XTAL2) PAI С 4 (XTALI)PAOC 5
(CKOUT/XCK/INTO) PD2 С 6
(INT1)PD3C 7 (T0)PD4C 8
18
18
□ РВ6 (MISO/DO/PCINT6)
□ РВ6 (MISO/DO/PCINT6)
17 nPB5(MOSI/DI/SDA/PCINT5)
17 nPB5(MOSI/DI/SDA/PCINT5)
16
16
7Э РВ4 (ОС1B/PCINT4)
7Э РВ4 (ОС1B/PCINT4)
(ОСОВ)PD5С
(ОСОВ)PD5С
9
9
GNDC 10
GNDC 10
15 З РВЗ (OC1A/PCINT3)
14 □ РВ2 (OC0A/PCINT2)
13 Z3 РВ1 (ANI1/PCINT1)
12 3 РВО (ANI0/PCINT0)
11 3 PD6 (1SP)
15 З РВЗ (OC1A/PCINT3)
14 □ РВ2 (OC0A/PCINT2)
13 Z3 РВ1 (ANI1/PCINT1)
12 3 РВО (ANI0/PCINT0)
11 3 PD6 (1SP)
MLFvcc(RESET/dW) PA2 | PB7 (UCSK/SCK/PCINT7)(RXD) PDO 4 t 4 P86 (MISO/DO/PCINT6)
(TXD)PDIE 1 - (XTAL2) РА1 Ц 2 |
02019181716
(ХТАИ)РАОС
(CKOUT/XCK/INTO) PD2C
(INT1)PD3E
3 I
6 7 8 9 10U U U U ЕГ
-15 □ PBS (MOSI/DI/SDA/PCINT5) ' 14 3P84(OC1B/PCINT4) 113 3 PB3 (OC1A/PCINT3) ] 12 3 PB2 (OC0A/PCINT2) *11рРВ1 (ANI1/PCINT1)
/(T0)PD4 4 a | PBO (ANlO/PClNTO) (OCOB) PD5 I PD6(ISP)
IGND
Внимание! Нижнюю площадку прижать к корпусу
РВО - РВ7PDO - РО6РВО - РВ7PDO - РО6Рис. 1.2. Блок-схема микроконтроллера ATiny2313Рис. 1.2. Блок-схема микроконтроллера ATiny2313RESETRESET
РВО - РВ7PDO - РО6
РВО - РВ7PDO - РО6
Рис. 1.2. Блок-схема микроконтроллера ATiny2313
Рис. 1.2. Блок-схема микроконтроллера ATiny2313
RESET
RESET
В режиме Power Down сохраняется содержимое регистров, но приостанавливается работа внутреннего генератора и отключаются все остальные функции микросхемы. Выход из режима возможен по внешнему прерыванию или после системного сброса. Такое решение позволяет совмещать быстрый старт с низким энергопотреблением.
Микросхема изготовлена с использованием уникальной высокоточной технологии фирмы Atmel. Внутренняя Flash-память программ может быть перепрограммирована при помощи ISP-интерфейса без извлечения микроконтроллера из платы. Объединение 8-разряд- ного RISC-процессора — внутрисистемной перепрограммируемой Flash-памятью на одном кристалле делают микросхему ATtiny2313 мощным средством, которое обеспечивает очень гибкие и недорогие решения многих прикладных задач управления.
Для микросхемы ATtiny2313, как и всех остальных микросхем серии AVR, существует полный набор документации и инструментальных программ:
компиляторы с языка С;
макроассемблеры;
программные отладчики/имитаторы;
отладочные комплекты.
Описание выводов
vcc
Напряжение питания
GND
Общий провод
Port A (PA2..PA0)
Порт А — трехразрядный двунаправленный порт ввода—вывода.
Каждая из линий порта имеет возможность подключения внутреннего нагрузочного резистора.
Подключение резистора производится программным путем только в том случае, если данный конкретный вывод находится в режиме ввода.
Когда резистор подключен, он создает выходной истекающий ток для внешних устройств, формирующих низкий логический уровень. Выходной буфер каждой линии порта А имеет симметричный каскад с высокой нагрузочной способностью.
После системного сброса все выводы порта А переходят в высокоимпендансное состояние (режим ввода без нагрузочного резистора) даже в том случае, если системный генератор не работает.
Все выводы порта А, кроме своих основных функций, имеют также и альтернативные. Все альтернативные функции выводов описаны ниже (см. табл. 1.24)
Port В (PB7..PB0)
Порт В — восьмиразрядный двунаправленный порт ввода— вывода
Каждая из линий порта имеет возможность подключения внутреннего нагрузочного резистора. Подключение резистора производится программным путем только в том случае, если данный конкретный вывод находится в режиме ввода.
Когда резистор подключен, он создает выходной истекающий ток для внешних устройств, формирующих низкий логический уровень.
Выходной буфер каждой линии порта А имеет симметричный каскад с высокой нагрузочной способностью. После системного сброса все выводы порта В переходят в высокоимпендансное состояние (режим ввода без нагрузочного резистора) даже в том случае, если системный генератор не работает.
Все выводы порта В, кроме своих основных функций, имеют также и альтернативные. Все альтернативные функции выводов описаны ниже (см. табл. 1.25)
Port D (PD6..PD0)
Порт D — семиразрядный двунаправленный порт ввода—вывода.
Каждая из линий порта имеет возможность подключения внутреннего нагрузочного резистора. Подключение резистора производится программным путем только в том случае, если данный конкретный вывод находится в режиме ввода.
Когда резистор подключен, он создает выходной истекающий ток для внешних устройств, формирующих низкий логический уровень. Выходной буфер каждой линии порта А имеет симметричный каскад с высокой нагрузочной способностью.
После системного сброса все выводы порта D переходят в высокоимпендансное состояние (режим ввода без нагрузочного резистора) даже в том случае, если системный генератор не работает.
Все выводы порта D, кроме своих основных функций, имеют также и альтернативные. Все альтернативные функции выводов описаны ниже (см. табл. 1.28)
RESET
Вход сброса.
Низкий уровень на этом входе с длительностью не меньше минимально допустимого значения приведет к полному сбросу микроконтроллера даже в том случае, когда не работает тактовый генератор.
Минимально допустимые значения для сигналов сброса приведены в табл. 1.15. Более короткий импульс не гарантирует нормального сброса. Вход сброса имеет альтернативные функции линии РА2 и линии dW
XTAL1
Инвертирующий вход для кварцевого резонатора, вход внешнего генератора.
Вход XTAL1 имеет альтернативную функцию. Он может использоваться как линия РАО
XTAL2
Выход на внешний резонатор.
Вывод XTAL2 имеет альтернативную функцию. Оц может использоваться как линия РА1
1.2. AVR — центральное ядро процессора
Введение
Главная функция центрального ядра процессора — управление процессом выполнения программ. Для этого центральный процессор должен иметь непосредственный доступ к памяти, должен быть способен производить все виды вычислений и выполнять запросы на прерывания. В этом разделе рассмотрены общие вопросы архитектуры AYR.
Краткая характеристика архитектуры
Чтобы максимально ускорить работу и сделать возможным параллельное выполнение нескольких операций, микроконтроллеры AVR используют Гарвардскую архитектуру (рис, 1.3). Такая архитектура предусматривает отдельную память и отдельную шину адреса как для программы, так и для данных.
Каждая команда из памяти программ выполняется за один машинный цикл с использованием многоуровневой конвейерной обработки. В тот момент, когда очередная команда выполняется, следующая команда считывается из программной памяти. Такая концепция позволяет выполнять по одной команде за один такт системного генератора. Программный сегмент памяти физически представляет собой встроенную перепрограммируемую Flash-память.
Файл регистров быстрого доступа содержит 32 восьмиразрядных регистра общего назначения, доступ к которым осуществляется за один такт системного генератора. Это позволяет арифметикологическому устройству (ОЛУ) осуществлять большинство своих операций за один такт.
Типичная операция АЛУ выполняется следующим образом: из регистрового файла читаются два операнда, выполняется операция. Результат сохраняется опять же в файле регистров. Все эти три действия выполняются за один цикл тактового генератора.
Шесть из этих 32 регистраторов могут использоваться как три 16- разрядных регистра-указателя косвенной адресации. Эти сдвоенные регистры могут использоваться для адресации данных в адресном пространстве ОЗУ. Такая организация дает возможность программного вычисления адреса.
Один из этих регистров-указателей может также использоваться в качестве указателя адреса данных, размещенных в памяти программ (Flash-памяти). Эти дополнительные составные 16-разрядные регистры именуются X, Y и Z. Подробнее они будут описаны далее в этом разделе.
Рис. 1.3. Блок-схема архитектуры AVR
АЛУ поддерживает арифметические и логические операции между двумя регистраторами или между константой и регистром. В АЛУ также могут выполняться операции с отдельными регистрами. После каждой арифметической операции обновляется регистр статуса для того, чтобы отразить информацию о ее результате.
Последовательность выполнения программы может быть изменена командами условного и безусловного перехода, а также командой вызова подпрограммы, в которых используется непосредственная адресация.
Большинство инструкций AVR представляет собой одно 16-разряд- ное слово. Каждый адрес памяти программы содержит 16-битовую инструкцию или половину 32-разрядной инструкции.
При выполнении процедуры обработки прерывания или подпрограммы текущее значение счетчика команд (PC) сохраняется в стеке.
Стек фактически размещен в одном адресном пространстве с памятью данных SRAM (ОЗУ) и, следовательно, размер стека ограничен только размером SRAM и тем, какую часть SRAM использует остальная программа.
Программа пользователя обязательно должна инициализировать указатель стека (SP) сразу после сброса (прежде, чем будет выполнена подпрограмма или будет вызвано прерывание). Указатель стека (SP) имеегсвой конкретный адрес в пространстве регистров ввода—вывода. К данным в ОЗУ (SRAM) можно получить доступ, используя пять различных способов адресации, поддержанных архитектурой AVR.
Адресное пространство всех видов памяти в архитектуре AYR являются регулярным линейным. Гибкий модуль прерываний имеет ряд регистраторов управления в адресном пространстве регистров ввода—вывода и дополнительный флаг глобального разрешения прерываний в регистре статуса.
Каждый вид прерывания имеет свой отдельный вектор в таблице векторов прерываний. Прерывания имеют приоритет в соответствии с их положением в таблице векторов прерываний. Чем ниже адрес вектора прерывания, тем выше приоритет.
Пространство регистров ввода—вывода содержит 64 адреса для регистров управления периферийными устройствами, регистров управления режимами работы процессора и другими функциями ввода/вывода. К любому регистру ввода—вывода можно получить доступ непосредственно по его номеру или как к ячейке памяти данных. В адресном пространстве памяти данных регистры ввода—вывода располагаются сразу после файла регистров общего назначения (0x20 — 0x5F).
АЛУ — арифметико-логическое устройство
Высокоэффективное АЛУ работает в прямой связи со всеми 32 регистрами общего назначения. За один цикл тактового генератора выполняется арифметическая операция между двумя РОН либо между РОН и непосредственно указанной константой. Все операции АЛУ разделены на три главных категории:
арифметические;
логические;
операции с разрядами.
Особенностью архитектуры является то, что при выполнении арифметических операций все операнды могут рассматриваться как числа без знака, так и числа со знаком.
Регистр статуса
Регистр статуса содержит информацию о результатах выполнения последней арифметической или логической команды. Эта информация может использоваться для того, чтобы изменить процесс выполнения программы, в командах условного перехода и других условных операторах.
Внимание. Изменение регистра статуса происходит не только при выполнении команд сравнения, но также в результате действия любых других команд, связанных с АЛУ.
Влияние различных команд на содержимое регистра статуса вы можете видеть во всех,таблицах этой главы (в графе «Примечание»). Воспользовавшись этой информацией, вы можете исключить лишние команды сравнения из своей программы и таким образом уменьшить ее длину.
При вызове процедуры обработки прерывания регистр статуса автоматически не сохраняется. Программист должен обязательно предусмотреть в процедуре обработки прерываний команды, которые будут сохранять содержимое этого регистра в начале и восстанавливать его в конце. Учтите, что регистр статуса не может быть непосредственно помещен в стековую память. Вам придется сначала сохранить в стеке один из регистров общего назначения,
затем поместить в освободившийся регистр содержимое регистра : статуса, а затем уже из этого промежуточного регистра переместить информацию в стек.
Регистр статуса микроконтроллера SREG имеет следующий формат:
Номер бита76543210
'I 1 lTlHislvl Nlzlcl SREG
Чтение(В)/ЗаписьС«)r/wR/WR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Бит 7 — 1: Общее разрешение прерываний. При установке этого флага в единичное состояние разрешается работа всей системы прерываний. Отдельные виды прерываний включаются и выключаются при помощи дополнительных регистров конфигурации (см. далее). .
Если флаг «Общее разрешение прерываний» имеет нулевое значение, все прерывания заблокированы, независимо от того, включены они или нет в дополнительных регистрах конфигурации.
Флаг I аппаратно сбрасывается сразу после вызова соответствующей процедуры обработки прерывания и устанавливается при выполнении команды RETI, разрешая последующие прерывания. Флаг I может быть также установлен и сброшен программно при помощи команд SEI и CLI соответственно.
Бит 6 — Т: Пользовательский бит для временного хранения информации. Бит Т используется командами BLD (загрузка бита Т) и BST (чтение бита Т) как ячейка для временного хранения информации. Любой бит любого регистра общего назначения может быть скопирован в Т, а затем содержимое Т может быть скопировано в любой другой бит того же либо любого другого регистра.
Бит 5 — Н: Флаг половинного переноса. Этот флаг устанавливается в единицу, если имел место перенос из младшей половины байта (из 3-го разряда в 4-й) или заем из старшей половины байта при выполнении некоторых арифметических операций.
Бит 4 — S: Флаг знака, S = N Ф V. Этот флаг является результатом операции «Исключающее ИЛИ» (XOR) между флагами N (отрицательный результат) и V (переполнение числа в дополнительном коде). Соответственно, этот флаг устанавливается в единицу, если результат выполнения арифметической операции меньше нуля.
Бит 3 — V: Флаг переполнения дополнительного кода. Этот флаг используется при работе со знаковыми числами (числами, представленными в дополнительном коде). Флаг устанавливается в единицу, если в результате арифметической операции произойдет переполнение числа, представленного в дополнительном коде.
Бит 2 — N: Флаг отрицательного значения. Этот флаг устанавливается в единицу, если в результате арифметической операции старший разряд результата равен единице. Если старший разряд результата вычислений равен нулю, то флаг N тоже равен нулю.
Бит 1 — Z: Флаг нуля. Этот флаг устанавливается в единицу, если результат выполняемой операции равен нулю.
Бит 0 — С: Флаг переноса. Этот флаг индицирует переполнение результата (перенос в старший разряд) при выполнении арифметической операции. Кроме того, флаг переноса используется в операциях сдвига.
Файл регистров общего назначения
Файл регистров оптимизирован для набора AVR RISC-инструкций. Для того, чтобы достичь требуемой производительности и гибкости, файл регистров -поддерживает следующие схемы ввода—вывода:
вывод одного 8-разрядного операнда и ввод одного 8-разряд- ного результата вычислений;'
вывод двух 8-разрядных операндов и ввод одного 8-разрядного результата вычислений;
вывод двух 8-разрядных операндов и ввод одного 16-разрядно- го результата вычислений;
вывод одного 16-разрядного операнда и ввод одного 16-разряд- ного результата вычислений.
На рис. 1.4 показана структура 32 регистров общего назначения, используемых в качестве рабочих регистров микроконтроллера.
Большинство инструкций, оперирующих файлом регистров, имеет прямой доступ ко всем его регистраторам, и большинство из них выполняются за один такт.
Как показано на рис. 1.4, каждому регистру также соответствует адрес в пространстве памяти данных, где они занимают первые 26
32 ячейки. Хотя физически регистры не входят в SRAM, такая организация памяти обеспечивает большую гибкость при доступе к регистраторам. Указатель косвенного доступа к памяти (один из регистров X, Y или Z) может быть установлен на любой регистр из файла.
7
0
Адрес
R0
0x00
Рабочие регистры
R1
0x01
R2
0x02
общего назначения
R13
0x00
R14
ОхОЕ
RI5
OxOF
R16
0x10
R17
0x11
R26
0x1 А
Х-регистр младший байт
R27
0x1 В
Х-регистр старший байт
R28
0x1 С
У-регистр младший байт
R29
0x10
Y-регистр старший байт
R30
0x1 Е
Z-регистр младший байт
R31
0x1 F
Z-регистр старший байт
Рис. 1.4. Файл регистров общего назначения микроконтроллеров AVR
Х-регистр, Y-регистри Z-регистр
Регистры R26—R31, кроме своего основного назначения, имеют дополнительную функцию. Эти регистраторы могут служить 16-битными указателями адреса для операций, использующих косвенную адресацию. Три косвенных регистра адреса X, У, и Z определены так, как это показано на рис. 1.5.
В разных командах, использующих косвенную адресацию, эти регистры могут быть использованы как источники постоянного адреса, как адресный регистр с автоматическим приращением адреса и как регистр с автоматическим уменьшением адреса.
15
ХН
XL
0
Х-регистр | 7
0 | 7
0 I
R27(0x1B)
R26 (0x1 А)
15
YH
YL
0
Y-регистр | 7
0|7
о|
R29 (0x10)
R28 (0x1 С)
15
ZH
ZL
0
Z-регистр | 7
0| 7
о|
R31 (0x1 F)
R30 (0x1 F)
Рис. 1.5. Сдвоенные регистры X, Y, Z
Указатель стека
Стек, главным образом, используется:
для временного хранения данных;
для хранения локальных переменных;
для хранения адреса выхода из подпрограммы или процедуры обработки прерывания.
Регистр указателя стека всегда указывает на его вершину.
Внимание. Стек выполнен таким образом, что перемещается от своей вершины вниз, к ячейкам памяти с меньшим адресом. По этой причине команда PUSH (записать в стек) уменьшает указатель стека.
Указатель стека указывает на стековую область в памяти данных (SRAM). В стеке, кроме прочего, сохраняются;
адрес выхода из подпрограммы;
адрес выхода из процедуры обработки прерывания.
Поэтому в любой программе адрес начала стека необходимо определить перед тем, как будет вызвана любая подпрограмма, и перед тем, как будут разрешены прерывания. Первоначально указатель стека должен быть установлен на адрес не ниже 0x60.
Указатель стека уменьшается на единицу, когда данные записываются в стек при помощи команды PUSH, и уменьшается на два,
когда в стек записывается адрес возврата из подпрограммы или процедуры обработки прерывания.
Указатель стека увеличивается на единицу, когда данные читаются из стека при помощи команды POP, и увеличивается на два, когда данные извлекаются из стека при выходе из подпрограммы (команда RET) или завершении процедуры обработки прерывания (команда RETI).
Указатель стека во всех микросхемах AYR выполнен в виде двух 8-разрядных регистров ввода—вывода. Число фактически используемых разрядов для каждой модели микроконтроллеров разное. В некоторых моделях, в том числе и в ATiny2313, объем памяти данных настолько мал, что для указателя стека используется только младший из регистров указателя стека (SPL). Регистр SPH у них отсутствует. Ниже показана структура регистров указателя стека для микроконтроллера ATiny2313.
Номербита 1514131211109 а
—
—
—
—
—
—
SP7
SP6
SP5
SP4
SP3
SP2
SP1
SP0
Номер бита
7
6
5
4
3
2
1
0
Чтение! R)/3anncb(W)
R
R
R
R
R
R
R
R
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Память ATtiny2313
Теперь рассмотрим различные виды памяти микроконтроллера Atiny2313. Архитектура AYR содержит два основных вида памяти:
память данных;
память программ.
Кроме того, микросхема Ttiny2313 имеет EEPROM-память для долговременного хранения данных. Все три вида памяти представляют собой непрерывные области с линейно возрастающими адресами.
Системная перепрограммируемаяFlash-память программ
Микросхема ATtiny2313 содержит 2 Кбайт встроенной перепрограммируемой памяти для хранения программ. Так как все команды, используемые в AVR, имеют размер 16 или 32 бита, память программ организована как 1К х 16. В графическом виде адресное пространство памяти программ показано на рис. 1.6.
Программная память
0x0000
0x03FF
Рис. 1.6. Карта памяти программ
Память программ допускает не менее 10000 циклов записи/стира- ния. Счетчик команд (PC) микросхемы ATtiny2313 имеет 10 двоичных разрядов и поэтому может работать с адресным пространством в 1К. Микросхема поддерживает режим низковольтного программирования памяти программ, которое может осуществляться по последовательному SPI интерфейсу.
В памяти программ можно размещать также любые данные, которые в процессе работы программы остаются неизменными. Для извлечения этих данных из программной памяти используется команда LPM.
Память данных SRAM
На рис. 1.7 показана организация памяти данных — ОЗУ (SRAM) микроконтроллера ATtiny2313. Всего адресное пространство ОЗУ содержит 224 ячейки, которые заняты:
файлом регистров общего назначения;
дополнительными регистрами ввода—вывода;
внутренней памятью данных.
Первые 32 ячейки совмещены с файлом РОН. Следующие 64 ячейки — это стандартная область, где располагаются все регистры ввода—вывода. И лишь оставшиеся 128 ячеек составляют внутреннюю память данных.
Существует пять различных способов адресации для памяти данных:
прямая;
косвенная со смещением;
косвенная;
косвенная с преддекрементом;
косвенная с постприращением.
Регистры R26—R31 (X, Y, Z) служат указателями адреса при всех операциях с косвенной адресацией.
При прямой адресации указывается полный адрес байта данных.
При косвенной адресации со смещением можно охватить до 63 ячеек, начиная с текущего базового адреса, на который указывает содержимое регистра Y или Z.■
Память данных
32 регистра64 регистра В/В32 регистра64 регистра В/В0x0000 -0x001 F0x0020 - 0X005F0x00600x0000 -0x001 F0x0020 - 0X005F0x0060
32 регистра
64 регистра В/В
32 регистра
64 регистра В/В
0x0000 -0x001 F
0x0020 - 0X005F
0x0060
0x0000 -0x001 F
0x0020 - 0X005F
0x0060
ВстроенноеОЗУ(128X8)
OxOODF
Рис. 1.7. Карта памяти данных
При использовании косвенной адресации с автоматическим преддекрементом и автоматическим постдекрементом после каждой операции чтения (записи) памяти изменяется адрес, записанный в регистр X, Y или Z.
Для всех пяти способов адресации доступны все 32 регистра общего назначения, 64 регистра ввода—вывода и 128 байтов памяти данных SRAM микросхемы ATtiny2313.
Память данных EEPROM
Микросхема ATtiny2313 содержит 128 байтов EEPROM-памяти. Она организована как отдельное адресное пространство для хранения данных, в котором каждый байт может быть отдельно прочитан или записан.
Внимание. Память EEPROM допускает не менее 100 000 циклов записи]стирания.
Обмен данными между EEPROM и центральным процессором описан ниже и происходит при помощи:
регистра адреса EEPROM;
регистра данных EEPROM;
регистра управления EEPROM.
Процесс чтения/записи EEPROM
Регистры, используемые для доступа к EEPROM, — это обычные регистры ввода—вывода. Время выполнения основных операций доступа для EEPROM приведено в табл. 1.1. Наличие функции автоопределения времени готовности позволяет программе пользователя самостоятельно определять тот момент, когда можно записывать следующий байт. Если программа содержит команды, которые производят запись в EEPROM, необходимо предпринять некоторые предосторожности.
В цепях питания, оснащенных хорошим фильтром, напряжение VCC при включении и выключении будет изменяться медленно. Это заставляет устройство в течение некоторого времени работать при более низком напряжении, чем минимально допустимое напряжение для данной частоты тактового генератора. Более детальную
информацию о том, как избежать проблем в этих ситуациях, читайте в разделе «Предотвращение ошибок при работе с EEPROM».
Чтобы предотвратить случайную запись в EEPROM, предусмотрена специальная последовательность действий, которую необходимо соблюдать при записи. Для получения подробной информации об этой процедуре обратитесь к описанию регистров управления EEPROM (см. ниже). Когда происходит процесс чтения EEPROM, работа центрального процессора приостанавливается на четыре цикла тактового генератора. И лишь потом выполняется следующая инструкция.
При записи в EEPROM центральный процессор приостанавливается в течение двух циклов тактового генератора прежде, чем будет выполнена следующая инструкция.
Регистр адреса EEPROM — EEAR
Номер бита76543210
|—|ЕЕАЯ6|EEAR5|EEAR4|EEAR3|EEAR2jEEAR1]EEARO| EEAR
4TeHwe(R)/3annCb(W)RR/wR/WR/WR/WR/WR/WR/W
Начальное значение ОХХХХХХХ
Бит 7 — Res: Бит зарезервирован. Этот бит в микросхеме ATtiny2313 не используется. Его значение всегда равно нулю.
3333Биты 6..0 — EEAR6..0: Адрес EEPROM. Регистр адреса EEPROM — EEAR определяет адрес одной из 128 ячеек EEPROM. Адрес данных в памяти EEPROM лежит в пределах между 0 и 127. Начальное значение EEAR не определено. Значение в регистр адреса должно быть обязательно записано перед первым обращением к EEPROM.
33
33
2 Зак. 944
Регистр данных EEPROM — EEDR
Номер бита 76543210
| MSB I S I I I I I LSB ] EEDR 4renHe(R)/3anncb(W)R/wR/WR/WR/WR/WR/WR/WR/W
Начальное значение00000000
MSB - Старший бит байтаLSB - Младший бит байта
Биты 7..0— EEDR7..0: Данные EEPROM. В режиме записи данные, записанные из регистра EEDR, будут записаны EEPROM по адресу, указанному в регистре EEAR.
В режиме чтения в регистр EEDR помещаются данные, прочтенные из EEPROM из ячейки с адресом, указанным в регистре EEAR.
Регистр управления EEPROM — EECR
Номер бита 765*4321 О
'|-}-| ЕЕРМ1 | ЕЕРМО | EERIE } ЕЕМРЕ | ЕЁРЕ | EERE j EECR
Чтение! R )/Запись(У/)
R
R
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
X
X
0
0
X
. 0
Биты 7, 6— Res: Зарезервированные биты
В микросхеме ATtiny2313 эти биты не используются и их значение всегда равно нулю.
Биты 5,4 — ЕЕРМ1 и ЕЁРМ0: Разряды выбора режима EEPROM. Биты установки режима программирования EEPROM определяют, каким способом будет выполняться команда программирования, если сброшен флаг ЕЕРЕ. Это дает возможность перепрограммировать данные за одно действие (стереть старое значение и записать новое) или разделить операции стирания и записи на две отдельные операции.
Время выполнения операции в каждом из режимов приведено в табл. Ы.Любые значения ЕЕРМп игнорируются, когда установлен флаг ЕЕРЕ. После системного сброса разряды ЕЕРМп будут
установлены в ОЬОО в том случае, если в это время не происходит процесс программирования EEPROM.
ЕЕРМ1
ЕЕРМО
Время программирования
Операция
0
0
3,4 мс
Стирание и запись за одну операцию (атомарное действие)
0
1
1,8 мс
Только стирание
1
0
1,8 мс
Только запись
1
1
-
Зарезервировано для будущего использования
Таблица 1.1.
Биты выбора режима EEPROM
Бит 3 — EERIE: Разрешение прерывания от EEPROM. Этот разряд управляет генерацией прерывания, возникающего при завершении цикла записи в EEPROM. Если этот разряд установлен в единицу, прерывания разрешены (если флаг I регистра SREG также установлен в единицу).
Запись нуля в EERIE выключает прерывание. В том случае, если энергонезависимая память готова к программированию, прерывание генерируется постоянно.
Бит 2 — ЕЕМРЕ: Управление разрешением программирования EEPROM. Значение бита ЕЕМРЕ определяет функционирование флага ЕЕРЕ. Если бит ЕЕМРЕ установлен (равен 1), установка бита ЕЕРЕ в единицу вызывает программирование ячейки EEPROM по выбранному адресу.
Под программированием здесь понимается одна из операций, выбранная при помощи битов ЕЕРМ1 и ЕЕРМО (см. табл. 1.1). Если бит ЕЕМРЕ равен нулю, установка бита ЕЕРЕ не производит никакого эффекта. Установка бита ЕЕМРЕ должна выполняться программным путем.
В течение четырех машинных циклов сразу после установки ЕЕМРЕ нужно производить установку ЕЕРЕ. Иначе бит ЕЕМРЕ будет аппаратно сброшен, а программирование окажется невозможным.
Бит 1 — ЕЕРЕ: Разрешение программирования EEPROM. Этот бит управляет процессом программирования EEPROM. Установка бита ЕЕРЕ в единицу вызывает один из вариантов программирования EEPROM в соответствии со значениями битов ЕЕРМп. Перед тем, как записывать в ЕЕРЕ единицу, необходимо прежде установить в
единицу бит ЕЕМРЕ. Иначе процесс программирования EEPROM не начнется.
По окончании процесса программирования бит ЕЕРЕ автоматически сбрасывается в ноль. Сразу после установки ЕЕРЕ в единицу работа CPU приостанавливается на два машинных цикла. И лишь затем контроллер переходит к выполнению очередной инструкции.
Бит 0 — EERE: Разрешение чтения EEPROM. Сигнал EERE является стробом чтения EEPROM. Если в регистре EEAR записан корректный адрес, установка бита EERE вызывает процесс чтения EEPROM. Процесс чтения EEPROM происходит очень быстро. Уже следующая команда вашей программы может прочитать результат.
Пока EEPROM находится в режиме чтения, центральный процессор приостанавливает свою работу в течение четырех машинных циклов и лишь после этого начинает выполнять очередную инструкцию. Перед тем, как начать процесс чтения, программа должна проверить состояние бита ЕЕРЕ. Если вызванная ранее операция записи еще не закончилась, запускать процесс чтения или изменять содержимое регистра адреса (EEAR) недопустимо.
Атомарное программирование байта
Использование атомарного программирования байта — самый простой способ программирования. Для записи байта в EEPROM программа должна сначала записать:
адрес — в регистр EEAR;
данные — в регистр EEDR.
Если биты ЕЕРМп установлены в ноль, то установка флага ЕЕРЕ (в течение четырех циклов после установки ЕЕМРЕ) включает процесс стирания/записи. Операции стирания и записи производятся за одно действие, длительность которого указана в табл. 1.1.
Бит ЕЕРЕ остается установленным до окончания процесса стирания и записи, то его сброс означает, что действие закончено. В течение всего процесса программирования никакие другие действия с EEPROM не возможны.
Раздельное программирование байта
Этот режим позволяет разделить процессы стирания и записи на два разных действия. Это может быть полезно в том случае, если требуется быстро записать ряд данных в течение ограниченного периода времени (например, если нужно записать данные в момент, когда неожиданно пропадает питание).
Для того, чтобы использовать этот метод, необходимо предварительно стереть все ячейки, в которые будет производиться запись. Учитывая, что процесс стирания и процесс записи — это две отдельных операции, процесс предварительного стирания ячеек можно производить в тот момент, когда время на выполнение этой операции не лимитировано (например, когда питание еше включено).
Стирание
Перед тем, как начинать процесс стирания, необходимо записать адрес стираемого байта в регистр EEAR. Затем нужно установить значение битов ЕЕРМп равным 0Ь01, установить ЕЕРЕ в единицу (в течение четырех машинных тактов после установки бита ЕЕМРЕ), и процесс стирания будет запущен (длительность этого процесса указана в табл. 1.1).
Бит ЕЕРЕ остается в единичном состоянии в течение всего цикла стирания. Пока идет процесс стирания, никакие другие операции С EEPROM невозможны.
Запись
Перед тем, как начинать процесс записи, необходимо записать адрес ячейки в регистр EEAR и байт данных, предназначенный для записи в регистр EEDR. Затем необходимо установить значения битов ЕЕРМп равным 0Ы0, установить в единичное состояние бит ЕЕРЕ (в течение четырех машинных циклов после установки бита ЕЕМРЕ), и процесс записи будет запущен.
Длительность этого процесса указана в табл. 1.1. Бит ЕЕРЕ остается равным единице в течение всего процесса записи байта. Если ячейка, в которую производится запись, предварительно не была стерта, то записываемые данные можно считать утерянными.
Пока идет процесс программирования, никакие другие операции с EEPROM невозможны. Для изменения времени доступа к EEPROM можно воспользоваться калибровкой тактового генератора. Убедитесь, что частота вашего тактового генератора лежит в пределах, установленных при описании регистра калибровки генератора — OSCCAL.
Предотвращение ошибок при работе с EEPROM
При падении напряжения питания УСС данные в EEPROM могут быть повреждены из-за того, что напряжение питания может оказаться слишком мало для нормальной работы центрального процессора и схемы EEPROM. Возникающие в данном случае проблемы — это те же проблемы, с которыми вы столкнетесь при использовании любых микросхем, использующих технологию EEPROM. Поэтому и способы решения этих проблем такие же.
Потеря данных в EEPROM при снижении напряжения питания может быть вызвана двумя ситуациями.
Во-первых, для того, чтобы процесс записи в EEPROM прошел нормально, требуется, чтобы напряжение питания в этот момент лежало в строго заданных пределах.
Во-вторых, сам центральный процессор может выполнить инструкции неправильно, если напряжение питания слишком мало.
Возникновения ошибок при работе с EEPROM можно легко избежать, если выполнять следующие рекомендации.
Рекомендация 1. Все время, пока напряжение питания ниже допустимого предела, на входе RESET нужно установить и удерживать низкий логический уровень. Для этого можно использовать встроенный детектор снижения питания (BOD).
Рекомендация 2. Если уровень срабатывания внутреннего детектора вас не удовлетворяет, можно использовать дополнительный внешний детектор BOD.
Рекомендация 3. Если сигнал сброса (RESET) поступит в то время, когда еще не закончен процесс записи EEPROM, этот процесс будет нормально завершен лишь при условии, что напряжение питания не будет ниже допустимого уровня.
Регистры ввода—вывода
Распределение адресного пространства регистров ввода—вывода микроконтроллера ATtiny2313 показано в сводной таблице в конце главы.
Адреса всех регистров ввода—вывода микросхемы ATtiny2313 находятся в пределах своего адресного пространства. К любому из этих адресов можно обратиться при помощи команд:
LD/LDS, LDD (загрузка); '''
STS, STD (чтение),.
Эти команды позволяют обмениваться данными между любым из 32 регистров общего назначения и любым из регистров ввода—вывода. Регистры ввода—вывода, имеющие адрес в диапазоне от 0x00 до 0x1 F, доступны для команд SBI и CBI, непосредственно изменяющих отдельные биты этих регистров.
Значение отдельных битов этих же регистров может быть проверено при помощи команд SB1S и SBIC. Для более детальной информации обратитесь к соответствующим инструкциям.
При использовании команд IN и OUT можно использовать адреса регистров ввода—вывода из диапазона 0x00 — 0x3F. При обращении к регистраторам ввода—вывода как к ячейкам памяти (то есть при использовании команду LD или ST), применяется другая адресация.
Для получения адреса ячейки памяти, соответствующей какому- либо из регистров, к адресу этого регистра нужно прибавить число 0x20.
Для совместимости программ с будущими модификациями микросхем при записи в любой регистр ввода—вывода следите, чтобы значения всех неиспользуемых разрядов были равны нулю. По той же причине в программах не должно быть команд, которые пытаются что-либо записать в несуществующие в данной модификации микроконтроллера регистры.
Внимание. Некоторые флаги сбрасываются при записи в них логической единицы. В отличие от большинства других контроллеров AVR, в микросхеме Atiny2313 инструкции СВ1 и SBI, работающие с отдельными битами, могут использоваться при работе с регистрами, содержащими именно такие флаги.
Чтение( Н)/Запись№) Начальное значениеR/W 0R/W 0R/W 0R/W 0R/W 0R/W 0R/W 0R/W 0Регистр ввода—вывода общегоназначения0 —GPIOR0Номер бита76543210Р"MSB I1LSB |Чтение( R }/3anwcb(W}R/WR/WR/WR/WR/WR/WR/WR/WНачальное значение00000000Чтение( Н)/Запись№) Начальное значениеR/W 0R/W 0R/W 0R/W 0R/W 0R/W 0R/W 0R/W 0Регистр ввода—вывода общегоназначения0 —GPIOR0Номер бита76543210Р"MSB I1LSB |Чтение( R }/3anwcb(W}R/WR/WR/WR/WR/WR/WR/WR/WНачальное значение00000000GPIOR0GPIOR0GPIOR1GPIOR1
Чтение( Н)/Запись№) Начальное значение
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
Регистр ввода
—вывода общего
назначения
0 —
GPIOR0
Номер бита
7
6
5
4
3
2
1
0
Р"
MSB I
1
LSB |
Чтение( R }/3anwcb(W}
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
Чтение( Н)/Запись№) Начальное значение
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
R/W 0
Регистр ввода
—вывода общего
назначения
0 —
GPIOR0
Номер бита
7
6
5
4
3
2
1
0
Р"
MSB I
1
LSB |
Чтение( R }/3anwcb(W}
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
GPIOR0
GPIOR0
GPIOR1
GPIOR1
Напоминаю, что инструкции CBI и SBI всегда работают только с регистрами из диапазона 0x00— OxlF. Описание регистров ввода—вывода и специальных регистров управления приводится в следующем разделе.
Регистры ввода—вывода общего назначения
Микросхема ATtiny2313 содержит три регистра ввода—вывода общего назначения. Эти регистры могут использоваться для хранения любой информации. Они особенно полезны для хранения глобальных переменных и флагов статуса. Регистры ввода—вывода общего назначения находятся в пределах адресного диапазона 0x00 — OxlF и поэтому непосредственно доступны для команд SBI, CBI, SBIS и SBIC.
Номер бита
7
е
5
4
3
21
0
MSB |
I LSB 1
Чтение( R)/3arwcb(W)
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
Регистр ввода-
—вывода общего
назначения
1 —
GPIOR1
Номер бита
7
6
5
4
3
2
1
0
Регистр ввода—вывода общего назначения 2 — GPIOR2
GPIOR2
MSB
• 1.3. Тактовый генератор
Система синхронизации и вариантыее конфигурирования
На рис. 1.8 представлена схема синхронизации микроконтроллера, на которой отражены все возможные варианты ее конфигурации. Одновременно может быть использован только один вариант конфигурации. Для уменьшения потребляемой мощности элементы синхронизации неиспользуемых модулей могут быть отключены.
Для этого предусмотрено несколько спящих режимов. Подробнее об этом читайте в разделе «Управление питанием и спящие режимы». Ииже приводится детальное описание системы синхронизации.
Рис. 1.8. Блок-схема системы синхронизации
Тактовый сигнал синхронизации центрального процессора — clkCPU.. Этот сигнал используется для синхронизации тех модулей, которые составляют ядро AYR. К таким мддулям относятся: '
файл регистров общего назначения;
регистр статуса;
содержимое указателя стека.
При отключении данного сигнала центральное ядро лишается возможности выполнять общие действия и вычисления.
Тактовый сигнал системы ввода—вывода *^—т1 k vo- Тактовый сигнал системы ввода—вывода используются большинством модулей ввода—вывода, такими как все таймеры/счетчики, а также USART. Тактовый сигнал системы ввода—вывода также используется при вызове внешних прерываний.
Некоторые виды внешних прерываний работают по принципу асинхронной логики, что позволяет обрабатывать такие прерывания даже тогда, когда тактовый сигнал отключен. Это же относится и к модулю USI. В том случае, если отсутствует сигнал clkI/o, старт модуля производится в асинхронном режиме, что позволяет производить запуск даже в режиме сна.
Тактовый сигнал Flash-памяти — clkFLASH. Этот сигнал синхронизирует работу Flash-интерфейса. Тактовый сигнал Flash-интерфейса обычно включается одновременно с тактовым сигналом центрального процессора.
Источники тактового сигнала
Микросхема имеет несколько вариантов получения тактового сигнала. Эти варианты выбираются при помощи Fuse-переключателей (битов конфигурации), состояние которых может быть изменено при помощи программатора.
Значение битов для каждого из режимов показано в табл. 1.2. После того, как источник тактового сигнала выбран, он является единственным источником сигналов в микроконтроллере AYR. Именно из этого сигнала вырабатываются все остальные тактовые сигналы микросхемы.
Таблица 1.2.Выбор источника тактового сигнала
Источник тактового сигнала
Значение битов CKSEL3..0
Внешний тактовый сигнал
0000
Настраиваемый внутренний RC-генератор 4 МГц
0010
Настраиваемый внутренний RC-генератор 8 МГц
0100
Генератор сторожевого таймера 128 кГц
0110
Внешний кварцевый резонатор
1000—1111
Зарезервировано
0001/0011/0101/0111
Примечание. Биты, установленные в 1. считаются незапрограм- мированными. Если бит содержит 0, то он запрограммирован.
Рассмотрим все перечисленные выше режимы подробно. Когда микроконтроллер пробуждается после спящего режима, выбранный источник тактового сигнала запускается в самом начале процесса пробуждения. Это гарантирует устойчивую работу генератора к моменту выполнения первой инструкции.
При перезапуске процессора сигналом RESET предусмотрена дополнительная задержка, позволяющая достигнуть устойчивого уровня сигнала к тому моменту, когда контроллер начнет выполнение первой инструкции. Для формирования этой задержки используется охранный таймер микроконтроллера.
Число циклов тактового генератора, необходимое для формирования разных значений задержки, показано в табл. 1.3. Частота генератора охранного таймера зависит от напряжения питания. Поэтому в таблице указано напряжение питания, при котором достигаются те или иные значения задержки.
Величина задержки (при VCC = 5,0В)
Величина задержки (при VCC = 3,0В)
Количество циклов
4,1 мс
4,3 мс
4 К (4096)
65 мс
69 мс
64 К (65536)
Таблица 1.3.
Количество циклов генератора охранного таймера
Источник сигнала по умолчанию
Устройство производится со следующими заводскими установками битов конфигурации:
CKSEL = “0100”;■ SUT = “10”:■ CKDIV8 = “0”.
Это означает, что источник тактового сигнала по умолчанию — это внутренний RC-генератор с самым большим временем запуска и начальным значением частоты, равным 8 МГц. Такие начальные установки гарантируют, что микросхема может быть запрограммирована с использованием как внутрисхемного, так параллельного способа программирования.
Кварцевый резонатор
Выводы XTAL1 и XTAL2 являются соответственно входом и выходом внутреннего инвертирующего усилителя, который может быть использован для создания тактового генератора, как показано на рис. 1.9. При этом допускается использование как кварцевого, так и пьезокерамического резонатора.
Конденсаторы С1 и С2 необходимы как для кварца, так и для пьезокерамики. Оптимальная емкость конденсаторов зависит:
от типа используемого кристалла или резонатора;
от величины паразитной емкости;.
от уровня электромагнитных помех.
Примерные значения емкости конденсаторов в случае использования кварцевого резонатора приведены в табл. 1.4. Для пьезокерамических резонаторов необходимо выбирать конденсаторы в соответствии с технической документацией на конкретный резонатор.
Рис. 1.9. Схема подключения внешнего резонатора
Генератор может работать в трех различных режимах, каждый из которых оптимизирован для определенного диапазона частот. Выбор режима производится при помощи fuse-переключателей CKSEL3—1, как показано в табл. 1.4.
CKSEL3-1
Диапазон частот”' (МГЦ)
Рекомендованное значение емкости конденсаторов С1 и С2 при использования кварцевого резонатора (пФ)
10012)
0,4—0,9
-
101
0,9—3,0
12-22
110
3,0-8,0
12—22
111
8,0-
12—22
Таблица 1.4.
Режимы работы кварцевого генератораРежимы работы кварцевого генератораПримечания. 1. Диапазоны частот указаны приблизительно.
Режимы работы кварцевого генератора
Режимы работы кварцевого генератора
2. Этот режим не должен использоваться с кварцевым резонатором, а только с керамическим.
Для выбора времени задержки запуска используется Fuse-переключатель CKSEL0 совместно с fuse-переключателями SUT1—0, как это показано в табл. 1.5. .
Таблица 1.5.Выбор времени запуска тактового генератора
CKSEL0
SUT 1...0
Время запуска при выходе из режимов «Power- Done* и «Power Save*
Время задержки запуска после сброса ,
(VCC = 5.0В)
Рекомендации по применению
0
00
258 циклов!”
14 циклов +
4,1 мс
Керамический резонатор, быстро устанавливающееся питайие
0
01
258 циклов (”
14 циклов + 65 мс
Керамический резонатор, медленно устанавливающееся питание
0
10
1 К циклов I2’
14 циклов
Керамический резонатор, включенная схема BOD
0
11
1 К ЦИКЛОВ <2>
14 циклов + 4,1 мс
Керамический резонатор, быстро устанавливающееся питание
1
00
1 К циклов (2>
14 циклов + 65 мс
Керамический резонатор, медленно устанавливающееся питание
1
01
16 К циклов '
14 циклов
Кварцевый резонатор, включенная схема BOD
1
10
16 К циклов
14 циклов + 4,1 мс
Кварцевый резонатор, быстро устанавливающееся питание
1
11
16 К циклов
14 циклов + 65 мс
Керамический резонатор, медленно устанавливающееся питание
Примечания. 1. Эти опции должны использоваться на частотах, далеких от максимальной, и только если не важна стабильность частоты при запуске. Они не подходят для кварцевого резонатора. 2. Эти опции предназначены для использования с керамическими резонаторами и гарантируют стабильность частоты при запуске. Они могут также использоваться с кварцевым резонатором, но только в случае работы на частотах, далеких от максимальной, и если не нужна высокая стабильность частоты при запуске.
Встроенный перестраиваемый RC-генератор
Встроенный RC-генератор вырабатывает колебания фиксированной частоты 8,0 МГц. Номинальное значение частоты устанавливается при напряжении питания 3 В и температуре 25 °C.
Если частота1 в 8 МГц слишком велика (а она зависит от напряжения питания Vcc), то можно запрограммировать Fuse-переключатель CKDIV8, после чего частота тактового генератора уменьшится в восемь раз.
Микросхема поставляется с запрограммированным битом CKDIV8. Внутренний RC-генератор может быть выбран в качестве основного системного генератора путем установки fuse-переключателей CKSEL в соответствии с табл. 1.6.
При выборе одного из этих режимов генератор будет работать без каких-либо внешних компонентов. При выполнении аппаратного сброса микроконтроллера в регистр OSCCAL загружается байт калибровки. Таким образом происходит автоматическая калибровка RC-генератора.
При напряжении питания 3 В и температуре 25 °C эта калибровка компенсирует изменение частоты в пределах ± 10 % от номинальной. Используя специальные методы калибровки, описанные в советах по применению микросхем, доступных на сайте www.atmeL com/avr, можно достигнуть точности ±2 % при любом допустимом напряжении питания и температуре.
Для получения дополнительной информации по калибровке генератора, см. раздел «Байт Калибровки».
Внутренний RC-генератор специально предназначен для использования только в качестве системного генератора. Для работы сторожевого таймера микроконтроллер имеет свой отдельный генератор, который также используется для формирования времени задержки начала работы после сброса.
Таблица 1.6.Выбор режимов работы внутреннего RC-генератора
CKSEL3...0
Номинальная частота, МГц
0010— 0011
4,0
0100 - 0101
8,0"'
Примечание 1. Заводская предустановка
Если в качестве источника тактового сигнала выбран RC-генера- тор, значение длительности задержки при старте системы выбираются при помощи fuse-переключателей SUT, так, как показано в табл. 1.7.
Таблица 1.7.Время задержки при старте в случае
использования RC-генератора
SUT1..0
Время задержки при выходе из режимов Power down и Power-save
Время задержки после аппаратного сброса
(VCC = 5.0V)
Рекомендации
00
6 циклов
14 циклов
При включенном BOD
01
6 циклов
14 циклов + 4,1 мс
Быстро устанавливающееся напряжение питания
Ю'1»
6 циклов
14 циклов + 65 мс
Медленно устанавливающееся напряжение питания
11
Зарезервировано
Примечание 1. Заводская предустановка
Регистр калибровки генератора — OSCCAL
Номер бита76543210
|—|CAL6|CALS|CAL4|CAL3[CAL2|CAL1|CALO| OSCCAL
Чтение(Н)/Запись(УУ}RR/WR/WR/WR/WR/WR/WR/W
Начальное значениеЗначение определяется аппаратно при калибровке
Биты 6..0 — CAL6..0: Калибровочный коэффициент для генератора. Запись корректирующих кодов в этот регистр изменяет частоту внутреннего перестраиваемого генератора, что позволяет подобрать нужное значение этбй частоты. Перезапись регистра выполняется автоматически в момент сброса микроконтроллера.
При записи в регистр OSCCAL нуля частота генератора имеет самое низкое из всех возможных значений. При записи в этот регистр значений, отличных от нуля, частота RC-генератора увеличивается.
Запись кода 0x7F соответствует самой высокой частоте генератора. Сигнал с внутреннего генератора используется при работе с EEPROM. Если вы не хотите потерять возможность записи информации в EEPROM или во Flash-память программ, не изменяйте частоту сигнала больше, чем 10 % от номинальной.
В противном случае попытки записи в EEPROM или Flash-память могут потерпеть неудачу.
Внимание. Генератор предназначен для работы на частоте 8,0 или 4,0 МГц. Избегайте резкого изменения частоты внутреннего RC-генератора при его калибровке для того, чтобы не. потерять работоспособность центрального процессора.
Изменение частоты более чем на 2 % от одного цикла тактового генератора до следующего может привести к непредсказуемому поведению микросхемы. Изменения регистра OSCCAL не должны превышать 0x20 за один шаг калибровки. Значения частоты сигнала при использовании разных настроечных коэффициентов приведены в табл. 1.8.
Таблица 1.8. Пределы изменения частоты внутреннего RC-генератора
Значение регистра OSCCAL
Минимальное значение частоты в процентах от номинала, %
Максимальное значение частоты в процентах от номинала, %
0x00
50
100
0x3F
75
150
0x7F
100
200
Внешний тактовый сигнал
Для того, чтобы использовать сигнал от внешнего генератора, необходимо подключить внешний генератор к входу XTAL1 так, как показано на рис. 1.10. Для того, чтобы включить микроконтроллер в режим синхронизации от внешнего сигнала, необходимо установить биты конфигурации CKSEL в положение “0000”.
XTAL2XTAL1GNDXTAL2XTAL1GNDНе используется —
XTAL2
XTAL1
GND
XTAL2
XTAL1
GND
Внешнийтактовый ^сигнал
Рис. 1.10. Схема подключения внешнего генератора
Время задержки при старте при работе с внешним генераторомВремя задержки при старте при работе с внешним генераторомПри использовании внешнего генератора в качестве источника таковых импульсов выбор времени задержки при старте производится при помощи переключателей SUT, как показано в табл. 1.10.
Время задержки при старте при работе с внешним генератором
Время задержки при старте при работе с внешним генератором
CKSEL3...0'
Диапазон частот, МГц
0000 — 0001
0-16
Таблица 1.9.
Выбор частоты кварцевого генератора
SUT1...0
Время задержки при выходе из режимов Power down и Powersave
Время задержки после аппаратного сброса
(VCC = 6.0V)
Рекомендации
00
6 циклов
14 циклов
При включенном BOD
01
6 циклов
14 циклов + 4,1 мс
Быстро устанавливающееся напряжение питания
10
6 циклов
14 циклов + 65 мс
Медленно устанавливающееся напряжение питания
11
Зарезервировано
Таблица 1.10
Чтобы гарантировать устойчивую работу центрального процессора при использовании внешнего тактового генератора, необходимо избегать внезапных изменений частоты внешнего сигнала. Изменение частоты более чем на 2 % от одного цикла колебаний до следующего может привести к непредсказуемому поведению микроконтроллера. Если это все же необходимо, нужно производить сброс микроконтроллера в момент изменения частоты тактового генератора.
Внимание. Если необходимо понизить внутреннюю тактовую частоту микроконтроллера без потери устойчивости работы, вы можете использовать предварительный делитель частоты тактового генератора.
Внутренний генератор на 128 кГц
Внутренний генератор на 128 кГц— это дополнительный простейший генератор, обеспечивающий тактовый сигнал указанной частоты. Значение частоты дается для напряжения питания 3 В и температуры 25 °C.
Для того, чтобы выбрать этот генератор в качестве основного источника тактового сигнала, необходимо записать в биты конфигурации CKSEL любое значение из диапазона “ОНО—0111”.
Если в качестве источника тактового сигнала выбран генератор 128 кГц, время задержки при запуске определяется согласно табл. 1.11.
Таблица 1.11.Время задержки запуска при работе
с внутренним генератором 128 кГц
SUT1...0
Время задержки при выходе из режимов «Power down» и «Power-save»
Время задержки после аппаратного сброса (VCC = 5.0V)
Рекомендации
00
6 циклов
14 циклов
При включенном BOD
01
6 циклов
14 циклов + 4 мс
Быстро устанавливающееся напряжение питания
10
6 циклов
14 циклов + 64 мс
Медленно устанавливающееся напряжение питания
11
Зарезервировано
Регистр предварительного делителя частоты — CLKPR
" Номер бита 7 6 5 4 3 2 1 0
I CLKPCE} — j — | — I CLK^S^PcLI^S2-p^LKPS l | CLKPSo"*| CLKPR Чтение(Я)/ЗаписьОУ) R/w R R R Я/W R/W R/W R/W
Начальное значение 0 0 0 0 Смотри описание
Бит 7 — CLKPCE: Разрешение изменения коэффициента деления. Для того, чтобы можно было изменить состояние битов CLKPS, нужно сначала установить бит CLKPCE в единицу. Бит CLKPCE можно устанавливать только в том случае, когда все биты CLKPSn имеют нулевые значения.
Бит CLKPCE аппаратно сбрасывается в ноль через четыре цикла тактового сигнала после его установки или сразу после записи битов CLKPSn. Если бит CLKPCE установлен, то до тех пор, пока он не будет сброшен аппаратно, его перезапись не имеет смысла. Повторная запись единицы не продлит период ожидания, а сброс бита в ноль блокируется.
Биты 3..0 — CLKPS3..0: Выбор режима предварительного делителя. Эти биты определяют коэффициент деления сигнала. На вход делителя поступает сигнал от одного из описанных выше источников. Выходной сигнал после делителя используется в качестве основной системной тактовой частоты микроконтроллера. Значение этих битов может быть в любой момент переписано программой, если это требуется для выполнения прикладных задач.
Поскольку предварительный делитель производит деление тактового сигнала центрального процессора, это приводит к замедлению всех операций, если, конечно, коэффициент деления не равен единице. Коэффициенты деления для всех режимов предделителя приведены в табл. 1.12.
Для того, чтобы избежать случайное изменение частоты тактового генератора, при изменении значений битов CLKPS для их записи используется специальная процедура.
Во-первых, установить бит разрешения изменения режимов предделителя (CLKPCE) в единицу и одновременно все биты CLKPR сбросить в ноль.
Во-вторых, в течение четырех циклов тактового сигнала записать код нужного режима в биты CLKPS. Одновременно бит CLKPCE нужно сбросить в ноль. Перед выполнением этой операции необходимо запретить прерывания. Если же процедура обработки прерывания уже началась, необходимо дождаться ее окончания.
Начальное значение битов CLKPS определяется при помощи fuse-переключателя CKDIV8. Если переключатель CKDIV8 не запрограммирован (содержит 1), то сразу после сброса биты CLKPS будут сброшены в “0000”.
Если CKDIV8 запрограммирован (содержит 0), то после системного сброса биты CLKPS устанавливаются в “ООП”. Это соответствует коэффициенту деления, равному 8.
Предварительный делитель можно использовать в том случае, если выбранный источник тактового сигнала имеет более высокую частоту, чем необходимо для разрабатываемого устройства.
Внимание. Программным путем вы можете записать любое значение битов CLKPS независимо от значения переключателя CKDIV8. В этом случае уже от программы зависит . правильность выбора тактовой частоты внутренних систем микроконтроллера.
Микросхема поставляется с запрограммированным fuse-переключателем CKDIV8 (т. е. его значение равно 0).
Табл ица 1.12.Выбор режимов предварительного делителя
CLKPS3
CLKPS2
CLKPS1
CLKPSO
Коэффициент деления "
0
0
0
0
1
0
0
0
1
2
0
0
1
0
4
0
0
1
1
8
0
1
0
0
16
0
1
0
1
32
0
1
1
0
64
0
1
1
1
128.
1
0
0
0
256
1
0
0
1
Зарезервировано
1
0
1
0.
Зарезервировано
1
0
1
1
Зарезервировано
1
1
0
0
Зарезервировано
1
1
0
1
Зарезервировано
1
1
1
0
Зарезервировано
1
1
1
1
Зарезервировано
Управления питанием и режимы сна
Режим низкого потребления (спящий режим) позволяет программе отключать неиспользуемые модули микроконтроллера, снижая, таким образом, потребляемую мощность. Микроконтроллеры AVR поддерживают три спящих режима, что дает возможность выбирать самый оптимальный вариант для конкретного приложения.
Для перехода в любой из трех спящих режимов необходимо записать в бит SE регистра SMCR логическую единицу, а затем выполнить команду SLEEP. Состояние битов SM1 и SM0 регистра MCUCR определяет, какой из трех спящих режимов будет использован при выполнении инструкции SLEEP. Эти режимы имеют названия:
«Idle»;
«Power-down»;
«Standby».
Значения битов для каждого из режимов указано в табл. 1.13. Если запрос на одно из разрешенных прерываний происходит в то время, когда микроконтроллер находится в спящем режиме, он пробуждается. После того, как ЦПУ проснется, он выдерживает стартовую паузу в течение четырех циклов тактового сигнала (в дополнение к задержке запуска), выполняет процедуру обработки прерывания и возобновляет выполнение основной программы с инструкции, которая идет в программе сразу после команды SLEEP.
После пробуждения содержание регистрового файла и ОЗУ (SRAM) не изменяется. Если во время сна происходит системный сброс микроконтроллера, он пробуждается и начинает выполнение программы с нулевого адреса (вектора сброса).
Для дальнейшего описания спящих режимов нам пригодится рис. 1.8, на котором представлена схема распределения тактового сигнала микросхемы ATtiny2313.
Регистр управления микроконтроллером — MCUCR
Этот регистр служит для выбора одного из спящих режимов и содержит биты для управления питанием.
Номер бита76543210
|PUD|SM1|SE|SMO|ISC11|ISC1Q|ISC01[ISCOO| MCUCR
Чтение(В)/Запись(№)Rr/wR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Биты 6, 4 — SM1...0: Первый и второй разряды выбора режимов сна. Эти биты позволяют выбрать один из четырех режимов сна, как показано в табл. 1.13. .
SM1
SM0
Режим сна
0
0
Режим Idle
0
Режим Power-down
1
1
Режим Power-down
1
0
Режим Standby
Таблица 1.13.
Выбор режимов сна
Примечание. Режим Standby рекомендуется выбирать только при использовании внешнего кварцевого резонатора.
Бит 5 — SE: Разрешение спящих режимов. Бит SE должен быть установлен в единицу для того, чтобы по команде SLEEP микроконтроллер перешел в спящий режим. Чтобы избежать случайного перехода в спящий режим, рекомендуется устанавливать бит SE в единичное состояние непосредственно перед вызовом команды SLEEP и сбрасывать его сразу после пробуждения.
Режим Idle
Если биты SM1—0 установлены в 00, команда SLEEP заставляет микроконтроллер перейти в режим Idle. При этом центральный процессор останавливается, остальные устройства продолжают работать, а именно:
последовательный канал UART;
аналоговый компаратор;
универсальный последовательный интерфейс;
таймеры/счетчики;
сторожевой таймер;
система прерывания.
В режиме Idle отключаются сигналы clkCpu и clkftash, а все остальные сигналы остаются включенными. Режим Idle позволяет микроконтроллеру пробудиться как при возникновении внешних прерываний, так и внутренних, таких как переполнение таймера и окончание передачи по UART.
Если пробуждение по прерыванию от аналогового компаратора не требуется, компаратор может быть отключен путем сброса соответствующего бита в регистре состояния — ACSR. Это уменьшит потребляемую мощность в режиме Idle.
Режим Power-down
Когда биты SM1—0 установлены в 01 или 11, команда SLEEP заставляет микроконтроллер перейти в режим Power-down. В этом режиме работа внешнего генератора приостанавливается.
В то же время такие внешние прерывания, как прерывание по каналу USI и прерывание по срабатыванию сторожевого таймера, продолжают работать (если конечно они разрешены). Выход МК из такого спящего состояния возможен при следующих условиях:
системный сброс от внешнего сигнала;
сброс при срабатывании охранного таймера;
сброс при кратковременном снижении напряжения питания;
прерывание от канала USI;
внешнее прерывание INTO;
прерывание при изменении состояния любого вывода.
В режиме Power-down отключаются все основные внутренние синхросигналы, а остаются активными лишь те устройства, которые работают в асинхронном режиме.
Пусть сигнал запроса на прерывание приходит в тот момент, когда МК находится в режиме Power-down. Для того, чтобы гарантировать вызов этого прерывания, необходимо обеспечить удержание сигнала на входе в течение всего периода пробуждения микросхемы плюс минимальная длительность сигнала в обычном рабочем режиме.
Подробнее смотрите в разделе «Внешние Прерывания».
При пробуждении из режима Power-down условие, вызвавшее это пробуждение, должно присутствовать до тех пор, пока процесс пробуждения не закончится. В процессе пробуждения тактовый генератор должен выйти из заторможенного состояния, запуститься и войти в устойчивый режим работы.
Время пробуждения определяется теми же самыми fuse-переключателями CKSEL, которые определяют задержку включения после системного сброса. Подробнее смотрите в разделе «Источники тактового сигнала».
Режим Standby
Если биты SM1—0 установлены в 10 и при этом используется внешний кварцевый резонатор, то при поступлении команды SLEEP микроконтроллер переходит в спящий режим Standby. Этот режим идентичен режиму Power-down за исключением того, что системный генератор продолжает работать. Из режима Standby микроконтроллер пробуждается всего за шесть циклов тактового сигнала.
Активность различных внутренних синхросигналов и источники пробуждения в различных спящих режимах приведены в табл. 1.14.
Таблица 1.14.Активность сигналов и источники пробуждения в
различных спящих режимах
Режим
Активность сигналов
Генератор
Источники пробуждения
clkcpu
ClkpmSH
clkl0
Включен
INTO, 1NT1 и изменение на любом выводе
Готовность к старту USI
Готовность БРМ/ EEPROM
Другие устройства ввода—вывода /
Idle
X
X
X
X
X
X
Powerdown
Х<2)
X
Standby*11
X
х(2)
X
Примечании. 1. Рекомендуется только при использовании внешнего кварцевого или пьезокерамического резонатора.
2. Только для прерываний по INTO.
Советы по уменьшению потребляемой мощности
Существуют несколько простых приемов, позволяющих минимизировать потребляемую мощность при использовании микроконтроллеров AVR. Для этого нужно как можно чаще использовать спящие режимы.
При этом необходимо всегда выбирать тот спящий режим, в котором в рабочем режиме останутся лишь нужные вам функции и устройства. Все ненужные функции должны быть отключены. В частности, для достижения максимального эффекта в минимизации энергопотребления нужно обратить внимание на следующие узлы.
Аналоговый компаратор. Если вы не используете аналоговый компаратор, то перед переходом в режим Idle нужно его заблокировать. В других спящих режимах аналоговый компаратор блокируется автоматически. Если аналоговый компаратор сконфигурирован на использование внутреннего источника опорного напряжения, то его нужно заблокировать во всех спящих режимах. Иначе внутренний источник опорного напряжения останется включенным, даже когда микроконтроллер будет находиться в режиме сна. Для получения подробной информации по настройке аналогового компаратора обратитесь к разделу «Аналоговый Компаратор».
Система контроля напряжения питания (BOD). Если система контроля напряжения питания не нужна, она должна быть отключена. Если эта система включена при помощи fuse-переключателя BODLEVEL, она будет работать во всех спящих режимах и, следовательно, всегда будет потреблять лишнюю мощность. Особенно заметно это будет в наиболее экономичных спящих режимах. Для получения более полной информации о настройках этого режима смотрите раздел «Контроль напряжения питания».
Встроенный источник опорного напряжения. Внутренний источник опорного напряжения используется в системе контроля напряжения питания или для работы аналогового компаратора. Если обе эти системы заблокированы (как описано выше), то и встроенный источник опорного напряжения тоже будет выключен. После пробуждения необходимо включить источник опорного напряжения, перед тем, как он будет использован. Если источник опорного напряжения в спящем режиме не отключался, то после пробуждения он может быть использован немедленно. Подробнее о настройках опорного напряжения смотрите в разделе «Встроенный источник опорного напряжения».
Сторожевой таймер. Если сторожевой таймер не нужен, он должен быть отключен. Если сторожевой таймер включен, он будет работать во всех спящих режимах, а, следовательно, всегда потреблять лишнюю мощность. В наиболее экономичных спящих режимах это будет более заметно. Подробнее о настройке сторожевого таймера смотрите в разделе «Прерывания». s
Выводы порта. Перед входом в спящий режим выводы всех портов Должны быть сконфигурированы таким образом, чтобы обеспечить наименьшее потребление. Особенно важно, чтобы ни один из выходов не создавал токов на сопротивлении нагрузки. Если в спящем режиме отключается сигнал синхронизации системы ввода—вывода (clkf/o), входные буферы устройства будут выключены. Это гарантирует от возникновения нежелательных токов через эти цепи в тот момент, когда микроконтроллер находится в спящем режиме.
В некоторых случаях линия порта должна работать как вход для обнаружения сигнала пробуждения. В этом случае вход остается активным. Если входной буфер включен, а на входе присутствует аналоговый сигнал, уровень которого близок к половине напряжения питания, входной буфер будет потреблять максимальную мощность.
Если какой-либо вход вы используете для ввода аналогового сигнала, то цифровой буфер этого входа должен быть всегда отключен. Аналоговый сигнал с уровнем, близким к половине напряжения питания, на любом входе может вызвать существенный ток даже в активном режиме работы микроконтроллера.
Цифровая часть входного буфера может быть заблокирована при помощи регистра отключения цифрового ввода (DIDR). Подробнее смотрите раздел «Регистр отключения цифрового ввода — DIDR».
Система управления и сброса
Начальный сброс микроконтроллера AVR
После окончания процесса системного сброса во всех регистрах ввода—вывода устанавливаются их начальные значения, а выполнение программы начинается с адреса, который называется вектором начального сброса. То есть с нулевого адреса.
По этому адресу в память программ должна быть помещена команда RJMP. Это команда безусловного перехода, которая должна передать управление к процедуре обработки начального сброса.
Если ваша программа не использует прерываний, таблицу векторов прерываний можно не определять, и код основной программы может начинаться с нулевого адреса. На рис. 1.11 показана блок-схема системы сброса микроконтроллера. В табл. 1.15 показаны.электрические параметры системного сброса. Как только активизируется внутренний сигнал сброса, все порты ввода—вывода микроконтроллера немедленно сбрасываются в начальное состояние.
Эта операция не требует, чтобы работал тактовый генератор. После того, как сигнал сброса заканчивается, запускается таймер задержки, который затягивает внутренний процесс сброса. Это дает возможность напряжению питания достигнуть устойчивого уровня перед тем, как будет выполнена первая операция.
Длительность задержки, вырабатываемая этим таймером, определяется при помощи fuse-переключателей CKSEL и SUT. Различные варианты выбора режимов задержки приведены в разделе «Источники тактового сигнала».
Источники сигнала сброса
Микросхема ATtiny2313 имеет четыре источника сигнала сброса: ■ сброс п)зи включении питания, который происходит в том случае, если напряжение питания окажется ниже порогового уровня для этого режима (VPOT);
внешний сброс, который происходит в том случае, если на вход RESET поступает сигнал низкого логического уровня длительностью не меньше одного такта системного генератора;
сброс от сторожевого таймера, который происходит в трех случаях:
если истек период работы сторожевого таймера;
если сторожевой таймер включен;
если запрещено прерывание по сторожевому таймеру;
■ сброс при снижении питания, который происходит, если напряжение питания окажется ниже порогового уровня для этого режима (VBOT), а система контроля уровня питания включена.
Рис. 1.11. Блок-схема системы сброса
Обозначение
Параметр
Условия
Мин. значение111
Типовое значение111
Макс, значение*11
Единица измерения
VPOT
Порог срабатывания сброса по включению питания (при повышении напряжения)
ТА = -4О...+85'С
1,2
В
Порог срабатывания сброса по включению питания (при снижении напряжения)*21
ТА= -40... +85"С
1,1
В
VRST
Значение напряжения сброса на входе $$$601
VCC = 1,8..,5,5В
0,2 УСС
0,9 УСС
В
tRST
Минимальная длительность импульса на входе $$$601
УСС = 1,8...5,5В
2,5
мкс
Таблица 1.15.
Характеристики режимов сброса
Примечания. 1. Значение для справки. 2. Сброс при включении не будет работать, если напряжение питания не было ниже Урот (при падении напряжения).
Сброс при включении питания
Импульс сброса при включении питания (POR) вырабатывается встроенной пороговой схемой. Порог срабатывания этой схемы приведен в табл. 1.15. Сигнал POR активизируется каждый раз, когда Усс окажется ниже порогового уровня (рис. 1.12). Схема POR может использоваться как для системного сброса, так и для обнаружения отсутствия напряжения питания.
Схема (POR) гарантирует, что при включении-питания произойдет системный сброс. Когда напряжение питания достигнет порога срабатывания, запускается счетчик задержки, который определяет время, в течение которого система находится в режиме сброса. Если напряжение питания опять опустится ниже порога срабатывания, сигнал RESET немедленно активизируется заново.
- VPOT
VRST
I—
*1 IOU1►
vcc
RESET
TIME-OUT (задержка)
Внутренний сброс
Рис. 1.12. Старт микроконтроллера с привязкой сигнала RESET к напряжениюпитания
Vcc ^
RESET
VPOT
1
/1^ VRST
—
TIME-OUT
1
1
t TOLfT►
—
(задержка)
1
1
1
1
1
Внутренний
1
сброс
Рис. 1.13. Старт микроконтроллера с дополнительным внешним сбросом
Внешний сброс
Импульс сброса на входе RESET длительностью большей минимально допустимого значения (см. табл. 1.15) вызывает сброс микроконтроллера даже в том случае, если тактовый генератор отключен. Более короткие импульсы не гарантируют инициализацию процесса сброса.
По заднему фронту импульса сброса (когда напряжение сигнала сброса достигнет уровня VRST) запускается схема, формирующая задержку сброса (рис. 1.13 и 1.14). Длительность этой задержки равна (tout.
RESETRESETTIME-OUT (задержка)TIME-OUT (задержка)Рис. 1.14. Выполнение операции внешнего сбросаРис. 1.14. Выполнение операции внешнего сбросаVcc
RESET
RESET
TIME-OUT (задержка)
TIME-OUT (задержка)
Рис. 1.14. Выполнение операции внешнего сброса
Рис. 1.14. Выполнение операции внешнего сброса
Внутренний сброс
Сброс при снижении напряжения питания
Микросхема ATtiny2313 имеет встроенную схему контроля напряжения питания BOD (Brown-out Detection), которая осуществляет постоянное сравнение напряжения питания с пороговым уровнем. Уровень порога срабатывания схемы BOD можно устанавливать при помощи fuse-переключателей BODLEVEL.
Пороговая схема системы BOD имеет гистерезис, который призван гарантировать от ложного срабатывания схемы при кратковременных изменениях напряжения питания. Верхний и нижний пороги гистерезиса определяются следующим образом:
Vbot+ — Увот + Vhyst/2;
Vboi- = Vrot "~ Vhyst/2.
Таблица 1.16.Действие fuse-переключателей BODLEVEL
BODLEVEL 2..0
Минимальное значение УВОт
Типичное значение Уаот
Максимальное значение VBot
Единицы измерения
111
BOD Отключен
110
1,8
В
101
2,7
100
4,3
011
Зарезервировано
010
001
000
В некоторых случаях значение Увот может быть ниже номинала. В процессе производства допускается проверка работоспособности микросхем при УСс = Увот- Такая проверка гарантирует, что сигнал системного сброса возникнет до того момента, когда напряжение питания упадет ниже уровня, при котором уже не гарантируется нормальная работа микроконтроллера. Проверка производится:
при BODLEVEL = ПО для ATtiny2313;
при BODLEVEL = 101 для ATtiny2313L.
Таблица 1.17.Характеристики системы BOD
Обозначение
Параметр
Типовое
Единицы измерения
Vhyst
Гистерезис BOD
50
мВ
Ibod
Минимальная длительность импульса пониженного питания для срабатывания BOD
2
нс
Если BOD включен, а напряжение питания опускается ниже нижнего порога (порог УВот-на рис. 1.15), то немедленно активизируется процесс задержки сброса. Если напряжение питания начинает расти и превысит верхний порог (Увот+ на рис. 1.15), то раньше, чем закончится процесс задержки сброса 1Тоит, сброс отменяется. Схема BOD обнаруживает снижение напряжения питания, только если напряжение остается ниже порогового уровня дольше, чем на время, указанное в табл. 1.15.
Таблица 1.18 при переводе документации производителя сочтена авторм не существенной и здесь не приводится (прим. ред.).
vcc
RESET
TIME-OUT (задержка)
Внутренний сброс
Рис. 1.15. Выполнение сброса при снижении напряжения питания
Сброс от сторожевого таймера
При срабатывании сторожевого таймера он вырабатывает короткий импульс сброса длительностью, равной одному такту системного генератора (рис.1.16). По заднему фронту этого импульса запускается таймер задержки сброса, формирующий сигнал задержки длительностью 1Тоит- Подробнее о работе сторожевого таймера смотрите в разд. 1.5 «Сторожевой (охранный) таймер».
сс
RESET
Сигнал от охранного таймера
Задержка сброса
► ^— 1 цикл тактового сигнала► ^— 1 цикл тактового сигналаВнутренний сброс
► ^— 1 цикл тактового сигнала
► ^— 1 цикл тактового сигнала
Рис. 1.16. Операция сброса при срабатывании сторожевого таймера
65653 Зак. 944
65
65
Регистр статуса системы сброса — MCUSR
Регистр статуса системы сброса содержит информацию о том, какой из источников сигнала сброса вызвал последний перезапуск системы.
Номер бита76543210
|—|—|—j —| WDRF | BORF | EXTRF | POrF~| MCUSR
4reHHe(R)/3an«Cb(W)R R R R r/w R/W R/W R/W
Начальное значение ОООСмотри описание
Бит 3 — WDRF: Флаг сброса от сторожевого таймера. Этот бит устанавливается в единицу, если произошел сброс при срабатывании сторожевого таймера. Бит сбрасывается после сброса по включению питания или после принудительной записи логического нуля.
Бит 2 — BORF: Флаг сброса при снижении питания. Этот бит устанавливается в единицу, если произошел сброс при кратковременном снижении напряжения питания (срабатывании схемы BOD). Бит сбрасывается после сброса по включению питания или после принудительной записи логического нуля.
Бит 1 — EXTRF: Флаг внешнего сброса. Этот бит устанавливается в единицу, если произошел внешний сброс. Бит сбрасывается после сброса по включению питания или после принудительной записи логического нуля.
Бит 0 — PORF: Флаг сброса по включению питания. Этот бит устанавливается в единицу, если произошел сброс по включению питания. Бит сбрасывается только при принудительной записи логического нуля.
При использовании в программе флагов состояния системного сброса для идентификации источника сброса, прочитать их значение нужно в самом начале программы. Прочитанные значения нужно сохранить в памяти микроконтроллера, а затем нужно сбросить содержимое регистра MCUSR. Правильно определить источник сброса можно только в том случае, если регистр MCUSR будет очищен до того, как произойдет следующий сброс.
Сторожевой (охранный) таймер
Особенности
i Микроконтроллер ATtiny2313 имеет в своем составе многофункциональный сторожевой таймер (Watchdog Timer или WDT). Этот
' таймер имеет следующие основные особенности:
синхронизация от отдельного внутреннего генератора;
три режима работы:
генерация запроса на прерывание;
системный сброс;
генерация прерывания и сброс;
перестраиваемое время срабатывания от 16 мс до 8 с;
возможность аппаратного включения охранного таймера (WDTON) для режима повышенной надежности.
Блок-схема
Сторожевой таймер (WDT) выполнен в виде счетчика импульсов, которые поступают от специального внутреннего генератора, вырабатывающего сигнал с частотой 128 кГц (см. рис. 1.17). Схема WDT формирует запрос на прерывание или системный сброс в тот момент, когда содержимое счетчика достигает заданного значения.
Генератор128 кГц
Предделитель
Сброс охранного таймера
WDPO WDP1 WDP2 WDP3
Рис. 1.17. Блок-схема сторожевого таймера
Режимы работы
В нормальном режиме работы необходимо, чтобы программа периодически сбрасывала охранный таймер при помощи команды WDR. Программа должна быть написана таким образом, чтобы команда сброса всегда приходила раньше, чем содержимое таймера достигнет конца. Если система зависнет и перестанет перезапускать счетчик, то он досчитает конца. Это вызовет прерывание или системный сброс. В результате программа начнет работать сначала.
В режиме прерываний при истечении заданного времени система WDT вырабатывает запрос на прерывание. Этот запрос может использоваться для пробуждения микроконтроллера из любого спящего режима.
Пробуждение происходит таким же образом, как в случае прерывания от системного таймера. Один из вариантов использования такого режима — ограничение максимального времени выполнения некоторых операций. Таймер вызывает прерывание, если выполнение операции происходит дольше, чем положено.
В режиме системного сброса при истечении заданного времени WDT вызывает системный сброс. Обычно это используется для того, чтобы предотвратить зависание системы в случае ошибки в программе.
Третий режим объединяет возможности двух первых режимов. Сначала вызывается прерывание, а затем происходит системный сброс. Этот режим применяется, например, в том случае, когда перед вызовом системного сброса необходимо сохранить важные параметры.
Если при помощи соответствующего fuse-переключателя (WDTON) выбран режим, при котором сторожевой таймер постоянно включен, то срабатывание этого таймера всегда вызывает сброс системы. При этом бит системного сброса (WDE) и бит режима прерывания (WDIE) приобретают фиксированные значения 1 и О соответственно.
Для изменения режима работы сторожевого таймера нужно выполнить определенную последовательность действий. Такой прием позволяет избежать случайного изменения режима. Для сброса флага WDE и изменения коэффициента пересчета таймера необходимо выполнить следующее.
Во-первых, одной командой установить в единицу разряд разрешения изменений (WDCE) и в бит WDE. Логическая единица в бит
WDE должна записываться обязательно, даже если значение этого бита и так равно единице.
Листинг 1.1.
Пример на языке Ассемблер
WDT.off:
; Глобальный запрет прерываний cli
; Перезапуск охранного таймера wdr
; Очистка бита WDRF в регистре MCUSR
inг 16, MCUSR
andir16, (Oxff& (O«WDRF))
outMCUSR, г1б
; Запись логической единицы в биты WDCE и WDE
; Сохраните старые установки предделителя, чтобы предотвратить ; случайное срабатывание
inг 16, WDTCSR
orir16, (1«WDCE) | (1«WDE)
outWDTCSR, r16
; Отключение охранного таймера
IdiП6, (0«WDE)
outWDTCSR, r16
; Глобальное разрешение прерываний sei ret
Листинг 1.2.
Пример на языке СИ (Code Vision)
«define WDRF 3
«define WDCE 4
«define WDE 3
void WDT_off(void) {
«asm("cli");
#asm("wdr");
/* Очистка бита 3 (WDRF) в регистре MCUSR */
MCUSR 4= "(1«WDRF);
/* Запись логической единицы в биты 4 (WDCE) и 3 (WDE)
Остальные биты, определяющие старые установки предделителя сохраняются, чтобы предотвратить случайное срабатывание охранного таймера */
WDTCR | = (1«WDCE) | (1«WDE); // В CodeVision так называется регистр WDTCSR /* Отключение охранного таймера */
WDTCR = 0x00;
#asm("sei");
Во-вторых, в течение следующих четырех циклов тактового генератора записать требуемое значение в бит WDE и биты установки коэффициента деления (WDP). Одновременно бит WDCE должен быть сброшен. Все эти три вида значений необходимо записывать одной операцией.
В листингех 1.1 и 1.2 приведены два примера процедуры выключения сторожевого таймера.. Одна процедура на Ассемблере, другая — на языке СИ. Примеры предполагают управление прерываниями (в данном случае путем глобального запрета прерываний) таким образом, чтобы ни одно прерывание не было вызвано во время работы данных процедур.
Регистр управления сторожевым таймером — WDTCSR(WDTCR)
Номер бита7654321О
j WDIF ) WDIE | WDP3 | WDCE | WDE j WDP2 } WDP1 | WDPO | WDTCSR
Чтение(А)/Запись^}R/WR/WR/WR/WR/WR/WR/WR/W
Начальное значение00000000
Бит 7 — WDIF: Флаг прерывания от сторожевого таймера. Этот бит устанавливается при срабатывании сторожевого таймера, если выбран режим прерываний. Флаг WDIF сбрасывается аппаратным способом в момент вызова процедуры обработки прерывания. Он также может быть очищен программно путем записи в него логического нуля.
Данное прерывание выполняется только в том случае, когда установлены как флаг глобального разрешения прерывания (флаг I регистра SREG), так и флаг WDIE, и при этом истекло время ожидания сторожевого таймера.
Бит 6 — WDIE: Бит разрешения прерываний от сторожевого таймера. Когда значение этого бита равно единице и установлен флаг
I в регистре SREG, прерывание от сторожевого таймера разрешается. Теперь, если флаг WDE очищен и время ожидания истекло, происходит запрос на прерывание.
Если оба флага (WDE и WDIE) установлены, охранный таймер переходит в режим прерывания со сбросом. В этом режиме первое срабатывание охранного таймера установит флаг WDIF. Как только начнется процедура обработки прерывания, флаги WDIE и WDIF автоматически очистятся, а сторожевой таймер перейдет в режим сброса.
Это повышает надежность работы охранного таймера по сравнению с обычным режимом работы по прерыванию. Если процедура обработки прерывания затянется непозволительно долго, произойдет очередное срабатывание охранного таймера, которое уже вызовет системный сброс микроконтроллера.
В случае успешного завершения процедуры обработки прерывания сторожевой таймер все равно останется в режиме системного сброса. Для того, чтобы сторожевой таймер постоянно оставался в режиме прерывания, необходимо устанавливать этот режим программным путем после каждого прерывания.
Этого нельзя делать непосредственно в процедуре обработки прерывания, так как это сведет на нет дополнительную функцию безопасности.
При зависании процедуры обработки прерывания сброс может не произойти. В табл. 1.19 показаны все режимы сторожевого таймера.
Таблица 1.19.Выбор режимов работы сторожевого таймера
WDTON
WDE
WDIE
Режим охранного таймера
Действие по истечении контрольного времени
0
0
0
Таймер остановлен
Нет
0
0
1
Режим прерывания
Вызов прерывания
0
1
0
Режим сброса
Системный сброс
0
1
1
Режим прерывания и сброса
Вызов прерывания и переход к режиму системного сброса.
1
х
х
Режим сброса
Системный сброс
Бит 4 — WDCE: Разрешение изменения режимов сторожевого таймера. Этот бит используется при изменении состояния битов предварительного делителя и бита WDE. Перед тем, как сбросить бит WDE и/или изменить состояние битов предварительного делителя, должен быть установлен разряд WDCE. После записи в него единицы бит WDCE будет автоматически сброшен аппаратным путем по истечении четырех машинных циклов.
Бит 3 — WDE: Разрешение режима сброса. Флаг WDE дублирует флаг WDRF в регистре MCUSR. Это означает, что WDE всегда установлен, если установлен WDRF. Для того, чтобы очистить WDE, нужно сначала очистить WDRF. Эта особенность гарантирует многократный сброс микроконтроллера до тех пор, пока существует условие, вызывающее зависание программы, и безопасный запуск программы сразу после окончания этого условия.
Биты 5, 2..0 — WDP3..0: Выбор режима работы предварительного делителя охранного таймера. Биты WDP3—0 определяют коэффициент деления предварительного делителя сторожевого таймера. Все возможные коэффициенты деления и соответствующие им защитные периоды времени приведены в табл. 1.20.
Таблица 1.20. Выбор режима предцелителя сторожевого таймера
WDP3
WDP2
WDP1
WDP0
Количество циклов генератора до срабатывания WDT
Примерное время при
VCC = 5.0V
0
0
0
0
2 К (2048) циклов
16 мс
0
0
0
1
4 К (4096)циклов
32 мс
0
0
1
0
8 К(8192)циклов
64 мс
0
0
1
1
16 К (16384) циклов
0,125 с
0
1
0
0
32 К(32768)циклов
0,25 с
0
1
0
1
64 К(65536)циклов
0,5 с
0
1
1
0
128 К (131072) циклов
1,0 с
0
1
1
1
256 К (262144) циклов
2,0 с
1
0
0
0
512 К (524288) циклов
4,0 с
1
0
0
1
1024 К(1048576) циклов
8,0 с
1
0
1
0
Зарезервировано
1
0
1
1
1
1
0
0
1 ■
1
0
1
1
1
1
0
1
1
1
1
Прерывания
Этот раздел описывает особенности системы прерываний микросхемы ATtiny2313. .
Векторы сброса и обработки прерыванийВекторы сброса и обработки прерыванийРассмотрим таблицу векторов прерываний микроконтроллера ATtiny2313.
Векторы сброса и обработки прерываний
Векторы сброса и обработки прерываний
Номер вектора
Адрес перехода
Источник
Описание прерывания
1
0x0000
RESET
Внешний сброс, сброс при включении питания, сброс по срабатыванию охранного таймера
2
0x0001
INTO
Внешний запрос на прерывание по входу INTO
3
0x0002
INTI
Внешний запрос на прерывание по входу INT1
4
0x0003
TIMER 1 CART
Прерывание по захвату таймера/счетчика 1
5
0x0004
TIMER 1 COMPA
Прерывание по совпадению таймера/счетчика 1. Канал А
6
0x0005
TIMER 1 OVE
Прерывание по переполнению таймера/счетчика 1
7
0x0006
TIMERO OVE
Прерывание по переполнению таймера/счетчика 0
8
0x0007
USARTO, RX
USARTO, прием завершен
9
0x0008
USARTO, UDRE
USARTO буфер данных пуст
10
0x0009
USARTO, TX
USARTO, передача завершена
11
ОхОООА
ANALOG COMP
Прерывание от аналогового компаратора
12
0x000В
PCINT
Прерывание по изменению на любом из выводов
13
0x0000
TIMER1 COMPB
Прерывание по совпадению таймера/счетчика 1. Канал В
14
0x0000
TIMERO COMPA
Прерывание по совпадению таймера/счетчика 0. Канал В
15
ОхОООЕ
TIMERO COMPB
Прерывание по совпадению таймера/счетчика 0. Канал А
16
OxOOOF
USI START
Прерывание по USI. Готовность к старту
17
0x0010
USI OVERFLOW
Прерывание по USI. Переполнение
18
0x0011
EE READY
Готовность EEPROM
19
0x0012
WDT OVERFLOW
Переполнение охранного таймера
Таблица 1.21.
Порты ввода—вывода
Введение
Все порты микроконтроллеров AVR в режиме цифрового ввода—вывода представляют собой полноценные двунаправленные порты, у которых каждый из выводов может работать как в режиме ввода, так и в режиме вывода. Это означает, что каждый отдельный разряд порта может быть настроен либо как вход, либо как выход, независимо от настройки всех остальных разрядов того же порта.
Настроить разряды порта можно при помощи команд сброса и установки бита SBI и CBI. То же самое касается изменения значения на выходе (если разряд сконфигурирован как выход) или вклю- чения/отключения внутреннего резистора нагрузки (если разряд сконфигурирован как вход).
Все эти настройки выполняются отдельно для каждого вывода порта. Выходной буфер каждого из выводов порта содержит симметричный выходной каскад с высокой нагрузочной способностью. Нагрузочная способность каждого вывода любого порта достаточна для непосредственного управления светодиодным дисплеем.
2\2\Все выводы любого порта имеют индивидуально подключаемые резисторы нагрузки, которые в случае необходимости могут подключаться между этим выводом и источником питания. Входные схемы каждой линии порта имеют по два защитных диода, подключенных к цепи питания и к общему проводу, как это показано на рис. 1.18.
2\
2\
। Подробнее смотри I схему цифроавого ■ ввода/вывода
Рис. 1.18. Эквивалентная схема входных цепей одного разряда порта ввода—вывода
Описание всех регистров и их отдельных разрядов в этом разделе приводится в общей форме. Буква “х” в описании имен регистра означает название порта, строчная буква “п” означает номер разряда. При использовании этого имени в программе вместо этих символов нужно подставлять конкретную букву названия порта и конкретный номер разряда.
Например, PORTB3 — для бита номер 3 порта В, если в документации этот бит назывался PORTxn. Физическое расположение регистров ввода—вывода и местоположение их разрядов подробно описаны в разделе «Описание регистров портов ввода—вывода» (стр. 93).
Для каждого порта ввода—вывода в микроконтроллере имеется три специальных регистра:
PORTx — регистр данных;
DDRx — регистр управления;
PINx — регистр непосредственного чтения состояния линий порта.
Регистр непосредственного чтения состояния линий порта доступен только для чтения, в то время как регистр данных и регистр управления доступны как для чтения, так и для записи.
Однако тоже возможна запись логической единицы в любой разряд регистра PINx. Она приведет к переключению соответствующего разряда регистра данных (PORTx). Каждый разряд регистра PORTx управляет включением и отключением резистора внутренней нагрузки, если соответствующий разряд порта находится в режиме ввода.
Внимание. Если установлен флаг отключения нагрузок (PUD) в регистре MCUCR, то все внутренние нагрузочные резисторы всех разрядов всех портов всегда отключены.
Подробнее об использовании портов ввода—вывода смотрите в разделе «Общие вопросы использование цифровых портов ввода—вывода» главы 1. Большинство разрядов любого порта имеют, кроме основной, одну или несколько дополнительных функций. Описание дополнительных функций для каждого вывода микросхемы приводится в разделе «Дополнительные функции линий порта ввода—вывода» (стр. 83). Для получения полной информации о
дополнительных функциях обратитесь к соответствующим абзацам этого раздела.
Следует отметить, что использование дополнительной функции одним из разрядов порта не мешает использовать остальные разряды того же порта для ввода или вывода цифровой информации.
Использование портов для цифрового ввода—вывода
Каждый разряд порта представляет собой двунаправленную линию ввода—вывода с возможностью подключение внутреннего сопротивления нагрузки. На рис. 1.19 показана функциональная схема одной линии порта ввода—вывода. Выходной контакт этой линии обозначен на схеме как Рхп.
Примечание. Сигналы WRx, WPx, WDx, RRx, RPx, и RDx являются общими для всех разрядов одного порта. Сигналы с1кц0, SLEEP и PUD являются общими для всех портов.
Конфигурация выводов
Каждый разряд порта связан с тремя разрядами трех специальных регистров:
DDxn;
PORTxn;*
PINxn.
Как уже говорилось:
бит DDxn — это разряд номер п регистра DDRx;
бит PORTxn — это разряд номер п регистра PORTx;
бит PINxn — это разряд номер п регистра PINx.
Бит DDxn регистра DDRx выбирает направление передачи информации соответствующего разряда. Если в DDxn записана логическая единица, разряд Рхп работает как выход. Если в DDxn записан логический ноль, разряд Рхп работает как вход.
Шина данныхШина данныхPUD Отключение нагрузки SLEEP Управление режимом сна dk |/о Блокировка ввода/выводаPUD Отключение нагрузки SLEEP Управление режимом сна dk |/о Блокировка ввода/выводаWDx Запись DDRx 'RDx Чтение DDRxWRx Запись PORTxRRx Чтение регистра PORTxRPx Чтение вывода PINxWPx Запись регистра PORTxWDx Запись DDRx 'RDx Чтение DDRxWRx Запись PORTxRRx Чтение регистра PORTxRPx Чтение вывода PINxWPx Запись регистра PORTx
Шина данных
Шина данных
PUD Отключение нагрузки SLEEP Управление режимом сна dk |/о Блокировка ввода/вывода
PUD Отключение нагрузки SLEEP Управление режимом сна dk |/о Блокировка ввода/вывода
WDx Запись DDRx '
RDx Чтение DDRx
WRx Запись PORTx
RRx Чтение регистра PORTx
RPx Чтение вывода PINx
WPx Запись регистра PORTx
WDx Запись DDRx '
RDx Чтение DDRx
WRx Запись PORTx
RRx Чтение регистра PORTx
RPx Чтение вывода PINx
WPx Запись регистра PORTx
Рис. 1.19. Упрощенная схема одной линии цифровоговвода—вывода
Если разряд порта сконфигурирован как вход, установка бита PORTxn в единицу включает внутренний резистор нагрузки. Для отключения резистора нагрузки нужно в PORTxn записать логический ноль. Сразу после системного сброса все выводы всех портов переходят в третье (высокоимпендансное) состояние.
Если разряд порта сконфигурирован как выход (установка бита PORTxn в единицу), то эта единица появится на выходе порта. Если в разряд PORTxn записан логический ноль, то и на выходе будет ноль.
Переключение значения разряда порта
Запись логической единицы в разряд PINxn переключает значение разряда PORTxn (с единицы на ноль и наоборот), независимо от значения разряда DDRxn. Обратите внимание, что команда SBI может использоваться для переключения значения одного отдельного разряда любого порта.
Переключение между выводом и вводом
При переключении разряда порта между третьим состоянием (DDxn = 0, PORTxn = 0) и состоянием высокого уровня на выходе (DDxn = 1, PORTxn = 1) обязательно происходит через один из промежуточных уровней:
через режим входа с включенным резистором нагрузки (DDxn = 0, PORTxn = 1);
либо через состояние вывода низкого логического уровня (DDxn = 1, PORTxn = 0).
Наиболее приемлемым является вариант входа с нагрузочным резистором, поскольку для высокоимпендансной среды нет различия между полноценным сигналом высокого логического уровня и напряжением, созданным благодаря подключению нагрузочного резистора.
Если же подключение резистора нежелательно, можно установить бит PUD регистра MCUCR в единичное состояние и тем самым отключить все нагрузочные резисторы для всех портов.
Аналогичная ситуация возникает при переключении между режимом входа с включенной нагрузкой (DDxn = 0, PORTxn = 1) и состоянием вывода низкого логического уровня (DDxn = 1, PORTxn = 0).
В этом случае промежуточным является:
либо высокоимпендансное состояние
(DDxn = 0, PORTxn = 0);
либо состояние вывода логической единицы
(DDxn = 1, PORTxn = 1).
И в этом случае решение проблемы будет точно таким же, как в предыдущем случае.
В табл. 1.22 сведены все сигналы, определяющие режимы работы выводов порта.
Таблица 1.22.Конфигурирование выводов порта
DDxn
PORTxn
PUD (in MCUCR2)
Ввод/вывод
Нагрузка
Комментарий
0
0
X
Ввод
Выкл.
Третье состояние (Z — состояние)
0
1
0
Ввод
Вкл.
Рхп создает выходящий ток, если внешняя цепь замкнута на общий провод
0
1
1
Ввод
Выкл.
Третье состояние (Z — состояние)
1
0
X
Вывод
Выкл.
Вывод НИЗКОГО уровня (Приемник тока)
1
1
X
Вывод
Выкл.
Вывод высокого уровня(Источник тока)
Чтение значения на выводе порта
Независимый от выбранного направления передачи данных (определяется DDxn) уровень логического сигнала на выводе порта может быть в любой момент прочитан при помощи разряда PINxn.
Как показано на рис. 1.19, схема чтения бита PINxn содержит синхронизатор. Синхронизатор позволяет избежать неопределенного результата при считывании уровня сигнала на выводе в том случае,
этот сигнал изменяет свои значения в момент прохождения фронта тактового сигнала.
Но использование синхронизатора приводит к задержке при установке сигнала на выходе. На рис. 1.20 показана временная диаграмма работы схемы синхронизации при чтении значения сигнала на выводе порта. Максимальное и минимальное значения задержки обозначены соответственно tpdmax и tpd.min-
Тактовый сигналТактовый сигналКомандыКоманды
Тактовый сигнал
Тактовый сигнал
Команды
Команды
Триггер синхронизацииТриггер синхронизацииOxFFOxFF
Триггер синхронизации
Триггер синхронизации
OxFF
OxFF
PiNxn
0x00
tpd, max
t pd, min !
Рис. 1.20. Синхронизация процесса чтения уровня сигнала на выводе порта
Рассмотрим один период тактового сигнала, начиная с заднего фронта первого импульса (см. рис. 1.20). Пока синхросигнал имеет низкий логический уровень, триггер закрыт. При высоком логическом уровне триггер прозрачен для входного сигнала, что обозначено в виде заштрихованной области на диаграмме, показывающей сигнал на выходе «триггера синхронизации».
Значение входного сигнала фиксируется в тот момент, когда синхроимпульс заканчивается и переходит в нулевое значение. Это вызывает изменение на PiNxn, которое происходит по переднему фронту следующего синхроимпульса.
Минимальное и максимальное значения задержки установки сигнала на выводе порта показаны на рис. 1.20 (tpd.max и tpd.min). Видно, что задержка составляет от 0,5 до 1,5 периодов тактового сигнала и зависит от того, в какой момент произошло изменение напряжения на входе.
Если ваша программа записывает значение в порт, а затем сразу же должна прочитать это значение, то между командами записи и чтения необходимо обязательно добавить команду пор, как это показано на рис. 1.21.
Команда out устанавливает сигнал «Триггер синхронизации» по переднему фронту очередного синхроимпульса. В этом случае время задержки tpd синхронизатора будет равно одному периоду тактового сигнала. -
Рис. 1.21. Синхронизация при чтении программно записанного значения разряда порта
В следующем примере (см. листинги 1.3 и 1.4) показано, как установить в разрядах 0 и 1 порта В высокий логический уровень, а в разрядах 2 и 3 — низкий, настроить разряды с 4 по 7 на ввод информации, а для входов 6 и 7 включить внутреннее сопротивление нагрузки.
Установленные значения сразу же читаются программой, но перед операцией чтения включена команда пор для того, чтобы правильно прочитать только что записанное значение некоторых разрядов.
Листинг 1.3.
Пример на языке Ассемблер
: Включение нагр резисторов и установка выходных уровней ; Определение направления передачи сигналов для разрядов
Idiг1б.(1«РВ7)Ц1«РВ6)|(1«РВ1)|(1«РВО)
Idiг17. (1<<0033) |( 1«DD82) |( 1<<DDBDK1<<DDB0)
outPORTB,г16
outDDRB.rIZ
. Добавлен пор для синхронизации
пор
. Чтение разрядов пор га
Г:Г 16 PTNB
Листинг 1.4.
Пример на языке СИ (Code Vision)
/* Включение нагр резисторов и установка выходных уровней */ /* Определение направления передачи сигналов для разрядов */ PORTB = (1<<7) | (1«6)1 (Л« 1) | (1«0):
DDRB = (1«3)|(1«2)|(1«1)|(1«0):
/- Добавлен пор для синхронизации */
#asm(’nop ):
/* Чтение разрядов порта */
= PINB:
Разрешение цифрового ввода и режимы низкогопотребления (режимы сна)
Как видно из рис. 1.19, схема входной части порта позволяет закоротить входной цифровой сигнал на общий провод на входе триггера Шмидта. Сигнал, обозначенный на рисунке как SLEEP, вырабатывается схемой управления энергопотреблением в режимах Power-down и Standby. Он служит для того, чтобы избежать высокой потребляемой мощности в том случае, если во входных цепях присутствует паразитный сигнал или туда подается полезный аналоговый сигнал, близкий к половине напряжения питания.
Сигнал SLEEP не поступает на те разряды порта, которые сконфигурированы как входы внешних источников прерывания. Сигнал SLEEP отключается также при активизации некоторых других дополнительных функций. Подробнее смотрите в следующем разделе.
Пусть сигнал высокого логического уровня («1») присутствует на входе внешнего асинхронного прерывания, сконфигурированном как «Прерывание по переднему фронту, прерывание по заднему фронту или прерывание при изменении на любом из входов», а внешние прерывания запрещены. В этом случае соответствующий флаг внешнего прерывания будет установлен сразу после выхода микроконтроллера из спящего режима. Это касается только режимов Power-down или Standby. Установка флага при выходе из режима происходит благодаря тому, что данные входные цепи в описанных выше режимах не закорачиваются.
Дополнительные функции линий порта ввода-вывода
Большинство выводов любого порта, кроме своего основного назначения (цифровые линии ввода—вывода), имеют дополнительные функции. На рис. 1.22 показан более полный вариант схемы одного разряда ввода—вывода, реализующий альтернативные функции (упрощенная схема показана на рис. 1.19). Такая схема не обязательно применяется в каждой из линий порта, но ее можно рассматривать как обобщенную схему канала ввода—вывода микроконтроллера AVR.
Примечание. Сигналы WRx, WPx, WDx, RRx, RPx, и RDx одинаковы для всех выводов одного и того же порта. Сигналы с1кц0, SLEEP, и PUD одинаковы для всех портов. Остальные сигналы уникальны для каждого вывода.
В табл. 1.23 описано назначение всех показанных на схеме управляющих сигналов. В отличие от схемы, в таблице в названиях сигналов для простоты опушены символы, означающие номер вывода и название порта. Все альтернативные сигналы вырабатываются соответствующими альтернативными устройствами.
Шина данныхШина данных
Шина данных
Шина данных
PUOExn: Разрешение выключения нагр. резистора линии Рхп PUOVxn: Сигнал выключения нагр. резистора линии Рхп DDOExn: Разрешение деактивации выходного буфера Рхп DDOVxn: Сигнал деактивации выходного буфера Рхп PVOExn: Разрешение изменения выходного уровня Рхп PVOVxn: Сигнал изменения выходного уровня Рхп DIEOExn; Разрешение сигнала считывания входного уровня Рхп DIEOVxn: Значение сигнала считывания входного уровня Рхп SLEEP:Включение спящего режима
РТОЕхп:Разрешение переключения порта Рхп
PUD:Отключение нагр. резисторов
WDx:Запись DDRx
RDx:Чтение DDRx
RRx:Чтение регистра PORTx
WRx:Запись PORTx
RPx:Чтение разряда PORTx
WPx:Запись PINx
dkl/0:Тактовый сигнал цепей вводв/вывода
Dlxn:Цифровой ввод разряда п порта х
АЮхп:Аналоговый ввод разряда п порта х
Рис. 1.22. Альтернативные функции портов
Описание альтернативных сигналов для дополнительных функций
Обозначение сигнала
Полное название
Описание
PUOE
Разрешение альтернативного управления нагрузочным резистором (Pull-up Override Enable)
Если этот сигнал установлен, управление подключением нагрузочного резистора происходит при помощи сигнала PUOV. Если этот сигнал сброшен, нагрузочный резистор управляется соответствующими сигналами управления: резистор включен, если DDxn=O, PORTxn=1 и PUD=0
PUOV
Сигнал альтернативного управления нагрузочным резистором (Pull-up Override Value)
Если сигнал PUOE установлен в единицу, включение выключение нагрузочного резистора происходит при установке/сбросе сигнала PUOV, независимо от значения битов DDxn, PORTxn и PUD
DDOE
Разрешение альтернативного управления направлением передачи данных (Data Direction Override Enable)
Если этот сигнал установлен, включением выходного каскада управляет сигнал DDOV. Если этот сигнал сброшен, выходным каскадом управляет бит DDxn
DDOV
Сигнал альтернативного управления направлением передачи данных (Data Direction Override Value)
Если DDOE установлен, включение/выключе- ние выходного каскада происходит при установке/сбросе сигнала DDOV, не зависимо от состояния бита DDxn
PVOE
Разрешение альтернативного изменения значения на выходе порта (Port Value Override Enable)
Если этот сигнал установлен и выходной каскад включен, значение на выходе порта зависит от сигнала PVOV. Если сигнал PVOE сброшен, а выходной каскад включен, значение на выходе порта зависит от бита PORTxn
PVOV
Альтернативное значение сигнала на выходе порта (Port Value Override Value)
Если сигнал PVOE установлен, на выход порта поступает сигнал PVOV, независимо от значения бита PORTxn
РТОЕ
Разрешение альтернативного переключения порта (Port Toggle Override Enable)
Если сигнал РТОЕ установлен, бит PORTxn инвертируется
DIEOE
Разрешение альтернативного управления режимом ввода (Digital Input Enable Override Enable)
Если этот бит установлен, включением цифрового ввода управляет сигнал DIEOV. Если этот сигнал сброшен, включение цифрового вывода определяется режимом работы микроконтроллера (рабочий режим или спящий)
/ DIEOV
Сигнал альтернативного управления режимом ввода (Digital Input Enable Override Value)
Если сигнал DIEOE установлен, включение/ выключение цифрового ввода производится установкой/сбросом бита DIEOV, не зависимо от режима работы микроконтроллера (рабочий или спящий)
DI
Цифровой вход (Digital Input)
Это цифровой вход для альтернативной функции. На рис. 1.22, сигнал подключен к выходу триггера Шмидта, но перед синхронизатором, Если цифровой вход используется как источник тактового сигнала, модуль дополнительной функции будет использовать свой собственный синхронизатор.
АЮ
Аналоговый вход/выход (Analog Input/Output)
Это аналоговый вход/выход для аналогового альтернативного устройства. Сигнал непосредственно подключен к выходному контакту и может использоваться двунаправлено
Приведу краткое описание всех дополнительных функций для каждого порта. Покажу, как важнейшие сигналы связаны с каждой дополнительной функцией. Для получения более полной информации о каждой дополнительной функции обратитесь к соответствующему разделу текущей главы.
Регистр управления микроконтроллером — MCUCR
Номер бита 7654321О
| PUD | SM1 | SE | SMO | ISC11 | ISC10 | ISC01 | ISCOO~~] MCUCR
4TenHe(R)/3anncb{W)R/WR/WR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Бит 7 — PUD: Отключение резисторов внутренней нагрузки. Если значение этого бита равно единице, нагрузочные резисторы всех разрядов всех портов отключены, даже если биты DDxn и PORTxn какого-либо регистра сконфигурированы на включение нагрузочного резистора.
Альтернативные функции порта А
Альтернативные функции порта А приведены в табл. 1.24.
Вывод порта
Альтернативная функция
РА2
RESET, dW
РА1
XTAL2
РАО
XTAL1
Таблица 1.24.
Альтернативные функции порта А
Альтернативные функции порта В
Альтернативные функции порта В приведены в табл. 1.25.
Вывод порта
Альтернативная функция
РВ7
USCK/SCL/PCINT7
РВ6
DO/PCINT6
РВ5
DI/SDA/PCINT5
РВ4
OC1B/PCINT4
РВЗ
OC1A/PCINT3
РВ2
OC0A/PCINT2
РВ1
AIN1/PCINT1
РВО
AIN0/PCINT0
Таблица 1.25.
Альтернативные функции порта В
Детальное описание альтернативных функцийкаждого из выводов
USCK/SCL/PCINT7 — Порт В, Бит 7
USCK: Одна из трех линий универсального последовательного интерфейса (тактовый сигнал).
SCL: Одна из линий двухпроводного последовательного интерфейса USI (линия синхронизации).
PCINT7: Седьмой разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВ7 может служить источником внешнего прерывания.
DO/PCINT6 — Порт В, Бит б
DO: Линия вывода данных универсального трехпроводного последовательного интерфейса. Сигнал данных трехпроводного порта подменяет значение разряда PORTB6 и управляет этой линией порта, если бит управления направлением передачи информации DDB6 установлен (в единицу). Однако при помощи разряда PORTB6 можно включить нагрузочный резистор, если выбрать режим ввода и разряд PORTB6 установить в единицу.
PCINT6: Шестой разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВб может служить источником внешнего прерывания.
DI/SDA/PCINT5 — Порт В, Бит 5
DI: Линия ввода данных универсального трехпроводного последовательного интерфейса. Включение трехпроводного режима не может изменить направление передачи информации, поэтому этот вывод нужно принудительно сконфигурировать как выход. , -
SDA: Линия данных двухпроводного последовательного интерфейса.
PCINT5: Пятый разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВ5 может служить источником внешнего прерывания. '
OC1B/PCINT4 — Порт В, Бит 4
ОС1В: Выход сигнала совпадения от таймера 1 (канал В). Вывод РВ4 может служить выходом для сигнала от таймера/счетчика 1 в режиме совпадения в канале В. Для того, чтобы использовать этот режим, линия должна быть сконфигурирована как выход (DDB4 установлен в единицу). Линия ОС1В также служит выходом при работе таймера в режиме ШИМ (PWM).
PCINT4: Четвертый разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВ4 может служить источником внешнего прерывания.
OC1A/PCINT3 — Порт В, Бит 3
ОС1А: Выход сигнала совпадения от таймера 1 (канал А). Вывод РВЗ может служить выходом для сигнала от таймера/счетчика 1 в режиме совпадения в канале А. Для того, чтобы использовать этот режим, линия должна быть сконфигурирована как выход (DDB3 установлен в единицу). Линия ОС1А также служит выходом при работе таймера в режиме ШИМ (PWM).
PCINT3: Третий разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВЗ может служить источником внешнего прерывания.
OC0A/PCINT2 — Порт В, Бит 2
ОСОА: Выход сигнала совпадения от таймера 0 (канал А). Вывод РВ2 может служить выходом для сигнала от таймера/счетчика 0 в режиме совпадения в канале А. Для того, чтобы использовать этот режим, линия должна быть сконфигурирована как выход (DDB2 установлен в единицу). Линия ОСОА также служит выходом при работе таймера в режиме ШИМ (PWM).
PCINT2: Второй разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВ2 может служить источником внешнего прерывания.
AIN1/PCINT1 — Порт В, Бит 1
AIN1: Инвертирующий вход аналогового компаратора. Для того, чтобы избежать конфликта цифровой части с аналоговой, перед использованием этой функции необходимо установить режим ввода и отключить нагрузочный резистор.
PCINT1: Первый разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВ1 может служить источником внешнего прерывания.
AIN0/PCINT0 — Порт В, Бит О
AINO: Неинвертирующий вход аналогового компаратора. Для того, чтобы избежать конфликта цифровой части с аналоговой, перед использованием этой функции необходимо установить режим ввода и отключить нагрузочный резистор.
PCINT0: Нулевой разряд, задействованный в режиме прерываний по изменению состояния на любом из выводов. Если линия работает как выход, то выходной сигнал разряда РВО может служить источником внешнего прерывания.
В табл. 1.26 и 1.27 показано, как связаны дополнительные функции порта В и альтернативные сигналы, которые мы видели на рис. 1.22. Сигналы SPI MSTR INPUT и SPI SLAVE OUTPUT составляют сигнал MISO, в то время как MOSI разделен на сигналы SPI MSTR OUTPUT и SPI SLAVE INPUT.
Альтернативные сигналы для дополнительных функций линий РВЗ.. РВОАльтернативные сигналы для дополнительных функций линий РВЗ.. РВОАльтернативные сигналы для дополнительных функций линий РВ7.. РВ4
Альтернативные сигналы для дополнительных функций линий РВЗ.. РВО
Альтернативные сигналы для дополнительных функций линий РВЗ.. РВО
Имя сигнала
PB7/USCK/ SCL/ PCINT7
PB6/DO/PCINT6
PB5/SDA/ DI/ POINTS
РВ4/ОС1В/ PCINT4
PUOE
0
0
0
0
PUOV
0
0
0'
0
DDOE
USI_TWO_WIRE
0
USI_TWO_WIRE
0■
DDOV
(USI_SCL_HOLD + P0RTB7 )*DDB7
0
( SDA + PORTBS)* DDRB5
0 :
PVOE
USITWOWIRE • DDRB7
USLTHREE_WIRE
USITWOWIRE • DDRB5
0C1B_PV0E
PV0V
0
DO
0
0OC1BPVOV
РТОЕ
USI_PTOE
0
0
0
DIEOE
(PCINT7-PCIE) +USISIE
(POINTS-PCIE)
(POINTS-PCIE) + USISIE
(PCINT4-PCIE)
DIEOV
1
1
1
1
DI
PCINT7 INPUT USCK INPUT SCL INPUT
PCINT6 INPUT ■
POINTS INPUT SDA INPUT DI INPUT
PCINT4 INPUT
' АЮ
-
-
-
Signal Name
РВЗ/ОС1А/ POINTS
РВ2/ОС0А/ PCINT2
PB1/AIN1/ PCINT1
PBO/AINO/ PCINTO
PUOE
0
0
0
0
PUOV
0
0
0
0
DDOE
0
0
0
0
DDOV
0
0
0
0
PVOE
0C1A_PV0E
OCOA_PVOE
0
0
PVOV
OC1A_PVOV
OCOAPVOV
0
0
PTOE
0
0
0
0
DIEOE
(POINTS • PCIE)
(PCINT2 • PCIE)
(PCINT1 • PCIE)
(PCINTO • PCIE)
DIEOV
1
1
1
1
DI
PCINT7 INPUT
PCINT6INPUT
POINTS INPUT
PCINT4 INPUT
AJO
-
-
AIN1
AINO
Таблица 1.27.
Альтернативные функции порта D
Альтернативные функции всех контактов порта D показаны в табл. 1.28.
Таблица 1.28. Альтернативные функции всех контактов порта D
Вывод порта
Альтернативная функция
PD6
ICP
PD5
OC0B/T1
PD4
то
PD3
INT1
PD2
INT0/XCK/CKOUT
PD1.
TXD
PD0
RXD
Подробное описание альтернативных функций
ICP — Порт D, Бит 6
ICP: Вход захвата таймера/счетчика 1. Вывод PD6 может действовать как вход захвата для таймера/счетчика 1.
ОС0В/Т1 — Порт D, Бит 5
ОСОБ: Выход сигнала совпадения В. Контакт PD5 может служить выходом сигнала совпадения в канале В от таймера/счетчика 0. Для нормальной работы в этом режима контакт должен быть сконфигурирован как выход (DDB5 установлен в единицу). Контакт ОС0В также может служить выходом в режиме ШИМ (PWM).
Т1: Вход внешнего тактового сигнала для таймера/счетчика 1. Этот режим включается установкой в единицу битов CS02 и CS01 регистра управления таймером Т1 (TCCR1).
ТО — Порт D, Бит 4
ТО: Вход внешнего тактового сигнала для таймера/счетчика 0. Этот режим включается установкой в единицу битов CS02 и CS01 регистра управления таймером ТО (TCCR0).
INTI — Порт D, Бит 3
INTI: Внешнее прерывание 0. Сигнал на линии PD3 может служить источником внешнего прерывания микроконтроллера.
INT0/XCK/CKOUT — Port D, Бит 2
INTO: Внешнее прерывание 1. Сигнал на линии PD2 может служить источником внешнего прерывания микроконтроллера.
ХСК: Передача тактового сигнала USART. Используется только в режиме синхронной передачи.
CKOUT: Выход Системного тактового сигнала
TXD — Порт D, Бит 1
TXD: Передача данных UART.
RXD — Порт D, Бит 0
RXD: Прием данных UART.
В табл. 1.29 и 1.30 показана связь дополнительные функций порта
D и альтернативных сигналов, которые мы видели на рис. 1.22.
Имя сигнала
PD6/ICP
PD5/OC1B/T1
PD4/T0
PUOE
0
0
0
PUOV
0
0
0
DDOE
0
0
0
DDOV
0
•0
0
PVOE
0
OC1B_PVOE
0
PVOV
0
OC1B_PVOV
0
PTOE
0
0
0
DIEOE
ICP ENABLE
T1 ENABLE
TO ENABLE
DIEOV
1
1
1
DI
ICP INPUT
T1 INPUT
TO INPUT
АЮ
-
-
AIN1
Таблица 1.29.
Альтернативные сигналы разрядов PD7—PD4
Имя сигнала
PD3/INT1
PD2/INT0/XCK/ CKOUT
PD1/TXD
PDO/RXD
PUOE
0
0
TXD_OE
RXD_OE
PUOV
0
0
0
PORTDO • PUD
DDOE
0
0
TXDOE
RXDEN
DDOV
0
0
1
0
PVOE
0
XCKOPVOE
TXDOE
0
PVOV
0
XCKO_PVOV
TXD_PVOV
0
РТОЕ
0
0
0
0
DIEOE
1NT1 ENABLE
INTO ENABLE/ XCK INPUT ENABLE
0
0
DIEOV
1
1
0
0
DI
INT1 INPUT
INTO INPUT/ XCK INPUT
RXD INPUT
АЮ
-
-
-
-
Таблица 1.30.
Альтернативные сигналы разрядов PD3..PD0Альтернативные сигналы разрядов PD3..PD0Описание управляющих регистров портовввода—вывода
Альтернативные сигналы разрядов PD3..PD0
Альтернативные сигналы разрядов PD3..PD0
PORTA — Регистр данных порта А
Номер бита7654321О
|—-|—|—|—|—| P0RTA2 | РОНТА 1 [ P0RTAO | РОНТА
ЧТение(Н)/Запись^RRRRRR/WR/WR/W
Начальное значение0000000О
DDRA — Регистр направления передачи информации порта А
Номер бита
7
6
5
4
3
2
1
0
L
[ —
|
—
j DDA2 |
DDA1
| DDAO |
| DDRA
4TeHHe(R)/3awcb(W)
R
R
R
R
R
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
PINA — Адрес для чтения уровней сигналов на внешних контактах порта А
Номер бита
7
6
5
4
3
2
1
0
L
—
—
| PINA2 |
PINA1 1
| PINAO |
| PINA
Чтение! R)/3anncb(W)
R
R
R
R
R
R/W
R/W
R/W
Начальное значение
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
PORTB — Регистр данных порта В
Номер бита 7654321О
| PORTB7 | PORTB6|PORTB5 | PORTB4 |PORTB3) PORTB2 |PORB1| РОЯТВО]PORTB
Чтение; R)/3anncb(W) R/W R/WR/W R/WR/WR/WR/WR/W
Начальное значение 00000000
DDRB — Регистр направления передачи информации порта В
Номер бита 76543210
| DDB7| DDB6 | DDB5 | DDB4 jDDB3 | DDB2 | DDBlJ DDBO j DDRB
Чтение; Н)/Запись(\М) R/W R/W R/W R/W R/W R/W R/W R/W Начальное значение 00000000
PINB — Адрес для чтения уровней сигналов на внешних контактах порта В
Номер бита
7
PINB7 |
6
| PINB6 |
5
PINB5 |
4
PINB4 |
3
PINB3 |
2
PINB2 |
1
PINB1
0
| PiNBO |
PiNB
Чтение(Р)/Запись(М)
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
PORTD — Регистр данных порта D
Номер бита
7
6
5
4
3
21
0
PORTD
*
|PORTD6]
|PORTD5 |
|P0RTD4|
PORTD31
PORTD21
PORTD 1 |
| PORTDO|
Чтение! R)/3anncb(W)
R
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
DDRD— Регистр направления передачи информации порта D
Номер бита76543210
|-| DDD6 | DDD5 | DDD4 | DDD3 | DDD2 } DDD1 | ODDO [ DDRD
Чтение; Я|/Запись№)RR/WR/WR/WR/WR/WR/WR/W
Начальное значение00000000
FIND — Адрес для чтения уровней сигналов на внешних контактах порта D
Номер бита76543210
|—| P1ND6 | PIND5 | PIND4 | PIND3 | PIND2 | PIND1 | P1ND0 | FIND
Чтение(Н)/Запись(Ю)RR/WR/WR/WR/WR/WR/WR/W
Начальное значениеN/AN/AN/AN/AN/AN/AN/AN/A
•1.8. Внешние прерывания
■Назначение и режимы работы
' Для вызова внешних прерываний используются входы INTO, INTI или любой из входов PCINT7—0. Если прерывания разрешены, то они будут вызваны, даже если выводы INTO, INTI и PCINT7—0 ; сконфигурированы как выходы.
Эта особенность обеспечивает возможность генерировать прерывание программным путем. Прерывание РСП — это прерывание по ■ изменению сигнала на любом из выводов PCINT7—8. Прерывание PCI0 — это прерывание по изменению любого сигнала PCINT7...0. ' Причем как для прерывания РСП, так и для прерывания PCI0 можно произвольно исключить из работы любой из закрепленных за ним входов.
Управляющие регистры PCMSK1 и PCMSK0 определяют, какие из входов будут вызывать соответствующее прерывание. Прерывание по изменению на контактах PCINT7—0 работает асйнхронным образом. Поэтому данный вид прерываний может использоваться для ' пробуждения изо всех спящих режимов, кроме режима Idle.
Прерывания INTO и INT1 поддерживают несколько режимов. Они могут быть вызваны по переднему фронту, по заднему фронту или по статическому сигналу низкого логического уровня. Выбор одного из этих режимов производится при помощи регистра управления ' внешними прерываниями — EICRA.
, Когда одно из прерываний INTO или INT1 разрешено и сконфи- h гурировано как прерывание по низкому входному уровню, запрос ■ на прерывание будет вырабатываться все время, пока на входе v присутствует низкий уровень.
Внимание. Работа прерываний INTO и INT1 по переднему или по заднему фронту входного сигнала требует обязательного присутствия тактового сигнала.
Подробнее смотрите в разделе «Источники тактового сигнала». Вызов прерываний INTO и INT1 по низкому уровню осуществляется в асинхронном режиме. Это означает, что такое прерывание может быть использовано для пробуждения из любого спящего режима за исключением режима Idle. Синхросигнал системы ввода—вывода выключается во всех спящих режимах, кроме режима Idle.
Внимание. Если для пробуждения микроконтроллера используется прерывание по низкому уровню, то этот уровень должен удерживаться достаточно долго, чтобы микроконтроллер успел выйти из режима сна и начать обработку этого прерывания. Если низкий уровень исчезнет раньше, чем запустится микроконтроллер, то процедура обработки прерывания не будет запущена и прерывание останется невыполненным.
Время запуска микроконтроллера определяется при помощи fuse- переключателей SUT и CKSEL, как описано в разделе «Тактовый генератор».
Регистр управления микроконтроллером — MCUCR
Этот регистр содержит биты управления режимами прерываний.
Номер бита
7
6
5
4
3
2
1
0
PUD |
SMI j
1 SE |
| SMO J
| ISC11 I
| ISC10 I
ISCO1 j
| ISCOO
| MCUCR
Чтение(Н)/ЗаписьМ)
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
Бит 3, 2— ISC11, ISC10: Биты выбора режима вызова внешнего
прерывания INTL Внешнее прерывание 1 вызывается при помощи
" внешнего входа INTI в том случае, если установлен флаг I реги- « стра SREG, а также установлен соответствующий бит регистра маски. Возможные варианты вызова прерывания INT1 приведены
г в табл. 1.31.
‘ Работа системы прерывания по переднему (заднему) фронту про, исходит следующим образом. Сначала схема обнаружения фронта ( фиксирует уровень сигнала на входе INT1. Затем она ожидает L изменения этого уровня. Если уровень на входе изменится и этот ■ измененный уровень продержится в течение одного периода так. тового сигнала, то происходит вызов прерывания.
1 Если изменение продержится меньше одного периода, вызов пре- г рывания не гарантируется. Если выбран режим прерывания по уровню, то для того, чтобы вызвать прерывание, низкий уровень - должен удерживаться на входе, пока не закончится процесс выполнения текущей команды..
ISC11
ISC1O
Описание
0
0
Низкий уровень на входе INT1 генерирует запрос на прерывание
0
1
Любое изменение логического уровня на входе INT1 генерирует запрос на прерывание
1
0
Задний фронт входного сигнала INT1 вызывает запрос на прерывание
1
1
Передний фронт входного сигнала INT1 вызывает запрос на прерывание
Таблица 1.31.
Режимы вызова прерывания INT1
Бит 1,0 — ISC01, ISC00: Биты выбора режима вызова внешнего прерывания INTO. Внешнее прерывание 0 вызывается при помощи внешнего входа INTO в том случае, если установлен флаг I регистра SREG, а также установлен соответствующий бит регистра маски. Возможные варианты вызова прерывания INTO приведены в табл. 1.32.
Работа системы прерывания по переднему (заднему) фронту происходит следующим образом. Сначала схема обнаружения фронта фиксирует уровень сигнала на входе INTO. Затем она ожидает изменения этого уровня. Если уровень на входе изменится и этот измененный уровень продержится в течение одного периода тактового сигнала, то происходит вызов прерывания.
Если изменение продержится меньше одного периода, вызов прерывания не гарантируется. Если выбран режим прерывания по уровню, то для того, чтобы вызвать прерывание,, низкий уровень должен удерживаться на входе, пока не закончится процесс выполнения текущей команды.
Таблица 1.32.Режимы вызова прерывания INTO
ISCO1
,ISCOO
Описание
0
0
Низкий уровень на входе INT1 генерирует запрос на прерывание
0
■1
Любое изменение логического уровня на входе (NT 1 генерирует запрос на прерывание
1
0
Задний фронт входного сигнала INT1 вызывает запрос на прерывание
1■
-1
Передний фронт входного сигнала INT1 вызывает запрос ’на прерывание
Главный регистр маски прерываний — GIMSK
Номер бита7654321О
|INTIfINTO|PCIE1—|-I—I—|—jGIMSK
Чтение! R)/3anncb(W)R/WR/WR/WRRRRR
Начальное значение 00000000
Бит 7— INTI: Разрешение внешнего прерывания INTI. Внешнее прерывание 1NT1 разрешается, когда бит INT1 установлен в единицу, а также установлен флаг I регистра SREG,. Условия возникновения прерывания определяются битами 1SC11 и ISC10 регистра MCUCR. Прерывание будет вызвано даже в том случае, если контакт INT1 сконфигурирован как выход. При вызове прерывания выполняется процедура, определяемая соответствующим вектором прерывания. ■
Бит 6— INTO: Разрешение внешнего прерывания INTO. Когда бит INTO установлен в единицу, а также установлен флаг I регистра SREG, внешнее прерывание INTO разрешается. Условия возникновения прерывания определяются битами ISC01 и ISCOO регистра MCUCR. Прерывание будет вызвано даже в том случае, если контакт INTO сконфигурирован как выход. При вызове пре-
рывания выполняется процедура, определяемая соответствующим вектором прерывания.
Бит 5 — PCIE: Разрешение прерывания по изменению состояния ■ выводов. Если бит PCIE установлен в единицу, и при этом установлен флаг I регистра SREG, прерывание по изменению состояния любого контакта разрешено. Запрос на прерывание по изменению состояния на любом из контактов вызывает процедуру обработки прерывания, определяемую соответствующим вектором прерывания. Какие именно контакты будут вызывать прерывание, определяется индивидуально, установкой одного из битов PCINT7—О регистра PCMSK.
Регистр флагов внешних прерываний — EIFR
Номер бита76543210
|1NTF1 | INTFO | PCIF |—|—|—|—|—|EIFR
Чтение(В)/Запись№R/WR/WR/WRRRRR
Начальное значение0000000О'
Бит 7 — INTF1: Флаг внешнего прерывания 1. Когда изменение логического уровня сигнала на входе INT1 вызывает запрос на прерывание, устанавливается флаг INTEL Если при этом флаг I регистра SREG и бит INT1 регистра GIMSK установлены в единицу, микроконтроллер перейдет к выполнению процедуры обработки прерывания по соответствующему вектору.
При запуске процедуры обработки прерывания флаг автоматически очищается. Флаг может быть также очищен программно, путем записи в него логической единицы. Если прерывание INT1 сконфигурировано как прерывание по уровню, данный флаг всегда очищен.
Бит 6 — INTF0: Флаг внешнего прерывания 0. Когда изменение логического уровня сигнала на входе INTO вызывает запрос на прерывание, устанавливается флаг INTF0. Если при этом флаг I регистра SREG и бит INTO регистра GIMSK установлены в единицу, микроконтроллер перейдет к выполнению процедуры обработки прерывания по соответствующему вектору.
При запуске процедуры обработки прерывания флаг автоматически очищается. Флаг может быть также очищен программно, путем записи в него логической единицы. Если прерывание INTO сконфигурировано как прерывание по уровню, данный флаг всегда очищен.
Бит 5 — PCIF: Флаг прерывания по изменению состояния оного из выводов. Изменение логического уровня на одном из входов PCINT7—0 вызывает генерацию запроса на прерывание, благодаря чему устанавливается флаг PCIF. Если при этом флаг I регистра SREG и бит PCIE регистра G1MSK установлены в единицу, микроконтроллер перейдет к выполнению процедуры обработки прерывания по соответствующему вектору.
При запуске процедуры обработки прерывания флаг автоматически очищается. Флаг может быть также очищен программно, путем записи в него логической единицы.
Регистр маски прерываний по изменению на любом изконтактов — PCMSK
Номер бита 7654321 О
| PCINT7 | PCINT6 j POINTS j PCINT4 | PCINT3 | IPCINT2 | Р$И*Г1 I PCfNTO | PCMSK
Чтение! R)/3a™cb(W)R/W R/W R/W R/W R/W R/W yffi/W R/W
Начальное значение 0000 О О 00
Бит 7..0 — PCINT7..0: Маска разрешения входов. Каждый из битов PCINT7—0 определяет, разрешается ли прерывание по изменению уровня на соответствующем входе. Если бит и флаг PCIE регистра G1MSK установлены в единицу, прерывание по изменению сигнала на соответствующем входе разрешается. Если бит сброшен, то прерывание по изменению сигнала на соответствующем входе запрещено.
Восьмиразрядный таймер/счетчик споддержкой режима ШИМ
Назначение и особенности
Таймер/счетчик ТО — это универсальный восьмиразрядный счетный модуль с двумя независимыми модулями совпадения и с поддержкой - ШИМ (PWM). Он позволяет формировать заданные промежутки времени (для работы в режиме реального времени). А также может служить генератором сигналов.
Рассмотрим основные особенности таймера:
два независимых модуля совпадения;
двойная буферизация при записи в регистры сравнения;
сброс таймера при совпадении,(авто перезагрузка);
симметричный широтно-импульсный модулятор с подавлением помех (PWM);
программно изменяемый период в режиме ШИМ;
генератор частот;
три независимых источники прерывания (TOVO, OCF0A и ОСТОВ).
Упрощенная блок-схема
Упрощенная блок-схема восьмиразрядного таймера/счетчика приведена на рис. 1.23. Фактическое расположение показанных на схеме входных и выходных контактов таймера смотрите в разделе «“Основные характеристики микроконтроллера» (стр. 16). Доступные для центрального ядра регистры и цепи передачи данных на схеме показаны полужирными линиями.
Регистры
Как счетный регистр таймера/счетчика (TCNT0), так и оба регистра совпадения (OCR0A, и OCR0B) представляют собой восьмиразрядные регистры. Наличие запроса на прерывание (на рис. 1.23 он
м
count
clear
direction
Управля-ющаялогика
■► TOVn (выз.прерыв)
Выбор частоты
Шина данных
bottom
top
Таймер/счетчик
TCNTn
OCRnA
C,kTn
OCRnB
TCCRnA
TCCRnB
-<— (От предцелителя)
Фиксациямакс,значения
Рис. 1.23. Блок-схема 8-разрядного таймера/счетчика
Детекторфронтов
ОСпА (выз.прерыв.)
Генераторсигналов
ОСпА
ОСпВ (выз.прерыв)
Генераторсигнала
ОСпВ
сокращенно обозначен «выз. прерыв.») всегда можно определить по состоянию соответствующего флага прерываний в регистре TIFR.
Каждое прерывание может быть индивидуально замаскировано при помощи регистра маски прерываний таймера TIMSK. Регистры TIFR и TIMSK на рис.1.23 не показаны.
Таймер/счетчик может работать как от внутреннего тактового генератора через предварительный делитель, так и от внешнего тактового сигнала, поступающего на вход ТО. Схема выбора источника тактового сигнала пропускает тактовые импульсы выбранного источника на вход таймера/счетчика, и каждый импульс этого сигнала увеличивает (или уменьшает) его значение.
Если не выбран ни один из источников тактового сигнала, таймер/ счетчик останавливается.
Определение. Сигнал на выходе схемы выбора источника такто- ■вого сигнала называется сигналом синхронизации
таймера (clkT0).
Содержимое регистров OCR0A и OCR0B постоянно сравнивается со значением таймера/счетчика. Результат сравнения может использоваться генератором для генерации сигнала ШИМ или прямоугольных импульсов переменной частоты на одном из выходов' ОСОА или ОСОБ. Подробнее об этом смотри в разделе «Модуль совпадения».
В момент совпадения в одном из каналов устанавливается соответствующий флаг OCF0A или OCF0B, который может использоваться для генерации запроса на прерывание по совпадению.
Используемые обозначения
Далее дано общее описание всех регистров и отдельных их разрядов. Строчная буква «п» в описании регистров означает номер таймера/счетчика, к которому он относится. В нашем случае «п» равно 0.
Строчная буква «х» обозначает наименование модуля сравнения. В нашем случае это модуль А или модуль В. При использовании
наименования регистра или бита в программе, нужно подставлять его полное значение. Например, TCNT0 для обращения к значению счетного регистра таймера/счетчика — ТО и так далее.
При описании счетчиков используются специальные обозначения для всех его важных состояний. Эти,обозначения приведены в табл. 1.33.
BOTTOM
Счетчик достигает значения BOTTOM (начало), когда его содержимое равно 0x00
МАХ
Счетчик достигает значения МАХ (максимум), когда его содержимое равно OxFF (десятичное 255)
ТОР
Счетчик достигает значения ТОР (вершина), когда его содержимое достигает самого высокого значению в данном режиме работы. В зависимости от режима значение ТОР может быть равно либо OxFF (МАХ) либо значению, записанному в регистре OCR0A (режим сброса по совпадению)
Таблица 1.33.
Обозначения
для основных состояний 8-разрядного счетчика
Источники тактового сигнала таймера/счетчика
Таймер/счетчик может работать как от внутреннего, так и от внешнего источников тактового сигнала. Выбор источника тактового сигнала производится при помощи управляющей логики, которая выбирает источник тактового сигнала в соответствии со значениями битов CS02:0 регистра TCCR0B.
Перед тем, как поступить в цепи синхронизации микроконтроллера, тактовый сигнал от выбранного источника подвергается предварительному делению. Подробнее об источниках тактового сигнала и предварительном делителе смотрите в разделе «Источники тактового сигнала».
Модуль счета
Основой восьмиразрядного таймера/счетчика является программируемый реверсивный счетный модуль. На рис. 1.24 показана блок-схема счетного модуля и его управляющие сигналы.
Рис. 1.24. Блок-схема счетного модуля
Рассмотрим внутренние сигналы:
count — увеличивает или уменьшает содержимое TCNT0 на 1;
direction — выбор между уменьшением и увеличением;
clear — очистка TCNT0 (установка всех битов в ноль);
clkTn — тактовая частота таймера/счетчика, называемая далее cIRtoS
top — возникает при достижении TCNT0 максимального значения;
bottom — возникает при достижении TCNT0 минимального значения (нуля).
В зависимости от режима работы таймера, каждый импульс тактового сигнала (clkT0) очищает, увеличивает или уменьшает значение счетчика. Сигнал clkT0 может быть получен как от внешнего, так и от внутреннего источника тактового сигнала. Это определяется битами выбора тактового сигнала (CS02:0). Когда не выбран ни один источник тактового сигнала (CS02:0 = 0), таймер останавливается.
Центральный процессор может обращаться к значению регистра TCNT0 независимо от того, присутствует ли сигнал clkTo или нет. Команда записи, поступающая от центрального процессора, имеет приоритет над всеми другими операциями (очистки счетчика или операциями счета).
Режимы работы таймера определяются установкой битов WGM01 и WGM00 регистра TCCR0A и битом WGM02 регистра TCCR0B. Есть тесная связь между выбранным режимом работы счетчика и частотой сигнала на выходе ОСОА. Подробнее это описано в разделе «Режимы работы».
Флаг переполнения таймера/счетчика (TOV0) устанавливается в соответствии с режимом работы, выбранным при помощи битов WGM0T.0. Флаг TOV0 может использоваться для генерации прерываний центрального процессора.
Модуль совпадения
Основа модуля— восьмиразрядный компаратор, который непрерывно сравнивает содержимое регистра TCNT0 с содержимым каждого из двух регистров совпадения (OCR0A или OCR0B). Каждый раз, когда содержимое TCNT0 оказывается равным содержимому OCR0A или OCR0B, компаратор вырабатывает сигнал совпадения. Этот сигнал устанавливает соответствующий флаг совпадения (OCF0A или OCF0B) в следующем тактовом цикле.
Если соответствующее прерывание разрешено, установка флага совпадения вызывает прерывание. Флаг совпадения автоматически сбрасывается при запуске процедуры обработки прерывания. Флаг также может быть очищен программно путем записи в него логической единицы.
Генератор частот использует сигнал совпадения для генерации выводного сигнала в соответствии с выбранным режимом работы, который определяется битами WGM02:0, а также битами выбора режима сравнения (COMOxl:0). Сигналы max и bottom используются генератором частот в некоторых случаях для получения критических значений в отдельных режимах работы (смотри раздел «Режимы работы»). На рис. 1.25 показана блок-схема модуля совпадения.
Регистры OCROx имеют двойную буферизацию в любом режиме широтно-импульсной модуляции (ШИМ). В режиме Normal и режиме СТС (Сброс при совпадении) двойная буферизация отключается. Двойная буферизация синхронизирует момент обновления регистра OCROx с моментом достижения таймером верхнего или нижнего пределов. Синхронизация предотвращает возникновение асимметричных ШИМ-импульсов, го есть импульсов, длина которых 106
равна нечетному количеству тактов. Таким образом обеспечивается высокое качество сигналов ШИМ.
Доступ к регистру OQROx может показаться слишком сложным. На самом деле это не так. Если двойная буферизация разрешена, центральный процессор обращается к регистрам OCROx через буфер. Если буферизация отключена, центральный процессор обращается к регистрам OCROx непосредственно.
WGMnEO СОМпХ1:0
Рис. 1.25. Блок-схема модуля совпадения
Принудительное изменение состояния выходасовпадения
Во всех не-ШИМ-режимах таймера сигнал на любом из выходов совпадения может быть изменен принудительно путем записи единицы в специальный бит FOCOx. Принудительное изменение выхода совпадения не устанавливает флаг OCFOx и не перезагружает таймер.
Сигнал на выходе ОСОх будет изменяться таким же образом, как при реальном совпадении. То есть поведение выхода ОСОх будет зависеть от установки битов COMOxl:0. В зависимости от значения этих битов сигнал на выходе будет либо установлен в единицу, либо сброшен в ноль, либо изменит свое значение на противоположное.
Блокировка режима совпадения в момент записирегистра TCNTO
При записи значения в регистр TCNT0 операция сравнения блокируется в течение одного такта входного сигнала таймера. Это происходит даже в том случае, если таймер остановлен. Эта особенность позволяет записывать в регистр OCROx то же самое значение, что и в регистр TCNT0, не вызывая прерывания при поступлении на вход таймера/счетчика тактового сигнала.
Использование модуля совпадения
В любом режиме работы таймера в момент записи регистра TCNT0 работа модуля сравнения приостанавливается на один периода тактового сигнала. Это может привести к ошибкам при изменении содержимого регистра TCNT0 независимо от того, запущен тай- мер/счетчик или нет.
Если значение, записанное в TCNT0, равно значению, записанному в OCROx, операция сравнения будет пропущена, что приведет к неправильной работе таймера в режиме генератора частоты.
Внимание. Точно так же нельзя записывать в TCNTO значение, равное BOTTOM, когда счетчик работает в режиме обратного счета.
Настройка режимов работы выхода ОСОх должна быть произведена перед тем, как соответствующая линия порта будет сконфигурирована как выход. Самый простой способ установить нужное значение на выходе ОСОх — использовать принудительную установку (бит FOCOx) в режиме Normal. Регистры ОСОх сохраняют свое значение при переключении режимов генерации сигналов.
Внимание. Биты COMOxl:0 не имеют двойной буферизации. Изменение битов СОМОхГ.О вступит в силу немедленно.
Модуль вывода сигнала совпадения
Разряды COMOxl:0 выполняют две функции. Генератор частот использует биты COMOxl:0 для того, чтобы определить, как изменится сигнала на выходе модуля совпадения (ОСОх) в момент обнаружения факта совпадения. В то же время биты COMOxl:0 управляют источником сигнала на выходе ОСОх.
На рис. 1.26 показана упрощенная схема, демонстрирующая логику работы разрядов COMOxl:0. Как видно из рисунка, на прохождение сигналов COMOxl:0 с выхода схемы совпадения на внешний вывод микросхемы отчасти влияет содержимое главных регистров управления портом ввода—вывода (DDR и PORT). Причем когда мы говорим о статусе ОСОх, нужно понимать, что внутренний регистр ОСОх не то же самое, что контакт микросхемы ОСОх. Сразу после системного сброса в регистр ОСОх записывается ноль.
Если любой из битов COMOxl:0 установлен, то основная функция порта ввода—вывода отменяется, и на выход проходит сигнал совпадения (ОСОх) с генератора частот. Направление передачи информации контакта ОСОх (вход он или выход) все еще зависит от соответствующего бита регистра DDR.
Значение бита, определяющего направление передачи информации для вывода ОСОх (DDR _ОСОх) в случае, если он должен работать как выход, должно быть установлено до того, как значение регистра
ОСОх поступит на этот выход. Альтернативные функции порта не зависят от режима работы генератора сигналов.
Рис. 1.26. Схема вывода сигнала совпадения
Режим вывода сигнала совпадения и генерациясигналов
Генератор сигналов использует биты COMOxl:0 не так, как они используются в режимах Normal, СТС и ШИМ. Для всех режимов установка СОМ0х1:0 = 0 указывает генератору сигналов, что при следующем совпадении с регистром ОСОх не должно быть выполнено никаких действий. Работа схемы совпадения в не-ШИМ-ре- жимах проиллюстрирована на рис. 1.34. Работа схемы в режиме «Fast PWM» описана в табл. 1.36. Работа в режиме «Correct PWM» описана в табл. 1.36.
При изменении значений битов COMOxl:0 их влияние на работу схемы отразится только при очередном после записи битов обнаружении факта совпадения. Для не-ШИМ-режимов это действие может
проявляться немедленно, в случае принудительной установки сигнала на выходе с использованием в качестве строба бита FOCOx.
Режимы работы
Режим работы, то есть, поведение таймера/счетчика и выхода сигнала совпадения, определяется как режимом работы генератора сигналов (WGM02:0), так и режимом вывода сигнала совпадения (СОМ0х1:0). Состояние битов, определяющих режим вывода сигнала совпадения, не влияет на последовательность подсчета, которая определяется только состоянием битов конфигурации генератора сигналов.
Биты COMOxl:0 определяют, должен ли выходной сигнал ШИМ быть инвертирован или нет (инвертированный или не инвертированный ШИМ). Для не-ШИМ-режимов содержимое битов COMOxl:0 определяет, должен ли сигнал на выходе быть установлен в единицу, сброшен в ноль либо переключен в противоположное состояние в момент совпадения (см. раздел «Модуль совпадения»).
Режим «Normal»
Режим «Normal» (WGM02:0 = 0) — это самый простой из режимов работы таймера. В этом режиме направление счета всегда вперед (содержимое увеличивается), и принудительный сброс счетчика не выполняется. Счетчик просто переполняется, когда достигнет максимального для восьми разрядов значения (ТОР = OxFF), а затем перезапускается сначала (0x00).
При нормальной работе флаг переполнения таймера/счетчика (TOV0) будет установлен в тот момент, когда TCNT0 станет равно нулю. Флаг TOV0 в этом случае ведет себя как девятый бит, за тем исключением, что он только устанавливается, но не сбрасывается.
Используя прерывание по переполнению таймера, которое автоматически очищает флаг TOV0, можно увеличить коэффициент пересчета программным путем. Режим Normal не имеет никаких особенностей, на которых стоило бы заострять внимание. Новое значение счетного регистра может быть записано в любой момент времени.
Модуль совпадения иногда может использоваться для вызова прерываний. Использование сигнала совпадения для генерации сигналов в режиме Normal не рекомендуется, так как это будет сильно тормозить работу процессора.
Режим сброса при совпадении (СТС)
В режиме сброса при совпадении или, по-другому, в режиме СТС (при WGM02:0 = 2) регистр OCR0A используется для того, чтобы управлять коэффициентом пересчета счетчика. В режиме СТС счетчик сбрасывается в ноль при совпадении содержимого счетного регистра (TCNT0) и регистра OCR0A.
Регистр OCR0A, таким образом, определяет максимальное значение для счетчика, а, следовательно, и его коэффициент пересчета.
Этот режим позволяет максимально контролировать частоту сигнала на выходе модуля. Упрощается также и подсчет внешних событий. Значение счетного регистра (TCNT0) увеличивается до момента, пока не происходит совпадение между TCNT0 и OCR0A, и затем содержимое счетчика (TCNT0) очищается.
Прерывание может вызываться каждый раз, когда счетчик достигает значения ТОР. При этом используется флаг OCF0A. Если прерывание разрешено, вызывается процедура обработки прерывания, которая может использоваться для того, чтобы обновить значение ТОР.
Установка ТОР чересчур близко к значению BOTTOM в тот момент, когда счетчик не работает или при низком коэффициенте предварительного деления, должна выполняться осторожно, так как режим СТС не имеет двойной буферизации.
Если новое значение, записанное в OCR0A, будет ниже, чем текущее значение TCNT0, то счетчик пропустит момент совпадения. В результате счетчик продолжит счет до своего максимального значения (OxFF), затем перейдет через ноль и лишь затем произойдет момент совпадения.
Для генерации выходного сигнала в режиме СТС выход ОСОА может быть установлен в режим переключения выходного уровня каждый раз в момент совпадения. Для этого нужно установить в соответствующее положение биты режима вывода сигнала совпа-
дения (COMOA 1:0 = 1). Значение регистра ОС0А не поступит на соответствующий внешний контакт порта, если он не сконфигурирован как выход. Сгенерированный сигнал будет иметь максимальную частоту f0co = Кчк_1/о/2, когда в регистр OCR0A записан ноль (0x00). Частота сигнала может быть рассчитана при помощи следующего уравнения:
{_Л;1к_1/О
JoCnx “ 2N(1 +OCFtm) ’
где переменная N — это коэффициент предварительного деления (1, 8, 64, 256 или 1024).
Как и в режиме Normal, флаг TOV0 устанавливается каждый раз, когда счетчик досчитывает до МАХ и переходит в ноль.
Режим Fast PWM (быстрый ШИМ)
Микроконтроллер имеет несколько режимов широтно-импульсной модуляции (ШИМ). По-английски это звучит как Pulse Width Modulation (PWM). Быстрый ШИМ (fast PWM) выбирается при WGM02:0 = 3 или 7. В этом режиме формируется самый высокочастотный сигнал ШИМ. Быстрый ШИМ отличается от других режимов ШИМ тем, что для формирования сигнала счетчик формирует только возрастающую последовательность. То есть изменение значения счетчика имеет вид пилообразного сигнала с односторонним наклоном.
Счет начинается со значения BOTTOM и заканчивается значением ТОР. После этого счетчик перезапускается (снова устанавливается значение BOTTOM). Значение ТОР равно OxFF при WGM2:0 = 3.
Если же WGM2:0 = 7, значение ТОР определяется содержимым регистра OCR0A. В режиме неинвертирующего выхода сигнал совпадения (ОСОх) сбрасывается в момент совпадения значений TCNT0 и OCROx и перехода к BOTTOM.
В инвертирующем режиме сигнал на выходе устанавливается в момент совпадения и перехода в BOTTOM. Благодаря тому, что счетчик работает всегда только в одном направлении, частота сигнала в режиме fast PWM может быть в два раза выше, чем в режиме
phase correct PWM, который использует пилообразный сигнал с двумя наклонами.
Благодаря высокой частоте выходного сигнала режим fast PWM хорошо подходит для создания систем регулировки мощности, для построения выпрямителей и цифро-аналоговых преобразователей. Высокая частота позволяет применять внешние компоненты (катушки, конденсаторы) небольших размеров и, тем самым, уменьшать общую стоимость системы.
В режиме fast PWM значение счетчика увеличивается до тех пор, пока не достигнет значения ТОР. В следующем цикле тактового сигнала таймера счетчик очищается.
Флаг переполнения таймера/счетчика (TOV0) устанавливается каждый раз, когда счетчик достигает значения ТОР. Если прерывание разрешено, то вызывается процедура обработки прерывания, которая может быть использована для обновления уровня совпадения.
В режиме fast PWM модуль совпадения используется для генерации сигнала ШИМ на выводах ОСОх. Установка битов COMOxl:0 = 2 произведет к генерации на выходе неинвертированного сигнала ШИМ. Для генерации инвертированного сигнала ШИМ необходимо установить COMOxl:0 =3. При установке битов COMOAl:0 =1 сигнал на выходе АСОА в момент совпадения переключается в противоположное состояние, при условии, что бит WGM02 = 1.
Эта опция не доступна для выхода ОСОБ (см. табл. 1.26). Фактическое значение ОСОх поступит на внешний контакт микросхемы только в том случае, если он будет сконфигурирован как выход.
Сигнал ШИМ формируется путем установки (сброса) регистра ОСОх в момент совпадения значений OCROx и TCNT0, и сброса (установки) этого регистра в первом тактовом цикле, после перезагрузки счетчика (изменении его значения с ТОР на БОТТОМ). Частота сигнала ШИМ на выходе может быть рассчитана при помощи следующего выражения: ■
г _ Л|кД/ОJocnxPWM- ^ „256 •
Переменная А представляет собой коэффициент предварительного деления (1, 8, 64, 256 или 1024). Отдельно нужно рассмотреть
несколько случаев при генерации сигнала ШИМ, когда в регистр OCR0A записывается значение, близкое к предельному.
Если в регистре OCR0A будет установлено значение, равное BOTTOM, то выходной сигнал будет представлять собой короткий выброс для каждого МАХ+1 тактового импульса таймера.
Если в регистр OCR0A записать значение МАХ, то это приведет к тому, что на выходе будет постоянно присутствовать либо высокий, либо низкой логический уровень (в зависимости от значения битов COMOAl:0).
Частота выходного сигнала в режиме fast PWM (при уровне регулирования 50 %) может быть достигнута, если заставить регистр ОСОх переключать свой логический уровень при каждом совпадении (COMOxkO = 1).
Сформированный таким образом сигнал будет иметь максимальную частоту f0co = fcikj/o/2 в том случае, когда в регистр OCR0A записан ноль. Эта особенность позволяет переключать регистр ОС0А таким же образом, как в режиме СТС, но при этом использовать все преимущества двойной буферизации, которая применяется в режиме fast PWM.
ШИМ, корректный по фазе (Phase Correct PWM)
Режим phase correct PWM (WGM02:0 = 1 или 5). Формирование сигнала ШИМ происходит с большим коэффициентом пересчета и корректного по фазе. Корректность по фазе обеспечивается благодаря работе счетчика в режиме пилообразного сигнала с двухсторонним наклоном.
Счетчик периодически изменяет направление своего счета. Сначала он считает от BOTTOM до ТОР, затем направление счета меняется, и счетчик считает ТОР до BOTTOM. Затем направление пересчета снова меняется, и все повторяется сначала.
Значение ТОР равно OxFF при WGM2:0 = 1 и определяется регистром OCR0A при WGM2:0 = 5.
В режиме неинвертирующего вывода сигнал на выходе ОСОх сбрасывается в ноль в момент совпадения содержимого регистров TCNT0 и OCROx, если счетчик работает в прямом направлении
(на увеличение). Значение устанавливается в единицу в момент совпадения, если счетчик работает на уменьшение.
В режиме инвертированного вывода картина меняется на противоположную. Режим двухстороннего наклона характеризуется более низкой максимальной частотой выходного сигнала по сравнению с предыдущим случаем, где применяется пила с односторонним наклоном. Благодаря симметричности по фазе при двустороннем наклоне такие режимы предпочитаются при создании систем управления электродвигателями.
В режиме phase correct PWM значение счетчика увеличивается, пока не достигнет значения ТОР. Когда значение счетчика достигает ТОР, направление счета изменяется. Содержимое TCNT0 будет равно ТОР в течение одного периода тактового сигнала таймера.
Флаг переполнения таймера/счетчика (TOV0) устанавливается каждый раз, когда счетчик достигает значения BOTTOM. Флаг прерывания может использоваться для генерации запроса на прерывание. Такое прерывание будет вызвано каждый раз, когда содержимое счетчика достигнет значения BOTTOM.
В режиме phase correct PWM модуль совпадения используется для генерации сигнала ШИМ на выходе ОСОх. При установке битов СОМ0х1:0 = 2 на выходе формируется неинвертированный ШИМ. Инвертированный сигнал ШИМ формируется при установке битов СОМ0х1:0 = 3. Установка битов СОМ0А0 = 1 заставляет сигнал на выходе ОСОА инвертироваться каждый раз в момент совпадения, если бит WGM02 установлен. Эта опция не доступна для вывода ОСОБ (см. табл. 1.27). Фактическое значение ОСОх поступает на внешний вывод порта только в том случае, если он сконфигурирован как выход.
Сигнал ШИМ сгенерируется путем сброса (установки) ОСОх в момент совпадения содержимого регистров OCROx и TCNT0, когда счетчик работает на увеличение, и устанавливается (сбрасывается) в момент совпадения, если счетчик работает на уменьшение. Частота выходного сигнала ШИМ в режиме phase correct PWM может быть вычислена по следующей формуле:
f _ Ус1к„1/О
JOCnxPCPWM " эд . 510 ’
где переменная N представляет собой коэффициент предварительного деления (1, 8, 64, 256, 1024).
Крайние значения содержимого регистра OCR0A при генерации сигналов ШИМ в режиме phase correct PWM представляют собой специальные случаи. Для неинвертирующего режима при записи в регистр OCR0A значения BOTTOM на выходе установится низкий логический уровень. При записи в OCR0A значения МАХ на выходе установится логическая единица. Для инвертирующего режима сигнал на выходе будет иметь противоположные значения.
Регистр А управления таймера/счетчика О — TCCROA
Номер бита76543210
| СОМОМ I COMPAQ | СОМ0В11СОМ0В01— j — I WGM01 [wSMOo] TCCROA
Чтение(В)/Запись(УУ)R/wR/WR/WR/WRRR/WR/W
Начальное значение00000000
Биты 7:6 — COMOAl:0: Режим работы схемы вывода сигнала совпадения (канал А). Эти два бита управляют режимом работы выхода сигнала совпадения (ОС0А). Если один или оба бита COMOAl:0 установлены в единицу, то стандартные свойства соответствующего разряда порта отменяются, и включается альтернативная функция. Однако для того, чтобы перевести контакт в режим вывода информации, соответствующий бит регистра DDR должен быть установлен в единицу.
Если сигнал ОСОА поступает на внешний вывод микросхемы, то назначение битов COMOAl:0 зависит от выбора значений разрядов WGM02:0. В табл. 1.34 показано назначение разрядов COMOAl:0, когда посредством битов WGM02:0 выбран режим СТС или Normal (то есть любой He-PWM-режим).
СОМ0А1
СОМ0А0
Описание
0
0
Стандартный режим порта. Выход ОС0А не подключен
'0
1
Переключение ОС0А на противоположное в момент совпадения
1
0
Сброс ОС0А в момент совпадения
1
1
Установка ОС0А в момент совпадения
Таблица 1.34.
Режимы вывода сигнала совпадения (He-PWM-режимы таймера)
В табл. 1.35 показано назначение разрядов СОМ0А1:0, когда посредством битов WGM01:0 выбран режим fast PWM.
Таблица 1.35.Поведение выходного сигнала ОСОА
в момент совпадения (режим Fast PWM)
СОМ0А1
СОМ0А0
Описание
0
0
Стандартный режим порта. Выход ОСОА не подключен
0
1
WGM02 = 0: Стандартный режим порта. Выход ОСОА не подключен.
WGM02 = 1: Переключение ОСОА в момент совпадения
1
0
Сброс ОСОА в момент совпадения, установка ОСОА при достижении счетчиком значения ТОР
1
1
Установка ОСОА в момент совпадения, сброс ОСОА при достижении счетчиком значения ТОР
Примечание. Особый случай, когда содержимое регистра ОСКОЛ равно ТОР и С0МОА1 установлен. В этом случае операция сравнения игнорируется, а установка или сброс сигнала происходит при достижении значения ТОР.
В табл. 1.36 показано назначение разрядов COMOAl:0 в том случае, когда при помощи битов WGM02:0 выбран режим «Phase correct PWM».
Таблица 1.36.Поведение выходного сигнала ОСОА
в момент совпадения (режим Phase Correct PWM)
СОМ0А1
СОМ0А0
Описание
0
0
Стандартный режим порта. Выход ОСОА не подключен
0
1
WGM02 = 0: Стандартный режим порта. Выход ОСОА не подключен.
WGM02 = 1: Переключение ОСОА в момент совпадения
1
0
Сброс ОСОА в момент совпадения при прямом счете. Установка ОСОА в момент совпадения при обратном счете
1
1
Установка ОСОА в момент совпадения при прямом счете. Сброс ОСОА в момент совпадения при обратном счете
Примечание. Особый случай. когда содержимое регистра OCR0A равно ТОР и бит СОМ0А1 установлен. В этом случае, момент совпадения игнорируется, а установки или сброс выходного сигнала производятся при достижении значения ТОР.
Биты 5:4 — COMOBl:0: Режим работы схемы вывода сигнала совпадения (канал В). Эти два бита управляют режимом работы выхода сигнала совпадения (ОСОБ). Если один или оба бита СОМОВ 1:0 установлены в единицу, то стандартные свойства соответствующего разряда порта отменяются, и включаются альтернативная функция. Однако для того, чтобы перевести контакт в режим вывода информации, соответствующий бит регистра DDR, должен быть установлен в единицу. ~
Если сигнал ОСОБ поступает на внешний вывод микросхемы, то назначение битов СОМ0В1:0 зависит от выбора значений разрядов WGM02:0. В табл. 1.37 показано назначение разрядов СОМ0А1:0, когда посредством битов WGM02:0 выбран режим СТС или Normal (то есть любой He-PWM-режим).
СОМОВ 1
сомово
Описание
0
0
Стандартный режим порта. Выход ОС0А не подключен
0
1
Переключение ОСОБ а момент совпадения
1
0
Сброс ОСОБ в момент совладения
1
1
Установка ОСОБ а момент совпадения
Таблица 1.37.
Режимы вывода сигнала совпадения (не-PWM-режимы таймера)
В табл. 1.38 показано назначение разрядов СОМОВ 1:0, когда посредством битов WGM01:0 выбран режим fast PWM.
Таблица 1.38.Режимы вывода сигнала совпадения (режим Fast PWM)
СОМ0В1
сомово
Описание
0
0
Стандартный режим порта. Выход ОС0А не подключен
0
1
Зарезервировано
1
0
Сброс ОСОБ в момент совпадения, установка ОСОБ при достижении счетчиком значения ТОР
1
1
Установка ОСОБ в момент совпадения, сброс ОСОБ при достижении счетчиком значения ТОР
Примечание. Особый случай возникает тогда, когда содержимое регистра OC.R0B равно ТОР и бит СОМОВ! установлен, В этом случае момент совпадения игнорируется, а установка или сброс происходят при достижении значения ТОР.
В табл. 1.39 показано назначение разрядов СОМ0В1:0, когда посредством битов WGM0T.0 выбран режим phase correct PWM.
Таблица 1.39.Режимы вывода сигнала совпадения
(режим Phase Correct PWM)
СОМ0В1
сомово
Описание
0
0
Стандартный режим порта. Выход ОС0А не подключен
0
1
Зарезервировано
1
0
Сброс ОСОБ в момент совпадения при прямом счете. Установка ОСОБ в момент совпадения при обратном счете
1 •
1
Установка ОСОБ в момент совпадения при прямом счете. Сброс ОСОБ в момент совпадения при обратном счете
Примечание: Особый случай возникает тогда, когда содержимое регистра ОС ROB равно ТОР и бит СОМОВ! установлен. В этом случае момент совпадения игнорируется, а установка или сброс происходят при достижении ТОР.
Биты 3, 2 — Res: Зарезервированные биты. В микроконтроллере ATtiny2313 эти биты зарезервированы. При чтении регистра значение этих битов всегда равно нулю.
Биты 1:0 — WGM01:0: Выбор режима работы генератора сигналов. Совместно с битом WGM02 регистра TCCR0B, эти биты управляют направлением счета, выбором максимального значения для счетчика (ТОР) и видом генерируемого сигнала на выходе, как показано в табл. 1.40. Модуль таймера/счетчика поддерживает следующие режимы работы: режим Normal (счетный режим), режим сброса при совпадении (СТС) и два режима широтно-импульсной модуляции (PWM).
Номер режима
WGM2
WGM1
WGM0
Название режима
Верхний предел (TOP)
OCRx изменяется
Флаг TOV (1> устанавливается от
0
0
0
0
Normal
OxFF
Непосредственно
МАХ
1
0
0
1
PWM, Phase Correct
OxFF
При достижении TOP
BOTTOM
2
0
1
0
CTC
OCRA
Непосредственно
МАХ
3
0
1
1
Fast PWM
OxFF
При достижении ТОР
МАХ
4
1
0
0
Зарезервировано
-
-
-
5
1
0
1 .
PWM, Phase Correct
OCRA
При достижении ТОР
BOTTOM
6
1
1
0
Зарезервиро-
-
-
7
1
1
1
Fast PWM
OCRA
При достижении ТОР
ТОР
Таблица 1.40.
Выбор режимов работы таймера
Примечание. МАХ - OxFF; BOTTOM = 0x00.
Регистр В управления таймера/счетчика 0 — TCCR0B
Номер бита 7 6 5 4 3 2 1 0
| FOC0A | FOC0B | — | — | WGM02 | CS02 | CS01 | CSOO™] TCCR0B Чтение(А)/ЗаписьОЛО W W R R R/W R/W R/W R/W
Начальное значение 00000000
Бит 7 — FOC0A: Принудительное изменение сигнала на выходе совпадения (канал А). Бит FOC0A активен только тогда, когда посредством битов WGM выбран один из He-PWM-режимов. Для того, чтобы гарантировать совместимость с будущими устройствами, этот бит должен быть установлен в ноль каждый раз, когда производится запись в регистр TCCR0B в любом из PWM-режимов.
Запись логической единицы в бит FOC0A вызывает немедленное изменение на выходе совпадения модуля генерации сигналов. Изменения на выходе ОСОА происходят согласно установкам битов COMOAl:0.
Обратите внимание, что бит FOC0A используется как строб. В момент установки этого бита проверяется состояние битов COMOAl:0 и выполняются соответствующие действия. Строб FOC0A не вызывает прерывания, и таймер в режиме СТС не сбрасывается, так
как это происходит в момент совпадения. При чтении регистра значение бита FOC0A всегда равно нулю.
Бит 6 — FOC0B: Принудительное изменение сигнала на выходе совпадения (канал В). Бит FOC0B активен только тогда, когда посредством битов WGM выбран один из ne-PWM-режимов. Однако для того, чтобы гарантировать совместимость с будущими устройствами, этот бит должен быть установлен в ноль каждый раз, когда производится запись в регистр TCCR0B в любом из PWM- режимов.
Запись логической единицы в бит FOC0B вызывает немедленное изменение на выходе совпадения модуля генерации сигналов. Изменения на выходе ОСОБ происходят согласно установкам битов СОМ0В1:0. Обратите внимание, что бит FOC0B используется как строб. В момент установки этого бита проверяется состояние битов СОМОВ! :0 и выполняются соответствующие действия.
Строб FOC0B не вызывает прерывания, и таймер в режиме СТС не сбрасывается, так как это происходит в момент совпадения. При чтении регистра значение бита FOC0B всегда равно нулю.
Биты 5:4 — Res: Зарезервированные биты. В микроконтроллере ATtiny2313 эти биты зарезервированы. При чтении регистра их значения всегда равны нулю.
Бит 3 — WGM02: Выбор режима работы генератора сигналов. Смотри описание в разделе «Регистр А управления таймера/счет- чика 0 — TCCR0A».
Биты 2:0 — CS02:0: Выбор режима тактового генератора. Эти три бита используются для выбора источника тактового сигнала для тай- мера/счетчика 0. Все возможные режимы перечислены в табл. 1.41.
CSO2
CS01
CSOO
Описание
0
0
0
Нет источника сигнала (таймер/счетчик остановлен)
0
0
1
clkl/0/l (нет предварительного деления)
0
1
0
cikl/O/8 (деление на 8)
0
1
1
clkl/O/64 (деление на 64)
1
0
0
clkl/O/256 (деление на 256)
1
0
1
clkl/Q/1024 (деление на 1024)
1
1
0
Внешний источник сигнала, вход ТО. Синхронизация по заднему фронту
1
1
1
Внешний источник сигнала, вход ТО. Синхронизация по переднему фронту
Таблица 1.41.
Выбор источника тактового сигнала
Если включен один из режимов внешней синхронизации, изменение сигнала на выводе ТО тактирует счетчик, даже если контакт сконфигурирован как выход. Эта особенность позволяет вырабатывать тактовые импульсы для таймера/счетчика программным путем.
Счетный регистр таймера/счетчика 0 — TCNTO
Номер бита 76543210
|TCNT0[7:0]| TCNT0
Чтение! R)/3anncb(W)R/W R/W R/W R/W R/W R/W R/W R/W
Начальное значение00000000
Счетный регистр позволяет осуществлять прямой доступ для чтения и записи 8 битов текущего значения таймера/счетчика. Запись в регистр TCNT0 блокируется на один период тактового сигнала в момент совпадения. Изменение содержимого счетного регистра (TCNT0) во время работы счетчика может привести к срыву генерации сигнала совпадения при равенстве содержимого регистров TCNT0 и OCROx.
Регистр совпадения (канал А) — OCR0A
Номер бита
7
6
5
4
3
21
0
L
OCR0A[7:0]
| OSR0A
Чтение(И)/Запись^)
R/W
R/W
R/W
R/W
R/W
R/WR/W
R/W
Начальное значение
0
0
0
0
0
00
0
Регистр совпадения канала А содержит восьмибитное значение, которое непрерывно сравнивается с текущим значением счетчика (TCNT0). Регистр используется для формирования сигнала совпадения или для генерации периодических сигналов на выходе ОС0А.
Регистр совпадения (канал В) — 0CROB
Номер бита76543210
| OCROB[7:Q]| OSR0S
Чтение(В)/ЗаписьОЛ/)R/WR/WR/WR/WR/WR/WR/WR/W
Начальное значение00000000
Регистр совпадения канала В содержит восьмибитное значение, которое непрерывно сравнивается с текущим значением счетчика (TCNT0). Регистр используется для формирования сигнала совпадения или для генерации периодических сигналов на выходе ОСОБ.
Регистр маски таймера/счетчика 0 — TIMSK
Номер бита76543210
|TOIE1|QCIE1A|OCIE1B |—|ICIE1| ОС1ЕОВ |TOIE0jOCIE0Aj TIMSK
Чтение(В}/Запись0Л/)R/WR/WR/WRR/WR/WR/WR/W
Начальное значение 00000000
Бит 4 — Res: Зарезервированный бит. Этот бит в микроконтроллере ATtiny2313 зарезервирован. Его значение при чтении регистра всегда равно нулю.
Бит 2 — OCIE0B: Разрешение прерываний таймера/счетчика 0 по совпадению в канале В.
Когда бит OCIE0B установлен в единицу, а флаг I регистра состояния также установлен, то прерывания по совпадению в канале В таймера 0 разрешены. Генерация запроса на прерывание происходит в момент совпадения, если бит OCF0B регистра TIER установлен.
Бит 1 — TOIE0: Разрешение прерывания по переполнению таймера/счетчика 0. Если бит TOIE0 установлен в единицу, а также установлен флаг I регистра состояния, то прерывания по переполнению таймера 0 разрешены. Генерация запроса на прерывание происходит в случае переполнения таймера/счетчика 0,'если бит TOV0 регистра TIFR установлен.
Бит 0 — OCIE0A: Разрешение прерываний таймера/счетчика 0 по совпадению в канале А. Когда установлены бит OCIE0A в едини-
цу и флаг I регистра состояния, то прерывания по совпадению в канале В таймера 0 разрешены. Генерация запроса на прерывание происходит в момент совпадения, если бит OCF0A регистра TIFR установлен.
Регистр флагов таймера/счетчика О — TIFR
Номер бита76543210
| TOV1 I OCF1A I OCF1B |—| ICF1 | OCF0B | TOV0 | OCF0A | TfFR
Чтение! R)/3arwCb(W)R/WR/WR/WRR/WR/WR/WR/W
Начальное значение00000000
Бит 4 — Res: Зарезервированный бит. Этот бит в микроконтроллере ATtiny2313 зарезервирован. Его значение при чтении регистра всегда равно нулю.
Бит 2 — OCF0B: Флаг совпадения в канале В. Бит OCF0B устанавливается в том случае, когда возникает совпадение содержимого счетного регистра таймера/счетчика 0 и регистра совпадения OCR0B. Бит OCF0B аппаратно сбрасывается в ноль в тот момент, когда начинается выполнение соответствующей процедуры обработки прерывания. Бит OCF0B может быть очищен программно путем записи в него логической единицы. Прерывание выполняется, когда флаг I регистра SREG, бит OCIE0B (бит разрешения прерывания по совпадению В) и флаг OCF0B установлены.
Бит 1 — TOV0: Флаг переполнения таймера/счетчика. Бит TOV0 устанавливается в единицу в том случае, когда происходит переполнение таймера/счетчика 0. Бит TOV0 сбрасывается в тот момент, когда начинается выполнение соответствующей процедуры обработки прерывания. Бит TOV0 может быть очищен программно, путем записи в него логической единицы. Прерывание выполняется, когда флаг I регистра SREG, бит TOIE0 (бит разрешения прерывания по переполнению) и флаг TOV0 установлены. Действие этого флага зависит от состояния разрядов WGM02:0. Смотри табл. 1.40.
Бит 0 — OCF0A: Флаг совпадения канале А. Бит OCF0A устанавливается в том случае, когда возникает совпадение содержимого счетного регистра таймера/счетчика 0 и регистра OCR0A. Бит OCF0A аппаратно сбрасывается в ноль в тот момент, когда начинается выполнение соответствующей процедуры обработки
прерывания. Бит OCF0A может быть очищен программно путем записи в него логической единицы. Прерывание выполняется, когда флаг I регистра SREG, бит OCIE0A (бит разрешения прерывания по совпадению А) и флаг OCF0A установлены".
Предварительные делители таймера/счетчика О итаймера/счетчика 1
Для" таймера/счетчика! и таймера/счетчикаО используется один общий предварительный делитель (рис 1.28). Но каждый из тайме- ров/счетчиков может использовать свой собственный коэффициент пересчета предварительного делителя частоты. Все описанное ниже относится как к таймеру/счетчику 1, так и к таймеру/счетчику 0.
Внутренний источник тактового сигнала
Любой таймер/счетчик может быть синхронизирован непосредственно от сигнала системного тактового генератора (при установке CSn2:0 = 1). Это самый скоростной режим работы с максимально возможной тактовой частотой таймера/счетчика, равной частоте системного генератора (fci.Kj/o)- Кроме этого, в качестве источника тактового сигнала может использоваться один из четырех выходов предварительного делителя. Частоты сигналов после предварительного делителя имеют следующие значения:
fcLKj/o/S;
fcrKj/o/64;
fci.K_i/o/256;
fcLKj/o/W24.
Сброс предварительного делителя
Предварительный делитель работает автономно, то есть независимо от работы таймеров/счетчиков. Выбор тактового сигнала происходит отдельно для таймера/счетчика! и для таймера/счетчикаО. Так как работа предварительного делителя продолжается и в момент
переключения коэффициентов деления, то состояние предварительного делителя в момент переключения будет влиять на время прихода первого тактового импульса после переключения.
Один из характерных примеров — работа таймера в момент включения, если таймер получает синхроимпульсы после предварительного деления (б > CSn2:0 > 1). Когда таймер еще не включен, предварительный делитель уже работает. Поэтому длительность самого первого отсчета зависит от состояния предварительного делителя в момент включения таймера.
От момента прихода сигнала, разрешающего работу таймера, и до момента первого отсчета, может пройти от 1 до N+1 тактов системного генератора. В данном случае N — это коэффициент деления предварительного делителя (8, 64, 256, или 1024).
Для того, чтобы синхронизировать работу предварительного делителя и таймера/счетчика, необходимо применять принудительный сброс предварительного делителя. Но это нужно делать осторожно, если другой таймер/счетчик работает в режиме предварительного деления и используется тот же самый предделитель. Сброс предварительного делителя окажет влияние на период предварительного деления для всех таймеров/счетчиков, с которыми он связан.
Внешний источник тактового сигнала
Внешний источник тактового сигнал, подключаемый к одному из входов Т1/Т0, может быть использован в качестве тактового сигнала для соответствующего таймера/счетчика (clkTi/clkT{)). Специальная схема внешней синхронизации проверяет уровень сигнала на входе Т1/Т0 один раз за каждый период тактового сигнала.
Синхронизированный (отобранный) таким образом сигнал поступает на детектор фронтов. На рис. 1.27 показана эквивалентная функциональная блок-схема модуля синхронизации Т1/Т0 и схема детектора фронтов. Все регистры синхронизируются по положительному фронту внутреннего тактового сигнала (clk1;Q). Триггер- защелка прозрачен при высоком уровне тактового сигнала.
Детектор фронтов генерирует один импульс clkTI/clkT0 для каждого обнаруженного положительного (при CSn2:0 = 7) или отрицательного (при CSn2:0 = б) фронта.
Схема синхронизации и детектор фронтов вводят задержку в 2,5 к 3,5 тактов системного генератора между сигналом, поступающим на вход Т1/Т0, и результирующим сигналом, поступающим на счетчик. Сигнал на входе Т1/Т0 должен изменяться таким образом, чтобы между двумя изменениями был стабильный промежуток в течение, по крайней мере, одного периода тактовой частоты системного генератора. Более частое изменение может привести к генерации ложного тактового импульса для таймера/счетчика.
Для того, чтобы гарантировать правильность выборки, каждая половина периода внешнего тактового сигнала должна быть длиннее, чем один цикл тактовой частоты системного генератора. Для внешнего тактового сигнала нужно гарантировать, что его частота будет в два раза меньше частоты тактового сигнала системы (f < f/2) при рабочем цикле 50/50 %.
Так как детектор фронтов использует выборку по времени, максимальная частота внешнего тактового сигнала, который еще можно обнаружить, равна половине частоты выборки (по теореме Найквеста). Однако из-за нестабильности частоты системного генератора и разброса параметров навесных элементов тактового генератора (пьезоэлектрический резонатор, кварцевый резонатор и конденсаторы) рекомендуется, чтобы максимальная частота внешнего источника тактового не превышала значения fdkj/o/2,5.
Внешний тактовый сигнал не может быть подвергнут предварительному делению.
Примечание: Логика работы схем синхронизаторов, включенных на входе внешних сигналов TljTO, показана на рис. 1.27.
Tnsync(к схеме выбора синхросигнала)Tnsync(к схеме выбора синхросигнала)Рис. 1.27. Обработка сигнала на входе Т1/ТОРис. 1.27. Обработка сигнала на входе Т1/ТО
Tnsync
(к схеме выбора синхросигнала)
Tnsync
(к схеме выбора синхросигнала)
Рис. 1.27. Обработка сигнала на входе Т1/ТО
Рис. 1.27. Обработка сигнала на входе Т1/ТО
Главный регистр управления Таймерами — GTCCR
Номер бита76543210
|—j —|—| —| ~| —|— | PSrTo"] GTCCR
Чтение(Я)/Запись(ИОRRRrrrrR/W
Начальное значение00000000
Биты 7..1 — Res: Зарезервированные биты. В микроконтроллере ATtiny2313 эти биты зарезервированы. При чтении регистра их значения всегда равны нулю.
Бит 0 — PSR10: Сброс предварительного делителя таймера/счетчи- ка 0 и таймера/счетчика 1. В момент установки этого бита в единицу предварительный делитель таймеров/счетчиков сбрасывается. Этот бит обычно немедленно очищается аппаратным способом. Обратите внимание, что таймер/счетчик 1 и таймер/счетчик 0 совместно используют один и тот же предварительный делитель, и его сброс затронет оба таймера.
16-разрядный таймер/счетчик(таймер/счетчик 1)
Основные особенности
Модуль 16-разрядного таймера/счетчика позволяет с высокой точностью формировать временные интервалы (режим реального времени), генерацию периодических сигналов, импульсы заданной длительности. Он имеет следующие основные особенности:
полная 16-разрядная структура (то есть поддерживает 16-разрядный ШИМ);
два независимых модуля совпадения;
двойная буферизация регистров совпадения;
модуль захвата;
схема фильтрации помех в режиме захвата;
режим сброса при совпадении (автоперезагрузка);
помехозащищенный, фазонезависимый широтноимпульсный модулятор (ШИМ);
изменяемый период ШИМ;
генератор сигналов;
счетчик внешних событий;
четыре независимых источника прерываний (TOV1, OCF1A, OCFIBhICFI).
Условные обозначения
В этом разделе приведено общее описание регистров и их отдельных битов. При написании имен регистров используются следующие условные обозначения:
строчная буква «п» означает номер таймера/счетчика;
строчная буква «х» означает канал сравнения (А или В).
Однако при использовании имени регистра или названия бита в вашей программе вы должны указывать точное их название. Например, нужно писать TCNT1 для того, чтобы обратиться к значению счетного регистра таймера/счетчика 1 и так далее.
Упрошенная блок-схема 16-разрядного таймера/счетчика показана на рис. 1.29. Для получения информации о фактическом распо-
ложении контактов ввода—вывода, показанных на этой схеме, обратитесь к разделу «Выводы микросхемы ATtiny2313» в начале этой главы.
Все регистры ввода—вывода, их разряды и выходные контакты, доступные для центрального процессора, показаны на рисунке полужирными линиями. Фактическое расположение всех регистров и местоположение их разрядов перечислены в разделе «Описание Регистров 16-разрядного таймера/счетчика».
Примечание. Для получения информации о фактическом размещении контактов таймера (счетчика обратитесь к рис. 1.1.
Регистры
Счетный регистр (TCNT1), регистры сравнения (OCR1A/B) и регистр захвата (ICR1)— это 16-разрядные регистры с двойной буферизацией. При доступе ко всем 16-разрядным регистрам из программы нужно соблюдать специальную процедуру. Эта процедура описана в разделе «Доступ к 16-разрядным регистрам».
Регистры управления таймера/счетчика (TCCR1A/B) — это восьмиразрядные регистры, при доступе к которым не нужна специальная процедура. Все сигналы запроса на прерывание (на рисунке сокращенно обозначенные «выз. прерыв.») отражаются в регистре флагов прерываний по таймеру (TIER). Все прерывания могут быть индивидуально замаскированы при помощи регистра маски прерываний по таймеру (TIMSK). Регистры TIFR и TIMSK на рисунке не показаны.
Таймер/счетчик может быть синхронизирован как от внутреннего сигнала через предварительный делитель, так и от внешнего тактового сигнала, поступающего на вход Т1. Блок управления логикой выбора тактового сигнала использует сигнал от выбранного источника для того, чтобы увеличивать или уменьшать значение счетного регистра таймера. Если ни один источник тактового сигнала не выбран, то таймер/счетчик останавливается.
ым
х1янмеУ енит Рис. 1.29. Блок-схема 16-разрядного таймера/счетчика
Определение. Тактовый сигнал, поступающий на вход блока управления, называется сигналом синхронизации таймера (clkn).
Содержимое обоих регистров совпадения (OCR1A/B) непрерывно сравнивается со значением счетного регистра таймера. Результат сравнения может быть использован для генерации колебаний в схеме ШИМ или для создания периодического сигнала заданной частоты на выходе схемы совпадения (ОС1А/В). Подробнее об этом смотрите в разделе «Модуль совпадения». При возникновении события "Совпадение" также устанавливается соответствующий флаг— флаг совпадения (OCF1A/B), который может использоваться для того, чтобы генерировать запрос на прерывание по совпадению.
Регистр захвата предназначен для захвата текущего значения счетного регистра в момент поступления внешнего сигнала на вход захвата (ICP1) или на вход аналогового компаратора (подробнее смотри раздел «Аналоговый компаратор»). На входе модуля захвата имеется специальная схема цифровой фильтрации (шумоподавления), которая сокращает влияние помех.
В некоторых режимах максимальное значение для таймера (ТОР) может определяться как при помощи регистра OCR1A, так и при помощи регистра ICR1. При использовании регистра OCR1A для хранения значения ТОР в режиме ШИМ он уже не может быть использован как пороговый элемент для генерации самого сигнала ШИМ. Зато значение ТОР будет храниться в регистре с двойной буферизацией, что позволяет легко изменять его в любой момент во время работы таймера. Если изменять значение ТОР не требуется, то для его хранения можно использовать регистр ICR1, что освобождает регистр OCR1A для участия в работе ШИМ.
Терминология
В данном разделе используются следующие определения.
Таблица 1.42.Определения
BOTTOM
Счетчик достигает значения BOTTOM, когда оно становится равным 0x0000
МАХ
Счетчик достигает значения МАХ (максимум) если оно равно OxFFFF (десятичное 65535)
ТОР
Счетчик достигает значения ТОР, когда оно становится равным самому большому возможному значению в данном режиме работы. В зависимости от выбранного режима ТОР может иметь одно из трех фиксированных значений: OxOOFF, 0x01 FF или OxO3FF, а также может определяться значением регистра OCR1A или регистра ICR1
Совместимость
В данной микросхеме 16-разрядный таймер/счетчик был модифицирован и улучшен по сравнению с предыдущими версиями этого счетчика, используемыми в выпущенных ранее микросхемах AYR (например, в микросхеме AT90S2313). Новый таймер/счетчик полностью совместим с более ранними версиями по следующим параметрам:
все 16-разрядные регистры управления таймера/счетчика имеют те же самые адреса в адресном пространстве микроконтроллера, включая регистр прерываний таймера;
сохранено расположение всех битов во всех 16-разрядных регистрах таймера/счетчика, включая регистр прерываний по таймеру;
сохранены адреса всех векторов прерываний.
Изменили название, но имеют те же самые функциональные возможности и местоположение в регистре следующие служебные биты:
PWM10 изменен на WGM10;
PWM11 изменен на WGM11;
СТС1 изменен на WGM12.
Использованы следующие новые биты в регистрах управления таймера/счетчика:
биты FOC1A и FOC1B введены дополнительно в регистре TCCR1A;
бит WGM13 введен дополнительно в регистре TCCR1B.
Не смотря на все предпринятые меры по совместимости нового 16- разрядного таймера/счетчика со старым его вариантом, в некоторых случаях совместимость будет все же неполная.
Доступ к 16-разрядным регистрам
Регистры TCNT1, OCR1A/B, и ICR1 — это 16-разрядные регистры, к которым центральный процессор может обращаться лишь при помощи 8-разрядной шины данных. Доступ к каждому из 16-раз- рядных регистров происходит как последовательное чтение или последовательная запись двух байтов информации.
Каждый 16-разрядный таймер имеет свой собственный 8-разрядный регистр для временного хранения старшего байта 16-разрядного доступа. Один и тот же временный регистр используется для доступа ко всем 16-разрядным регистраторам одного 16-разрядного таймера. Этот регистр временного хранения не доступен программисту и используется в автоматическом режиме.
При чтении или записи старшего байта информация на самом деле читается из временного регистра и записывается во временный регистр. Фактические чтение/запись всех шестнадцати разрядов происходят в момент чтения/записи его младшего байта. Если производится запись, то одном цикле с младшим байтом записывается и старший, значение которого предварительно должно быть сохранено во временном регистре.
Если производится чтение младшего байта, то одновременно в том же самом цикле читается и старший. Значение последнего помешается во временный регистр, откуда оно должно быть считано следующей командой.
Подобный способ доступа к 16-разрядным регистрам используется не всегда. Например, при чтении 16-разрядных регистров OCR1A/B временный регистр не используется.
Исходя из вышесказанного, можно сформулировать следующие правила, которые необходимо соблюдать при написании программы для микроконтроллера: Для того, чтобы произвести запись в 16- разрядный регистр, необходимо сначала записать старший байт, а затем младший. При чтении 16-разрядного регистра сначала нужно читать младший байт, а затем старший.
Источники тактового сигнала таймера/счетчика
Шестнадцатиразрядный таймер/счетчик может быть синхронизирован как от внутреннего, так и от внешнего источников тактового сигнала. Какой из источников будет использоваться, определяет блок выбора, который управляется битами выбора тактового сигнала (CS12:0), расположенными в регистре управления В таймера/счетчика (TCCR1B). Подробнее о работе предварительного делителя смотрите в разделе «Предварительные делители таймера/счетчика 0 и таймера/счетчика 1».
Модуль счета
Основная часть 16-разрядного таймера/счетчика— программируемый 16-разрядный двунаправленный модуль счета. На рис. 1.30 показана блок-схема счетчика и его окружения.
Рис. 1.30. Блок-схема модуля счета
Описание сигналов (внутренние сигналы):
Count — приращение или уменьшение TCNT1 на единицу;
Direction — выбор направления счета (приращение или уменьшение);
Clear — сброс регистра TCNT1 (обнуление всех битов);
с!кТ] — тактовый сигнал таймера/счетчика;
ТОР— активизируется, когда TCNT1 достигает максимального значения;
BOTTOM — активизируется, когда TCNT1 достигает минимального значения (нуля).
Шестнадцатиразрядный счетный регистр отображен в пространстве ввода—вывода как два восьмиразрядных регистра:
старший байт бчетного регистра (TCNT1H) содержит восемь старших битов счетчика;
младший байт счетного регистра (TCNT1L) содержит восемь младших битов.
К регистру TCNT1H центральный процессор может обратиться только косвенно. Когда центральный процессор обращается к регистру TCNT1H, то доступ происходит через регистр временного хранения информации (TEMP).
Временный регистр сохраняет содержимое регистра TCNT1H в тот момент времени, когда происходит чтение регистра TCNT1L. И, наоборот, в регистр TCNT1H записывается содержимое временного регистра в тот момент, когда происходит запись регистра TCNT1L. Это позволяет центральному процессору, используя восьмиразрядную шину данных, читать или записывать полное 16-разрядное число за один такт.'
Внимание. В отдельных случаях попытка запаса в регистр TCNT1 в момент, когда счетчик находится в режиме счета, может дать непредсказуемые результаты. Эти случаи будут описаны далее в соответствующих разделах.
В зависимости от выбранного режима работы счетчик очищается, увеличивает или уменьшает свое значение от каждого импульса тактового сигнала таймера (clkT!). Сигнал с!кТ1 может быть сформирован как от внешнего, так и от внутреннего источника тактовой частоты в соответствии с установками битов выбора тактового сигнала (CS12:0).
Таймер останавливается, когда ни один из источников тактового сигнала не выбран (CS12:0 = 0). Но центральный процессор может обратиться к значению регистра TCNT1 независимо от того, присутствует ли с1кц или нет. Команда записи от центрального процессора имеет приоритет над всеми остальными операциями (операциями очистки или счета).
Выбор направления счета производится установкой битов выбора режимов генерации сигнала (WGM13:0) регистров управления таймера!счетчика (TCCR1А и TCCR1B). Есть тесная связь между поведением счетчика и формой выходного сигнала на выходе сов-
падения OClx. Подробнее о режимах счета и генерации сигналов смотрите в разделе «Режимы работы таймера».
Флаг переполнения таймера/счетчика (TOV1) устанавливается в соответствии с выбранным при помощи битов WGM13:0 режимом работы. Флаг TOV1 может использоваться для того, чтобы генерировать прерывание центрального процессора.
Модуль захвата
В состав шестнадцатиразрядного таймера/счетчика входит модуль захвата, который может фиксировать внешние события и присваивать им временную метку, указывающую время их возникновения. Внешний сигнал, соответствующий началу этого события или нескольких событий, должен поступать на вход ICP1. Кроме того, в качестве сигнала захвата может быть использован сигнал с выхода аналогового компаратора.,
Полученные в результате захвата временные метки могут быть использованы для вычисления частоты, периода и других параметров прикладного сигнала. Альтернативный вариант использования временных меток — создание таблицы регистрации событий.
Принцип работы модуля захвата иллюстрирует блок-схема, показанная на рис. 1.31. Элементы блок-схемы, которые не являются составной частью модуля захвата, показаны серым цветом. Маленькое «п» в названии регистров и именах разрядов означает номер таймера/счетчика. В нашем случае этот номер равен 1.
Захват произойдет в том случае, если:
происходит смена логического уровня на входе захвата (1СР1);
происходит смена логического уровня на выходе аналогового компаратора (АСО);
направление этого изменения соответствует выбранным установкам.
В момент захвата 16-разрядное значение счетчика (TCNT1) записывается в регистр захвата (ICR1). Одновременно, в том же периоде тактового сигнала устанавливается флаг захвата (ICF1), сигнализируя, что значение TCNT1 скопировано в регистр ICR1.
Ы<0
Рис. 1.31. Блок-схема модуля захвата
Если данный вид прерываний разрешен (IC1E1 = 1), установка флага захвата вызывает запрос на прерывание по захвату. Флаг автоматически очищается в момент запуска процедуры обработки прерывания. Флаг ICF1 может быть очищен программно путем записи в этот разряд логической единицы.
При чтении значения из 16-разрядного регистра захвата (ICR1) сначала нужно читать младший байт (ICR1L), а затем старший (ICR1H). При чтении младшего байта значение старшего запоминается во временном регистре (TEMP). Когда процессор читает старший байт ICR1H, информация поступает из регистра TEMP.
Запись в регистр ICR1 возможна только при использовании режима «Генератор сигналов». В этом режиме регистр ICR1 используется для задания значения ТОР счетчика. Биты выбора режима (WGM13:0) должны быть установлены в положение, соответствующее режиму «Генератор сигналов» прежде, чем в регистр ICR1 будет записано значение ТОР. При записи информации в регистр 1CR1 сначала должен быть записан старший байт (ICR1H), а затем младший (ICR1L).
Более подробно работа это описано в разделе «Доступ к 16-раз- рядным регистрам».
Источники сигнала запуска в режиме захвата
Основной и наиболее часто используемый источник сигнала захвата — внешний вход захвата (ICP1). Таймер/счетчик 1 также может использовать выход аналогового компаратора как вход с регулируемым порогом срабатывания для сигнала захвата. Выбор аналогового компаратора в качестве источника сигнала захвата производится путем установки бита включения этого режима (ACIC) в регистре статуса и управления аналоговым компаратором (ACSR).
Имейте в виду, что при переключении в режим захвата от компаратора может произойти срабатывание схемы захвата. Поэтому флаг захвата должен быть очищен сразу после смены режимов.
Сигнал с внешнего входа захвата (ICP1) с выхода аналогового компаратора (АСО) поступает на схему обработки, подобную схеме, которая используется для обработки сигнала внешней синхронизации таймера на входе Т1 (смотри рис. 1.27).
Но если включена схема подавления помех, это добавляет дополнительное преобразование перед детектором фронтов, что увеличивает задержку входного сигнала еше на четыре периода тактового сигнала. Следует отметить, что захвата работает во всех режимах, кроме режима «Генератор сигналов». В этом режиме регистр ICR1 использует для хранения значения ТОР.
Сигнал захвата может быть вызван программно путем управления выходным сигналом соответствующего разряда порта (ICP1).
Схема подавления помех
Шумоподавитель улучшает помехоустойчивость канала захвата, используя простую схему цифровой фильтрации. При обнаружении изменения уровня сигнала на входе схема шумоподавителя производит четыре выборки входного сигнала. Для того, чтобы сигнал на выходе схемы шумоподавления изменился, результаты всех четырех выборок должны быть одинаковы, а также соответствовать рабочему уровню для выбранного фронта. При синхронизации по переднему фронту схема ждет подряд четыре единицы. При синхронизации по заднему фронту схема ждет четыре нуля.
Шумоподавитель включен, если установлен бит включения шумоподавителя системы захвата (ICNC1) в регистре управления таймера/счетчика (TCCR1B). Когда шумоподавитель включен, к уже существующей задержке между изменением сигнала на входе и моментом обновления регистра ICR1 добавляется дополнительная задержка длительностью в четыре периода системного тактового сигнала. Шумоподавитель непосредственно использует системный тактовый сигнал, и поэтому на его работу не влияет предварительный делитель.
Использование модуля захвата
При использовании режима захвата ваша программа должна как можно быстрее обрабатывать захваченное значение. Время между двумя событиями является критическим.
Внимание. Если процессор не прочитал захваченное значение из регистра ICR1 прежде, чем произойдет следующий случай захвата, новое значение будет записано поверх предыдущего. В этом случае результат захвата будет утерян.
При использовании прерывания по захвату в процедуре обработки прерывания регистр ICR1 должен быть прочитан как можно быстрее. Даже несмотря на то, что прерывание по захвату имеет относительно высокий приоритет, максимальное время вызова прерывания зависит от того, сколько времени потребуется для обработки других активных в этот момент прерываний.
Внимание. Использовать модуль захвата в тех режимах работы, когда значение ТОР (а значит и коэффициент пересчета) активно изменяется, не рекомендуется.
Измерение длительности импульса внешнего сигнала требует, чтобы фронт срабатывания был изменен после каждого захвата. Изменение режима выбора фронта должно быть сделано как можно раньше после того, как прочитан регистр ICR1. После изменения фронта флаг захвата (ICF1) должен быть очищен программно (путем записи в него логической единицы). Если требуется только измерение частоты, очистка флага ICF1 не требуется (если используется процедура обработки прерывания).
Модуль совпадения
Встроенный 1б-разрядный компаратор непрерывно сравнивает содержимое регистра TCNT1 с регистром совпадения (OCRlx). Если содержимое TCNT равно содержимому OCRlx, компаратор вырабатывает сигнал совпадения. Этот сигнал устанавливает флаг совпадения (OCFlx) в следующем цикле работы таймера.
Если данный вид прерываний разрешен (OCIElx = 1), то флаг совпадения генерирует прерывание по совпадению. Флаг OCFlx автоматически сбрасывается, когда начинается выполнение про-
цедуры обработки прерывания. Флаг OCFlx может быть очищен программно путем записи в него логической единицы.
Генератор сигналов использует модуль совпадения для формирования выходного сигнала согласно выбранному режиму. Режим работы генератора зависит:
от состояния битов выбора режима генерации (WGM13:0);
от состояния битов выбора режимов сравнения (COMlxl:0).
Сигналы ТОР и BOTTOM используются генератором в граничных режимах его работы (Смотри раздел «Режимы работы 16-разряд- ного таймера счетчика»).
Особенностью модуля сравнения является возможность программно задавать верхнее значение (ТОР) таймера/счетчика. То есть менять его коэффициент пересчета. Кроме коэффициента пересчета, значение ТОР определяет период выходного сигнала. На рис. 1.32 показана блок-схема модуля совпадения.
Маленькая буква «п» в названиях регистров и в именах разрядов указывает номер таймера (в нашем случае n = 1).
Маленькая буква «х» — это название одного из выходов модуля совпадения (А или В). Элементы блок-схемы, которые непосредственно не являются частью модуля совпадения, показаны серым цветом. ■
Регистры OCRlx имеют двойную буферизацию в любом режиме широтно-импульсной модуляции (ШИМ). В режиме Normal и режиме Сброс при совпадении (СТС) отключается двойная буферизация. Двойная буферизация синхронизирует момент обновления регистра OCRlx с моментом достижения таймером верхнего или нижнего пределов (ТОР и BOTTOM). Синхронизация предотвращает возникновение нечетной длины асимметричных ШИМ импульсов, обеспечивая, таким образом, качественный выходной сигнал.
Может показаться, что доступ к регистру OCRlx чересчур осложнен, но это не так. Когда двойная буферизация разрешена, центральный процессор обращается к регистрам OCRlx через буфер.
Содержимое регистра OCRlx (с буфером или без буфера) изменяется только в процессе выполнения команды записи (таймер/счетчик не модифицирует этот регистр автоматически, как в случае с регистрами TCNT1 и ICR1). Поэтому при чтении старшего байта регистра OCRlx не используется буфер временного хранения (TEMP).
Рис. 1.32. Модуль совпадения, блок-схемаРис. 1.32. Модуль совпадения, блок-схема
Рис. 1.32. Модуль совпадения, блок-схема
Рис. 1.32. Модуль совпадения, блок-схема
Однако будет правильнее, если вы все равно будете читать сначала младший байт, а затем старший, как при доступе к любому другому 16-разрядному регистру. Запись в регистр OCRlx производится через буфер TEMP, так как сравнение всех 16 битов должно производиться непрерывно.
Поэтому старший байт (OCRlxH) должен быть записан первым. Когда центральный процессор производит запись по адресу, где находится регистр старшего байта, на самом деле эта информация записывается в регистр TEMP. Когда же происходит запись младшего байта (OCRlxL), одновременно старший байт будет скопирован в верхние 8 битов буфера OCRlxH из регистра TEMP в том же самом цикле системного генератора.
Для получения дополнительной информации о работе с 16-раз- рядными регистрами смотрите раздел «Доступ к 16-раз рядным регистрам».
Принудительное изменение сигнала на выходесовпадения
В режимах таймера без ШИМ сигнал на выходе совпадения может быть изменен путем записи единицы в бит принудительного изменения (FOClx). Принудительное изменение выхода совпадения не устанавливает флаг OCFlx и не перезагружает таймер. Но сигнал на выходе ОС1х будет изменяться таким же образом, как при реальном совпадении. То есть поведение выхода ОС1х будет зависеть от установки битов СОМ 1x1:0 (сигнал на выходе будет установлен, сброшен или изменит свое значение на противоположное).
Блокировка режима совпадения в момент записирегистра TCNT1
Каждый раз, когда центральный процессор производит запись в регистр TCNT1, любое событие "Совпадение", которое происходит в следующем тактовом цикле таймера, блокируется даже в том случае, если таймер остановлен. Эта особенность позволяет записывать в регистр OCRlx то же самое значение, что и в регистр TCNT1, не вызывая запрос на прерывание, если включен тактовый сигнал таймера/счетчика.
Использование модуля совпадения
В любом режиме после записи нового значения в регистр TCNT1 в течение одного периода тактового сигнала блокируется работа модуля совпадения. Это может стать причиной неправильной работы модуля совпадения в момент изменения TCNT1 независимо от того, находится ли таймер/счетчик в режиме счета или нет.
Если значение, записанное в TCNT1, равно значению, записанному в OCRlx, то операция сравнения будет пропущена. Это приведет к сбою в работе генератора сигналов. Нельзя записывать в регистр TCNT1 значение, равное ТОР, в режимах ШИМ с переменным значением ТОР. В этом случае событие «Совпадение» для значения ТОР будет проигнорировано, и счетчик продолжит счет до значения OxFFFF. Точно так же нельзя записывать в TCNT1 значение, равное BOTTOM, когда счетчик работает в режиме обратного счета.
Настройка выхода ОС1х должна быть выполнена перед тем, как соответствующая линия порта будет сконфигурирована как выход. Самый простой способ установить нужное значение на выходе ОС1х— использовать бит принудительной установки FOClx в режиме Normal.
Регистры ОС1х сохраняют свое значение при любых переключениях режимов генератора сигналов.
Внимание. Биты COMlxl :0 не имеют двойной буферизации. Изменения их значений вступят в силу немедленно.
Модуль вывода сигнала совпадения
Биты выбора режимов вывода сигнала совпадения (COMlxl:0) выполняют две функции. Генератор сигналов использует биты COMlxl:0 для того, чтобы определить, как будет вести себя сигнал на выходе совпадения (ОС1х) в момент совпадения.
Те же биты COMlxl:0 управляют источником сигнала на выходе ОС1х. На рис. 1.33 показана упрощенная схема, демонстрирующая логику работы разрядов СОМ1х1:0. Частично на вывод сигнала влияют главные регистры управления портом ввода—вывода (DDR и PORT).
Когда мы говорим о OClx, нужно понимать, что внутренний регистр OClx не то же самое, что контакт OClx. После системного сброса в регистр OClx записывается ноль.
Рис. 1.33. Схема вывода сигнала модуля совпадения
Если хотя бы один из битов COMlxl:0 установлен, то основная функция порта ввода—вывода отменяется, и активизируется альтернативная функция: вывод становится выходом сигнала совпадения (OClx).
Однако направление передачи информации контакта OClx (вход или выход) все равно управляется при помощи соответствующего бита регистра DDR. Бит регистра направления передачи данных, соответствующий выходу OClx (DDR _ОС1х), должен быть установлен прежде, чем значение OClx поступит на этот контакт. Детальнее смотрите в табл. 1.43, 1.44 и 1.45.
Логика работы модуля совпадения позволяет изменять состояние сигнала OClx перед тем, как он поступит на выход.
Внимание. Некоторые значения разрядов COMlxl:0 зарезервированы для других режимов работы. Детальное описание смотри далее, в разделе «Описание регистров 16-раз- рядного таймера!счетчика». Биты COMlxl:0 не имеют никакого влияния на работу модуля захвата.
Режимы работы 16-разрядного таймера/счетчика
Режим работы таймера/счетчика и выходов совпадения определяется установками битов WGM13:0 и битами СОМ 1x1:0:
биты WGM13:0 определяют на работу таймера/счетчика;
биты COMlxl:0 в ШИМ режимах определяют, будет ли сигнал на выходе инвертирован или неинвертирован.
В не-ШИМ-режимах эти же биты определяют, будет ли сигнал на выходе установлен, очищен или будет переключаться в момент совпадения (смотрите раздел «Модуль Сигнала совпадения»).
Режим Normal
Режим Normal (WGM13:0 = 0) — самый простой режим работы. В этом режиме таймер работает как обычный суммирующий счетчик. При достижении максимального 16-ричного значения (МАХ = OxFFFF) счетчик переполняется и начинает работать сначала, т. е. со своего минимального значения BOTTOM (0x0000).
В нормальном режиме работы в том же цикле тактового сигнала, в котором произошло переполнение, устанавливается флаг переполнения таймера/счетчика (TOV1). Флаг TOV1 в этом случае ведет себя как 17-ый бит счетчика, но с тем лишь отличием, что он только устанавливается, но не сбрасывается.
Одновременно с перезапуском таймера возникает запрос на прерывание, которое автоматически очищает флаг TOV1. Коэффициент пересчета таймера может быть увеличен программным путем. В режиме Normal новое значение счетного регистра может быть записано в любой момент времени.
Именно в режиме Normal удобнее всего использовать режим захвата. Нужно только следить, чтобы максимальный интервал между внешними событиями, вызывающими захват, не превышал периода пересчета счетчика. Если интервал между событиями слишком велик, то необходимо использовать:
прерывание по переполнению таймера;
предварительный делитель для увеличения периода пересчета. Модуль совпадения может использоваться для того, чтобы вызвать прерывание в заданный момент времени. Использовать модуль совпадения для генерации сигналов в режиме Normal не рекомендуется, так как это займет слишком много процессорного времени.
Режим сброса при совпадении (СТС)
В режиме сброса при совпадении, или в английском сокращении — СТС (WGM13:0 = 4 или 12), для управления коэффициентом пересчета используется регистр OCR1A или ICR1. При работе в режиме СТС счетчик сбрасывается в ноль, если значение его счетного регистра (TCNT1) соответствует значению регистра OCR1A (при WGM13:0 = 4) или регистра ICR1 (при WGM13:0 - 12).
Поэтому регистр OCR1A или ICR1 определяет максимальное значение для счетчика, а, следовательно, и его коэффициент пересчета. Этот режим позволяет осуществлять непосредственное управление частотой сигнала. Это справедливо также в случае работы в режиме подсчета внешних событий.
Прерывание может вызываться по достижению счетчиком значения ТОР. При этом используется флаги OCF1A или ICF1 в зависимости от того, какой из регистров применяется для определения значения ТОР. Если прерывание разрешено, процедура обработки прерывания может использоваться для обновления значения ТОР.
Но если значение ТОР выбирается близко к значению БОТТОМ, то записывать его нужно только в момент, когда счетчик не работает. Ведь в режиме СТС отсутствует двойная буферизация.
Если новое значение, записанное в регистр OCR1A (ICR1), будет ниже, чем текущее значение TCNT1, счетчик пропустит момент совпадения. В этом случае счетчик должен будет досчитать до максимального значения (OxFFFF) и перейти через 0x0000 прежде, чем произойдет момент совпадения.
Во многих случаях это нежелательно. В этой ситуации можно использовать режим fast PWM с использованием регистра OCR1A для определения TOP (WGM13:0 = 15). В этом режиме регистр OCR1A имеет двойную буферизацию.
Для того, чтобы в режиме СТС на выходе сформировался периодический сигнал, необходимо настроить выход ОС1А таким образом, чтобы при каждом совпадении сигнал на выходе менял свое значение на противоположное (COM1AL0 = 1).
Но этот сигнал не поступит на внешний вывод ОС1А, если он не сконфигурирован как выход (DDR OC1A = 1). Сформированные таким образом колебания будут иметь максимальную частоту fociA = fCik_i/o/2, когда регистр OCR1A установлен в ноль (0x0000). В общем случае частота сигнала определена следующим уравнением:
г /clkj/о" 2N- (1 ^OCRnA^ *
Переменная N — это коэффициент пересчета предварительного делителя (1, 8, 64, 256 или 1024). В режиме Normal флаг TOV1 устанавливается в том же самом тактовом цикле таймера, в котором счетчик переходит от МАХ до 0x0000.
Режим Fast PWM *
Режим «Быстрый ШИМ» или fast PWM (WGM13:0 = 5, 6, 7, 14 или 15) позволяет формировать сигнал с широтно-импульсной модуляцией и относительно высокой частотой. Быстрый ШИМ отличается от других видов ШИМ тем, что счетчик в этом режиме вырабатывает сигнал в виде пилы с одним наклоном.
Счет происходит всегда в одном направлении: от минимального значения (BOTTOM) до максимального (ТОР). После этого счетчик сбрасывается в BOTTOM. В неинвертирующем режиме сигнал на выходе (ОС1х) устанавливается в единицу в момент совпадения содержимого регистров TCNT1 и OCRlx и сбрасывается в ноль при достижении значения ТОР.
В инвертирующем режиме сигнал на выходе сбрасывается в момент совпадения и устанавливается при достижении ТОР. Благодаря
тому, что пилообразный сигнал на выходе счетчика имеет один наклон, частота выходного сигнала ШИМ вдвое выше, чем в остальных режимах ШИМ, которые используют пилообразный сигнал с двойным наклоном. Высокая частота сигнала позволяет использовать режим fast PWM для построения схем управления мощностью, программируемых выпрямителей и различных цифроаналоговых преобразователей. Высокая частота позволяет применять внешние компоненты (катушки, конденсаторы) малых габаритов, что уменьшает общую стоимость системы.
Коэффициенты пересчета таймера можно установить либо в одно из фиксированных значений (8 разрядов, 9 разрядов или 10 разрядов), либо определять его при помощи регистра ICR1 или OCR1A. Минимально возможный коэффициент пересчета соответствует коэффициенту пересчета 2-разрядного счетчика (устанавливается путем записи в регистры ICR1 или OCR1A значения, равного 0x0003).
А максимальный коэффициент пересчета соответствует коэффициенту пересчета счетчика, имеющего 16 разрядов (устанавливается путем записи в регистры ICR1 или OCR1A значения МАХ). Коэффициент пересчета в битах может быть вычислен при помощи следующего уравнения:
Jog(TOP+l)
HpPWM Б5(2)*
В режиме fast PWM счетчик увеличивает свое значение, пока оно не станет равно одному из фиксированных значений:
OxOOFF, OxOlFF;
0x03FF (WGM13:0 - 5, 6 или 7);
значению в регистре ICR1 (WGM13:0 = 14);
значению в регистре OCR1A (WGM13:0 = 15).
При наступлении одного из описанных выше событий в следующем тактовом цикле счетчик очищается, и счет начинается сначала.
Флаг переполнения таймера/счетчика (TOV1) устанавливается каждый раз, когда счетчик достигает ТОР. Кроме того, в том же самом тактовом цикле, что и флаг TOV1, устанавливается флаг ОС1А или флаг 1CF1. Это происходит в том случае, если в качестве значения ТОР используется соответственно содержимое регистров OCR1A или 1CR1. Если прерывание, вызываемое установкой одного из вышеупомянутых флагов, разрешено, то процедура обработки этого
прерывания может быть использована для того, чтобы обновить значение ТОР.
При изменении значения ТОР программным путем нужно следить, чтобы новое его значение было больше или равно значению любого из регистров совпадения. Если значение ТОР окажется ниже, чем значение любого из этих регистров, то совпадение никогда не произойдет. v -
Следует заметить, что при использовании одного из фиксированных значений ТОР неиспользованные старшие разряды регистров OCRlx всегда будут равны нулю, какое бы значение в этот регистр не записывалось. Процедура обновления ICR1 отличается от процедуры обновления OCR1A.
Регистр ICR1 не имеет двойной буферизации. Перезапись значения этого регистра должна производиться в момент, когда счетчик остановлен. Или придется выбрать как можно больший коэффициент пересчета предварительного делителя и следить, чтобы изменение значения происходили в тот момент, когда содержимое счетчика еще не достигло содержимого регистра сравнения.
Иначе счетчик пропустит момент совпадения по значению ТОР, счет продолжится дальше до тех пор, пока содержимое счетчика не достигнет значения MAX (OxFFFF). Затем счетчик перезапустится (пройдет через 0x0000), и лишь затем произойдет момент совпадения.
Напротив, регистр OCR1A имеет двойную буферизацию. Это позволяет изменять значение OCR1A в любой момент времени. При записи нового значения в регистр OCR1A оно на самом деле будет записано в специальный буферный регистр. Реальное обновление регистра OCR1A содержимым буферного регистра произойдет в следующем тактовом цикле после достижения регистром TCNT1 значения ТОР. Обновление происходит в том же самом тактовом цикле потому, что регистр TCNT1 в этот момент сброшен в ноль, а флаг TOV1 установлен. -
Использование регистра ICR1 для определения ТОР удобно в том случае, когда во время работы значение ТОР не изменяется. При этом регистр OCR1А освобождается и может быть использован для генерации сигнала ШИМ на выходе ОС1А.
Но если в процессе работы вам необходимо активно менять частоту сигнала ШИМ (изменяя значение ТОР), то использование регистра OCR1A для определения значения ТОР более предпочтительно, так как он имеет двойную буферизацию.
В режиме fast PWM модули совпадения формируют сигналы ШИМ на выводах ОС1х. Установка битов СОМ1х1:0 = 2 определяет, что это будет неинвертированный сигнал ШИМ. Инвертированный сигнал ШИМ формируется при СОМ 1x1:0 = 3 (смотри табл. 1.43).
Реально значение ОС1х появится на соответствующем выводе микросхемы только тогда, когда он будет сконфигурирован как выход (при помощи бита DDR OClx). Сигнал ШИМ на выходе ОС1х устанавливается (сбрасывается) в момент совпадения содержимого регистров OCRlx и TCNT1. Сигнал ШИМ на выходе ОС1х сбрасывается (устанавливается) в том же тактовом цикле, когда счетчик перезагружается (переходит из ТОР к BOTTOM). Частота сигнала ШИМ в режиме fast PWM может быть вычислена по следующей формуле:
f_ /clkJ/O
'JOCnxPWM-N .^ ^уор^ .
Переменная N — это коэффициент деления предварительного делителя (1, 8, 64, 256 или 1024).
Особый случай представляет собой генерация ШИМ при предельных значениях регистра OCRlx. Если значение регистра OCRlx равно BOTTOM (0x0000), то выходной сигнал будет представлять собой узкие выбросы для каждого ТОР +1 цикла тактового сигнала.
Если значение регистра OCRlx равно ТОР, то на выходе будет присутствовать постоянный (высокий либо низкий) логический уровень (в зависимости от выбранной при помощи битов СОМ1х1:0 полярности выходного сигнала).
Если выбрать режим переключения сигнала в момент совпадения (COMiAl:0 = 1), то мы получим на выходе прямоугольный сигнал с постоянной скважностью (50 % от периода) и изменяемой частотой.
Частота на выходе генератора сигналов будет иметь максимальное значение fociA = fCikj/o/2, когда OCR1A установлен в ноль (0x0000).
Режим phase correct PWM
Режим phase correct PWM или ШИМ, корректный по фазе, включается при WGM13:0 = 1, 2, 3, 10 или 11. В этом режиме счетный
регистр работает как реверсивный счетчик и вырабатывает пилообразный сигнал с двухсторонним наклоном. Направление счета периодически меняется.
Сначала содержимое счетчика увеличивается от BOTTOM (0x0000) до ТОР, а затем уменьшается от ТОР до BOTTOM. В неинвертирующем режиме сигнал на выходе совпадения (ОС1х) сбрасывается в момент совпадения TCNT1 и OCRlx, если счетчик работает на уменьшение, и устанавливается в момент совпадения в том случае, когда счетчик работает на увеличение. В инвертирующем режиме все происходит наоборот.
Использование режима пилы с двухсторонним наклоном приводит к тому, что максимальная частота выходного сигнала в два раза ниже, чем в режиме с одним наклоном. Но благодаря симметричному изменению фазы при работе с двухсторонним наклоном этот режим более предпочтителен для управления электромотором.
Коэффициент пересчета для phase correct PWM может иметь в одно из трех фиксированных значений (как 8-, 9- или 10-разрядный счетчик), а также может определяться регистрами ICR1 или OCR1A.
Минимально возможный коэффициент пересчета соответствует 2-разрядному счетчику (при записи в регистр ICR1 или OCR1A значения 0x0003). Максимальный коэффициент пересчета соответствует полному 16-разрядному счетчику (в регистр ICR1 или OCR1A записывается значение МАХ). Коэффициент пересчета PWM в битах может быть вычислен с использованием следующего уравнения:
_log( ТОР+1)
HpcpWM" |од(2) ’
В режиме phase correct PWM значение счетного регистра увеличивается до тех пор, пока не достигнет значения ТОР. А это либо одно из фиксированных значений OxOOFF, OxOlFF или OxO3FF (WGM13:0 = 1, 2 или 3), либо значение регистра ICR1 (WGM13.0 = 10), либо значение регистра OCR1A (WGM13:0 =11). Когда счетчик достигнет значения ТОР, он изменяет направление счета. Значение TCNT1 будет равно ТОР лишь в течение одного тактового цикла.
Флаг переполнения таймера/счетчика (TOV1) устанавливается каждый раз, когда счетчик достигает значения BOTTOM. Если регистр OCR1A или ICR1 используется для определения значения ТОР, то флаг ОС1А или ICF1, соответственно, устанавливается в том же самом тактовом цикле, что и флаг TOVL
Регистры OCR 1х имеют двойную буферизацию и обновляются в тот момент, когда счетчик достигнет значения ТОР. Флаги прерывания могут использоваться для генерации прерываний в момент, когда счетчик достигает значения ТОР или BOTTOM. В случае программного изменения значения ТОР необходимо гарантировать, что новое значение ТОР выше или равно значению каждого из регистров совпадения.
Если новое значение ТОР будет ниже, чем значение одного из регистров совпадения, то момент совпадения никогда не произойдет. Следует заметить, что при использовании одного из фиксированных значений ТОР неиспользованные старшие разряды регистров OCRlx всегда остаются равными нулю, какое бы значение в этот регистр не записывалось.
Рекомендуется использовать режим phase and frequency correct PWM вместо режима phase correct PWM, если требуется изменять значение ТОР «на ходу», то есть в то время, когда таймер/счетчик работает. Если во время работы таймера значение ТОР менять не требуется, то между этими двумя режимами нет никаких различий.
В режиме phase correct PWM модуль совпадения формирует сигнал ШИМ на выводах ОС1х. Установка битов СОМ 1x1:0 = 2 приводит к тому, что на выходе будет сформирован неинвертированный сигнал ШИМ. Инвертированный сигнал ШИМ формируется при COMlxl:0 = 3 (смотри табл. 1.44). Реально значение ОС1х появится на соответствующем выводе микросхемы только тогда, когда он будет сконфигурирован как выход (при помощи бита DDROClx). Частота сигнала ШИМ в режиме phase correct PWM может быть вычислена по следующей формуле:
г ■ _ Vclki/O '
JocnxPCPWM ~ 2N- ТОР 1
Переменная N — это коэффициент деления предварительного делителя (1,8, 64, 256 или 1024).
Особый случай представляет собой генерация ШИМ при предельных значениях регистра OCRlx. Если в неинвертирующем режиме содержимое OCRlx равно BOTTOM, то на выходе будет постоянный нулевой уровень. А если это содержимое равно ТОР, на выходе будет постоянный уровень логической единицы. Для инвертирующего режима выходной сигнал будет иметь обратные значения.
Режим phase and frequency correct PWM
Режим phase and frequency correct PWM или ШИМ, корректный по фазе и частоте, включается при WGM13:0 = 8 или 9. Этот режим, как и предыдущий, основан на пилообразном сигнале с двухсторонним наклоном. Счетчик периодически меняет направление и считает сначала от BOTTOM (0x0000) до ТОР, а затем от ТОР до BOTTOM.
В неинвертированном режиме сигнал на выходе совпадения (ОС1х) сбрасывается в момент совпадения содержимого регистров TCNT1 и OCRlx, если счет происходит в прямом направлении, и устанавливается в единицу в момент совпадения регистров в том случае, если счетчик считает в обратном направлении.
В инвертирующем режиме сигналы на выходе имеют противоположные значения. Использование пилы с двухсторонним наклоном определяет более низкую максимальную частоту сигнала по сравнению с режимом, использующим пилообразный сигнал с одинарным наклоном. Однако из-за симметричности сигналов в двунаклонных режимах они больше подходят для управления электродвигателями.
Основное различие между режимом с корректной фазой и режимом с корректной фазой и частотой — это момент времени, когда происходит обновление регистра OCRlx из буфера OCRlx. В режиме phase and frequency correct PWM обновление буфера происходит тогда, когда значение счетчика достигнет BOTTOM.
Рассмотрим регистры 16-разрядного таймера/счетчика.
Регистр А управления таймером/счетчиком — TCCR1А
Номер бита 76543210
[cOM1Al)cOWAO|cOM1Bl|cOM1BO| — | — | WGM11 | W3M10] TCCR1А
Чтение(К)/Запись(«) RyW ЯМ R/W R/WR R R/W R/W
Начальное значение 00000000
Биты 7:6 — СОМ1А1:0: Выбор режима работы выхода совпадения (канал А)
Биты 5:4 — СОМ1В1:0: Выбор режима работы выхода совпадения (канал В)
Биты СОМ1А1:0 и COMIBI:0 управляют поведением выходов сигнала совпадения (ОС1А и ОС1В, соответственно). Если один или оба бита COMIAI:0 равны единице, то стандартные функции соответствующего контакта микросхемы отменяются, и он становится выходом совпадения ОС1А. Однако при этом биты регистра направления передачи данных (DDR), соответствующие выводам ОС1А и ОС1В, должны быть установлены в такое состояние, чтобы эти контакты работали как выходы.
Когда сигналы ОС1А или ОС1В подключены к внешним контактам микросхемы, действие битов COMlxl:0 зависит от режима работы, выбранного при помощи битов WGM13.0. В табл. 1.43 показано назначение битов СОМ1х1:0 в том случае, когда при помощи WGM.13:0 выбран режим Normal либо режим сброса при совпадении — СТС. То есть не-ШИМ-режимы.
СОМ1А1/ СОМ1В1
СОМ1А0/ СОМ1В0
Описание
0
0
Обычные операции с портом. Сигналы ОС1А/ОС1В отключены
0
1
Переключение сигнала OC1A/OC1B в момент совпадения
1
0
Сброс сигнала ОС1А/ОС1В в момент совладения (Устанавливает на выходе низкий логический уровень)
1
1
Установка сигнала ОС1А/ОС1В в момент совпадения (Устанавливает на выходе высокий логический уровень)
Таблица 1.43.
Режимы вывода сигнала совпадения, не-ШИМ
В табл. 1.44 показаны функции битов СОМ 1x1:0 в том случае, когда при помощи битов WGM13:0 выбран режим «Fast PWM».
Таблица 1.44.Режимы вывода сигнала совпадения, Fast PWM
СОМ1А1/ СОМ1В1
СОМ 1 АО/ СОМ1В0
Описание
0
0
Обычные операции с портом. Сигналы ОС1А/ОС1В отключены
0
1
WGM13=0. Обычные операции с портом. Сигналы ОС1А/ ОС1В отключены.
WGM13=1. Переключение ОС1А в момент совпадения. Для ОС1В данный режим зарезервирован
1
0
Сброс ОС1А/ОС1В в момент совпадения, установка ОС1А/ ОС1В при достижении счетчиком значения ТОР
1
1
Установка ОС1А/ОС1В в момент совпадения, сброс ОС1А/ ОС1В при достижении счетчиком значения ТОР
Примечание. Особый случай возникает, когда содержимое OCRIAi OCR1B равно ТОР, а биты СОМ1АЦСОМ1В1 установлены. В этом случае событие «Совпадение» игнорируется, но установка или очистка сигналов на выходах происходят при достижении ТОР. Подробнее смотри раздел «Режим Fast PWM».
В табл. 1.45 показаны функции битов СОМ 1x1:0 в том случае, когда при помощи битов WGM13:0 выбран один из режимов «Phase correct PWM» или «Phase and Frequency Correct PWM». ■
Таблица 1.45. Режимы вывода сигнала совпадения Phase Correct или Phase and Frequency Correct PWM
СОМ1А1/ СОМ1В1
СОМ 1 АО/ СОМ 1 ВО
Описание
0
0
Обычные операции с портом. Сигналы ОС1А/ОС1В Отключены
0
1
WGM13=0: Обычные операции с портом, Сигналы ОС1А/ OC1B отключены.
WGM13=1: Переключение ОС1А в момент совпадения. Для выхода ОС1В этот режим зарезервирован
1
0
Очистка ОС1А/ОС1В в момент совпадения при прямом счете. Сброс ОС1А/ОС1В в момент совпадения при обратном счете
1
1
Установка ОС1А/ОС1В в момент совпадения при прямом счете. Сброс OC1A/OC1B в момент совпадения при обратном счете
Примечание. Специальный случай возникает, когда содержимое OCRIAiOCRIB равно ТОР, а СОМ1А1ICOM1B1 установлены.
Бит 1:0— WGMll:0: Режимы генератора сигналов. Совместно с разрядами WGM13:2 регистра TCCR1B эти биты управляют последовательностью подсчета счетчика, определяют максимальный предел счета (ТОР) и способ генерации сигналов, так как это показано в табл. 1.46. Модуль таймера/счетчика поддерживает следующие режимы работы:
режим Normal (счетный);
режим сброса при совпадении (СТС);
три режима широтно-импульсной модуляции (ШИМ).
Смотри раздел «Режимы работы 16-разрядного таймера/счетчика».
Таблица 1.46. Описание битов выбора режима генератора сигналов
Mode
WGM 13
WGM 12 (СТС1)
WGM 11 (PWM11)
WGM10 (PWM10)
Режим работы таймера/ счетчика
TOP
Регистр OCR1x загружается из
Флаг TOV1 устанавливается по
0
0
0
0
0
Normal
OxFFFF
Непосредственно
MAX
1
0
0
0
1
PWM, Phase
Correct, 8-бит
OxOOFF
TOP
BOTTOM
2
0
0
1
0
PWM, Phase
Correct, 9-бит
0x01FF
TOP
BOTTOM
3
0
0
1
1
PWM, Phase Correct, 10-бит
0x03FF
TOP
BOTTOM
4
0
1
0
0
СТС
OCR1A
Непосредственно
MAX
5
0
1
0
1
Fast PWM, 8-бит
OxOOFF
TOP
TOP
6
0
1
1
0
Fast PWM, 9. бит
0x01FF
TOP
TOP
7
0
1
1
1
Fast PWM, 10. бит
0x03FF
TOP
TOP
8
1
0
0
0
PWM, Phase and Frequency Correct
ICR1
BOTTOM
BOTTOM
9
1
0
0
1
PWM, Phase and Frequency Correct
OCR1A
BOTTOM
BOTTOM
10
1
0
1
0
PWM, Phase Correct
ICR1
TOP
БОНОМ
11
1
0
1
1
PWM, Phase Correct
OCR1A
TOP
ВОНОМ
12
1
1
0
0
CTC
ICR1
Непосредственно
MAX
13
1
1
0
1
(Зарезервировано)
-
-
14
1
1
1
0
Fast PWM
ICR1
TOP
TOP
15
1
1
1
1
Fast PWM
OCR1A
TOP
TOP
Примечание. Имена СТС1 u PWM11:O— это устаревшие имена разрядов- Используйте имена WGM12:0. Однако, функциональные возможности и местоположение этих битов совместимы с предыдущими версиями таймера.
Регистр В управления таймером/счетчиком — TCCR1В
Номер бита76543210
|ICNC1|ICES1|—|WGM13|WGM12|CS12|CS11|CS10|TCCR1В
Чтение(Я)/ЗаписьО«)R/wR/WRR/WR/WR/WR/WR/W
Начальное значение 00000000
Бит 7— ICNC1: Разрешение работы шумоподавителя на входе захвата. Установка этого бита (в единицу) активизирует схему шумоподавителя на входе захвата. Когда шумоподавитель активизирован, входной сигнал, поступающий на вход захвата (ICP1), подвергается фильтрации. Функция фильтрации сводится к тому, что производится четыре последовательных выборки сигнала на входе ICP1. И только если уровень сигнала для всех четырех выборок окажется одинаковым, данный уровень проходит на выход шумоподавителя. По этой причине включение схемы захвата увеличивает общую задержку сигнала захвата на четыре периода тактового генератора.
Бит б— ICES1: Выбор активного фронта сигнала захвата. При помощи этого разряда выбирается активный фронт сигнала захвата (вход ICP1). Когда бит ICES1 сброшен в ноль, захват происходит по заднему фронту входного сигнала, а если ICES1 равен единице, то захват происходит по переднему фронту.
Если происходит захват, текущее значение счетного регистра записывается в регистр захвата (ICR1). Одновременно с этим устанавливается флаг захвата (ICF1), который может использоваться для вызова прерывания по захвату в том случае, если это прерывание разрешено.
Если регистр ICR1 используется для хранения значение ТОР (смотри описание битов WGM13:0 регистров TCCR1A и TCCR1B), вход ICP1 отключен, а, следовательно, и функция захвата заблокирована.
Бит 5 — Зарезервирован. Этот бит зарезервирован для будущих модификаций. Рекомендуется при записи нового значения в регистр TCCR1B в этот бит записывать ноль для того, чтобы гарантировать совместимость ваших программ с будущими модификациями микросхемы.
Бит 4:3 — WGM13:2: Выбор режима генерации сигналов. Смотри описание регистра TCCR1A.
Бит 2:0— CS12:0: Выбор тактовой частоты. Эти три бита позволяют выбрать один из источников тактового сигнала для таймера/ счетчика 1. Действие битов показано в табл. 1.47.
Таблица 1.47.Описание битов выбора тактовой частоты
CS12
CS11
CS10
Описание
0
0
0
Нет источника сигнала (таймер/счетчик остановлен)
0
Q
1
clk,/0/1 (Нет предварительного деления)
0
1
0
clk1/0 /8 (деление на 8)
0
* 1
1
clkl/0./64 (деление на 64)
1
0
0
clk,/0 /256 (деление на 256)
1
0
1
clk,/0 /1024 (деление на 1024).
1
1
0
Внешний источник сигнала на входе T1. Синхронизация по заднему фронту
1
1
1
Внешний источник сигнала на входе Т1. Синхронизация по переднему фронту
Если выбран режим синхронизации таймера/счетчика от внешнего сигнала, то изменение уровня на входе Т1 вызовет изменение счетного регистра счетчика, даже если соответствующий контакт сконфигурирован как выход. Эта особенность позволяет формировать счетные импульсы программным путем.
Регистр С управления таймером/счетчиком- TCCR1С
Номер бита 76543210
| focia1-focib-| — | — | — | — | — | — ] TCCR1 с
4reH№(R)/3anMCb(W) WWRRRRRR
Начальное значение 00000000
Бит 7 — FOC1A: Принудительная установка выхода совпадения (канал А).
Бит 6— FOCI В: Принудительная установка выхода совпадения (канал В). Разряды FOCI A, FOCI В активны только в том случае, если при помощи битов WGM13:0 выбран один из не-ШИМ-ре- жимов. Однако для того, чтобы гарантировать совместимость с будущими модификациями микросхем, рекомендуется во всех ШИМ
режимах при записи нового значения в регистр TCCR1А в эти биты устанавливать в ноль.
При записи логической единицы в разряды FOCI A, FOCI В состояние соответствующего выхода изменяется так, как при возникновении совпадения. Сигнал на выходе ОС1А, ОС1В изменяется в соответствии с установкой разрядов COM3 х 1:0. Обратите внимание: разряды FOCI A, FOCI В используется как строб. Именно в момент изменения значения одного из этих разрядов проверяется состояние СОМ1хЗ:0 и выполняется соответствующее действие.
Строб FOCI A, FOC1B не вызывает прерывания и не перезапускает таймер в режиме СТС. При чтении разряды FOC1A, FOC1B всегда равны нулю.
Счетный регистр таймера/счетчика 1 — TCNT1Н иTCNT1L
Номер бита 76543210
TCNT1[15:8]
TCNT1H
TCNT1L
TCNT1 [7:0]
Чтение(Я)/ЗаписьОЛ^
Начальное значение
R/WR/WR/WR/WR/WR/WR/WR/W
00000000
Шестнадцатиразрядный счетный регистр таймера/счетчика 1 (TCNT1) в адресном пространстве ввода—вывода представлен как два восьмиразрядных регистра (TCNT1H и TCNT1L). Эти два регистра дают прямой доступ для чтения или записи содержимого всего 16-разрядного счетного регистра. Для того, чтобы все 16 бит читались и записывались одновременно, для доступа к старшему байту счетного регистра используется 8-разрядный регистр временного хранения (TEMP). z
Тот же самый временный регистр используется для доступа ко всем остальным 16-разрядными регистраторам данного таймера/ счетчика. Подробнее смотри в разделе «Доступ к 16-разрядным регистрам».
Изменение содержимого счетного регистра (TCNT1) во время работы таймера может привести к пропуску момента совпадения в случае равенства содержимого регистра TCNT1 и одного из регистров
OCRlx. В момент записи нового значения в регистр TCNT1 модуль совпадения блокируется на один период тактового сигнала.
Регистр совпадения А — OCR1АН и OCR1AL
Номер бита
7
6
5
43
2
10
OCR1A[15'8]
OCR1 AH
OCR1A[7:0]
OCR1AL
Чтение) R)/3an«cb(W)
Начальное значение
R/W 0
R/W 0
R/W 0
R/WR/W
00
R/W 0
R/W 0
R/W 0
Регистр совпадения содержит 16-разрядное значение, которое непрерывно сравнивается со значением счетного регистра (TCNT1). Момент совпадения используется для генерации запроса на прерывание по совпадению или для формирования сигнала на выходе ОС1х.
Имеет размер 16-разрядов. Состоит из двух 8-разрядных регистров. Для того, чтобы гарантировать, что старший и младший байты будут записаны (считаны) одновременно при обращении к регистрам совпадения, для хранения старшего байта используя временный 8-разрядный регистр (TEMP).
Это тот самый временный регистр, который используется для доступа ко всем остальным 16-разрядным регистрам данного тайме- ра/счетчика. Подробнее смотри в разделе «Доступ к 16-разрядным регистрам».
Регистр совпадения В — OCR1ВН и OCR1BL
Номер бита76543210
OCR18[15:8] ~~ OCR1ВН
QCR1B[70] OCR 1 BL
Чтение(В)/Запись№)R/wR/WR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Регистр совпадения содержит 16-разрядное значение, которое непрерывно сравнивается со значением счетного регистра (TCNT1). Момент совпадения используется для генерации запроса на прерывание по совпадению или для формирования сигнала на выходе ОС1х.
Имеет размер 16 разрядов. Состоит из двух 8-разрядных регистров. Для того, чтобы гарантировать, что старший и младший байты будут записаны (считаны) одновременно при обращении к регистрам совпадения, для хранения старшего байта используя временный 8-разрядный регистр (TEMP).
Это тот самый временный регистр, который используется для доступа ко всем остальным 16-разрядным регистрам данного тайме- ра/счетчика. Подробнее смотри в разделе «Доступ к 16-разрядным регистрам».
Регистр захвата — ICR1Н и ICR1L
Номер бита 76543210
ICR1[15:8]
ICR1H
ICR1L
iCR 1(7:0]
Чтение(Н)/Запись(У/)
Начальное значение
R/WR/WR/WR/WR/WR/WR/WR/W
00000000
Регистр захвата сохраняет содержимое счетного регистра (TCNT1) при поступлении сигнала с внешнего входа захвата 1СР1 (или сигнала с выхода аналогового компаратора). Регистр захвата также может рспользоваться для хранения значения ТОР таймера/счетчика.
Регистр захвата имеет размер 16 разрядов и состоит из двух 8-раз- рядных регистров. Для того, чтобы гарантировать, что старший и младший байты будут записаны одновременно, при обращении к этому регистру для хранения старшего байта используя временный 8-разрядный регистр (TEMP). Этот тот самый временный регистр, который используется для доступа ко всем остальным 16-разрядным регистрам данного таймера/счетчика. Подробнее смотри в разделе «Доступ к 16-разрядным регистрам».
Регистр маски прерываний таймера/счетчика — TIMSK
Номер бита 76543210
| T0IE1 | OCIE1A j 0CIE1B [—] ICIE1 | OCIE0B | T0IEO | ОС1ЕОА~] TIMSK
Чтение) R)/3anHCb(W)R/WR/WR/WRR/WR/WR/WR/W
Начальное значение 00000000
Бит 7 — TOIE1: Разрешение прерываний по переполнению. Прерывания по переполнению таймера/счетчика 1 разрешены, когда значение этого бита равно единице, а также установлен флаг I регистра состояния (глобальное разрешение прерываний). Если при этом установлен флаг TOV1 регистра TIER (см. раздел «Прерывания»), вызывается процедура обработки прерывания по соответствующему вектору.
Бит 6 — OCIE1A: Разрешение прерывания по совпадению (канал А). Прерывания по совпадению в канале А таймера/счетчика 1 разрешены, когда значение этого бита равно единице, а также установлен флаг I регистра состояния (глобальное разрешение прерываний). Если при этом установлен флаг OCF1A регистра TIER (см. раздел «Прерывания»), вызывается процедура обработки прерывания по соответствующему вектору.
Бит 5 — OCIE1B: Разрешение прерывания по совпадению (канал В). Прерывания по совпадению в канале В таймера/счетчика 1 разрешены, когда значение этого бита равно единице, а также установлен флаг I регистра состояния (глобальное разрешение прерываний). Если при этом установлен флаг OCF1B регистра TIFR (см. раздел «Прерывания»), вызывается процедура обработки прерывания по соответствующему вектору.
Бит 3 — ICIE1: Разрешение прерываний по захвату таймера/счетчика 1. Прерывания по захвату таймера/счетчика 1 разрешены, когда значение этого бита равно единице, и флаг I регистра состояния (глобальное разрешение прерываний) также установлен. Если при этом установлен флаг ICF1 регистра TIFR (см. раздел "Прерывания"), вызывается процедура обработки прерывания по соответствующему вектору.
Регистр флагов таймера/счетчика 1 — TIER
Номер бита 76543210
QjovT^EocFijA^^ocHiQ^^^^tifr
Чтение! R)/3an*Cb(W) R/W R/W R/W R R/W R/W R/W R/W Начальное значение 00000000
Бит 7 — TOV1: Флаг переполнения таймера/счетчика 1. Поведение этого флага зависит от состояния разрядов WGM13:0. В режимах Normal и СТС флаг TOV1 устанавливается в том случае, если таймер переполняется. Поведение флага TOV1 при других установках разрядов WGM13:0 показано в табл. 1.46. В момент вызова процедуры обработки прерывания по переполнению таймера/счетчика 1 флаг TOV1 автоматически сбрасывается. Флаг TOV1 может быть сброшен программно путем записи в этот разряд логической единицы.
Бит 6 — ОСПА: Флаг совпадения канала А таймера/счетчика 1. Этот флаг устанавливается в следующем тактовом цикле таймера после совпадения содержимого счетного регистра (TCNT1) и регистра (OCR1A).
Обратите внимание, что строб принудительной установки сигнала совпадения (FOC1A) не устанавливает флаг OCF1A. Флаг OCF1A очищается автоматически в момент запуска процедуры обработки прерывания. Флаг OCF1А может быть сброшен программно путем записи в этот разряд логической единицы.
Бит 5 — OCF1B: Флаг совпадения канала В таймера/счетчика 1. Этот флаг устанавливается в следующем тактовом цикле таймера после совпадения содержимого счетного регистра (TCNT1) и регистра совпадения (OCR1B).
Обратите внимание, что строб принудительной установки сигнала совпадения (FOC1B) не устанавливает флаг OCF1B
Флаг OCF1B очищается автоматически в момент запуска процедуры обработки прерывания. Флаг OCF1B может быть сброшен программно путем записи в этот разряд логической единицы.
Бит 3 — 1CF1: Флаг захвата таймера/счетчика 1. Этот флаг устанавливается в том случае, если на вход ICP1 поступает сигнал захвата. В том случае, если регистр захвата (ICR1) используется для хранения значения ТОР (см. установку разрядов WGM13:0), флаг 1CF1 устанавливается в момент достижения счетчиком значения ТОР. Флаг ICF1 очищается автоматически в момент запуска процедуры обработки прерывания. Флаг ICF1 может быть сброшен программно путем записи в этот разряд логической единицы.
USART
Особенности
Универсальный синхронно-асинхронный последовательный приемопередатчик (Universal Synchronous and Asynchronous serial Receiver and Transmitter — USART) является очень гибким устройством последовательной передачи информации. Он имеет следующие основные особенности:
полно-дуплексная организация (независимые регистраторы последовательного приема и передачи);
синхронный и асинхронный режимы работы;
синхронизация как от ведущего, так и от ведомого устройства;
выбор скорости передачи информации в широких пределах;
поддержка кадров длиной 5—9 битов и 1 или 2 стоп-бита;
аппаратная поддержка генерации и проверки сигнала четности;
обнаружение переполнения данных;
обнаружение ошибок кадрирования;
низкоуровневая цифровая фильтрация и обнаружение ложного стопового бита;
три источника прерывания: «Передача завершена», «Регистр данных передатчика пуст», «Прием завершен»;
режим межпроцессорной связи;
двухскоростной режим асинхронной передачи
Краткий обзор'
Упрощенная блок-схема передатчика USART показана на рис. 1.34.'
Примечание. Действительное расположение контактов USART смотрите на рис. 1.1, в табл. 1.29 и в табл. 1.26.
Шина данныхШина данныхРис. 1.34. Блок-схема USARTРис. 1.34. Блок-схема USART
Шина данных
Шина данных
Рис. 1.34. Блок-схема USART
Рис. 1.34. Блок-схема USART
На схеме штрихпунктирной линией обведены следующие три основные части USART (начиная с верхней):
.■ синхрогенератор;
передатчик;
приемник.
Регистры управления общие для всех трех модулей. Логика генерации тактового сигнала синхронизации состоит из:
внешнего входа тактового сигнала, используемого в ведомом режиме;
генератора скорости передачи.
Вход ХСК (тактовый сигнал передачи) используется только в режиме синхронной передачи.
Передатчик состоит из отдельного буфера записи, последовательного сдвигового регистра, генератора сигнала четности и логики контроля для работы с различными последовательными форматами кадра. Буфер записи обеспечивает непрерывную передачу данных без задержки между кадрами.
Приемник— самая сложная часть модуля USART из-за наличия тактового генератора и модулей восстановления данных. Модули восстановления используются в режиме асинхронного приема данных. В дополнение к модулям восстановления, приемник имеет устройство проверки четности, логику контроля, сдвиговый регистр и двухуровневый буфер приема (UDR). Приемник поддерживает те же самые форматы кадра, что и передатчик, и может обнаружить ошибку кадра, переполнение данных и ошибки четности.
Совместимость режимов AVR USART и AVR UART
Режим USART полностью совместим с режимом UART по следующим параметрам.
По расположению битов во всех USART регистрах.
По выбору скорости передачи информации.
По алгоритму работы передатчика.
По функционированию буфера передатчика.
По алгоритму работы приемника.
В схеме буферизации приема имеются два отличия, которые в некоторых случаях могут вызвать некоторую несовместимость.
Во-первых, добавлен второй буферный регистр. Два буферных регистратора работают как кольцевой буфер FIFO. Поэтому UDR должен читаться только один раз для каждой посылки! Еще наиболее важный момент: флаги ошибки (FE и DOR) и девятый информационный разряд (RXB8) сохраняются вместе с данными в буфере получателя. Поэтому биты состояния должны быть прочитаны прежде, чем будет прочитан регистр UDR. Иначе состояние ошибки будет потеряно, так как потеряно содержимое буфера.
Во-вторых, сдвиговый регистр приемника может теперь действовать как буфер третьего уровня. Эта особенность позволяет полученным данным оставаться в последовательном сдвиговом регистре (см. рис. 1.34) в случае, если буферные регистры заполнены до тех пор, пока не обнаружен новый стартовый бит. Поэтому режим USART является более устойчивым к ошибкам по переполнению данных (DOR). В новом режиме следующие служебные биты изменили свои названия, ио имеют те же самые функциональные возможности и местоположение в регистре:
CHR9 заменено на UCSZ2;
OR заменено на DOR.
Тактовый генератор
Тактовый генератор вырабатывает все основные тактовые сигналы — как для передатчика, так и для приемника. Модуль USART поддерживает четыре режима синхронизации:
обычный асинхронный;
асинхронный с двойной скоростью;
синхронизация от ведущего (Master) устройства;
синхронизация от ведомого (Slave) устройства.
При помощи разряда UMSEL регистра UCSRC можно выбрать асинхронный либо синхронный режим работы. Режим удвоенной скорости (только для асинхронного режима) включается при помощи бита U2X регистра UCSRA.
При использовании синхронного режима (UMSEL = 1) регистр направления передачи данных для контакта ХСК (DDR _ХСК)
Рис. 1.35. Тактовый генератор, блок-схема
определяет, является ли источник тактового сигнала внутренним (режим Master) или внешним (режим Slave). Контакт ХСК активен только в синхронном режиме. На рис. 1.35 показана блок-схема тактового генератора модуля USART.
Описание сигналов:
txclk — тактовая частота передатчика (внутренний сигнал);
rxclk — основной тактовый сигнал приемника (внутренний сигнал);
xcki — входной сигнал с контакта ХСК (внутренний сигнал). Используется для синхронизации slave операций;
хско — сигнал, поступающий на выход ХСК (внутренний сигнал). Используется для синхронизации master операций;
fosc — тактовая частота с контакта XTAL (системный тактовый генератор). .
Внутренняя генерация тактового сигнала — генераторскорости передачи информации
Внутренний тактовый генератор используется для работы в синхронном и асинхронном Master-режиме. Все описанное в этом разделе относится к рис. 1.35.
Регистр скорости передачи информации модуля USART (UBRR) и связанный с ним реверсивный счетчик используются как программируемый предварительный делитель и определяют скорость передачи информации. В реверсивный счетчик, работающий от тактового сигнала (fosc), загружается содержимое регистра UBRR каждый раз, когда счетчик досчитает до нуля или сразу после записи младшей части регистра UBRR (UBRRL).
Импульс тактовой частоты вырабатывается каждый раз, когда содержимое счетчика достигает нулевого значения. Таким образом, скорость передачи информации равна fObC/(UBRR+1). Передатчик делит тактовый сигнал, определяющий скорость передачи информации, на 2, 8 или 16 в зависимости от выбранного режима.
Тактовый сигнал скорости передачи используется непосредственно как тактовый сигнал приемника и в модулях восстановления данных. Напротив, модули восстановления используют автоматический
выбор 2, 8 или 16 выборок в зависимости от установок разрядов UMSEL, U2X и DDRXCK.
Табл. 1.48 содержит выражения, по которым можно определить скорость передачи информации в бодах (битах в секунду) при различных значениях UBRR для каждого режима работы при использовании внутреннего генератора.
Таблица 1.48.Выражения для расчета значения
регистра скорости передачи
Режим работы
Выражение для расчета скорости передачи*1*
Выражение для расчета значения регистра UBRR
Стандартный асинхронный режим ■ (U2X = 0)
BAUp,.-^-
16(UBf?fl+1)
fosc .
U8RR=16BAUd '
Асинхронный режим с удвоенной скоростью (U2X = 1)
fosc
BAUD —
B(UBRRM)
UBRR-8^UO - '
Синхронный режим Master
fosc BAUD - 2^jBRR+Vi
UBRH= 2ВАШ - '
Примечание. Скорость передачи (BAUD) выражается в битах в секунду (bps)
BAUD — скорость передачи данных (в битах в секунду, bps);
fosc — частота системного тактового генератора;
UBRR — содержимое регистров UBRRH и UBRRL (0-4095).
Несколько примеров выбора значений регистра UBRR для некоторых значений частоты тактового генератора приведены в табл. 1.48.
Режим удвоенной скорости (U2X)
Скорость передачи удваивается, если бит U2X регистра UCSRA установлен в единицу. Установка этого бита имеет эффект только
для асинхронного режима работы. Бит сбрасывается в ноль при выборе синхронного режима.
Установка этого бита уменьшит коэффициент деления делителя в формирователе скорости передачи информации с 16 до 8, фактически удваивая скорость асинхронной передачи. Но в этом случае приемник будет использовать в два раза меньшее число тактов (уменьшенное с 16 до 8) выборки данных и восстановления синхронизации. Поэтому потребуются более точная установка скорости передачи и частоты тактового сигнала в этом режиме работы. Для передатчика в этом режиме нет никаких проблем.
Внешний тактовый сигнал
Внешняя синхронизация используется в синхронном slave-режиме работы. Для того, чтобы подробнее понять работу схемы синхронизации, обратимся к рис. 1.35. Дальнейшее описание ведется по этому рисунку.
Внешний тактовый сигнал со входа ХСК поступает на регистр синхронизации. Этот регистр предназначен для того, чтобы уменьшить нестабильность тактового сигнала. С выхода регистра синхронизации синхросигнал поступает на детектор фронтов и лишь потом используется для синхронизации передатчика либо приемника. Каждое из этих преобразований вводит свою задержку для внешнего тактового сигнала. Поэтому максимальная внешняя частота тактового сигнала, поступающая на вход ХСК, ограничена следующим уравнением:
/ < ^osc
J хек < д •
Внимание. Частота fosc зависит от стабильности источника тактового сигнала системы. Поэтому рекомендуется выбирать частоту внешнего тактового сигнала с некоторым запасом, чтобы избежать возможной потери данных из-за нестабильности частоты.
Синхронизация процесса передачи данных
В синхронном режиме (UMSEL = 1) вывод ХСК будет использоваться либо как-вход (Slave), либо как выход (Master) тактового сигнала. Выборка данных на входе приемника и изменение данных на выходе передатчика синхронизируются от одного и того же тактового сигнала. При этом ввод данных (RxD) и вывод данных (TxD) синхронизируются от противоположных фронтов этого сигнала.
UCPOL=1UCPOL=1ХСКRxD/TxDХСКRxD/TxDUCPOL=0 ХСКRxD/TxDUCPOL=0 ХСКRxD/TxDРис. 1.36. Временная диаграмма синхронного режима работыРис. 1.36. Временная диаграмма синхронного режима работы
UCPOL=1
UCPOL=1
ХСК
RxD/TxD
ХСК
RxD/TxD
UCPOL=0 ХСК
RxD/TxD
UCPOL=0 ХСК
RxD/TxD
Рис. 1.36. Временная диаграмма синхронного режима работы
Рис. 1.36. Временная диаграмма синхронного режима работы
При помощи разряда UCPOL регистра UCRSC можно выбирать, какой фронт синхроимпульса ХСК будет использоваться для выборки данных на входе, а какой — для изменения данных на выходе. Как видно из рис. 1.36, при нулевом значении бита UCPOL данные на выходе будут изменяться по переднему фронту сигнала ХСК, а выборка будет происходить по заднему фронту. Если же UCPOL будет равен единице, то' данные на выходе будут изменяться по заднему фронту ХСК, а выборка будет производиться по переднему фронту.
Форматы кадра
Определение. Единицей передачи данных является кадр. Кадр — это одно слово данных плюс сопутствующие ему биты синхронизации (стартовый бит, стоповые биты). Сюда же может быть добавлен бит четности, который применяется для проверки правильности передачи информации.
Канал USART поддерживает 30 разных вариантов формата кадра.
Любой допустимый формат имеет следующие элементы:
один стартовый бит;
5, 6, 7, 8, или 9 битов данных;
бит четности (если включен контроль четности);
один или два стоповых бита.
Кадр начинается со стартового бита, за которым следует младший разряд слова данных. Затем идут остальные информационные разряды. Их может быть до девяти. Разряды идут в порядке возрастания. Самый старший разряд передается последним.
Если размер проверки включен, то бит четности вставляется между старшим разрядом слова данных и стоповыми битами. После передачи одного полного кадра канал может сразу начинать передачу нового кадра. Если новый кадр данных не готов, канал переходит в режим ожидания. Рис. 1.37 иллюстрирует все возможные комбинации формата кадра. Биты, номера которых заключены в квадратные скобки, являются необязательными.
Кадр
Рис. 1.37. Форматы кадра
Условные обозначения:
St — стартовый бит, всегда равен нулю;
(п) — бит данных (п = 0—8);
Р — бит четности. Принимает значение «четный», «нечетный»;
Sp — столовый бит, всегда равен единице;
IDLE — информация по линии (RxD или TxD) не передается. В состоянии IDLE на линии должен быть высокий логический уровень.
Формат кадра для канала USART выбирается при помощи разрядов UCSZ2:0, UPM1:O и USES регистров UCSRB и UCSRC. Для приемника и передатчика должны быть выбраны одни и те же установки.
Внимание. Отличие в любом из битов, определяющих эти 'установки, приведет к полной невозможности совместной работы приемника и передатчика.
Биты выбора размера слова данных канала USART (UCSZ2:0) определяют количество информационных разрядов в кадре.
Биты выбора режима четности (UPMI:0) определяют наличие, отсутствие и тип битов четности. Выбор одного или двух стоповых битов производится при помощи переключателя количества стоповых битов (USBS). Приемник игнорирует второй столовый бит. Поэтому сигнал FE (Frame Error — ошибка кадра) появится только в том случае, если первый столовый бит будет равен нулю.
Расчет значения бита четности
Значение бита четности получается путем выполнения операции «Исключающее ИЛИ» над всеми разрядами передаваемого слова данных. Если используется проверка на нечетность (odd parity), полученный результат инвертируется. Отношение между битом четности и битами данных следующее:
Peven — dn-i © ... © dj © 62 © d] © do © O', Podd = dn 1 © ... © d3 © d2 © d] © dp © 1; где:
Рое» — бит четности при использовании проверки на четность;
P<><id — бит четности при использовании проверки на нечетность; dn — «п»-ый бит данных;
© — операция «Исключающее ИЛИ».
Если контроль четности включен, то бит четности размещается между последним разрядом данных и первым стоп-битом каждого кадра.
Инициализация USART
Канал USART должен быть инициализирован прежде, чем будет произведен первый сеанс передачи информации. Процесс инициализации обычно состоит из:
установки скорости передачи информации;
установки формата кадра;
включения передатчика или приемника в зависимости от выполняемой операции., .
Для того, чтобы прерывание раньше времени не запустило процесс обмена информацией в канале USART, флаг глобального разрешения прерываний должен быть сброшен (все прерывания заблокированы) до окончания процесса инициализации.
Перед тем, как выполнять переинициализацию с изменением скорости передачи информации или формата кадра, убедитесь, что в момент изменения значений регистров конфигурации все процессы обмена информацией уже завершены. Для проверки того, что передатчик закончил передачу всех данных, используется флаг ТХС. Для проверки того, что в приемном буфере нет непрочитанных данных, используется флаг RXC.
Внимание. Если флаг ТХС используется для этой цели, то он должен сбрасываться перед каждой передачей (прежде, ■■ чем записан UDR).
Ниже приведено два примера (листинги 1.5 и 1.6) простых программ инициализации USART. Одна программа написана на Ассемблере, а вторая — на СИ. Обе программы идентичны по выполняемым функциям. В примерах устанавливается асинхронный редким работы (прерывания не используются) и фиксированный формат кадра.
Скорость передачи информации задается как параметр функции. В программе на Ассемблере параметр, определяющий скорость передачи информации, перед вызовом подпрограммы помещается в пару регистров R17: R16.
Пример на языке Ассемблер
USAR7_Im г
Установка скорости передачи
outUBRRH, г 17
outUBRRL. г 16
, Включение приемника и передатчика
Idir16, (1«RXEN) | (1«TXEN)
outUCSRB. г 16
Установка формата кадра 8 бит данных. 2 столовых бига
Idi116, (l«USBS)|(3«UCSZ0)
outUCSRC.г 16
ret
Листинг 1.6.
Пример на языке СИ (Code Vision)
«define RXEN 4
«define TXEN 3
«define USES 3
«define UCSZO 1
void USART_Init( unsigned int baud )
/* Установка скорое in передачи */
UBRRH = (unsigned char )(baud»8):
UBRRL = (unsigned char)baud, /■ Включение приемника и передатчика V
UCSRB = (1«RXEN) | (1«TXEN)‘
/* Установка формата кадра 8 бит данных. 2 стоповых бита */
UCSRC = (1«USBS)|(3«UCSZ0).
Вариантов построения процедуры инициализации может быть множество. Такие процедуры могут включать в качестве параметра формат кадра, содержать команды запрета прерываний. Большинство приложений используют фиксированное значение всех параметров.
Для таких приложений код инициализации может быть помещен непосредственно в теле основной программы или включен в общую процедуру инициализации для всех остальных устройств ввода—вывода.
Передача данных — передатчик USART
Передатчик USART включается, если установлен бит разрешения передачи (TXEN) регистра UCSRB. Когда передатчик включен, стандартная функция вывода TxD отключается, а включается альтернативная функция. Теперь это выход передатчика последовательного канала USART.
Скорость передачи информации, режим работы и формат кадра должны быть установлены однажды, но до того, как произойдет первый сеанс передачи информации. Если выбран синхронный режим, то назначение вывода ХСК также изменится, и он будет использоваться как выход тактового сигнала передачи.
Посылка кадра данных длиной от 5 до 8 бит
Передача данных начинается с загрузки в буфер передачи байта данных. Центральный процессор может загрузить буфер передачи, записывая байт данных в регистр ввода—вывода UDR. Данные из буфера передачи будут загружены в сдвиговый регистр, как только он будет готов к передаче нового кадра.
Сдвиговый регистр может быть загружен новыми данными, если он находится в состоянии ожидания (не занят процессом передачи) или сразу после того, как передан последний столовый бит предыдущего кадра. Когда сдвиговый регистр загружен новыми данными, он начинает последовательную передачу данных с заданной скоростью.
Ниже (листинги 1.7 и 1.8) показан пример простой функции передачи USART, использующей для проверки готовности флаг «Регистр передачи пуст» (UDRE). Если выбран формат кадра, имеющий меньше чем восемь разрядов данных, старшие биты регистра UDR игнорируются. Прежде чем использовать приведенные функции, нужно инициализировать USART. В программе на Ассемблере данные, предназначенные для передачи, помещаются в регистр R16.
Функция ожидает, пока освободится буфер передачи. Для этого служит цикл проверки флага UDRE регистра UCSRA. Когда буфер окажется пустым, процесс ожидания прерывается, и подпрограмма записывает в него данные.
Пример на языке Ассемблер
USARTTransmit
; Ожидаем, пока очистится буфер передачи
sbisUCSRA.UDRE
rjmpUSART Transmit
. Помещаем данные (из г1б) в буфер Начинается передача outUDR.r16
ret
Листинг 1.8.
Пример на языке СИ (Code Vision)
ffdefine UDRE 5
void USART_Transmit( unsigned char data )
/- Ожидаем, пока очистится буфер передачи */
while ( ! ( UCSRA & (1«UDRE)) ).
/• Помещаем данные в буфер. Начинается передача V UDR = data, }
Посылка кадра данных длиной 9 бит
Если используется 9-разрядное слово данных (UCSZ = 7), то девятый разряд должен быть помещен в бит ТХВ8 регистра UCSRB прежде, чем младшие восемь битов будут записаны в регистр UDR. В следующих программных примерах (листинги 1.9 и 1.10) показана функция передачи информации, состоящей из 9-битового слова. В программе на Ассемблере передаваемые данные должны быть записаны в регистровую пару R17:R16.
Листинг 1.9.
Пример на языке Ассемблер
USART_Transnnt
. Ожидаем, пика очистится буфер передачи
sbisUCSRA.UDRE
; jmpUSART Transmit
■ Копируем 9-й бит из г17 в ТХВ8
C01UCSR8.TXB8
sOrcг17,0
sbiUCSRB,ТХ88
Помешаем младшие разряды данных (из । 16) в буфер . начинаем передачу данных outUDR. г 16
ret
Пример на языке СИ (Code Vision)
«define UDRE 5
«define TXB8 0
void USARI_Transmit( unsigned int data ) {
/• Ожидаем, пока очистится буфер передачи •/ while ( 1 ( UCSRA & (1«UDRE)) ).
/* Копируем 9-й биг в ТХВ8*/
UCSRB ^ "(1«ТХВ8)
if ( data & 0x0100 ) UCSRB |= (1«ТХВ8).
Л Помещаем младшие 8 разрядов данных в буфер начинаем передачу данных ■/
UDR = data.
Примечания. 1. Эти функции передачи предназначены для общего использования. Они могут быть упрощены, если содержимое UCSRB не изменяется. Например, если после инициализации из всего регистра UCSRB используется только бит ТХВ8. 2. Данные программные примеры предполагают, что в начале программы выполнено подключение файла описаний.
Флаги и прерывания передатчика
Существует два флага, индицирующие состояние передатчика USART:
флаг «Регистр данных пуст» (UDRE);
флаг «Передача окончена» (ТХС).
Оба флага могут использоваться для генерации прерываний.
Флаг «Регистр данных пуст» (UDRE) указывает, готов ли буфер передачи к получению новых данных. Этот флаг установлен, если буфер передачи пуст. Флаг сброшен, если буфер содержит данные, предназначенные для передачи, которые еще не перемещены в сдвиговый регистр. Для совместимости с будущими устройствами всегда устанавливайте этот бит в ноль при перезаписи регистра UCSRA.
Когда регистр данных пуст, бит разрешения прерывания (UDRIE) в регистре UCSRB устанавливается в единицу. Прерывание по событию «Регистр данных пуст» должно быть выполнено, пока UDRE установлен (при условии, что глобальные прерывания разрешены). Флаг UDRE сбрасывается при записи регистра UDR.
Если используется передача данных, управляемая прерыванием по событию «Регистр данных пуст», процедура обработки прерывания должна либо записать новые данные в регистр UDR, чтобы сбросить флаг UDRE, либо запретить прерывание. Иначе сразу по окончании процедуры обработки прерывания будет вызвано новое прерывание.
Флаг «Передача окончена» (ТХС) устанавливается в тот момент, когда весь кадр в сдвиговом регистре полностью передан, а в буфере передачи нет никаких новых данных. Флаг ТХС автоматически сбрасывается при запуске процедуры обработки прерывания. Он также может быть сброшен путем записи в этот бит единицы. Флаг ТХС полезен при построении последовательных полудуплексных интерфейсов (таких как RS-485), где управляющая программа должна включить режим приема и освободить линию связи сразу по завершении процесса передачи.
Если бит разрешения прерывания по событию «Передача завершена» (TXCIE) регистра UCSRB установлен, то (при условии глобального разрешения прерываний) сразу после установки флага ТХС вызывается соответствующее прерывание. При использовании прерывания по событию «Передача завершена» процедура обработки этого прерывания не должна сбрасывать флаг ТХС потому, что это делается автоматически в момент вызова прерывания.
Генератор сигнала четности
Генератор четности предназначен для вычисления бита четности, который используется при'передаче данных. Если бит четности разрешен (UPM1 = 1), управляющая логика передатчика вставляет этот бит между последним информационным разрядом и первым стоповым битом кадра.
Отключение передатчика
Отключение передатчика (при установке TXEN в ноль) не будет вступать в силу, пока не закончится передача текущих и отложенных данных, то есть пока сдвиговый регистр не будет пуст, а также не опустеет буфер передачи. Когда передатчик все же отключится, то вывод TxD перестанет выполнять альтернативную функцию.
Прием данных — приемник USART
Приемник USART включается при установке в единицу флага разрешения приема (RXEN) в регистре UCSRB. Основная функция вывода RxD заменяется альтернативной, когда приемник включен. Теперь это последовательный вход приемника.
Перед тем, как приемник будет использован, должны быть установлены:
скорость передачи информации;
режим работы;
формат кадра.
Если выбран синхронный режим работы, то тактовый сигнал на выходе ХСК будет использоваться как тактовый сигнал передатчика.
Прием кадра данных длиной от 5 до 8 битов
Приемник начинает прием данных, если обнаруживает на входе корректный стартовый бит. После обнаружения стартового бита приемник последовательно считывает следующие за ним биты.
Определение. Считывание битов — это проверка сигнала на входе через заданные промежутки времени, определяемые тактовым сигналом.
В зависимости от выбранного режима (асинхронный, синхронный) в качестве тактового сигнала используется либо сигнал внутреннего генератора скорости передачи, либо сигнал со входа ХСК. Каждый считанный бит помещается в сдвиговый регистр приемника.
Считывание битов данных происходит до тех пор, пока не будет получен первый столовый бит кадра. Второй столовый бит приемником игнорируется. В момент, когда обнаружен первый столовый бит, то есть когда принят полный кадр и в сдвиговом регистре находится принятое слово данных, содержимое сдвигового регистра переносится в буфер приемника.
После этого принятый байт может быть прочитан процессором из этого буфера. В адресном пространстве ввода—вывода этот буфер выступает в виде регистра UDR.
Ниже (листинги 1.11 и 1.12) показан пример функции приема данных USART, основанной на опросе флага «Прием завершен» (RXC). Если используется формат кадра с числом разрядов меньше восьми, то при чтении полученных данных из регистра UDR старшие разряды будут замаскированы (то есть равны нулю). Перед использованием функций приема данных USART необходимо провести его инициализацию.
Листинг 1.11.
Пример на языке Ассемблер
USART Receive-
Ожидаем пока данные будут получены sbisUCSRA. RXC
rjmpUSART_Receive
, Читаем данные из буфера и возвращаем их в регистре R16 inr16, UDR
гет
Листинг 1.12.
Пример на языке СИ (Code Vision)
«define RXC 7
unsigned char USART_Receive( void ) {
/• Ожидаем пока данные будут получены */ while ( 1 (UCSRA & (1«RXC)) )
/• Читаем данные из буфера и возвращаем их при выходе из подпрограммы */ return UDR,
1
Прием кадра данных длиной 9 бит
При использовании кадра, содержащего 9-разрядное слово данных (UCSZ=7), девятый разряд помещается в бит RXB8 регистра UCSRB. Процессор должен прочитать этот бита перед тем, как будут прочитаны восемь младших битов из регистра UDR. Это правило также необходимо соблюдать при проверке флагов FE, DOR и UPE в регистре статуса. Сначала прочитайте содержимое регистра статуса UCSRA, а затем можете читать данные из регистра UDR.
При чтении регистра UDR изменится состояние FIFO буфера приема, а, следовательно, изменится состояние разрядов ТХВ8, FE, DOR и UPE, которые все сохранены в FIFO. В следующем программном примере показана простая функция приема данных USART, которая работает со словом данных в девять разрядов и с битами статуса (листинги 1.13 и 1.14).
Листинг 1.13.
Пример на языке Ассемблер
USAR7.Receive
: Ожидаем пока данные будут получены
stubUCSRA. RXC
rjmpUSART^Receive
, Получаем статус и 9-й бит данных, а затем остальные данные
in
r18, UCSRA
in
r17, UCSRB
in
r16. UDR
: Если
ошибка возвращаем -1
andi
г18. (1«FE) | (1«DOR) | (1«UPE)
breq
USARf ReceiveNoError
Idi
И7. HIGH(-1)
Idi
t16. LOW(-1)
USART_ReceiveNoError■
, Выделяем 9-й бит и возвращаем полученные данные
1stг17
andiгГ/. 0x01
ret
Листинг 1.14.
Пример на языке СИ (Code Vision)
«define RXC 7
«define FE 4
«define OOP 3
«define UPE 2
unsigned mt USARf Receive( void )
{"
unsigned char status, resh. resl.
/• Ожидаем пока данные будут получены */
1 е ( 1 (UCSRA & (1«RXC)) )
/* Получаем статус и 9-й бит данных а затем остальные данные из буфера -/ status - UCSRA:
resh = UCSRB
resl = UDR:
/• Если ошибка, возвращаем -ь/
if ( status & (1«FE)!( 1<<00R)|(1«UPE) ) return -1
/- Выделяем 9-й бит. соединяем все 9 бит вместе .
и возвращаем полученное значение */
msb = (resh >> 1) & 0x01:
return (((unsigned int)resn r< g) । resl)
В приведенном примере функция сначала читает данные из регистров ввода—вывода и помещает каждое из прочитанных значений в свой отдельный регистр общего назначения. И лишь затем она может выполнять все необходимые операции с прочитанными значениями. Такое решение позволяет оптимально использовать буфер приема, так как в этом случае буфер будет освобожден как можно раньше и будет готов принять новые данные.
Флаг готовности приемника и вызов прерывания
Приемник USART использует всего один флаг, который индицирует его состояние. Флаг «Прием завершен» (RXC) позволяет определить, есть ли непрочитанные данные в буфере приема. Этот флаг устанавливается в единицу, если в буфере приема существуют непрочитанные данные, и равен нулю, если буфер приема пуст (то есть не содержит никаких непрочитанных данных).
Если приемник отключен (RXEN = 0), то буфер приема будет сброшен, и, следовательно, бит RXC будет равен нулю.
Если прерывание по событию «Прием завершен» разрешено (бит RXCIE регистра UCSRB установлен), оно будет вызываться все время, пока флаг RXC установлен (при условии глобального разрешения прерываний).
Если для получения данных используется прерывание, процедура обработки этого прерывания должна обязательно прочитать данные из регистра UDR для того, чтобы сбросить флаг RXC. Иначе как только закончится текущее прерывание, будет вызвано новое.
Флаги ошибки приемника
Приемник USART использует три флага ошибки:
флаг «Ошибка кадра» (ЕЕ);
флаг «Переполнение данных» (DOR);
флаг «Ошибка четности» (UPE).
Все три флага — это отдельные биты регистра UCSRA. Особенность флагов ошибки в том, что они расположены в буфере приема вместе с принятым кадром, статус ошибки которого они отражают. Поэтому
все три флага ошибки должны быть прочитаны посредством регистра UCSRA прежде, чем будет прочитан буфер приема (UDR).
В момент чтения буфера приема значение всех флагов сбрасывается. Другая особенность флагов ошибки состоит в том, что они не могут быть изменены программным путем. Однако при записи нового значения в регистр UCSRA рекомендуется разряды, соответствующие флагам ошибки, устанавливать в ноль, для совместимости с будущими модификациями канала USART. Ни один из флагов ошибки не может вызывать прерывания.
Флаг «Ошибка кадра» (FE) содержит информацию о правильности приема первого стопового бита очередного прочитанного кадра, хранящегося в буфере приема. Флаг FE равен нулю, если столовый бит был правильно прочитан (был равен единице), и равен единице, если столовый бит был неправильный (равен нулю).
Этот флаг может использоваться для того, чтобы обнаружить:
срыв синхронизации;
обрыв связи;
ошибки протокола.
На логику работы флага FE не влияет бит выбора количества стоповых битов (бит USBS регистра UCSRC), так как приемник игнорирует второй столовый бит.
Флаг «Переполнение данных» (DOR) указывает на потерю данных из-за переполнения буфера в процессе приема. Переполнение данных происходит в том случае, когда буфер приема заполнен (два слова данных), новое слово данных находится во входном сдвиговом регистре и обнаружен новый стартовый бит.
Если флаг DOR установлен, это значит, что один или более кадров были потерянны. Флаг DOR сбрасывается в том случае, если полученный кадр был успешно перемещен из сдвигового регистра в буфер приема.
Флаг «Ошибка четности» (UPE) указывает на то, что очередной кадр в буфере приема имел ошибку четности. Если проверка четности отключена, флаг UPE всегда будет равен нулю.
Схема контроля четности
Схема контроля четности активна, когда установлен бит включения режима проверки четности (UPM1). Режим проверки четности (четность или нечетность) определяется битом UPM0. Если включен контроль четности, то генератор сигнала четности формирует сигнал на основе значений информационных разрядов в текущем принятом кадре и сравнивает результат с битом четности этого же кадра.
Результат проверки запоминается в буфере приема вместе с полученными данными и стоповыми битами. Флаг «Ошибка четности» (UPE) может быть прочитан программным путем для того, чтобы проверить, имел ли принятый кадр ошибку четности.
Бит UPE устанавливается в единицу в том случае, если текущий кадр, значение которого можно прочитать из буфера приема, имел ошибку четности в момент его приема и контроль четности в этот момент был разрешен (UPM1 = 1). Значение флага действительно до тех пор, пока не прочитан буфер приема (UDR).
Выключение приемника
В отличие от передатчика, отключение приемника происходит немедленно. Текущие принимаемые данные будут потеряны. Когда приемник отключен (то есть бит RXEN установлен в ноль), альтернативная функция вывода RxD отменяется, и возвращается стандартная функция порта ввода—вывода. После того, когда приемник будет заблокирован, его буфер FIFO будет полностью освобожден. Сохранные ранее данные в буфере будут потеряны.
Освобождение буфера приемника
Буфер приемника FIFO освобождается автоматически при выключении приемника. Бывают ситуации, когда нужно освободить буфер в процессе работы. Например, при получении сигнала ошибки. Для освобождения буфера необходимо читать содержимое регистра UDR до тех пор, пока флаг RXC не окажется равным нулю. Следующий программный пример (листинги 1.15 и 1.16) показывает, как освободить буфер приема.
Листинг 1.15.
Пример на языке Ассемблер
USART Flush. sbis
UCSRA, RXC ; Проверка флата
in
r16, UDR : Чтение буфера
г jmp
USART_Flush
Листинг 1.16.
Пример на языке СИ (Code Vision)
#define RCX 7
void USART_Flush( void ) {
unsigned char dummy;
while ( UCSRA & (1«RCX) ) dummy = UDR.
Асинхронный прием данных
Модуль USART содержит:
схему восстановления тактового сигнала;
схему восстановления данных для работы в асинхронном режиме приема.
Схема восстановления тактового сигнала позволяет синхронизировать внутренний тактовый генератор, определяющий скорость передачи информации от поступающего на вход RxD асинхронного сигнала данных.
Схема восстановления данных осуществляет выборку и фильтрацию каждого разряда принимаемого кадра, улучшая, таким образом, помехоустойчивость приемника.
Восстановление тактового сигнала в асинхронномрежиме
Схема восстановления тактового сигнала синхронизирует внутренний тактовый генератор со скоростью передачи кадра. Рис. 1.38 иллюстрирует технологию выборки стартового бита текущего кад-
ра. Частота опроса входного сигнала в 16 раз превышает скорость передачи информации в нормальном режиме работы и в восемь раз в режиме двойной скорости. Несколько выборок, обозначенных на рисунке номером ноль, — это выборки, которые произведены, когда линия RxD находится в режиме ожидания (то есть передача информации не производится).
RxDRxDВыборки при U2X-0Выборки при U2X= 1Выборки при U2X-0Выборки при U2X= 1Рис. 1.38. Выборка стартового битаРис. 1.38. Выборка стартового бита
RxD
RxD
Выборки при U2X-0
Выборки при U2X= 1
Выборки при U2X-0
Выборки при U2X= 1
Рис. 1.38. Выборка стартового бита
Рис. 1.38. Выборка стартового бита
Последовательность выборок обнаружения стартового бита начинается с того момента, когда схема восстановления тактового сигнала обнаруживает на линии RxD переход с высокого логического уровня на низкий. Поэтому выборкой номер 1 считается первая выборка с нулевым сигналом (как показано на рисунке).
Согласно этой нумерации схема восстановления тактового сигнала использует выборки 8, 9 и 10 в нормальном режиме работы, а выборки 4, 5 и 6 — в режиме с двойной скоростью (на рисунке номера для этих выборок заключены в прямоугольники) для оценки того, действительно ли получен стартовый бит.
Если две или более из этих трех выборок имеют высокий логический уровень (по принципу большинства), считается, что это не стартовый бит, а помеха. При этом приемник переходит в режим ожидания нового перехода с высокого уровня на низкий.
Если большинство выборок содержит ноль, считается, что стартовый бит получен, и схема переходит к распознаванию данных. Такая же технология используется для распознавания каждого стартового бита. Горизонтальные стрелки на рисунке показывают временной интервал, в котором может изменяться время начала синхронизации.
Внимание. Величина этого интервала в режиме двойной скорости (U2X = 1) в два раза больше. Поэтому и точность определения начала кадра в два раза меньше.
Восстановление данных в асинхронном режиме
Когда тактовый сигнал приемника засинхронизирован со стартовым битом, начинается процесс восстановления данных. Модуль восстановления использует последовательность из 16 выборок для нормального режима работы и 8 выборок — для режима двойной скорости. На рис. 1.39 показано, как осуществляется выборка информационных разрядов и бита четности.
Каждой из выборок присваивается номер от 1 до 16 или от 1 до 8, в соответствии с выбранным режимом работы модуля восстановления.
НхОНхОВыборки при U2X=0Выборки при U2X= 1Выборки при U2X=0Выборки при U2X= 1Рис. 1.39. Распознавание бита данных или бита четностиРис. 1.39. Распознавание бита данных или бита четности
НхО
НхО
Выборки при U2X=0
Выборки при U2X= 1
Выборки при U2X=0
Выборки при U2X= 1
Рис. 1.39. Распознавание бита данных или бита четности
Рис. 1.39. Распознавание бита данных или бита четности
Определение логического уровня для каждого бита производится по результатам трех выборок. Эти три выборки делаются в центре каждого бита. Номера выборок, по которым производится оценка, на рис. 1.39 заключены в прямоугольники. Оценка логического уровня бита производится следующим образом:
если две из трех или все три выборки обнаружили высокий логический уровень, то значение текущего бита равно единице;
если же два из трех или все три выборки обнаружили низкий логический уровень, то текущий бит равен нулю.
Эта технология выбора «по принципу большинства» действует как низкочастотный фильтр сигнала поступающего со входа RxD. Процесс восстановления повторяется для каждого бита до тех пор, пока не будет получен полный кадр. То есть до первого стопового бита включительно.
Внимание. Приемник использует только первый стоповый бит кадра, а второй игнорирует.
На рис. 1.40 показано, как происходит распознавание стопового бита. При этом рассматривается случай, когда еще до окончания стопового бита начинается передача первого стартового бита следующего кадра. В определенных пределах допускается такое наползание кадра на кадр. .
RxDRxDВыборки при U2X=0Выборки при 112X^1Выборки при U2X=0Выборки при 112X^1Рис. 1.40. Распознавание стопового бита и стартового бита следующего кадраРис. 1.40. Распознавание стопового бита и стартового бита следующего кадраX—(С)X—(С)
RxD
RxD
Выборки при U2X=0
Выборки при 112X^1
Выборки при U2X=0
Выборки при 112X^1
Рис. 1.40. Распознавание стопового бита и стартового бита следующего кадра
Рис. 1.40. Распознавание стопового бита и стартового бита следующего кадра
X—(С)
X—(С)
При распознавании стопового бита применяется та же технология восстановления, как и для других битов кадра. Если в момент приема стопового бита окажется, что он имеет нулевое значение, это будет воспринято как ошибка кадра, и флаг ЕЕ будет установлен.
Новый переход от высокого к низкому уровню, указывающий на начало стартового бита нового кадра, может начинаться непосредственно после последней из трех контрольных выборок. Для режима одинарной скорости момент времени, когда уже допускается начало очередного стартового бита, обозначен на рис. 1.40 буквой А.
Для режима двойной скорости начало стартового бита может происходить лишь в точке В. Буквой С обозначен стоповый бит полной продолжительности. Раннее обнаружение стартового бита расширяет скоростной диапазон приемника.
Допустимые отклонения в асинхронном режиме
Определение. Диапазон допустимых отклонений приемника — это максимально возможное отклонение реальной скорости передачи информации от частоты внутреннего тактового генератора.
Если передатчик посылает кадры со скоростью, которая недопустимо больше или недопустимо меньше, чем выбранная скорость передачи информации, или частота внутреннего тактового генератора приемника не соответствует основной частоте выбранного режима (см. табл. 1.49), приемник потеряет способность синхронизировать кадры.
Для вычисления предельных значений скорости передачи данных на входе приемника для разных частот внутреннего генератора используются следующие выражения:
^slow =^slow =(0+1)5S-1+D-S+Sf(0+1)5S-1+D-S+Sf
^slow =
^slow =
(0+1)5
S-1+D-S+Sf
(0+1)5
S-1+D-S+Sf
R =
fast (D+1)S+SM '
где:
D — суммарное количество битов: биты данных плюс биты четности (D = 5—10 бит);
S — количество выборок на бит. S — 16 в режиме нормальной скорости и S = 8 в режиме двойной скорости;
SF — минимальное количество выборок, достаточное для распознавания. Sp = 8 для режима нормальной скорости и SF = 4 для режима двойной скорости;
SM — среднее количество выборок, достаточное для распознавания. 8м = 9 для режима нормальной скорости и SM = 5 для режима двойной скорости;
R$iow — отношение между самой медленной скоростью передачи данных на входе, когда данные еще могут быть приняты, и скоростью приема данных приемника;
Rfasi — отношение между самой быстрой скоростью передачи данных на входе, когда данные еще могут быть приняты, и скоростью приема данных приемника.
В табл. 1.49 и 1.50 перечислены максимально допустимые значения отклонения скорости передачи информации на входе приемника. Обратите внимание, что режим нормальной скорости имеет более высокую устойчивость к изменениям скорости передачи информации.
Таблица 1.49. Рекомендованное максимальное отклонение скорости передачи информации на входе приемника для режима одинарной скорости ( U2X = 0)
D # (Данные+бит четности)
R&IOW №
Rf«t(%)
Максимально возможное отклонение (%)
Рекомендованное отклонение (%)
5
93,20
106,67
+ 6,67/-6,8
±3,0
6
94,12
105,79
+5,79/-5,88
±2,5
7
.94,81
105,11
+5,11/-5,19
±2,0
8
95,36
104,58
+4,58/-4,54
±2,0
9
95,81
104,14
+4,147—4.19
±1,5
10
96,17
103,78
+ 3,787-3,83
±1,5
Таблица 1.50. Рекомендованное максимальное отклонение скорости передачи информации на входе приемника для режима двойной скорости (U2X - 1)
D # (Данные+бит четности)
^slOw
(%)
Rfast (%)
Максимально возможное отклонение (%)
Рекомендованное отклонение (%)
5
94,12
105,66
+ 5,667-5,88
±2,5
6
94,92
104.92
+ 4,92/-5,08
±2,0
7
95,52
104.35
+ 4,357-4,48
±1,5
8
96,00
• 103,90
+3.90/-4,00
±1.5
9
96,39
103,53
+3,537-3,61
±1,5
10
96,70
103,23
+3.237-3,30
±1,0
Рекомендации для максимального отклонения скорости передачи информации на входе приемника были сделаны исходя из предположения, что это отклонение поровну делится между приемником и передатчиком.
Есть две возможные причины отклонения скорости передачи информации на входе приемников.
Во-первых, системный тактовый генератор (XTAL) всегда будет иметь незначительное отклонение частоты генерации из-за изменения напряжения питания и температуры. Но при использовании кварцевого резонатора это отклонение может быть сведено до минимума, поскольку отклонение частоты в этом случае не превышает 2 % от номинального значения.
Вторая причина возможных отклонений легко корректируема. В генераторе тактового сигнала для системы передачи информации не всегда может быть выбран подходящий коэффициент деления для получения требуемой частоты. В этом случае нужно использовать такое значение регистра UBRR, которое дает приемлемо низкую ошибку.
Режим мультипроцессорного обмена
Установка флага разрешения режима мультипроцессорного обмена (бит МРСМ регистра UCSRA) включает функцию фильтрации кадров, полученных приемником USART. Кадры, которые не являются адресом, будут игнорироваться и не будут записываться в буфер приема. Это значительно уменьшает количество кадров, которое должно быть обработано центральным процессором в системе, где к одной последовательной шине подключено сразу множество микроконтроллеров. Установка флага МРСМ не затрагивает работу передатчика. Но в режиме мультипроцессорного обмена передатчик используется по-другому.
Если приемник установлен в режим приема кадров, имеющих 5—8 информационных разрядов, то первый стоповый бит указывает, что содержит этот кадр:
данные;
адрес.
Если выбран режим приема кадров размером в девять информационных разрядов, то для того, чтобы отличить данные от адреса, используется девятый информационный разряд (RXB8). Когда разряд, определяющий тип передаваемого кадра (первый стоповый бит или девятый бит данных), равен единице, это означает, что кадр содержит адрес. Когда бит типа кадра равен нулю, текущий кадр — это кадр данных.
Режим мультипроцессорного обмена дает возможность нескольким ведомым микроконтроллерам получить данные от одного ведущего микроконтроллера. Это достигается установкой всех ведомых микросхем в режим ожидания адреса, что позволяет узнать, к какому из ведомых устройств обращается ведущее. Переданный адрес получают сразу все ведомые устройства.
Программа обработки мультипроцессорных запросов каждого микроконтроллера должна сравнить принятый адрес со своим собственным адресом, присвоенным ему программистом. Если адрес сойдется, программа сбрасывает флаг МРСМ и переходит в обычный режим обмена информацией. Остальные микроконтроллеры останутся в режиме ожидания своего адреса.
После этого между ведущим и ведомым устройствами происходит обмен информацией. Все передаваемые (принимаемые) данные должны иметь признак типа кадра равный нулю (кадр данных). Остальные микроконтроллеры игнорируют всю эту информацию, так как работают в режиме фильтрации и пропускают только кадры с адресом.
По завершению процесса обмена управляющая программа ведомого устройства, участвовавшего в этом обмене, должна установить в единицу флаг МРСМ и перевести, таким образом, микроконтроллер в мультипроцессорный режим работы. После этого ведущий микроконтроллер должен передать новый кадр с адресом и инициализировать таким образом новое ведомое устройство.
Рассмотрим подробно регистры USART.
Регистр ввода—вывода USART — UDR
Номер бита 76543210
RXB[7 0]ТХВ[7:0]RXB[7 0]ТХВ[7:0]UDR (Чтение)
RXB[7 0]
ТХВ[7:0]
RXB[7 0]
ТХВ[7:0]
UDR (Запись)
Чтение(Н)/Запись(«0 R/W R/W R/W R/W R/W R/W R/W R/WНачальное значение 00000000
Регистр буфера передаваемых данных USART и регистр буфера принимаемых данных USART совместно используют один и тот же адрес в пространстве ввода—вывода, воспринимаемый как единый
регистр данных (UDR). На самом деле, когда процессор производит запись в регистр UDR, данные попадают в буфер передачи (ТХВ). При чтении из регистра UDR возвращается содержимое буфера приема (RXB).
В пяти-, шести- и семибитовых режимах передачи данных старшие неиспользуемые разряды передатчиком будут игнорироваться, а приемником будут установлены в ноль.
Запись в буфер передачи может производиться только в том случае, когда флаг UDRE регистра UCSRA установлен. Данные, записанные в UDR в тот момент, когда флаг UDRE не установлен, передатчиком USART будут проигнорированы. *
Если данные загружены в буфер передачи, а передача разрешена, то передатчик загружает данные в передающий сдвиговый регистр, если, конечно, он пуст. После этого данные начинают побитно передаваться на выход TxD.
Буфер приемника состоит из двух уровней FIFO. Буфер FIFO изменяет свое состояние всякий раз, когда происходит обращение к нему. Поэтому для обращения к буферу не используйте команды из разряда «чтение/модификация/запись» (SBI и CBI). Будьте внимательны также при использовании команд проверки разрядов (SBIC и SBIS), так как они также изменяют состояние FIFO.
Регистр «А» статуса и управления USART — UCSRA
Номер бита76543210
|RXCg ТХС | UDRE | FE | DOR | UPE | U2X | МРСМ | UCSRA
4TeHMe(R)/3anMCb(W)RR/WRRRRR/WR/W
Начальное значение00100000
Бит 7 — RXC: Флаг завершения приема USART. Этот флаг устанавливается в единицу, если в буфере приемника есть непрочитанные данные, и очищается, когда буфер приемника пуст (то есть не содержит никаких непрочитанных данных). Если приемник заблокирован, буфер приемника будет освобожден, и, следовательно, бит RXC установится в ноль. Флаг RXC может быть использован для генерации прерывания по событию «Прием завершен» (смотри описание разряда RXCIE).
Бит 6 — ТХС: Флаг завершения передачи USART. Этот флаг устанавливается в том случае, если очередной кадр в сдвиговом регистре передатчика был полностью передан, а в буфере передатчика (UDR) нет никаких новых данных, предназначенных для передачи. Флаг ТХС автоматически очищается, когда начинается выполнение соответствующей процедуры обработка прерывания. Флаг может быть очищен программно путем записи в этот бит логической единицы. Флаг ТХС может использоваться для генерации прерывания по событию «Передача завершена» (смотри описание бита TXCIE).
Бит 5 — UDRE: Флаг «Регистр данных USART пуст». Флаг UDRE указывает, готов ли буфер передачи (UDR) принять новые данные. Если UDRE установлен в единицу, то буфер пуст, а значит готов к записи новых данных. Флаг UDRE может вызывать прерывание по событию «Регистр данных пуст» (смотри описание бита UDRIE). Сразу после системного сброса флаг UDRE устанавливается в единицу, указывая на то, что передатчик готов к работе.
Бит 4 — FE: Флаг ошибки кадрирования. Этот бит устанавливается в единицу, если очередная принятая посылка в буфере имеет ошибку кадрирования, то есть если первый столовый бит очередной посылки в буфере приема оказался нулевым. Значение флага остается действительным до тех пор, пока буфер приема (UDR) не будет прочитан. Флаг ЕЕ равен нулю, если стоп бит в принятом кадре равен единице. При перезаписи значения регистра UCSRA этот бит рекомендуется устанавливать в ноль.
Бит 3 — DOR: Флаг переполнения. Этот флаг устанавливается в том случае, если обнаружено переполнение данных. Переполненные данных происходит в том случае, когда буфер приема полон (содержит две посылки), в приемном сдвиговом регистре находится еще одна посылка и обнаружен новый стартовый бит. Флаг сохраняет свое значение, пока приемный буфер (UDR) не будет прочитан. При перезаписи значения регистра UCSRA этот бит рекомендуется устанавливать в ноль.
Бит 2 — UPE: Флаг ошибки контроля четности USART. Этот флаг устанавливается в том случае, если очередное слово данных, находящееся в приемном буфере, имеет ошибку четности и проверка четности в момент приема этого слова была разрешена (UPM1 = 1). Этот флаг действителен до тех пор, пока не прочитан буфер приема (UDR). При записи нового значения в регистр UCSRA этот бит рекомендуется устанавливать в ноль.
Бит 1 — U2X: Удвоение скорости обмена. Этот бит используется только в асинхронном режиме работы. При работе в синхронном режиме рекомендуется этот бит устанавливать в ноль. При установке этого бита в единицу уменьшается коэффициент деления делителя в формирователе скорости обмена с 16 до 8, что приводит к удвоению скорости передачи (приема) информации. .
Бит 0— МРСМ: Режим мультипроцессорного обмена. Этот бит включает режим мультипроцессорного обмена. Если бит МРСМ установлен в единицу, все входящие кадры, полученные приемником USART и не являющиеся адресом, будут игнорироваться. Установка бита МРСМ не затрагивает работу передатчика. Для более детальной информации смотри раздел «Режим мультипроцессорного обмена».
Регистр «В» статуса и управления USART — UCSRB
Номер бита76543210
|RXCIE|TXCiE}UDRIE|RXEN|TXEN|UCSZ2|RXB8|ТХВ8| UCSRB
Чтение(Н)/Записъ(№)A/wR/WR/WR/WA/WR/WRR/W
Начальное значение 00000000
Бит 7 — RXCIE: Разрешение прерывания по завершению приема. При записи в этот бит единицы разрешается генерация прерывания при установке флага RXC. Прерывание по завершении приема USART будет сгенерировано только в том случае, если бит RXCIE установлен в единицу, общий флаг разрешения прерываний (бит I регистра SREG) установлен в единицу, а бит RXC регистра UCSRA также установлен.
Бит 6 — TXCIE: Разрешение прерывания по завершению передачи. При записи в этот бит единицы разрешается генерация прерывания при установке флага ТХС. Прерывание по завершении передачи USART будет сгенерировано только в том случае, если бит TXCIE установлен в единицу, общий флаг разрешения прерываний (бит I регистра SREG) установлен в единицу, а бит ТХС регистра UCSRA также установлен.
Бит 5— UDRIE: Разрешение прерывания по событию «Регистр данных USART пуст». При записи в этот бит единицы разрешается
генерация прерывания при установке флага UDRE. Данное прерывание будет сгенерировано только в том случае, если бит UDRIE установлен в единицу, общий флаг разрешения прерываний (бит I регистра SREG) установлен в единицу, а бит UDRE регистра UCSRA также установлен.
Бит 4 — RXEN: Разрешение приема. При установке этого бита в единицу разрешается работа приемника USART. Когда работа приемника разрешена, переопределяется функция соответствующего вывода микросхемы, и он становится входом сигнала RxD. При сбросе этого флага (отключении приемника) буфер приема освобождается от записанной туда ранее информации, а состояние флагов FE, DOR и UPE игнорируется.
Бит 3 — TXEN: Разрешение передачи. При установке этого бита в единицу разрешается работа передатчика USART. Когда работа передатчика разрешена, переопределяется функция соответствующего вывода микросхемы, и он становится выходом сигнала TxD. При сбросе этого флага (отключении приемника) приемник сразу не отключится. Это действие не будет вступать в силу до тех пор, пока не закончится передача текущего передаваемого слова и слова, которое находится в буфере передачи. То есть передатчик отключается лишь в том случае, когда сдвиговый регистр и буфер передачи не содержат больше данных, предназначенных для передачи. Стандартные функции вывода TxD восстанавливаются, когда режим передачи отключен.
Бит 2 — UCSZ2: Формат посылок. Разряд UCSZ2 данного регистра совместно с разрядами UCSZI:0 регистра UCSRC определяют количество информационных разрядов в кадре (размер слова) как для передачи, так и для приема.
Бит 1 — RXB8: Разряд номер восемь приемного буфера. Бит RXB8 предназначен для хранения девятого информационного разряда принимаемого слова данных при размере кадра в 9 разрядов. Этот бит должен быть прочитан до того, как будет прочитан буфер UDR.
Бит 0 — ТХВ8: Разряд номер восемь буфера передачи.
Бит ТХВ8 — девятый информационный разряд слова данных, предназначенного для передачи при размере кадра в 9 разрядов: Этот разряд должен быть записан перед тем, как младшие 8 разрядов будут записаны в регистр UDR.
Регистр С статуса и управления USART — UCSRC
Номер бита76543210
|— j UMSEL | UPM1 | UPM0 | USBS | UCSZ1 j UCSZO | UCPOL | UCSRC
Чтение! R)/3annCb(W}RR/WR/WR/WR/WR/WR/WR/W
Начальное значение00000110
Бит 6 — UMSEL: Выбор режима работы USART. Этот бит позволяет выбирать синхронный или асинхронный режим работы (смотрите табл. 1.51).
UMSEL
Режим
0
Асинхронный
1
Синхронный
Таблица 1.51.
Выбор режима при помощи бита UMSEL
Биты 5:4 — Выбор режима контроля четности UPMl:0. При помощи этих битов выбирается один из режимов контроля четности (см. табл. 1.52). Если контроль четности включен, передатчик автоматически генерирует и посылает биты контроля четности в каждом кадре переданных данных. Приемник генерирует значение четности для входных данных и сравнивает полученное значение со значением флага UPM0. Если обнаружено несоответствие, устанавливается флаг UPE в регистре UCSRA.
UPM1
UPM0
Режим контроля четности
0
0
Отключено
0
1
Зарезервировано
1
0
Включено, проверка на четность
1
1
Включено, проверка на нечетность
Таблица 1.52.
Выбор режима контроля четности
Бит 3 — USBS: Выбор количества стоповых битов. Этот разряд позволяет выбирать количество стоповых битов (см. табл. 1.53), которые будут вставлены передатчиком в конец каждой посылки. На работе приемника это не отражается.
uses
Режим
0
1 -бит
1
2-бит
Таблица 1.53.
Выбор количества стоповых битов
Биты 2:1 — UCSZ1:O: Формат посылки. Разряды UCSZ1:O совместно с разрядом UCSZ2 регистра UCSRB определяют количество информационных разрядов (размер посылки) в кадре при передаче и приеме информации. Подробнее смотри в табл. 1.54.
Таблица 1.54.Выбор размера слова данных в кадре
UCSZ2
UCSZ1
UCSZ0
Размер посылки
0
0
0
5 бит
0
0
1
6 бит
0
1
0
7 бит
0
1
1
8 бит
1
0
0
Зарезервировано
1
0
1
Зарезервировано
1■
1
0
Зарезераировано
1
1
1
9 бит
Бит 0 — UCPOL: Полярность тактового сигнала. Этот бит используется только в синхронном режиме. При записи в регистр нового значения этот бит рекомендуется обнулить. Бит UCPOL устанавливает связь между фронтами тактового сигнала (ХСК) и моментами передачи/приема очередного бита информации (см. табл. 1,55).
UCPOL
Момент передачи очередного бита данных (на выходе TxD)
Момент приема очередного бита данных (на входе RxD)
0
Передний фронт сигнала ХСК
Задний фронт сигнала ХСК
1
Задний фронт сигнала ХСК
Передний фронт сигнала ХСК
Таблица 1.55.
Установки бита UCPOL
Регистры скорости обмена информации USART —UBRRL и UBRRH
Номер бита
15141312111098
—|—|—|—|UBRR[11:8]
UBRRH UBRRL
UBRR[7:0]
Номер бита
Чтение! R)/3annc.b(W)
Начальное значение
76543210
RRRRR/WR/WR/WR/W
R/WR/WR/WR/WR/WR/WR/WR/W
00000000 00000000
Бит 15:12 — Зарезервированные биты. Эти биты зарезервированы. Для совместимости с будущими устройствами при записи нового значения в регистр UBRRH рекомендуется устанавливать эти биты в ноль.
Бит 11:0— UBRRll:0: Биты, определяющие скорость обмена USART. Эти биты представляют собой 12-разрядный регистр, который содержит скорость передачи информации модуля USART. Регистр UBRRH содержит четыре старших бита, a UBRRL содержит восемь младших битов скорости передачи информации USART. Если в момент передачи или приема информации изменить скорость, то процесс обмена данными будет нарушен. Запись в регистр UBRRL вызывает непосредственное изменение значения скорости передачи информации.
1.12. Универсальный последовательныйинтерфейс — USI
Назначение и особенности
Универсальный последовательный интерфейс (Universal Serial Interface или USI) является основным средством последовательной передачи данных для данного вида микросхем. Используя минимальное программное обеспечение, интерфейс USI позволяет достигать значительно более высоких скоростей передачи информации и
использует меньше программной памяти, чем решения, основанные только на программном способе формирования канала связи. Для минимизации загрузки процессора можно использовать прерывания. Интерфейс USI имеет следующие основные особенности:
двухпроводный синхронный режим передачи данных (Master или Slave, fSCLmax = fCK/16);
трехпроводный синхронный режим передачи данных (Master, fSCKmax = fCK/2, Slave fSCKmax = fCK/4);
прием данных с использованием прерывания;
автоматическое пробуждение из режима Idle;
в двухпроводном режиме: пробуждение из всех режимов сна, кроме Power-down;
проверка стартового условия в двухпроводном режиме с возможностью вызова прерывания.
Краткое описание
Упрощенная блок-схема канала USI показана на рис. 1.41. Действительное расположение контактов ввода—вывода смотрите в разделе «Расположение выводов микросхемы ATtiny2313» в начале данной главы. Адреса размещения регистров и их отдельных битов смотрите в разделе «Описание регистров USI».
Сдвиговый регистр на 8 битов непосредственно доступен через шину данных и содержит принятые либо передаваемые данные. Регистр не имеет никакой буферизации, так что данные должны читаться максимально быстро для того, чтобы избежать их потери. Старший бит в зависимости от выбранного режима непосредственно подключается к одному из двух выходных контактов.
Триггер-защелка вставлен между выводом последовательного регистра и выходным контактом. Он синхронизирует изменение сигнала на выходе данных по отрицательному фронту синхроимпульса выборки данных. Входная информация, независимо от выбранной конфигурации, всегда поступает через вход данных (DI).
Содержимое 4-разрядного счетчика может быть прочитано и записано программным путем. Переполнение счетчика в процессе счета может вызывать прерывание. Сдвиговый регистр и счетчик синхронизируются одним и тем же тактовым сигналом. Это позволяет
Шина данныхШина данныхблок-схемаблок-схема
Шина данных
Шина данных
блок-схема
блок-схема
м о о
счетчику подсчитывать количество принятых или переданных битов и генерировать прерывание в момент, когда передача закончена.
В отличие от других режимов, при использовании внешнего генератора счет происходит по обоим фронтам синхроимпульса. В этом случае счетчик считает количество фронтов, а не количество битов. Тактовый сигнал может поступать от трех различных источников:
с входа USCK;
по переполнению таймера 0;
формироваться программным путем.
Модуль формирования тактового сигнала двухпроводного режима может генерировать прерывание при обнаружении стартового условия на линии. Он также позволяет переводить канал в режим ожидания путем удержания низкого логического уровня на выходе синхронизации:
в случае обнаружения стартового условия;
при переполнении счетчика.
Описание принципа работы в трехпроводном режиме
Работа интерфейса USI в трех проводном режиме похожа на работу интерфейса SPI в режимах 0 и 1. Разница лишь в том, что здесь отсутствует вход выбора ведомого устройства (SS). В случае необходимости выбор ведомого можно осуществить программным путем. Приведу имена контактов, используемых в этом режиме:
DI;
DO;
USCK.
На рис. 1.42 показаны два модуля USI, работающие в трехпроводном режиме. Один ведущий (Master), а второй ведомый (Slave). При таком включении сдвиговые регистры обоих модулей связаны таким образом, что после восьми тактовых импульсов USCK регистры обмениваются своим содержимым.
Те же самые тактовые импульсы увеличивают содержимое 4-раз- рядного счетчика модуля USI. Поэтому флаг переполнения (прерывания) счетчика (USIOIF) может использоваться для определения конца передачи. Особенностью данного интерфейса является возможность формирования тактового сигнала программным путем.
208
Рис. 1.42. Работа интерфейса USI в трехпроводном режиме, упрощенная схема
В трехпроводном режиме синхронизация канала возлагается на ведущее устройство (Master).
Циклы (условно) |1 ~2|3 j 4|5|6|7{8Циклы (условно) |1 ~2|3 j 4|5|6|7{8Программа формирует тактовый сигнал путем изменения сигнала на выводе USCK при помощи регистра PORT либо изменяя бит USITC регистра USICR.
Циклы (условно) |1 ~2|3 j 4|5|6|7{8
Циклы (условно) |1 ~2|3 j 4|5|6|7{8
USCK
USCK
DO
DI
© © ©© © ©©
© © ©
© © ©
Рис. 1.43. Трехпроводной режим, диаграмма работы
Временные диаграммы работы канала в двухпроводном режиме показаны на рис. 1.43. В верхней части рисунка показан тактовый сигнал USCK в прямом и в инверсном виде. Каждый тактовый импульс этого сигнала перемещает на один бит содержимое сдвигового регистра USI (USIDR).
В режиме 0 внешней синхронизации (USICS0 = 0) проверка сигнала на входе DI происходит по переднему фронту, а изменение сигнала на выходе DO (выдача очередного бита информации) происходит по заднему фронту.
В режиме 1 внешней синхронизации (USICS0 = 1) порядок синхронизации прямо противоположный. Оценка данных на входе происходит по отрицательному фронту, а изменение сигнала на выходе — по переднему.
Режимы синхронизации интерфейса USI соответствуют аналогичным режимам передачи данных 0 и 1 интерфейса SPI.
Обратимся теперь к временной диаграмме (рис. 1.43), отражающей процесс передачи данных по последовательной шине. Этот процесс включает в себя следующие шаги.
Шаг 1. Устройство Slave и устройство Master подготавливают систему передачи данных в соответствии с выбранным протоколом
(точки А и В). Подготовка производится путем загрузки байта данных, предназначенного для передачи, в сдвиговый регистр.
Причем данные загружает как Master, так и Slave, — каждый в свой сдвиговый регистр. Настройка направления передачи информации (соответствующих выводов канала связи) производится при помощи того же самого регистра (DDR), который определяет направление передачи информации в обычном режиме работы порта ввода—вывода.
Операции, обозначенные точками А и В, можно выполнять в любом порядке. Главное, чтобы обе они завершились не позже половины тактового цикла синхросигнала USCK до начала следующего этапа (точка С), где происходит выборка данных. Это необходимо, чтобы гарантировать своевременную подготовку данных. Четырехразрядный счетчик на этом этапе сбрасывается в ноль.
Шаг 2. Ведущий микроконтроллер (Master) программным путем вырабатывает один импульс тактового сигнала, дважды переключая значение USCK (точки С и D). По переднему фронту сигнала USI (точка Q) происходит выборка значений на входах DI обоих устройств (Slave и Master). По заднему фронту тактового сигнала (точка D) происходит изменение сигнала на выходах DO тех же устройств. Четырехразрядный счетчик увеличит свое значение как по переднему, так и по заднему фронту. Шаг 2 повторяется восемь раз до окончания передачи все восьми битов (байта).
Шаг 3. После восьми тактовых импульсов (то есть после 16 фронтов синхроимпульса) произойдет переполнение счетчика, что послужит сигналом конца передачи (точка Е). Управляющая программа должна обработать полученные данные перед тем, как начинать передачу новых. Для обработки данных можно использовать прерывание. Прерывание по переполнению четырехразрядного счетчика способно пробудить микроконтроллер из режима сна (только из режима Idle).
Пример операции SPI для ведущего устройства
Следующий программный пример (см. Листинг 1.17 и 1.18) показывает, как можно использовать модуль SPI в качестве ведущего устройства SPI.
Данный программный код оптимизирован по размеру и содержит только восемь команд (плюс команда ret). Предполагается, что ранее в программе вывод USCK уже сконфигурирован как выход при помощи регистра DDRE. Значение, которое требуется передать
ведомому устройству, перед вызовом данной функции помещается в регистр г16. По окончании процесса передачи данные, полученные от Slave, также сохраняются в регистре г!б.
Листинг 1.17.Пример на ассемблере
Пример на языке Ассемблер
SPITransfer'
out
USIDR, r 16
Idi
r 16, (1«USIOIF)
out
USISR r16
I d j
r 16. ( K<USIWM0) | (1«USICS1) | (1 «USICLK) | (1«USITC)
SPITransfer loop
out
USICR.r16
sbis
USISR.USIOIF
i jmp
SPITransfer loop
in
r 16. USIDR
ret
Вторая и третья команды сбрасывают флаг переполнения USI, а также его текущее значение. Четвертая и пятая команды устанавливают трехпроводный режим работы, вырабатывают положительный фронт для синхронизации сдвигового регистра, устанавливают строб USITC и переключают значение USCK.
Шестая команда проверяет значение флага переполнения счетчика. Цикл повторяется 16 раз, пока не обнаружится переполнение.
В следующем программном примере (см. Листинг 1.18) приведен другой вариант той же самой функции, оптимизированной по скорости работы (fsck = fck/2):
Листинг 1.18.Пример на ассемблере
Пример на языке Ассемблер
SPII ransf er_Fast
outUSIDR. г 16
Ldiг 16. (1«USIWMO)I(O«USICSO)I(1«US1TC)
Idir17. (K<USIWMO)|(O«USICSO)|U«USITC)|( 1<ZUSICLK)
outUSICR г 16 Пеоедача старшего бита
outUSICR r17
outUSICR.'"16
outUSICRr17
outUSICRИ6
outUSICRH7
outUSICRr16
outUSICRr17
outUSICR,r16
outUSICR.ri?
outUSICR.r16
outUSICR.r!7
outUSICR.r16
outUSICR.r17
outUSICR,r 16 : Передача младшего бига
outUSICRi17
in< 16 USIDR
ret
Пример операции SPI для ведомого устройства
Следующий программный пример (см. Листинг 1.19) показывает, как можно использовать модуль SPI в качестве ведомого устройства SPL
Листинг 1.19.
Пример на языке Ассемблер
mil
Idi
r 16, (K^USIWMO) Ц 1«USICS1)
out
USICR. r16
SlaveSPIlfansfer
out
USIDR. Г16
. Idi
r!6. (1«USIOIF)
out
USISR Г16
SlaveSPITransfer
loop- USISR,USIOIF
sins
r jmp
SlaveSPITransfer loop
in
r16.USIDR
ret
Приведенный выше пример программы оптимизирован по размеру. Он состоит всего из восьми команд (плюс команда ret). Данный пример предполагает, что вывод DO сконфигурирован как выход, а вывод USCK — как вход. Байт данных, предназначенный для передачи с ведомого на ведущее устройство, перед вызовом функции должен быть помещен в регистр г16. После завершения работы функции данные, полученные от ведущего устройства, также сохраняются в регистре г16.
Принцип действия в двухпроводном режиме
Двухпроводный канал USI не имеет никаких ограничений по скорости передачи сигнала на выходе, но имеет систему подавление помех на входе. Название контактов, используемое в этом режиме:
SCL;
SDA.
На рис. 1.44 показаны два модуля USI, соединенные между собой каналом USI, работающим в двухпроводном режиме. Один из этих модулей выступает в роли ведущего (Master), а второй в роли ведомого (Slave).
Как видите, изменение схемы подключения вызвало также изменение на уровне аппаратной части канала. Основное различие в
213
Рис. 1.44. Работа в двухпроводном режиме, упрощенная схема
работе устройств Master и Slave на этом уровне состоит в способе их синхронизации.
Во всех случаях тактовый сигнал вырабатывает Master, a Slave использует специальный модуль синхронизации. Генерация тактового сигнала должна производиться программным путем, при этом операция сдвига происходит автоматически, одновременно для обоих устройств.
Внимание. В данном режиме для синхронизации операция сдвига обыч- , но происходит по заднему фронту синхроимпульса.
Ведомое устройство может перевести канал в режим ожидания в начале или в конце процесса передачи байта, устанавливая на выходе SCL низкий логический уровень. Это означает, что Master после того, как сформирует положительный фронт на линии SCL, должен обязательно проверить, свободна ли линия (действительно ли там логическая единица).
Так как один и тот же тактовый сигнал не только синхронизирует сдвиговый регистр, но и одновременно увеличивает содержимое четырехразрядного счетчика, переполнение счетчика может быть использовано для определения момента окончания передачи очередного байта. Тактовый сигнал вырабатывается ведущим устройством путем переключения вывода SCL при помощи регистра PORTB.
Направление передачи данных на физическом уровне не определено. Для управления потоком данных должен быть осуществлен протокол, подобный тому, который используется TWI-шиной (аналог PC). -
Рис. 1.45. Двухпроводной режим, типовая временная диаграмма
Как видно из временной диаграммы (рис. 1.45), процесс передачи данных включает в себя следующие шесть шагов.
Шаг 1. Процесс передачи байта данных начинается с того, что Master формирует стартовое условие: переход сигнала на линии SDA с высокого логического уровня на низкий в то время, когда на линии SCL присутствует высокий уровень (точка А).
Низкий уровень на линии SDA может быть установлен путем записи логического нуля в 7-й разряд сдвигового регистра или обнулением соответствующего разряда в регистре PORTB. При этом данный вывод порта должен быть сконфигурирован как выход (установкой нужного разряда в DDRB).
Схема распознавания стартового условия ведомого устройства (см. рис. 1.46) обнаруживает это условие и устанавливает флаг USISIF. В случае необходимости при установке этого флага может генерироваться прерывание.
Шаг 2. Сигнал на выходе схемы обнаружения стартового условия будет удерживаться и после того, когда Master сформирует отрицательный фронт на линии SCL и уровень сигнала на этой линии окажется равным нулю (точка В). Это позволяет Slave-устройству при необходимости пробудиться ото сна или завершить выполняемую в этот момент задачу и подготовить сдвиговый регистр для приема адреса. Для этого должен быть очищен флаг USISIF и сброшен четырехразрядный счетчик.
Шаг 3. Ведущее устройство подает на выход первый информационный бит и освобождает линию SCL (точка С). По положительному фронту сигнала на входе SCL ведомое устройство производит выборку бита данных и записывает его в свой сдвиговый регистр.
Шаг 4. После того, как переданы семь битов адреса и один бит, определяющий направление передачи информации (чтение или запись), происходит переполнение счетчика ведомого устройства, и на линии SCL устанавливается низкий логический уровень (точка D). Если адрес ведомого устройства не соответствует переданному адресу, оно освобождает линию SCL и ожидает нового стартового условия.
Шаг 5. Если переданный адрес соответствует адресу ведомого устройства, оно вырабатывает сигнал подтверждения — удерживает на линии SDA низкий логический уровень. Низкий логический уровень удерживается на линии SDA в течение всего цикла подтверждения до момента окончания синхроимпульса на линии SCL.
Затем, в зависимости от значения бита R/W, либо Master, либо Slave начинают процесс передачи. Если бит R/W равен единице, то ведущее устройство переходит в режим чтения (то есть ведомое устройство управляет линией SDA). Ведомое устройство может удерживать линию SCL и после окончания фазы распознавания (вплоть до точки Е).
Шаг 6. Теперь в выбранном направлении может передаваться любое количество байтов данных до тех пор, пока Master не сформирует стоп-условие (точка F). Или не будет сформировано новое стартовое условие.
Если в процессе передачи Slave уже не может получить очередной байт данных, то этот байт теряется. Если Master выполняет чтение данных, то для окончания процесса чтения цепочки данных необходимо при получении очередного байта принудительно установить нулевой бит подтверждения.
SDASDASCLЗапись (USISIF)SCLЗапись (USISIF)Рис. 1.46. Схема детектора стартового условияРис. 1.46. Схема детектора стартового условия
SDA
SDA
SCL
Запись (USISIF)
SCL
Запись (USISIF)
Рис. 1.46. Схема детектора стартового условия
Рис. 1.46. Схема детектора стартового условия
Схема обнаружения стартового условия
Схема обнаружения стартового условия показана на рис. 1.46. Для того, чтобы гарантировать надежную выборку сигнала с линии SCL, производится задержка сигнала SDA (величина задержки 50—300 нс).
Датчик стартового условия работает в асинхронном режиме и поэтому способен пробудить процессор из спящего режима «Powerdown». Однако использование спящих режимов налагает дополнительные условия на длительность сигнала SCL. В этом случае при выборе длительности входного сигнала также должно учитываться время запуска генератора, установленное fuse-переключателем CKSEL (смотри раздел «Тактовый генератор и его окружение»).
Альтернативное использование USI
Если модуль USl не используется для передачи данных, то он, благодаря гибкости схемного решения, может быть использован для решения других задач.
Полудуплексная асинхронная передача данных
При использовании сдвигового регистра в трехпроводном режиме можно получить более компактную и быстродействующую программу UART, чем при чисто программной его реализации.
Четырехразрядный счетчик. Четырехразрядный счетчик может использоваться как автономный счетчик с прерыванием по переполнению. Обратите внимание, что если счетчик синхронизирован от внешнего сигнала, приращение счетчика вызывают оба фронта синхроимпульса.
12-разрядный таймер/счетчик. Объединение 4-разрядного счетчика USI и таймера/счетчика 0 позволяет использовать их как один 12- разрядный счетчик.
Запускаемое фронтом внешнее прерывание. При записи в счетчик максимального значения (OxF) он может работать как дополнительное внешнее прерывание. В этом случае флаг прерывания по переполнению счетчика и бит разрешения прерывания используются для управления этим внешним прерыванием. Этот режим выбирается при помощи бита USICS1.
Программное прерывание. Прерывание по переполнению счетчика может использоваться как программное прерывание, вызванное стробом тактового сигнала.
Рассмотрим подробно регистры USI.
Регистр данных USI — USIDR
Номер бита 76543210
| MSB [ I I I I || LSB I USIDR
Чтение(Н)/Зались(^R/wR/WR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Модуль USI не использует буферизации, то есть при записи или чтении информации из регистра USIDR процессор непосредственно обращается к сдвиговому регистру. Если тактовый сигнал поступает на сдвиговый регистр в том же самом цикле, когда происходит запись значения в регистр, приращение регистра не выполняется, и в регистре останется только что записанное значение.
Выполнение операции сдвига (влево) зависит от установки битов USICS1—0. Операция сдвига может производиться:
по фронту внешнего синхроимпульса;■
по переполнению таймера/счетчика 0;
непосредственно программным путем с использованием бита . USICLK в качестве строба.
Внимание. Даже если не выбран ни один из двух режимов работы USI (USIWM1—0 = 0), оба внешних контакта — линия данных (DHSDA) и линия тактового сигнала (USCK/SCL) — могут использоваться сдвиговым регистром.
Выход данных (в зависимости от выбранного режима это DO или SDA) соединен через внутренний электронный переключатель со старшим разрядом (бит 7) регистра данных. Триггер-защелка:
открыт (прозрачен) в течение первой половины цикла сдвига, если выбран внешний источник тактового сигнала (USICS1 = 1);
открыт постоянно, если используется внутренний источник тактового сигнала (USICS1 = 0).
Сигнал на выходе будет изменен немедленно, если в момент появления нового значения MSB триггер защелка находится в прозрачном состоянии. Применение триггера защелки гарантирует, что момент считывания данных на входе и момент их изменения на выходе будут синхронизированы противоположными фронтами тактового сигнала.
Примечание. Для того чтобы данные с выхода сдвигового регистра могли поступать на внешний контакт микросхемы, необходимо сконфигурировать его как выход.
Регистр состояния USI — USISR
Номер бита76543210
[jusisiFjjJsioi^jj^usisr
Чтение(Н)/Запись(М)R/WR/WR/WRR/WR/WR/WR/W
Начальное значение00000000
Регистр состояния содержит флаги прерывания, флаги состояния линии и значение счетчика.
Бит 7 — USISIF: Флаг прерывания по обнаружению стартового условия. Если выбран двухпроводный режим работы, то флаг USISIF устанавливается (в единицу), если обнаружено стартовое условие.
Если выбран режим отключения выхода или в трехпроводном режиме выбрана одна из комбинаций битов (USICSx = Obi 1 и USICLK = 0 или USICS = 0Ы0 и USICLK = 0), то флаг устанавливается по любому фронту на входе SCK.
Прерывание будет сгенерировано в том случае, когда установлены в единицу:
данный флаг; ■
бит разрешения прерывания USISIE регистра USICR;
флаг глобального разрешения прерывания (I).
Флаг может быть очищен только путем записи логической единицы в разряд USISIF. В двухпроводном режиме очистка этого бита освобождает линию USCL, удержание которой начинается с момента обнаружения стартового условия. Прерывание по обнаружению стартового условия приводит к пробуждению процессора из всех спящих режимов.
Бит 6 — USIOIF: Флаг прерывания по переполнению счетчика. Этот флаг устанавливается (в единицу) в том случае, когда переполняется 4-разрядный счетчик (то есть при переходе его содержимого от 15 к 0). Прерывание будет сгенерировано, если установлены:
данный флаг;
бит USIOIE регистра USICR;
флаг глобального разрешения прерываний (I).
Флаг может быть очищен только путем записи единицы в бит USIOIF. В двухпроводном режиме очистка этого бита освобождает линию SCL, удержание которого начинается в момент переполне-
ния счетчика. Переполнение по переполнению счетчика пробуждает процессор из спящего режима Idle.
Бит 5— USIPF: Флаг обнаружения стоп-условия. Если выбран двухпроводный режим, флаг USIPF устанавливается (в единицу) в том случае, когда обнаружено стоп-условие. Флаг сбрасывается путем записи в него единицы.
Внимание. Этот флаг не является флагом прерывания. Этот сигнал полезен при осуществлении ведущим устройством арбитража и управления двухпроводной шиной.
Бит 4 — USIDC: Коллизия при выводе данных. Значение этого бита устанавливается в единицу, если значение 7-го разряда сдвигового регистра отличается от физического значения сигнала на выходном контакте микросхемы. Флаг действителен только в двухпроводном режиме и полезен при осуществлении ведущим устройством арбитража и управления шиной в двухпроводном режиме.
Биты 3...0 — USICNT3...0: Содержимое 4-разрядного счетчика
Эти биты отражают текущее значение 4-разрядного счетчика. Центральный процессор при помощи этих битов может непосредственно читать или записывать значение 4-разрядного счетчика.
Приращение 4-разрядного счетчика на единицу происходит:
от каждого тактового импульса, получаемого детектором фронтов внешнего тактового сигнала, по переполнению таймера/ счетчика 0;
программным путем посредством битов стробирования USICLK и USITC.
Выбор источника тактового сигнала производится при помощи битов USICS1—0. При использовании внешнего тактового сигнала возникает дополнительная возможность формирования тактового сигнала путем записи бита строба USITC. Эта возможность включается путем записи единицы в бит USICLK при выборе внешнего источника тактового сигнала (USICS1 = 1).
Внимание. Даже если не выбран ни один из режимов работы USI (US1WM1—0 = 0), внешний вход синхронизации (USCK/ SCL) может использоваться счетчиком.
Регистр управления USI — USICR
Номер бита 765432 ТО
| USISIE I USIOIE I USIWMl| USIWMO | USICS1 I USICSO I USICLK | USITC I USICR
Чтение(А)/Запись(М/} Я/W R/W R/W Я R/W R/W Я/W R/W
Начальное значение 00000000
Регистр управления содержит:
биты управления прерываниями;
биты выбора режима USI (одно- или двухпроводный);
биты выбора источника тактового сигнала;
бит строба синхронизации.
Бит 7 — USISIE: Разрешение прерывания по стартовому условию. При установке этого бита в единицу разрешается прерывание по обнаружению стартового условия. Если есть отложенное прерывание, а флаги USISIE и глобального разрешения прерываний установлены в единицу, то прерывание будет вызвано немедленно.
Бит 6 — USIOIE: Разрешение прерывания по переполнению счетчика. Запись в этот бит единицы разрешает прерывание по переполнению счетчика. Если есть отложенное прерывание, а флаги USIOIE и глобального разрешения прерываний установлены, прерывание будет вызвано немедленно.
Бит 5..4— USIWM1..0: Выбор режима (двухпроводный/трехпро- водный). При помощи этих двух битов выбирается режим работы USI. Эти биты, в основном, влияют лишь на процесс вывода информации. Порядок работы входов (входа данных и входа тактового сигнала) не зависит от выбранного режима.
Поэтому внешний тактовый сигнал всегда поступает на 4-разряд- ный счетчик, сдвиговый регистр и выборки сигнала данных, даже если все выходные сигналы заблокированы. В табл. 1.56 показаны все возможные режимы работы модуля USI и соответствующие им состояния битов USIWMI:0.
Режимы работы модуля USI, определяемые битами USIWM1 —О
USIWM1
USIWMO
Описание
0
0
Выходные сигналы, система захвата синхросигнала и детектор стартового условия отключены. Соответствующие выводы ■ микросхемы выполняют свои основные функции
0
1
Трехпроводный режим. Используются линии DO, D1 и USCK.
Для вывода микросхемы, соответствующего линии DO (выход данных’) отменяется действие соответствующего бита регистра PORTB. Соответствующий бит регистра DDRB все еще управ- ■ ляет направлением передачи информации. Если контакт порта сконфигурирован на ввод, соответствующий бит регистра PORT управляет подключением внутреннего резистора нагрузки.
Еще два вывода того же порта приобретают альтернативные функции. Это вывод, соответствующий линии «Ввод данных» (DI) и вывод, соответствующий линии «Синхронизации» (USCK). Но активизация альтернативных функций в данном случае не отменяет основных. Если микросхема работает в качестве ведущего устройства, то необходимо предусмотреть программную генерацию тактовых импульсов путем переключения соответствующего разряда регистра PORTS. При этом данный вывод микросхемы должен быть сконфигурирован как выход. Для программной синхронизации также может использоваться бит USITC регистра USICR
1
0
Двухпроводный режим. Используются линии SDA (то же, что и Di) и SCL (то же, что и USCK).
Примечание. Выводы D! и USCK переименованы соответственно в SDA и SCL для того, чтобы избежать путаницы при работе в разных режимах.
Линия «Данные» (SDA) и линия «Тактовый сигнал» (SCL) — двунаправленные и используют выходной каскад с открытым коллектором. Эти каскады включаются при установке в единицу соответствующих битов в регистре DDRB.
Если включен выходной каскад для линии SDA, то уровень напряжения на этой линии зависит как от сигнала на выходе сдвигового регистра, так и от сигнала на соответствующем разряде регистра PORTS. Если хотя бы один из этих сигналов равен нулю, то на выходе SDA устанавливается низкий логический уровень. В противном случае линия SDA будет освобождена (напряжение на линии будет зависеть от других подключенных к ней устройств).
Если включен выходной каскад для линии SCL, то уровень напряжения на этой линии зависит от соответствующего бита регистра PORTB и от сигнала на выходе детектора стартового условия.
Если значение хотя бы одного из этих сигналов равно нулю, на линии устанавливается низкий логический уровень. В противном случае линия SCL будет освобождена. На линии SCL удерживается низкий логический уровень в том случае, если обнаружено стартовое условие и вывод информации разрешен.
Очистка флага стартового условия (USISIF) освобождает линию. При работе линий SDA и SCL в качестве входов выбор данного режима никакого влияния не оказывает. В двухпроводном режиме внутренние нагрузочные резисторы всегда отключены
USIWM1
USIWM0
Описание
1
1
Двухпроводный режим. Использует линии SDA и SCL.
Этот режим является модификацией предыдущего. Отличие состоит в том, что на линии SCL низкий логический уровень появляется также и в случае переполнения 4-х разрядного счетчика и удерживается в этом состоянии до тех пор, пока не будет очищен флаг переполнения таймера (USIOIF)
Таблица 1.56.
Продолжение
Бит 3..2 — USICS1..0: Выбор источника тактового сигнала. Эти биты позволяют выбирать источник тактового сигнала для сдвигового регистра и четырехразрядного счетчика. Применение триггера-защелки для формирования данных гарантирует, что при использовании внешнего источника тактового сигнала (USCK/SCL) изменение сигнала на выходе всегда будет происходить по одному фронту тактового импульса, а выборка сигнала на входе (DI/SDA) — по другому его фронту.
Если выбран программный способ синхронизации по установке строба или синхронизация по переполнению таймера/счетчика О, триггер-защелка постоянно находится в прозрачном состоянии, и поэтому все изменения на выходе данных происходят немедленно.
При USICSI:0 = 00 включается режим программного формирования стробирующего импульса. В этом случае запись единицы в бит USICLK вызывает как срабатывание сдвигового регистра, так и итерацию счетчика. Если выбран внешний источник тактового сигнала (USICS1 = 1), то бит USICLK больше не использует в качестве строба. Теперь он служит для выбора между внешней синхронизацией и программной синхронизацией с использованием в качестве строба бита USITC.
В табл. 1.57 показаны варианты источников тактового сигнала для сдвигового регистра и 4-разрядного счетчика, выбираемые при помощи битов USICSI:0 и бита USICLK.
Бит 1 — USICLK: Строб синхронизации. Если биты USICSL0 установлены в ноль, выбран режим разрешения программного стробирования^ то запись единицы в этот разряд вызывает сдвиг информации в сдвиговом регистре на один шаг и увеличивает значение 4-разрядного счетчика на единицу.
При поступлении строба сигналы на выходе изменятся немедленно. То есть в том же самом цикле тактовой частоты, в котором выполняется установка строба. Значение, попадающее на вход сдвигового регистра, формируется во время предыдущей команды сдвига. При чтении регистра бит USICLK всегда равен нулю.
Связь между значениями USICS1..0, USICLK и режимами синхронизации
USICS1
USICSO
USICLK
Источник тактового сигнала сдвигового регистра
Источник тактового сигнала 4-разрядного счетчика
0
0
0
Нет тактового сигнала
Нет тактового сигнала
0 ■
0
1
Программное формирование строба (USICLK)
Программное формирование строба (USICLK)
0
1
X
Переполнение таймера/счет- чика 0
Переполнение таймера/ счетчика 0
1
0
0
Внешняя синхронизация по положительному фронту
Внешняя синхронизация от обоих фронтов
1
1
0
Внешняя синхронизация по отрицательному фронту
Внешняя синхронизация от обоих фронтов
1
0
1
Внешняя синхронизация по положительному фронту
Программное формирование строба (USITC)
1
1
1
Внешняя синхронизация по отрицательному фронту
Программное формирование строба (USITC)
Если выбран режим внешней синхронизации (USICS1 = 1), функция бита USICLK изменяется. Он уже не исполняет роль строба, а используется для переключения источника сигнала синхронизации счетчика.
В этом случае при установке бита USICLK в единицу в качестве источника синхроимпульсов для 4-разрядного счетчика выбирается бит USITC, который в данном случае используется как строб (см. табл. 1.57).
Бит 0 — USITC: Переключение значения тактового сигнала. Запись единицы в этот разряд переключает значение линии USCK/SCL с нуля на единицу или с единицы на ноль. Переключение сигнала на выходе происходит вне зависимости от установленного направления передачи информации для этой линии порта.
Если необходимо, чтобы на выход поступал сигнал с регистра PORTB, разряд DDRB4 должен быть установлен в единицу (режим вывода информации). Эта особенность позволяет простым способом осуществлять программную генерацию тактового сигнала при работе микросхемы в качестве ведущего устройства. При чтении регистра бит USITC всегда равен нулю.
В режиме внешней синхронизации (US1CS1 = 1) при установленном бите USICLK запись единицы в бит строба USITC приведет к непосредственному увеличению содержимого 4-разрядного счетчика. Это позволяет при работе в режиме Master своевременно обнаруживать момент окончания передачи данных.
Аналоговый компаратор
Назначение и особенности
Аналоговый компаратор сравнивает аналоговые напряжения на прямом A1N0 и на инверсном AIN1 входах. Когда напряжение на прямом входе окажется выше, чем напряжение на инверсном входе, на выходе компаратора (АСО) устанавливается логическая единица.
Сигнал с выхода компаратора может быть использован как сигнал захвата таймера/счетчика 1. Кроме того, компаратор может вызывать специальное прерывание — прерывание по срабатыванию аналогового компаратора.
Пользователь может выбрать один из двух вариантов вызова прерывания:
по появлению единицы на выходе компаратора;
по появлению нуля.
Блок-схема компаратора и схема логики его окружения показана на рис. 1,47.*
Регистр статуса и управления аналоговогокомпаратора — ACSR
Номер бита76543210
| ACD ( ACBG | АСО | ACI | АС1Е j АСЮ | ACIS1 | ACISO | ACSR
Чтение(В)/ЗаписьО«)R/WR/WЯH/WR/WR/WH/WR/W
Начальное значениеООN/A00000
Бит 7 — ACD: Отключение аналогового компаратора. Если значение этого бита равно логической единице, то питание аналогового компаратора отключается. При помощи данного бита аналоговый компаратор можно отключить в любой момент. Отключение компаратора уменьшит потребляемую мощность, как в активном, так и в спящем Idle-режиме.
225225Перед тем, как изменять значение бита ACD, необходимо запретить прерывание от аналогового компаратора, для чего следует очистить бит ACIE регистра ACSR. В противном случае возможно возник-
225
225
8 Зак. 944
К схеме захвата таймера/счетчика
Рис. 1.47. Блок-схема аналогового компаратора
новение ошибочного запроса на прерывание в момент отключения компаратора.
Бит 6 — ACBG: Выбор источника опорного напряжения аналогового компаратора. Когда этот бит установлен в единицу, неинвертирующий вход компаратора отключается от внешнего сигнала и подключается к внутреннему источнику опорного напряжения. Как только бит ACBG сбрасывается в ноль, на неинвертирующий вход компаратора снова подается внешний сигнал с контакта AINO.
Бит 5 — АСО: Выход аналогового компаратора. Сигнал с выхода аналогового компаратора привязывается к внутреннему тактовому сигналу таким образом, чтобы изменение его значения происходило только в момент прихода тактового импульса. И лишь затем этот сигнал непосредственно поступает на бит АСО и на другие системы микроконтроллера. Система привязки к тактовому сигналу вносит задержку на срабатывание компаратора длительностью в 1—2 цикла тактового генератора.
Бит 4 — ACI: Флаг прерывания от компаратора. Этот бит аппаратно устанавливается, когда на выходе компаратора возникает условия генерации прерывания, определяемые значением битов ACIS1 и ACIS0. Прерывание от аналогового компаратора возникает в том случае, если бит ACIE установлен, а также установлен флаг глобального разрешения прерываний I, входящий в состав регистра SREG. Флаг ACI сбрасывается аппаратно при запуске соответствующей процедуры обработки прерывания. Флаг можно также сбросить программно, если записать в этот разряд единицу.
Бит 3 — ACIE: Разрешение прерывания от аналогового компаратора. Если в разряде ACIE записана логическая единица, а флаг I регистра состояния также установлен, то разрешается прерывание от аналогового компаратора. Если значение разряда равно нулю, прерывание запрещено.
Бит 2 — ACIC: Разрешение режима захвата от компаратора. При записи в этот разряд логической единицы включается режим захвата таймера/счетчика! от аналогового компаратора. Выход компаратора в этом случае непосредственно подключается к входу схемы захвата. Это позволяет использовать при захвате от компаратора схему шумоподавления и схему выбора активного фронта.
Если значение разряда ACIC равно нулю, то выход компаратора отключается от входа схемы захвата. Для того, чтобы сигнал от компаратора мог вызывать прерывание по захвату таймера/счетчика!,
бит ICIE1 регистра маски прерываний таймера (TIMSK) должен быть установлен в единицу.
Биты 1, О— ACIS1, ACIS0: Выбор условия возникновения прерывания. При помощи этих двух разрядов можно выбрать условия возникновения прерывания от аналогового компаратора. Все возможные варианты условий возникновения прерывания приведены в табл. 1.58.
Таблица 1.58.Установки разрядов ACIS1/ACIS0
ACIS1
ACISO
Режим прерывания
0
0
Прерывание по любому изменению сигнала на выходе компаратора
0
1
Зарезервировано
1
0
■Прерывание по заднему фронту сигнала с выхода
компаратора (переход с 1 на 0)
1
1
Прерывание по переднему фронту сигнала с выхода компаратора (переход с 0 на 1)
В момент изменения значений разрядов ACIS1/ACIS0 прерывание от аналогового компаратора должно быть запрещено путем очистки бита разрешения прерывания регистра ACSR. В противном случае в момент изменения значения битов возможно возникновение ложного запроса на прерывание. .
Регистр отключения цифрового ввода — DIDR
Номер бита
7
6
5
4
3
2
1
0
—■
| AIN1D
| AIN0D |
DIDR
Нтение( Н)/Запись(У/)
R
R
R
R
R
R
R/W
R/W
Начальное значение
0
0
0
0
0
0
0
0
Бит 1, 0 — AIN1D, AIN0D: Отключение цифрового ввода для входов AIN1, AINO. Если в один из этих разрядов записать логическую единицу, то цифровой входной буфер соответствующего вывода AIN1/0 будет заблокирован. При чтении содержимого порта заблокированные биты будут всегда читаться как ноль.
Если вход AIN1 (или AINO) используется только для ввода аналогового сигнала, а ввод цифрового сигнала для этого входа не нужен, то рекомендуется всегда отключать цифровой ввод путем записи в разряд AINOD (AIN1D) логической единицы для уменьшения потребляемой мощности.
Встроенная система отладки программdebugWIRE
Основные особенности встроенной системы отладки
Рассмотрим особенности встроенной системы отладки:
полный контроль над процессом выполнения программы;
эмуляция всех цифровых и аналоговых функций микросхемы, за исключением команды RESET;
работа в реальном режиме времени;
поддержка отладки на уровне мнемокодов (для языков С, Ассемблер и др.);
неограниченное число точек останова (при использовании программного способа их формирования);
незаметность в работе;
электрические характеристики, идентичные реальному устройству;
автоматическая конфигурация системы;
высокая скорость работы;
реальное программирование энергонезависимой памяти.
Назначение
Встроенная система отладки debugWIRE использует двунаправленный однопроводный интерфейс для того, чтобы управлять процессом выполнения программы, выполнять отдельные команды
центрального процессора и программировать все виды энергонезависимой памяти.
Физический интерфейс
Если fuse-переключатель разрешения работы системы debugWIRE (DWEN) запрограммирован (т. е. равен нулю), а биты блокировки микросхемы LB1 и LB2 не запрограммированы, включается система отладки debugWIRE.
Вывод RESET в этом режиме представляет собой двунаправленную открытую шину ввода—вывода (с открытым стоком) с подключенным внутренним резистором нагрузки. Эта шина становится шлюзом для обмена информации между отлаживаемой микросхемой и схемой сопряжения с компьютером (эмулятором).
Рис. 1.48. Схема подключения микроконтроллера в режиме debugWIRE
На рис. 1.48 показана схема подключения отлаживаемого микроконтроллера, работающего в режиме debugWIRE, к выходному разъему эмулятора. Выбор источника тактового сигнала не зависит от наличия либо отсутствия режима debugWIRE, а всегда определяется установками fuse-переключателей CKSEL. Схема эмулятора, поддерживающего режим debugWIRE, должна удовлетворять следующим требованиям:
резистор нагрузки, подключаемый к линии dW/(RESET), должен иметь сопротивление меньше 10 кОм, хотя желательно его и вовсе исключить;
непосредственное подсоединение вывода RESET к источнику питания недопустимо;
конденсатор, подключенный к выводу RESET, в режиме debugWire должен отключаться;
если имеются дополнительные внешние цепи формирования сигнала сброса, то в режиме debugWire они должны быть отключены.
■ Точки останова программы
Режим debugWIRE поддерживает программные точки останова, которые формируются при помощи специальной команды Break, входящей в систему команд AVR. При создании точки останова в среде программирования AVR Studio® в программный код автоматически включается команда BREAK.
Затем измененная программа, содержащая в нужных местах команды BREAK, помещается в программную память микроконтроллера (перепрошивается). Команда, заменяемая на BREAK, сохраняется в памяти компьютера.
Когда прерванная программа запускается на дальнейшее выполнение, сначала выполняется сохраненная команда, а затем уже продолжается выполнение команд из программной памяти микроконтроллера. Вы можете также создать точки останова вручную, помещая команду BREAK в любом месте вашей программы.
Особенностью данной технологии является то, что память программ должна перепрограммироваться каждый раз, когда изменяется размещение точек останова. Среда AVR Studio делает это автоматически посредством debugWIRE-интерфейса.
Использование программных точек останова уменьшает максимально возможное количество циклов записи/стирания для программной памяти микроконтроллера. Поэтому при отладке программ подобным способом нужно постоянно следить, чтобы отладчик не израсходовал все ресурсы вашей микросхемы.
Ограничения режима debugWIRE
Вывод микросхемы, обеспечивающий режим debugWIRE (dW), физически объединен с входом внешнего сброса (RESET). Поэтому
при использовании режима debugWIRE невозможна проверка схем внешнего сброса.
Система debugWIRE позволяет программе в процессе отладки точно выполнять все функции ввода—вывода и соблюдать все временные соотношения. То есть скорость выполнения программы в режиме отладки не отличается от скорости в реальном режиме работы. Но в тот момент, когда центральный процессор остановлен, необходимо соблюдать осторожность при обращении через отладчик (AVR Studio) к различным регистрам ввода—вывода, чтобы не нарушить работу системы. Подробное описание всех правил работы с регистрами в режиме debugWIRE можно найти в специальной документации по этому режиму. Ее можно найти на сайте фирмы Atmel.
Если fuse-переключатель DWEN запрограммирован (режим debugWIRE включен), то некоторые тактовые сигналы микроконтроллера не отключаются даже в спящих режимах, что увеличивает потребляемую мощность. Поэтому, когда режим debugWire вам больше не нужен, не забывайте перевести в исходное состояние fuse-переключатель DWEN.
Специальный регистр ввода—выводапредназначенный для debugWIRE
.Регистр данных debugWire — DWDR
Номер бита76543210
| DWDR[7:0]। DWDR
Чтение(В)/Запись№R/WR^VR/WR/WR/WR/WR/WR/W
Начальное значение 00000000
Регистр DWDR обеспечивает передачу информации от управляющей программы микроконтроллера к отладчику. Данный регистр доступен только в режиме debug WIRE, поэтому не может быть использован в качестве универсального регистра в обычном режиме работы.
Автоматическое перепрограммирование памятипрограмм
Механизм самопрограммирования в основном используется для того, чтобы микроконтроллер, самостоятельно используя любой канал ввода—вывода, мог загружать новый программный код, а затем записывать его в память программ. Таким образом, микроконтроллер ATiny2313 обладает способностью автообновления собственной управляющей программы.
Память программ перезаписывается постранично. При этом для хранения страницы используется специальный временный буфер. Для управления всем этим процессом должна быть создана и записана в программную память микроконтроллера специальная управляющая программа.
Эта программа должна сначала получить новые данные и записать их в буфер. Перед программированием страницы программной памяти старое содержимое этой страницы должно быть стерто. Причем заполнение буфера можно производить как перед подачей команды «Стереть страницу», так и в промежутке между командами «Стереть страницу» и «Записать страницу». То есть существует два способа записи страницы.
Первый способ. Заполнение буфера перед стиранием страницы:
заполнить временный буфер страницы;
выполнить стирание страницы;
выполнить запись страницы.
Второй способ. Заполнение буфера после стирания страницы:
выполнить стирание страницы;
заполнить временный буфер страницы;
выполнить запись страницы.
Если нужно изменить только часть страницы, то необходимо сначала сохранить текущее ее содержимое во временном буфере, произвести стирание этой страницы, а затем модифицировать содержимое буфера и перезапись страницу измененными данными. При этом удобнее воспользоваться способом номер 1, так как при втором способе содержимое страницы сразу стирается.
Все операции со страницами программной памяти (стирание, запись, загрузка страницы) выполняются при помощи команды SPM. Операции стирания и записи — это групповые операции. То есть для стирания (записи) целой страницы подается всего одна команда.
Определение. Загрузка страницы — это модификация отдельных ячеек временного буфера страницы. Модификация производится при помощи той же команды SPM, но использует свободный доступ к каждой ячейке буфера.
Каждая ячейка буфера представляет собой шестнадцатиразрядное слово данных и соответствует одной ячейке программной памяти. Команда SPM использует регистровую пару Z в качестве указателя адреса, регистр SPMCSR для задания вида операции и регистры RI, R0 для передачи слова данных в ячейку временного буфера страницы.
Стирание страницы
Для стирания страницы памяти программ необходимо записать адрес этой страницы в указатель адреса (Z). Затем поместить в регистр SPMCSR значение “00000011”. Не позднее, чем через четыре такта системного генератора выполнить команду SPM. Значение регистров R1 и R0 при этом игнорируется. В качестве адреса страницы, записываемого в регистр Z, нужно взять PCPAGE (см. рис. 1.49). Неиспользуемые биты указателя (Z) будут проигнорированы.
Внимание. На время выполнения операции «Стирание страницы» центральный процессор приостанавливается.
Загрузка страницы (заполнение данными временногобуфера)
Для того, чтобы записать двухбайтовый код в ячейку временного буфера страницы, необходимо поместить адрес этой ячейки в регистровую пару Z, а сам код— в регистры Rl:R0. Затем необходимо поместить код “00000001" в регистр SPMCSR. Не позднее, чем через четыре периода тактового сигнала, выполнить команду SPM.
В качестве адреса в этом случае используется адрес ячейки PCWORD (см. рис. 1.49). Запись по одному и тому же адресу временного буфера можно произвести только один раз. Повторная запись по тому же адресу возможна только после полной очистки буфера.
Очистка буфера происходит автоматически после выполнения команды «Запись страницы» либо вручную путем записи единицы в разряд СТРВ регистра SPMCSR. Буфер также очищается после системного сброса.
Если во время выполнения операции загрузки страницы произойдет запись в EEPROM, все загруженные данные будут потеряны.
Запись страницы
Чтобы осуществить запись страницы, необходимо поместить в регистр Z ее адрес, записать в регистр SPMCSR код “00000101”, а затем, не позднее, чем через четыре цикла тактового генератора, выполнить команду SPM. Содержимое регистров R1 и R0 игнорируется. В качестве адреса страницы используется PCPAGE (см. рис. 1.49). Неиспользуемые разряды регистра Z необходимо сбросить в ноль.■
Внимание. На время выполнения операции «Запись страницы» центральный процессор приостанавливается.
Адресация памяти программ при автоматическомперепрограммировании
Номер бита 7Номер бита 7В командах SPM в качестве указателя используется регистровая пара Z.
Номер бита 7
Номер бита 7
Z15
Z14
Z13
Z12
Z11
Z10
Z9
Z8
Z7
Z6
Z5
Z4
Z3
Z2 j
Z1
Z0
Номербита 15141312111098
2
О
6
3
5
4
ZH (R31)
ZL(R30)
Программная память поддерживает станичную организацию (см. табл. 1.69), поэтому счетчик команд можно разделить на две разные
секции. Секция, состоящая из младших разрядов, служит для обращения к отдельным словам программного кода в пределах одной страницы. Старшие разряды служат для обращения к отдельным страницам. На рис. 1.49 назначение битов регистра-указателя адреса показано в графическом виде.
Внимание. При использовании команды SPM существует возможность для операций «Стирание страницы» и «Запись страницы» указывать разные адреса. Поэтому при создании программы нужно следить, чтобы при стирании и при записи была выбрана одна и та же страница.
Команда LPM адресуем память программ побайтно, но за раз записывается шестнадцатиразрядное слово данных. Поэтому младший разряд Z-указателя (Z0) всегда равен нулю.
Примечание. Все переменные, используемые на рис. 1.49, описаны далее.
Рис. 1.49. Адресация программной памяти в команде SPM
Регистр статуса и управления загрузкой программнойпамяти — SPMCSR
Регистр статуса и управления загрузкой программной памяти содержит служебные биты, которые должны управлять всеми операциями с программной памятью.
Номер бита 7 6 5 4 3 2 1 О
| — | — | — | СТРВ | RFLB | PGWRT | PGERS | SELFPRGEN] SPMCSR Чтение! R)/3anncb(W) R R R R/W R/W R/W R/W R/W
Начальное значение О О О О О О О О
Биты 7...S — Res: Зарезервированные биты. Эти разряды в микроконтроллере ATtiny2313 зарезервированы. При чтении регистра они всегда равны нулю.
Бит 4 — СТРВ: Стирание буфера временного хранения. Если записать бит СТРВ при частичном или полностью заполненном буфере временного хранения страницы, буфер будет очищен, и все записанные к этому моменту данные будут потеряны.
Бит 3 — RFLB: Чтение fuse-переключателей и битов защиты. Если одновременно установить в единицу биты RFLB и SELFPRGEN регистра SPMCSR, а затем в течение трех машинных циклов выполнить команду LPM, то эта команда произведет чтение содержимого fuse-переключателей либо битов защиты (в зависимости от значения разряда Z0 в регистровой паре Z). Прочитанный байт будет помещен в регистр общего назначения, на который указывает сама команды LPM. Подробнее смотри раздел «Чтение состояния Fuse-переключателей...».
Бит 2 — PGWRT: Запись страницы. Если данный бит одновременно с битом SELFPRGEN устанавливаются в единицу, то поступившая после этого в пределах четырех машинных циклов команда SPM выполняет запись страницы данных из временного буфера в выбранную страницу памяти программ. Адрес страницы определяется старшими разрядами указателя (Z).
Содержимое регистров R1 и R0 игнорируются. Бит PGWRT автоматически сбрасывается после завершения операции записи страницы или в том случае, если команда SPM не выполнена в пределах отведенных ей четырех машинных циклов. На все время выполнения операции «Запись страницы» работа центрального процессора приостанавливается.
Бит 1 — PGERS: Стирание страницы. Если данный бит одновременно с битом SELFPRGEN устанавливаются в единицу, то поступившая после этого в пределах четырех машинных циклов команда SPM выполняет стирание страницы. Адрес страницы определяется старшими разрядами указателя (Z). Содержимое регистров R1 и R0 игнорируется. Бит PGERS автоматически сбрасывается после завершения операции «Стирание страницы» или в том случае, если команда SPM не выполнена в пределах отведенных ей четырех машинных циклов. На все время выполнения операции «Стирание страницы» работа центрального процессора приостанавливается.
Бит 0 — SELFPRGEN: Разрешение автоматического программирования. Установка этого бита разрешает выполнение команды SPM в течение следующих четырех циклов тактового генератора. Если при этом одновременно записывается единица в один из битов СТРВ, RFLB, PGWRT или PGERS, то первая же команда SPM, поступившая не позднее, чем через четыре машинных цикла, будет выполнять одно из описанных выше специальных действий.
Если установлен только бит SELFPRGEN, то команда SPM сохранит значение регистров R1:RO во временном буфере страницы, т. е. по адресу, на который указывает Z-указатель. Младше разряды Z-указателя игнорируются. Бит SELFPRGEN сбрасывается как автоматически после завершения выполнения команды SPM, так и если не поступило ни одной команды SPM в пределах четырех машинных циклов после установки этого бита.
При выполнении команд «Стирание страницы» и «Запись страницы» бит SELFPRGEN остается в единичном состоянии все время, пока операция не закончена. Запись любой другой комбинации, кроме “10001”, “01001”, “00101”, “00011” или “00001”, в пять младших разрядов регистра SPMCSR не будет иметь никакого эффекта.
Запись в EEPROM и работа с регистром SPMCSR
Обратите внимание, что при записи в EEPROM блокируются все попытки перезаписи памяти программ. Чтение fuse-переключателей и битов блокировки также будет заблокировано. Поэтому рекомендуется при создании процедуры перепрограммирования программной памяти включать в нее проверку бита состояния EEPROM (бит EEWE регистра EECR). Перед записью команды в регистр SPMCSR необходимо убедиться, что бит EEWE сброшен.
Чтение состояния fuse-переключателей и битовблокировки программным путем
При необходимости управляющая программа микроконтроллера может читать состояние всех fuse-переключателей, а также состояние битов блокировки. Для того, чтобы прочитать биты блокировки, необходимо загрузить в Z-указатель код 0x0001, затем установить биты RFLB и SELFPRGEN регистра SPMCSR в единицу.
Потом, в течение трех машинных циклов после установки битов RFLB и SELFPRGEN, необходимо выполнить команду LPM. Эта команда в данном случае читает байт, содержащий два бита блокировки, и запишет его в регистр R0 или регистр, указанный в качестве параметра команды. Биты RFLB и SELFPRGEN автоматически сбрасываются после завершения операции чтения либо если в течение трех машинных циклов не поступила команда LPM. Если биты RFLB и SELFPRGEN сброшены в ноль, команда LPM будет выполнять свою стандартную функцию чтения данных из программной памяти (см. приложение).
Формат байта, содержащего биты защиты:
Байт защиты
Номер бита 76543210
I "i -I -I ~| ~| -| LB2 [ LB1 |
Алгоритм чтения младшего байта fuse-переключателей подобен описанному выше алгоритму чтения битов блокировки. Для того, чтобы прочитать младший байт fuse-переключателей, необходимо загрузить в указатель (Z) код 0x0000,.потом установить биты RFLB и SELFPRGEN регистра SPMCSR в единицу. Затем в пределах трех машинных циклов после установки битов RFLB и SELFPRGEN необходимо выполнить команду LPM.
Эта команда прочитает значение младшего байта fuse-переключателей (FLB) и запишет его в регистр R0 или в регистр, указанный в качестве параметра команды. Ниже показан формат младшего байта битов конфигурации. Описание каждого его бита (fuse-переключателя) описано в табл. 1.64.
Младший байт конфигурации
Номер бита 765-4321 О
| FLB7| FLB6| FLB5 | FLB4[ FLB3| FLB2| FL87| FLBO |
Для чтения старшего байта fuse-переключателей загрузите в Z-указатель код 0x0003. Если команда LPM будет выполнена в пределах трех машинных циклов после установки битов RFLB и SELFPRGEN регистра SPMCSR, значение старшего байта fuse-переключателей (FHB) будет прочитано и загружено в регистр R0 или в регистр, указанный в качестве параметра команды. Ниже показан формат старшего байта битов конфигурации. Описание каждого его бита (fuse-переключателя) также описано в табл. 1.63.
Старший байт конфигурации
Номер бита7654321 О
| FH87 | FHB6 | FHB5 | FHB4 | FHB3 | FHB2 | FHB7 ["fHBO |
Внимание. Если fuse-переключатель или бит блокировки запрограммирован, то он будет читаться как ноль. Если же fuse-переключатель или бит блокировки не запрограммирован, то его значение равно единице.
Предотвращение ошибок при программированииFlash-памяти
Если в процессе записи Flash-памяти напряжения питания VCc окажется слишком низким, то возможно возникновение ошибок программы и, как следствие, нарушение работы системы. Искажение программы во Flash-памяти в случае снижения напряжения питания может быть вызвано двумя причинами:
во-первых, напряжение может оказаться недостаточным для нормального завершения самого процесса программирования;
во-вторых, сам центральный процессор может выполнить команды неправильно, если напряжение питания слишком низко.
Ошибок при программировании Flash-памяти можно легко избежать, если выполнять следующие рекомендации (хотя бы одно из этих условий).
Первое условие. В течение всего времени, пока питания недостаточно, переведите вход RESET в активное состояние (низкий логический уровень). Это может быть сделано путем включения встроенного датчика кратковременного провала напряжения питания (BOD), если рабочее напряжение соответствует уровню его срабатывания.
В противном случае для формирования сигнала сброса может использоваться внешняя схема защиты от снижения напряжения Vcc. Если сигнал сброса поступает в тот момент, когда производится запись Flash-памяти, действие сигнала сброса задерживается до окончания операции записи при условии, что напряжения питания достаточно.
Второе условие. Переведите микроконтроллер в спящий режим (Power-down) на все время, пока напряжение питания Vcc ниже положенного. Это не даст центральному процессору декодировать и выполнять любые команды, что фактически защитит регистр SPMCSR и, таким образом, Flash-память, от случайной записи.
Время программирования Flash-памяти прииспользовании команды SPM
Для формирования времени доступа к Flash-памяти используется калиброванный RC-генератор. В табл. 1.59 показаны типовые значения времени записи во Flash-память.
Таблица 1.59.Время программирования при помощи команды SPM
Вид операции
Минимальное время программирования
Максимальное время программирования
Модификация Flash-памяти (стирание страницы, запись страницы или запись битов защиты при помощи команды SPM)
3,7 мс
4,5 мс
Программирование памяти
Биты защиты памяти данных и программ
Микросхема ATtiny2313 имеет два бита блокировки. Их можно оставить незапрограммированными (“1”) или запрограммировать любой из них (“0”) для того, чтобы перевести микросхему в один из уровней защиты (см. табл. 1.61). Биты блокировки могут быть стерты (“1”) только при помощи команды «стирание микросхемы».
Таблица 1.60.Байт битов защиты
Байт битое защиты
Номер бита
Описание
Значение по умолчанию
7
—
■1 (не запрограммирован)
6
—
1 (не запрограммирован)
5'
■—
1 (не запрограммирован)
4
—
1 (не запрограммирован)
3
—
1 (не запрограммирован)
2
—
1 (не запрограммирован)
LB2
1
Бит защиты
1 (не запрограммирован)
LB1
0
Бит защиты
1 (не запрограммирован)
Примечание. “/” — если не запрограммирован, “0" — если запрограммирован
Таблица 1.61.Режимы защиты
Биты блокировки
Вид защиты
Режим
LB2
LB1
1
1
1
Не включен ни один из режимов защиты
2
1
0
Возможность программирования памяти программ и БЕРНОМ как в параллельном, так и в последовательном режиме заблокирована. Изменение fuse-переключателей также заблокировано как в параллельном, так и в последовательном режиме111
3
0
0
Возможность чтения и программирования памяти программ и БЕРНОМ как в параллельном, так и в последовательном режиме заблокирована. Изменение значений fuse-переключателей и битов защиты загрузчика также заблокированы как в параллельном, так и в последовательном режиме1’1
Примечания. 1. Нужное значение fuse-переключателей необходимо установить до того, как будут запрограммированы биты защиты LB1 и LB
Значение “Г’ означает «нс запрограммировано», “0” означает «запрограммировано».
Fuse-переключатели
Дополнительный fuse-байтДополнительный fuse-байтМикросхема ATtiny2313 имеет три байта fuse-переключателей. В табл. 1.63 и 1.64 кратко описаны функциональные возможности всех fuse-переключателей и их расположение в соответствующих fuse-байтах. Обратите внимание, что значение fuse-переключателя равно нулю, если он запрограммирован.
Дополнительный fuse-байт
Дополнительный fuse-байт
Описание разрядов
№ бита
Описание
Значение по умолчанию
7
1 (не запрограммирован)
6
-
1 (не запрограммирован)
5
1 (не запрограммирован)
4
-
1 (не запрограммирован)
3
1 (не запрограммирован)
2
1 (не запрограммирован)
1
1 (не запрограммирован)
SELFPRGEN
0
Разрешение самопрограммирования
1 (не запрограммирован)
Таблица 1.62.
Таблица 1.63.Старший fuse-байт
Описание разрядов
№ бита
Описание
Значение по умолчанию
DWEN'3)
7
Разрешение debugWIRE
1 (не запрограммирован)
EESAVE
6
Разрешить сохранение содержимого EEPROM при выполнении команды -Стирание кристалла»
1 (не запрограммирован, содержимое EEPROM не сохраняется)
SPIEN<”
5
Разрешить последовательное программирование памяти программ
0 (запрограммирован, программирование по SPI разрешено)
WDTON'2’
4
Включить сторожевой таймер
1 (не запрограммирован, таймер отключен)
BODLEVEL2*4’
3
Уровень срабатывания схемы контроля напряжения питания
1 (не запрограммирован)
BODLEVEL V4’
2
Уровень срабатывания схемы контроля напряжения питания
1 (не запрограммирован)
BODLEVELO*4’
1
Уровень срабатывания схемы контроля напряжения питания
1 (не запрограммирован)
RSTDISBU5’
0
Отключить внешний вход сброса
1 (не запрограммирован)
Примечания. /. Fuse-переключатель SPIEN не доступен в режиме последовательного программирования.
Подробнее см. в разделе «Регистр управления охранного таймера — WDTCSR».
Никогда нс оставляйте в готовом изделии fuse-переключатель DWEN в запрограммированном состоянии, независимо от установки защитных битов. При программировании DWEN некоторые тактовые сигналы не отключаются даже в спящем режиме. Это увеличивает потребляемую мощность.
Для расшифровки значений переключателей BODLEVEL см. табл. 1.16.
Подробнее о работе переключателя RSTDISBL смотри в разделе “Альтернативные функции порта А ”.
Таблица 1.64.Младший fuse-байт
Описание разрядов
№ бита
Описание
Значение по умолчанию
CKDIV8
7
Деление тактового сигнала на 8
0 (запрограммирован)
CKOUT
6
Вывод тактовой частоты на вывод CKOUT
1 (не запрограммирован)
SUT1
5
Выбор времени старта
1 (не запрограммирован) <”
SUTO
4
Выбор времени старта
0 (запрограммирован) <’>
CKSEL3
3
Выбор источника тактового сигнала
0 (запрограммирован) <2>
CKSEL2
2
Выбор источника тактового сигнала
1 (не запрограммирован)121
CKSEL1
1
Выбор источника тактового сигнала
0 (запрограммирован)121
CKSEL0
0
Выбор источника тактового сигнала
0 (запрограммирован) <2>
Примечания.
Значение по умолчанию SUT1—0 приводит к максимальному времени запуска для заданного по умолчанию источника тактового сигнала. Подробнее смотри в табл. 1.15.
Значение по умолчанию переключателей CKSEL3...0 настраивает внутренний RC-генератор на частоту 8 МГц.
Состояние fuse-переключателей не изменяется после выполнения операции «Стирание кристалла».
Внимание. Если запрограммировать первый бит защиты (LB1), то все fuse-переключатели окажутся заблокированными. Поэтому значения всех fuse-переключателей необходимо выставить перед программированием защитных битов.
Фиксирование значений fuse-переключателей
Значения fuse-переключателей фиксируются, когда микросхема находится в режиме программирования. Любые изменения значений fuse-переключателей не будут иметь никакого эффекта до окончания процесса программирования.
Это не касается fuse-переключателя EESAVE, изменение которого вступает в силу сразу, как только он будет запрограммирован. Фиксирование значений fuse-переключателей происходит также в момент включения напряжения питания в режиме Normal.
Байты идентификации
Все микроконтроллеры фирмы Atmel имеют трехбайтовый код идентификации, который однозначно идентифицирует устройство. Этот код можно прочитать при помощи программатора как при последовательном, так и при параллельном способе программирования.
Биты идентификации могут быть прочитаны даже в том случае, если микросхема полностью заблокирована (оба бита защиты запрограммированы). Три байта идентификационного кода расположены в отдельном адресном пространстве и имеют адреса ООО—003.
Для микросхемы ATtiny2313 байты идентификации равны:
Адрес 0x000: значение 0x1 Е (Означает, что производитель — фирма Atmely
Адрес 0x001: значение 0x91 (Означает 2 Кб программной памяти).
Адрес 0x002: значение ОхОА (Вместе с предыдущим байтом идентифицирует конкретный тип микросхемы. Если байт 0x001 равен 0x91, а байт 0x002 равен ОхООА, то данная микросхема — это ATtiny2313).
Байт калибровки
Микроконтроллер ATtiny2313 сохраняет два разных калибровочных значения для внутреннего RC-генератора. Эти байты расположены в старших адресах адресного пространства ячеек идентификатора с адресами 0x0000 и 0x0001 и содержат калибровочные значения для частот 4 и 8 МГц соответственно.
После системного сброса значение ячейки соответствующей частоте 4 МГц автоматически записывается в регистр OSCCAL (смотри раздел «Регистр калибровки генератора — OSCCAL»). Это необходимо для того, чтобы гарантировать соответствие частоты внутреннего RC-генератора указанному выше значению.
Количество слов в странице и количество страниц в EEPROMКоличество слов в странице и количество страниц в EEPROMРазмер страницы
Количество слов в странице и количество страниц в EEPROM
Количество слов в странице и количество страниц в EEPROM
Таблица 1.65. Количество слов в странице и количество страниц в программной памяти
Размер программной памяти
Размер страницы
PCWORD
Количество страниц
PCPAGE
PCMSB
1 К слов (2 К байт)
16 слов
РС[3:0]
64
РС[9:4]
9
Размер EEPROM
Размер страницы
PCWORD
Количество страниц
PCPAGE
EEAMSB
128 байт
4 байт
. ЕЕА[1:0]
32
ЕЕА[6:2]
6
Таблица 1.66.
ГЛАВА 2
Написание программ длямикроконтроллеров AVR
В этой главе приводятся несколько примеровсхем на микроконтроллере АТ1пу2313.Примеры наглядно иллюстрируютвозсожности контроллера и позволяютполнее разобраться в особенностяхиспользования этой микросхемы.Предлагаемые в качестве примеровэлектронные устройства с успехом могутнайти свое практическое применение вдомашнем хозяйстве.
Музыкальная шкатулка
Постановка задачи
И так, начинаем ряд примеров, в которых будет не только представлено описание неких схем на микроконтроллере, но и описан процесс их разработки. Все три примера, приведенные в этой книге специально разработаны автором, и предназначены для обучения начинающих программистов и являются заключительным этапом урока по программированию, подробно представленного в [4].
В первом примере мы покажем процесс разработки простого микропроцессорного устройства, предназначенного для автоматического воспроизведения нескольких простейших мелодий. Причем все эти мелодии мы жестко “зашьем” в память микроконтроллера. Удобнее всего для этого использовать программную память контроллера. То есть, ту же самую память, куда записывается управляющая программа. Можно было бы, конечно, для хранения мелодий использовать и EEPROM. Но объем EEPROM в микросхеме ATiny2313 составляет всего 128 байт, а объем памяти программ - 2 килобайта. Поэтому память программ в данном случае предпочтительнее.
Сформулируем задачу следующим образом: «Разработать устройство, предназначенное для воспроизведения простых одноголосых мелодий, записанных в память программ на этапе программирования. Устройство должно иметь семь управляющих кнопок. Каждой из кнопок должна соответствовать своя мелодия. Мелодия воспроизводится при нажатии и удержании кнопки. При отпускании всех кнопок воспроизведение мелодий прекращается».
Рис. 2.1. Принципиальная электрическая схема музыкальной шкатулки
Схема
Принципиальная электрическая схема устройства, уовлетворяющая сформулированным выше требованиям приведена на рис. 2.1. Кнопки S1...S7 предназначены для выбора мелодий. Для воспроизведения мелодии используется звуковой излучатель VF1, сигнал на который поступает с выхода РВЗ микроконтроллера. В качестве усилителя сигнала используется электронный ключ RI, VT1.
Алгоритм
Для начала нам нужно придумать, как мы будем хранить мелодии в памяти. Для того, чтобы в памяти можно было что-либо хранить, нужно сначала это что-то каким-либо способом закодировать. Любая мелодия состоит из нот. Каждая нота имеет свой тон (частоту) и длительность звучания. Для того, чтобы закодировать тон ноты, можно просто все ноты пронумеровать по порядку. Удобнее нумеровать, начиная с самого низкого тона. На клавиатуре клавишного инструмента это будет слева направо.
Известно, что весь музыкальный ряд делится на октавы. Если вы думаете, что в каждой октаве семь нот, то вы плохо знаете физические основы музыкального ряда. На самом деле в современном музыкальном ряду каждая октава делится на 12 нот. Семь основных нот (белые клавиши) и пять дополнительных (черные клавиши).
Деление на основные и дополнительные ноты сложилось исторически. В настоящее время используется музыкальный строй, в котором все 12 нот одной октавы равнозначны. Частоты любых двух соседних нот отличаются друг от друга в одинаковое количество раз. При этом частоты одноименных нот в двух соседних октавах отличаются ровно в два раза. Более подробно об этом вы можете прочитать в [3].
Для нас же важно то, что коды всем этим нотам мы должны присваивать в порядке возрастания частоты. И начнем мы с ноты «До» первой октавы. Для музыкальной шкатулки более низкие ноты не нужны. В табл. 2.1 показаны коды для всей первой октавы. Следующая, вторая октава продолжает первую и по кодировке, и по набору частот. Так нота «До» второй октавы будет иметь код 13, а частоту f12=fox2. А нота «Ре» второй октавы будет иметь код 14 и частоту fL3=f]x2. И так далее.
Таблица 2.1.■-Кодировка нот первой октавы
Код
Нота
Частота
Код
Нота
Частота
1
До
'to
7
Фа#
f6=f5/K
2
До#
f,=fo/K
8
Соль
f7=f6/K
3
Ре
f2=f,/K
9
Соль#
fe=f7/K
4
Ре#
f3=WK
10
Ля
f9=f8/K
5
Ми
f4=f3/K
11
Ля#
fio=fg/K
6
Фа
f5=fVK
12
Си
fn=fw/K
12,—
Для справки: К = \/ 2
Музыкальная длительность тоже легко кодируется. В музыке применяют не произвольную длительность, а длительность, выраженную долями от целой (см. табл. 2.2). В зависимости от темпа реальная длительность целой ноты меняется. Для сохранения мелодии необходимо соблюдать лишь соотношения между длительностями. Поэтому нам необходимо закодировать лишь семь вариантов длительности. Присвоим им коды от 0 до 6. Например так, как это показано в графе «Код» табл. 2.2. Назначение графы «Коэффициент деления» мы пока опустим.
Код ■
Длительность
Коэффициент деления
0
1 (целая)
■64
1
1/2(половинная)
128
2
1/4 (четверть)
256
3
1/8 (восьмая)
512
4
1/16 (шестнадцатая)
1024
5
1/32 (тридцать вторая)
2048
6
1/64 (шестьдесят четвертая)
4096
Таблица 2.2.
Кодирование музыкальных длительностей
Кроме нот, любая мелодия обязательно содержит музыкальные паузы.
Определение. Паузы — это промежутки времени, когда ни один звук не звучит. Длительность музыкальных пауз принимает точно такие же значения, как и длительность нот.
В связи с этим удобно представить паузу как еще одну ноту. Ноту без звука. Такой ноте логично присвоить нулевой код.
Кодируем мелодии
Для экономии памяти удобнее каждую ноту кодировать одним байтом. Договоримся, что три старших бита мы будем использовать для кодирования длительности ноты, а оставшиеся пять битов — для кодирования ее тона. Пятью битами можно закодировать до 32 разных нот, что вполне хватит для музыкальной шкатулки.
Итак, если использовать приведенный выше способ кодирования, то код ноты ля первой октавы длительностью 1/4 в двоичном виде будет равен.
01001001 - 73
/ ^-Код ноты (9)
— Код длительности (2)
Теперь мы можем приступать к кодированию мелодий. Для того, чтобы закодировать мелодию, нам нужна ее нотная запись. Используя нотную запись, мы должны присвоить каждой ноте и каждой музыкальной паузе свой код.
Цепочка таких кодов и будет представлять собой закодированную мелодию. По условиям задачи наша музыкальная шкатулка должна уметь воспроизводить семь разных мелодий. Коды всех семи мелодий мы разместим в программной памяти микроконтроллера.
Как определить конец каждой мелодии? Для того, чтобы компьютер знал, где заканчивается каждая мелодия, используем код 255 в качестве признака конца.
Теперь нам нужно придумать, как микроконтроллер будет находить начало каждой мелодии. Все мелодии имеют разную длину, а в памяти они будут записаны одна за другой. Поэтому адрес начала каждой мелодии зависит от длины всех предыдущих. Удобнее всего просто по факту определить адрес начала каждой мелодии и поместить все семь адресов в специальную таблицу.
Кроме этой таблицы нам еще понадобится таблица коэффициентов деления для всех 32 нот и таблица, хранящая константы задержки для всех используемых нами музыкальных длительностей.
Алгоритм работы музыкальной шкатулки
Теперь мы можем сформулировать алгоритм работы музыкальной шкатулки.
Просканировать клавиатуру и определить номер самой первой нажатой клавиши.
Извлечь из таблицы начал мелодий значение элемента, номер которого соответствует только что определенному номеру нажатой клавиши. Это значение будет равно адресу в программной памяти, где начинается нужная нам мелодия.
Начать цикл воспроизведения мелодии. Для этого поочередно извлекать коды нот из памяти, начиная с адреса, который мы определили в пункте 2 алгоритма.
Каждый код ноты разложить на код тона и код длительности.
Если код тона равен нулю, отключить звук и перейти к фор' мированию задержки (к п. 9 настоящего алгоритма).
Если код тона не равен нулю, извлечь из таблицы коэффициентов деления значение элемента с номером, равным коду тона.
Записать коэффициент деления, который мы нашли в пункте б настоящего алгоритма, в регистр совпадения таймера Т1.
Включить звук (подключить вывод ОС1А к выходу таймера Т1).
Извлечь из таблицы длительностей задержки значение элемента с номером, равным коду длительности.
Сформировать паузу с использованием константы задержки, которую мы нашли в пункте 9 настоящего алгоритма.
И. По окончании паузы выключить звук (отключить ОС1А от выхода таймера),
Повторять цикл (пункты 4—11 настоящего алгоритма) до тех пор, пока нажата соответствующая кнопка.
Если очередной код ноты окажется равным 255, перейти к началу текущей мелодии, то есть вернуться к п. 3 настоящего алгоритма.
Программа на Ассемблере
Возможный вариант программы на языке Ассемблер приведен в листинге 2.1. Приводимое ниже описание программы расчитано на читателей, знакомых с языком Ассемблера. Если вы не знаете этого языка, рекомендую обратиться к [4], где представлен подробный урок для начинающих.
Листинг 2.1
йййййййййййййййййййййййййййййййййййййййййййййй ййПример 9йй
: ййМузыкальная шкатулкайй
. ЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙ
. Псевдокоманды управления
1
2
include "tn23!3def inc", Присоединение файла описаний
.list: Включение листинга
3 4
5 6
7
8 9
10
.def1оор1 = R0. Три ячейки для процедуры задержки
def1оор2 = R1
.defloops = R21
.deftemp = R16:Вспомогательный регистр
.deftempi = R17:Второй вспомогательный регистр
.defcount = R17■Определение регистра счетчика опроса клавиш
deffnota = R19.Частота текущей ноты
.defdnota = R20;Длительность текущей ноты
:Начало программного кода
11
12
cseg; Выбор сегмента программного кода
отд0; Установка текущего адреса на ноль .
131
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
start:rjmpimt; Переход на начало программы
reti:Внешнее прерывание 0
reti:Внешнее прерывание 1
reti:Таймер/счетчик 1 захват
reti; Таймер/счетчик 1. совпадение канал А
reti:Таймер/счетчик 1. прерываниепопереполнению
reti:Таймер/счетчик 0, прерываниепопереполнению
reti;ПрерываниеHARTприем завершен
reti:ПрерываниеUARTрегистр данныхпуст
reti.ПрерываниеHARTпередача завершена
■reti;Прерываниепо компаратору
reti:Прерывание по изменению на любомконтакте
reti;Таймер/счетчик1Совпадение,каналВ
reti.Таймер/счетчик0Совпадение,каналВ
reti,Таймер/счетчик0Совпадение,каналА
retiUSI готовность к старту
retiUSI Переполнение
retiEEPROM Готовность
• reti■ Переполнение охранного (Эймера
. -Модуль инициализации'
Инициализация стека
32
Idi
temp. RAMEND
. Инициализация стека
33
OUT
SPL temp
—
Инициализация i
портов B/B
34
35
1(11 out
temp. 0x08 PORTB. temp
, Инициализация порта РВ
36
out
DDRB temp
35
101
temp, 0x7F
. Инициализация порта PD
36
out
PORTD temp
3/
Idi
temp 0x00
38
out
DDRD: temp
Инициализация
(выключение) компаратора
39
Idi
temp. 0x80
40
out
ACSR. temp
—
Инициализация
таймера Т1
41
- Idi
temp, 0x09
, Включаем режим СТС
42
out
TCCR1B temp
43
ml
Idi
temp. 0x00
. Выключаем звук
44
out
ТССЙ1А. temp
Начало основной программы-
main:
45
46
Вычисление номера нажатой кнопки
clrcount: Обнуление счетчика опроса клавиш
intemp. PINO, Чтение порта D
47m2.
48
49
50
51
52
Isrtemp; Сдвигаем входной байт
Ьгссm3,Если текущий разряд был равен 0
inccount;Увеличиваем показание счетчика
cpicount, 71Сравнение (7 - конец сканирования)
brnem2’■Если не конец, продолжить
rjmpmlЕсли не одна клавиша не нажата
Выбор мелодии
53m3.
54
55
56
57
58
movYLcount.Вычисляем адрес где
IdiZL.low(tabm*2) .хранится начало мелодии
idiZH, high(tabm*2)
real 1addw•К подпрограмме 16-разрядного сложения
1pmXL.Z+.Извлекаем адреса из таблицы
]pmХН.Z:и помещаем в X
Воспроизведение мелодии
59 m4
60
томZH ХН: Записываем в Z начало мелодии
томZL’ XL
61 m5
62
63
64
65
66
67
68
69
70
71
72
73
254
intempFIND.Читаем содержимое портD
cpitemp0x7F;Проверяем на равенство7FH
отецml•Если равно (кнопки отпущены) в начало
1pmtemp.Z'Извлекаем код ноты
cpiюлю.OxFFПроверяем не коней ли мелодии
breoт4Если конец начинаем мелодию сначала
anditemp.0x1FВыделяем код гона из кода ноты
movfnota тетрЗаписываем в регистр кода тона
ipmtemp.Z*Еще раз берем код ноты
roltempПроизводим четырехкратный сдвиг коданоты
roltemp
'О1temp
roltemp
74
75
anditemp, 0x07. Выделяем код длительности
movdnota. tempПомещаем ее в регистр длительности
76
real]nota. К подпрограмме воспроизведения ноты
77
гjmpni5; В начало цикла (следующая нога)
: *Вспомогательные подпрограммы•.
78
, Подпрограмма 16-ти разрядного сложения.
addw.pushYH
79
80
81
82
islYL•: Умножение первого слагаемого на 2
IdiYH,0:Второй байт первого слагаемого= 0
addZL,YL.Складываем два слагаемых
adcZH,YH
83
84
popYH
ret
85
86
87
88
; Подпрограмма исполнения одной ноты
nota.pushZH
pushZL
pushYL
pushtemp
89
90
cpifnota, 0x00; проверка, не пауза ли
breqnt 1. Если пауза, переходим сразу к задержке
91
92
93
94
movYL. fnota:Вычисляем адрес, где хранится
IdiZL, low(tabkd*2).коэффициент деления для текущей ноты
IdiZH. high(tabkd*2)
rcalladdw;к подпрограмме 16-разрядного сложения
95
96
97
98
1pm temp, Z+ ; Извлекаем мл. разряд КД для текущей ноты 1pm tempi, Z ; Извлекаем ст. разряд КД для текущей ноты out 0CR1AH, tempi . Записать в старт, часть регистра совпадения out 0CR1AL. temp Записать в млада, часть регистра совпадения
99
100
Iditemp, 0x40; Включить звук
outTCCR1A. temp
101
nt1:rcallwait: К подпрограмме задержки
102
103
Iditemp. 0x00: Выключить звук
outTCCRiA, temp
104
105
Ididnota. 0: Сбрасываем задержку для паузы между нотами
rcallwait. Пауза между нотами
106
107
108
109
110
poptemp.Завершениеподпрограммы
popYL
popZL
popZH
ret
111
112
113
114
: Подпрограмма формирования задержки
wait:pushZH
pushZl
pushYH
pushYL
115
116
117
118
movYL.dnota.Вычисляем адрес где хранится
IdiZL.low(tadz*2)■нужный коэффициент задержки
idiZH.high(tabz*2)
rcalladdw.К подпрограмме 16-разрядногосложения
119
120
1pmYL, Z+. Читаем первый байт коэффициента задержки
lomYH. ZЧитаем второй байт коэффициент задержки
121
122
clrZL■ Обнуляем регистровую пару Z
скZH
. Цикл задержки
123
124
125
126
127
128
129
130
w1Idiloop, 255: Пустой внутренний цикл
w2.decloop
brnew2
adiwR30.1■Увеличение регистровой пары Z на единицу
соYL,ZL:Проверкамладшегоразряда
brnewl
срYH.ZH;Проверкастаршегоразряда
brnew1
131
132
133
134
135
popYL : Завершениеподпрограммы
popYH
popZL
popZH
ret
'*ii«-*wTWww*-riw*i»**irw**#**XTe*i**ww*****e*****»*****e* ; *Таблица длительности задержек*
■ *********X*»W***************************V***«**e******
136
tabzdw128,256.512,1024,2048,4096. 8192
. *Таблица коэффициентов деления*
*****<***Х*"гяХ*******х*******#**********х*»********хх*
137
138
139
140
tabkd:. dw0
.dw4748,4480,4228.3992,3768,3556,3356.3168,299028222664.2514
dw2374,2240,2114,1996,1884,1778.1678.1584.1495,1411.1332. 1257
dw1187.1120,1057, 998. 942, 889. 839. 792
‘***i**x******wir>w<i****lrw****»*********»*e*************•
, *Таблица начал всех мелодий•
141
142
tabm-dwmel1*2,mel2*2,mel3*2,mel4-2
■dwme!5*2.mel6*2,me!7*2
: *Таблица мелодий-
:В траве сидел кузнечик
143
144
145
146
147
148
149
men..db109,104.109,104.109.108.108,96.108.104
• db108,104,108.109,109. 96.109,104,109.104
■db109,108,108, 96.108.104,108,104,108.141
db96,109.111. 79. 79.111.111,112, 80. 80
■db112,112.112.111,109.108,109.109. 96.109
db111, 79. 79,111.111.112. 80, 80.112,112
■db112 111,109,108.141 128. 96.255
:Песенка крокодила Гены
150
151
152
153
154
155
156
157
158
159
160
me!2:.db109.110.141.102.104.105.102.109.110.141
■ db104.105,107.104.109.110.141. 104.105. 139
■db109.110,173. 96.114.115,146.109.110112
db109.114.115.146.107 109.110 114,112.110
db146.109.105.136.107 105.134.128,128.102
db105.137,136 128.104.107.139.137.128.105
db109 141.139.128.110.109 176.112.108 109
.db112.144 142.128.107.110.142 141.128.105
db109.139.128.173,134.128.128 109,112.144
db142.128,107,110.142.141.128.105. 109.139
db128.173.146,128. 96 255
161№13
162
163
164
В лесу родилась елочка
db132.141.141.139.141.137 132.132.132.141
db141.142.139.176.128.144.146.146.154.154
db153.151.149.144.153.153.151.153 181.128
db96 255
165№14
166
167
Happy bjrths to you
db107.107.141.139144.143.128.107.107,141
db139,146.144.128107.107.151.148.146 112
db111.149.117.117148.144,146.144.128 255
168 me!5
169
170
171
172
173
174
175
С чего начинается родина
db99.175.109.107.106.102. 99.144,111.175
db96, 99.107,107.107.107.102.104,170, 96
db99.109. 109.109,Ю9.107. 106. 143, 109.141
■do99.109.109.109.109.104.106,171, 96. 99
db111,109 107.106.102. 99.144.111.143 104
db114,114.114,114.109,111.176. 96,104.116
db112.109 107.106. 64. 73,143,107,131, 99
db144. 80 80.112,111. 64. 75.173.128.255
176№16:
177
178
179
180
181
182
183
184
185
186
Песня из кинофильма Веселие ребята
■db105.109.112.149,116. 64. 80.148.114. 64
■db78.146 112, 96.105.105.109.144,111. 64
■db80 145.112. 64, 81.178, 96.117.117.117
■do149.116. 64, 82.146.112. 64, 79.146.144
•db96.105.105.107,141,108:109.112.110.102
■db104.137.128, 96.105.105.105,137.102. 64
■db73.142,105.107.109 64. 75.137, 96,105
do105.105137.102.105.142,112. 64, 82.180
db96.116.116.116.148.114.112.142.109. 64
db78.146.144, 96,105.105.107.141.108,109
db112,110.102.104.169, 96. 96.255
187№17
188
189
190
191
192
193
194
195
196
197
198
199
200
Улыбка
db107.104,141,139.102, 105.104.102.164, 128
dbЮ4. 107. 109,109, 109. 111.114. 112,111, 109
.db144,139.128.109.111.144. 96,111,109,104
dbЮ7,105.173.128.111.109.112.107. 111,109
db109.107 102.104.134.132.128.100.103, 107
db107. 107.107,139,112.100.103. 102. 102, 102
db134.102.103.107.105. 107. 108. 108. 108. 108
db107.105,107.108.144.142. 128, 112. 107,110
db140,112.105.108,107.107.107.105.140 139
db139,112 103 102 103,105.108.107.105.103
db128.112 107.110.108.108.108.140.112,105
db108,107.107.107,139,112.103, 102.103.105
db108.107.105.103.105.139.132,128 96,96
db96.255
Описание программы (листинг 2.1)
Описание программы удобнее начать с конца. Начиная со строки 136 программы располагается описание так называемых таблиц данных. На самом деле каждая из этих “таблиц” представляеет собой цепочку кодов, записываемых в программную память микроконтроллера и предназначенных для кодирования того либо иного вида данных. Для описания этих данных используются как операторы db, так и операторы dw.
Первая таблица содержит коэффициенты задержки для формирования всех вариантов музыкальной длительности. Таблица начинается с адреса, соответствующего метке tabz. Вся таблица занимает одну строку программы (строка 136). Так как в нашей программе мы будем применять лишь семь вариантов длительности, таблица имеет 7 элементов. Каждый элемент записывается в память как двухбайтовое слово.
В строках 137—140 описывается таблица коэффициентов деления для Всех нот. Начало таблицы соответствует метке tabkd. Каждый элемент этой таблицы также имеет размер в два байта. Первый элемент таблицы равен нулю. Это неиспользуемый элемент. Ноты номер ноль у нас не существует. Ноль мы использовали для кодирования паузы.
В паузе не формируется звуковой сигнал, поэтому и коэффициент деления там не имеет смысла. Поэтому значение нулевого элемента массива несущественно. Описание таблицы разбито на строки. Для удобства каждая строка описывает коэффициенты деления для одной октавы. Нулевая нота выделена в отдельную строку. Последняя октава неполная, так как наша шкатулка будет использовать всего 32 ноты.
В строках 143—200 описана таблица мелодий. Вернее, это не одна таблица, а семь таблиц (своя таблица для каждой из мелодий). Каждая таблица помечена своей отдельной меткой (те 11, те 12 — те 17). Значение каждой метки — это адрес начала соответствующей мелодии. Каждое значение таблицы мелодий записывается в память в виде одного байта. Поэтому все строки, кроме последней, для каждой таблицы имеют четное число значений.
В строках 141,142 описана таблица начал всех мелодий. Начало этой таблицы отмечено меткой tabm. Таблица используется для того, чтобы программа могла найти адрес начала нужной мелодии по ее номеру. В качестве элементов массива выступают удвоенные значения меток mell,me!2 —me!7. Применение удвоенных значений обусловлено необходимостью перевода адресов из основной адресации в альтер-
нативную. При трансляции программы вместо меток в память будут записаны конкретные адреса.
Подробнее об основной и альтернативной адресации читайте в [3] и [4].
Процедура вычисления адреса
Большое количество таблиц в нашей программе заставляет позаботиться о процедуре вычисления адреса.
Однотипные вычисления удобно оформить в виде подпрограммы. Эта подпрограмма занимает строки 78—84. Вызов подпрограммы производится по имени addw. Подпрограмма получает номер элемента таблицы и адрес ее начала. Номер элемента передается в подпрограмму при помощи регистра YL, а адрес — через регистровую пару Z.
Используя эти данные, подпрограмма вычисляет адрес нужного элемента. Для этого она сначала удваивает номер элемента (строка 79). Затем дополняет полученное значение до шестнадцатиразрядного путем записи в YH нулевого байта (строка 80). И, наконец, производит сложение двух шестнадцатиразрядных величин, находящихся к этому моменту в регистровых парах Y и Z (строки 81,82). Результат вычислений при этом попадает, в регистровую пару Z. Назначение команд push и pop (строки 78, 83), по-видимому, уже объяснять не нужно.
Текст программы «шаг за шагом»
Теперь рассмотрим текст программы с самого начала. В строках 3...10 расположен модуль описания переменных (рабочих регистров). В строках 13...31 располагается модуль переопределения векторов прерываний, в строках 32...41 — модуль команд инициализации.
■ Особенности программы
Процедура, расположенная в строках 45—52 программы, сканирует клавиатуру и находит код первой из нажатых кнопок. Найденый код находится в регистре count. Затем управление переходит к строке 53. С этого места начинается процедура выбора мелодии (строки 53—58). Суть процедуры — прочитать из таблицы tabm значение
адреса начала этой мелодии. То есть прочитать элемент таблицы, номер которого равен коду нажатой клавиши.
Прежде чем прочитать элемент, необходимо найти его адрес. Для вычисления адреса используем подпрограмму addw. Перед тем, как вызвать подпрограмму, подготовим все данные. Номер нажатой клавиши помещаем в регистр YL (строка 53). Адрес начала таблицы записываем в регистровую пару Z (строки 54, 55). И лишь затем в строке 56 вызывается подпрограмма addw.
После выхода из подпрограммы в регистровой паре Z находится результат вычислений — адрес нужного нам элемента таблицы tabm. Следующие две команды (строки 57 и 58) извлекают тот элемент (адрес начала мелодии) и помещают его в регистровую пару X. Там этот адрес будет храниться все время, пока воспроизводится именно эта мелодия.
Следующий этап — воспроизведение мелодии. Воспроизведением мелодии занимается процедура, расположенная в строках 59—77. Для последовательного воспроизведения нот нам понадобится указатель текущей ноты. В качестве указателя текущей ноты используется регистровая пара Z. В самом начале процедуры воспроизведения мелодии в регистровую пару Z помещается адрес начала мелодии их регистровой пары X (строки 59, 60).
Затем начинается цикл воспроизведения (строки 61—77). В этом цикле программа извлекает код ноты по адресу, на который указывает наш указатель, выделяет из кода ноты код тона и код длительности, воспроизводит ноту, а затем увеличивает значение указателя на единицу. Затем весь цикл повторяется.
Этот процесс происходит до тех пор, пока код очередной ноты не окажется равным 255 (метка конца мелодии). Прочитав этот код, программа передает управление на строку 62, где в регистр Z снова записывается адрес начала мелодии. Воспроизведение мелодии начнется сначала. Этот процесс должен прерваться лишь в одном случае — при отпускании управляющей кнопки.
Для проверки состояния кнопок в цикл воспроизведения мелодии включена специальная процедура (строки 61—63). Процедура упрощенно проверяет состояние сразу всех кнопок. Она считывает содержимое порта PD (строка 61) и сравнивает его с кодом 0x7F (строка 62). Прочитанное из порта значение может быть равно 0x7F только
в одном случае — если все кнопки отпущенны. Если хотя бы одна кнопка нажата, то при чтении порта мы получим другое значение.
Проверкой вышеописанного условия занимается оператор breq в строке 63. Если все кнопки оказались отпущены, этот оператор завершает цикл воспроизведения мелодии и передает управление на метку ml, то есть на самое начало основного цикла программы. Там происходит выключение звука, а затем новое сканирование клавиатуры.
Если хотя бы одна кнопка окажется нажатой, то цикл воспроизведения звука продолжается дальше, и управление переходит к строке 64, где происходит извлечение кода ноты. Так как адрес этой ноты находится в регистровой паре Z (указатель текущей ноты), то для извлечения ноты просто используется команда 1pm.
В строке 65 происходит проверка признака конца мелодии. Только что прочитанный код ноты сравнивается с кодом OxFF. Оператор breq в строке 66 передает управление по метке т4, если мелодия действительно закончилась (условие выполняется). Если код ноты не равен OxFF, перехода не происходит, и управление переходит к строке 67.
В строках 67—75 происходит обработка кода ноты. То есть из кода ноты выделяется код тона и код длительности. Сначала на код ноты накладывается маска, которая оставляет пять младших разрядов, а три старших сбрасывает (строка 67). Под действием маски в регистре temp остается код тона, который затем помещается в регистр f not а (строка 68).
Теперь нам нужно найти код длительности ноты. Для этого нам заново придется извлечь код ноты из памяти программ. Так как до этого момента мы не изменяли положение указателя текущей ноты, то для извлечения нет никаких препятствий. В строке 69 мы повторно извлекаем код ноты из памяти программ. Но на этот раз значение указателя увеличивается. Теперь можно приступать к выделению кода длительности. Как вы помните, длительность кодируется тремя младшими битами кода ноты. Для выделения этих битов нам также нужно использовать маску. Но одной маской нам не обойтись. Нам нужно не просто выделить три старших разряда, а сделать их младшими, как это показано на рис. 2.2.
0
0
0
64
63
62
61
60
Рис. 2.2. Разложение кода ноты
Процедура выделения кода длительности занимает строки 70—74. Сначала программа производит многократный циклический сдвиг кода ноты до тех пор, пока три старших разряда не станут тремя младшими. Для сдвига используется команда rol. Так как сдвиг происходит через ячейку признака переноса, то нам понадобится четыре команды сдвига. Эти команды занимают в программе строки 70—73.
Затем в строке 74 на полученное в результате сдвигов число накладывается маска, которая выделяет три младшие бита, а пять старших сбрасывает в ноль. Полученный таким образом код длительности записывается в регистр dnota (строка 75).
Когда код тона и код длительности определены, производится вызов подпрограммы воспроизведения ноты (строка 76). Оператор г jmp в строке 77 передает управление на начало цикла воспроизведения мелодии, и цикл повторяется для следующей ноты.
Подпрограмма воспроизведения ноты занимает строки 85—ПО. Она выполняет следующие действия:
извлекает из таблицы tabkd коэффициент деления, соответствующий коду ноты;
программирует таймер и включает звук;
затем выдерживает паузу и звук выключает.
Если код тона равен нулю (нужно воспроизвести паузу без звука), извлечение коэффициента деления и включение звука не выполняется. Подпрограмма сразу переходит к формированию паузы.
Начинается подпрограмма воспроизведения ноты с сохранения всех используемых регистров (строки 85—88). Затем производится проверка кода ноты на равенство нулю (строка 89). Если код ноты
равен нулю, то оператор breq в строке 90 передает управление по метке ntl, то есть к строке, где происходит вызов процедуры формирования задержки.
Если код ноты не равен нулю, то программа приступает к извлечению коэффициента деления. Для вычисления адреса элемента таблицы tabkd, где находится этот коэффициент, снова используется подпрограмма addw.
Код тона помещается в регистр YL (строка 91), а адрес начала таблицы — в регистровую пару Z (строки 92, 93). Вызов подпрограммы addw производится в строке 94. В регистровой паре Z подпрограмма возвращает адрес элемента таблицы, где находится нужный нам коэффициент деления. В строках 95, 96 из таблицы извлекается этот коэффициент. А в строках 97,98 он помещается в регистр совпадения таймера. В строках 99,100 включается звук.
В строке 104 вызывается специальная подпрограмма, предназначенная для формирования задержки. Подпрограмма называется wait и формирует задержку с переменной длительностью. Длительность задержки зависит от значения регистра dnota. По окончании задержки звук выключается (строки 102,103).
На этом можно было бы закончить процесс воспроизведения ноты. Однако это еще не все. Для правильного звучания мелодии между двумя соседними нотами необходимо обеспечить хотя бы небольшую паузу. Если такой паузы не будет, ноты будут звучать слитно. Это исказит мелодию, особенно если подряд идет несколько нот с одинаковым тоном. Формирование паузы между нотами происходит в строках 104,105.
Вспомогательная пауза формируется при помощи уже знакомой нам подпрограммы задержки. В строке 104 коду паузы присваивается нулевое значение (выбирается самая минимальная пауза). Затем в строке 105 вызывается подпрограмма wait. После окончания паузы остается только восстановить содержимое всех сохраненных регистров из стека (строки 106—109) и выйти из подпрограммы (строка 110).
Подрограмма формирования задержки
И последнее, что нам еще осталось рассмотреть, — это подпрограмма формирования задержки. Текст подпрограммы занимает строки 111—135. Как и любая другая подпрограмма, подпрограмма wait в
начале сохраняет (строки 111—114), а в конце — восстанавливает (строки 131—134) все используемые регистры.
Рассмотрим, как работает эта подпрограмма. Сначала определяется длительность задержки. Для этого извлекается соответствующий элемент из таблицы tabz. Номер элемента соответствует коду задержки, находящемуся в регистре dnota. Извлечение значения из таблицы производится уже знакомым нам образом. Команды, реализующие вычисление адреса нужного элемента таблицы, находятся в строках 115—118. Затем в строках 119 и 120 производится чтение элемента таблицы. Прочитанный код задержки помещается в регистровую пару Y.
Теперь наша задача: сформировать задержку, пропорциональную содержимому регистровой пары У. Так как микроконтроллер Atiny2313 имеет только один шестнадцатиразрядный таймер, который уже занят формированием звука, будем формировать задержку программным путем. Но в данном случае цикл формирования задержки построен немного по-другому.
Вообще-то, способов построения подобных подпрограмм может быть бесконечное множество. Все зависит от изобретательности программиста. Использованный в данном примере способ более удобен для формирования задержки переменной длительности, пропорциональной заданному коэффициенту. Главной особенностью нового способа является шестнадцатиразрядный параметр цикла.
Для хранения этого параметра используется регистровая пара Z. Перед началом цикла задержки в нее записывается ноль. Затем начинается цикл, на каждом проходе которого содержимое регистровой пары Z увеличивается на единицу. После каждого такого увеличения производится сравнение нового значения Z с содержимым регистровой пары Y.
Заканчивается цикл тогда, когда содержимое Z и содержимое Y окажутся равны. В результате число, записанное в регистровой паре Y, будет определять количество проходов цикла. Поэтому и время задержки, формируемое этим циклом, будет пропорционально константе задержки. Однако это время будет слишком мало для получения приемлемого темпа воспроизведения мелодий. Для того, чтобы увеличить время до нужной нам величины, внутрь главного цикла задержки помещен еще один цикл, имеющий фиксированное количество проходов.
Описанная выше процедура задержки занимает строки 121—135. В строках 121, 122 производится запись нулевого значения в регистровую пару Z. Большой цикл задержки занимает строки 123—130. Малый внутренний цикл занимает строки 124—125. Для хранения параметра малого цикла используется регистр loop. В строке 123 в него записывается начальное значение. Строки 124,125 выполняются до тех пор, пока содержимое loop не окажется равным нулю.
В строке 126 содержимое регистровой пары Z увеличивается на единицу. В строках 127—130 производится сравнение содержимого двух регистровых пар Y и Z. Сравнение производится побайтно. Сначала сравниваются младшие байты (строка 127). Если они не равны, оператор условного перехода в строке 128 передает управление на начало цикла.
Если младшие байты равны, сравниваются старшие байты (строка 129). Если старшие байты неодинаковы, оператор brne в строке 130 опять заставляет цикл начинаться с начала. И только когда оба оператора сравнения дадут положительный результат (не вызовут перехода), цикл заканчивается, и подпрограмма формирования задержки переходит к завершающей фазе (к строкам 131—135).
Программа на языке СИ
Возможный вариант программы на языке СИ приведен в листинге 2.2. В данном случае использована модификация языка поддердиваемая программной средой CodeVision. Описание программы расчитано на читателей, знакомых с языком СИ. Если вы не владеете этим языком или у вас вызывает проблему конкретная реализация языка, рекомендую обратиться к [4], где представлен подробный урок этого языка для начинающих.
Теперь рассмотрим подробнее программу с самого начала.
Листинг 2.2
Project Prog 9
Version 1
Date . 31.01.2006
Author : BeJov
Comments. Музыкальная укагулка
Chip ГуреATtiny2313
Clock frequency4.000000 MHz
*»e***we**w**Tx*i-***»i*»*iwwtt*e*****et*********»w«-wx,/
1«include <tiny2313 h>
2 «include <delay h>
// Объявление и инициализация массивов
// Таблица задержек
3 flash unsigned int tabz[] = (16,32,64.128,256 512.1024}
// Массив коэффициентов деления
4 flash unsigned int tabkd[] = (0.4748,4480,4228,3992.3768,3556 3356.3168,2990.2822.
52664.2514.2374 2240.2114.1996.1884.1778,1678,1584 1495 1411,1332,1257,
61187,1120.1057. 998,942.889,839,792};
// Таблицы мелодий
// В траве сидел кузнечик
7 flash unsigned char mel1[] = (109,104 109,104,109,108,108,96 108,104 108.104,108.
8109,109.96.109.104.109.104,109,108 108.96.108.104.108.104.108,141,96.109.
9111, 79. 79.111,111,112 80.80.112.112,112, 111 109, 108 109.109. 96.109 111,
1079.79,111.111.112,80,80,112.112.112.111.109 108,141 128 96.255}:
If Песенка крокодила Гены
11 flash unsigned char me!2[] = (109.110,141,102 104,105.102,109 110.141,104,105.107
12104,109 110.141.104.105,139,109,110,173.96 114 115.146.109.110.112,109.114.
13115,146.107 109 110.114,112,110,146,109,105.136 107 105,134,128 128.102.105,
14137 136 128.104.107.139.137,128,105,109.141.139.128.110,109.176 112.108,109,
15112,144.142,128 107 110,142.141.128,105,109.139.128,173.134 128.128.109.112,
16144.142.128 107,110,142,141,128.105.109.139,128.173.146 128 255},
// В лесу родилась елочка
17 flash unsigned char mel3[] = (132.141,141.139.141.137.132.132 132 141.141.142.139,
18176.128.144,146,146 154. 154,153. 151, 149 144.153.153.151.153,181,128 96,255}'
// Happy births day to you
19 flash unsigned char mel4[] = (107, 107.141,139.144.143.128.107.107 141.139, 146,144
20128,107 107.151.148.146.112 111.149,1 17.117,148,144 146.144,128 255}:
// С чего начинается родина
21 flash unsigned char mel5[] = (99,175,109.107.106.102.99 144 111.175.96.99,107 107
22107. 107.102, 104. 170.96.99. 109. 109.109. 109. 107, 106, 143. 109. 141 99, 109. 109,109.
23109.104.106.171.96,99,111 109.107.106.102.99.144.111,143 104 114,114.114 1 14.
24109. 111, 176, 96 104. 116.112. 109.107 106 64 73. 143. 107 131.99, 144,80.80.112,
25111 64.75 173 128 255}.
// Из кинофильма "Веселые ребята"
26 flash unsigned char mel6f1 = (105,109,112 149,116 64.80. 148. 114,64.78,146.112 96. 105
27105 109,144,111 64.80,145.112,64.81 178 96,117.117.117.149.116.64 82 146.112.
2864.79. 146. 144,96, 105, 105, 107,141.108.109.112,110.102.104,137 128 96.105.105.
29105, 137 102 64.73. 142. 105. 107 109 64 75. 137,96 105 105. 105, 137. Ю2. 105. 142 112
3064.82.180 96. 116. 116.116 148.114. 112. 142. 109.64.78 146 144 96. 105 105. 107. 141
31108,109 112,110,102.104.169.96.96 255}.
32flash unsigned char mcl7[l 1 (107.104.141.139.102.105.104 102.164 128 104.107 109.1 и 933109 111. 114112. 111 109144139 128,109. 111. 144. 96.111.109104107. 105. 17312834111 109 112107. 111 109109107 102.104.134. 132 128.100.103107107. 107. 10713935112.100 103102.102.102134102.103,107.105.107 108. 108.108108107 105 10710836144. 142 128112.107. 110140112.105,108 107 107. 107 105. 140139139.112.10310237103 105.108107,105.103128112.107. 110. 108. 108. W8. 140, 112105108 107 10710738139.112.103102.103 105108107 105 103 105. 139.132.128 96.96 96.255}32flash unsigned char mcl7[l 1 (107.104.141.139.102.105.104 102.164 128 104.107 109.1 и 933109 111. 114112. 111 109144139 128,109. 111. 144. 96.111.109104107. 105. 17312834111 109 112107. 111 109109107 102.104.134. 132 128.100.103107107. 107. 10713935112.100 103102.102.102134102.103,107.105.107 108. 108.108108107 105 10710836144. 142 128112.107. 110140112.105,108 107 107. 107 105. 140139139.112.10310237103 105.108107,105.103128112.107. 110. 108. 108. W8. 140, 112105108 107 10710738139.112.103102.103 105108107 105 103 105. 139.132.128 96.96 96.255}!f Таблица начал всех мелодий39 flash unsigned char -tabrnf] = {men mel2, me13 me(4. те!5 mp!6 mel7}!f Таблица начал всех мелодий39 flash unsigned char -tabrnf] = {men mel2, me13 me(4. те!5 mp!6 mel7}// Улыбка
32
flash unsigned char mcl7[l 1 (107.
104.141.139.102.105.104 102.164 128 104.107 109.
1 и 9
33
109 111. 114
112. 111 109
144
139 128,109. 111. 144. 96.111.109
104
107. 105. 173
128
34
111 109 112
107. 111 109
109
107 102.104.134. 132 128.100.103
107
107. 107. 107
139
35
112.100 103
102.102.102
134
102.103,107.105.107 108. 108.108
108
107 105 107
108
36
144. 142 128
112.107. 110
140
112.105,108 107 107. 107 105. 140
139
139.112.103
102
37
103 105.108
107,105.103
128
112.107. 110. 108. 108. W8. 140, 112
105
108 107 107
107
38
139.112.103
102.103 105
108
107 105 103 105. 139.132.128 96.
96 96
.255}
32
flash unsigned char mcl7[l 1 (107.
104.141.139.102.105.104 102.164 128 104.107 109.
1 и 9
33
109 111. 114
112. 111 109
144
139 128,109. 111. 144. 96.111.109
104
107. 105. 173
128
34
111 109 112
107. 111 109
109
107 102.104.134. 132 128.100.103
107
107. 107. 107
139
35
112.100 103
102.102.102
134
102.103,107.105.107 108. 108.108
108
107 105 107
108
36
144. 142 128
112.107. 110
140
112.105,108 107 107. 107 105. 140
139
139.112.103
102
37
103 105.108
107,105.103
128
112.107. 110. 108. 108. W8. 140, 112
105
108 107 107
107
38
139.112.103
102.103 105
108
107 105 103 105. 139.132.128 96.
96 96
.255}
!f Таблица начал всех мелодий
39 flash unsigned char -tabrnf] = {men mel2, me13 me(4. те!5 mp!6 mel7}
!f Таблица начал всех мелодий
39 flash unsigned char -tabrnf] = {men mel2, me13 me(4. те!5 mp!6 mel7}
40 void mam(void)
41
unsigned char count.
// Определяем переменную count
42
unsigned char' temp
// Определяем переменную temp
43
unsigned char fnota
// Код тона ноты
44
unsigned char dnota.
// Коп длительности ноты
45
flash unsigned char
•nota: // Ссылка на текущую ноту
46 PORTB=OxO8// Инициализация порта РВ
47 DDRB=0x08'
48 P0RTD=0x7F. Н Инициализация порта PD
49 DDRD=0x00.
50 ACSR -0x80:// Инициализация (отключение) компаратора
51 TCCR1A=0x00 // Инициализация таймера счетчика Т1
52 TCCR1B=0x09.
while (1)
ml: temp=PIND.
for (count=0. counts?. countr-+) // Цикл сканирования датчиков
56if ((temp&1)==0) goto m3'// Проверка младшего бита переменной temp
57temp >^= 1.//Сдвиг содержимого temp
58 m2'ТС(5н1А=0х00,Ц Выключение звука
59 goto ml,// Переход на начало
// Воспроизведение мелодии60m3:nota = tabm[count],61m4if (PIND==0x7F) goto m262if (*nota==OxFF) goto m3,63fnota = (-nota)&OxlF64dnota = ((•nota)»5)&0x0765if (fnota==0) goto m5;660CR1A=tabkd[fnota],67TCCR1A=0x40:68m5:delay ms (tabz[dnota])69TCCRlA^OxOO.70delay_ms (tabz[OJ)"71пога+т,72 goto m4.■// Воспроизведение мелодии60m3:nota = tabm[count],61m4if (PIND==0x7F) goto m262if (*nota==OxFF) goto m3,63fnota = (-nota)&OxlF64dnota = ((•nota)»5)&0x0765if (fnota==0) goto m5;660CR1A=tabkd[fnota],67TCCR1A=0x40:68m5:delay ms (tabz[dnota])69TCCRlA^OxOO.70delay_ms (tabz[OJ)"71пога+т,72 goto m4.■// Устанавливаем указатель на первую ноту П Если ни одна кнопка не нажата, закончить И Проверка на конец мелодии// Определяем код тонаП Определяем код длительности// Если пауза не воспроизводим звук// Программируем частоту звука// Включаем звук// Формируем задержку// Выключаем звук// Задержка между нотами// Перемещаем указатель на следующую ногу // К началу цикла// Устанавливаем указатель на первую ноту П Если ни одна кнопка не нажата, закончить И Проверка на конец мелодии// Определяем код тонаП Определяем код длительности// Если пауза не воспроизводим звук// Программируем частоту звука// Включаем звук// Формируем задержку// Выключаем звук// Задержка между нотами// Перемещаем указатель на следующую ногу // К началу цикла
// Воспроизведение мелодии
60m3:nota = tabm[count],
61m4if (PIND==0x7F) goto m2
62if (*nota==OxFF) goto m3,
63fnota = (-nota)&OxlF
64dnota = ((•nota)»5)&0x07
65if (fnota==0) goto m5;
660CR1A=tabkd[fnota],
67TCCR1A=0x40:
68m5:delay ms (tabz[dnota])
69TCCRlA^OxOO.
70delay_ms (tabz[OJ)"
71пога+т,
72 goto m4.■
// Воспроизведение мелодии
60m3:nota = tabm[count],
61m4if (PIND==0x7F) goto m2
62if (*nota==OxFF) goto m3,
63fnota = (-nota)&OxlF
64dnota = ((•nota)»5)&0x07
65if (fnota==0) goto m5;
660CR1A=tabkd[fnota],
67TCCR1A=0x40:
68m5:delay ms (tabz[dnota])
69TCCRlA^OxOO.
70delay_ms (tabz[OJ)"
71пога+т,
72 goto m4.■
// Устанавливаем указатель на первую ноту П Если ни одна кнопка не нажата, закончить И Проверка на конец мелодии
// Определяем код тона
П Определяем код длительности
// Если пауза не воспроизводим звук
// Программируем частоту звука
// Включаем звук
// Формируем задержку
// Выключаем звук
// Задержка между нотами
// Перемещаем указатель на следующую ногу // К началу цикла
// Устанавливаем указатель на первую ноту П Если ни одна кнопка не нажата, закончить И Проверка на конец мелодии
// Определяем код тона
П Определяем код длительности
// Если пауза не воспроизводим звук
// Программируем частоту звука
// Включаем звук
// Формируем задержку
// Выключаем звук
// Задержка между нотами
// Перемещаем указатель на следующую ногу // К началу цикла
Описание программы (листинг 2.2)
Для формирования задержки мы будем использовать функцию из библиотеки delay.h. Поэтому в строках 1,2 программы, кроме файла описаний, мы’присоединяем и эту библиотеку. Затем начинаются описания всех массивов. В строке 3 описывается массив, содержащий величины всех музыкальных длительностей.
Так как для формирования длительности мы будем использовать функцию delay_ms, величина длительностей задана в миллисекундах. Как видно из текста программы, в данном случае мы используем массив типа unsigned int. Переменные этого типа
имеют длину два байта, все 16 битов которых используются для хранения информации.
Именно такой тип наиболее подходит для хранения наших коэффициентов. Управляющее слово f leash перед описанием массива гарантирует, что эти данные будут размещены в программной памяти микроконтроллера.
В строках 4, 5, 6 описывается массив коэффициентов деления для всех нот. В этом месте программы мы впервые используем перенос строки. Перенос строки применяется в том случае, когда текст команды не помещается в одной строке. Язык СИ разрешает свободно переносить текст на следующую строку. При этом не требуется никаких специальных директив и указателей.
Перенос допускается в том месте команды, где между двумя соседними элементами выражения можно поставить пробел. Тип массива, как и в предыдущем случае,— usingnerd int. Содержимое массива tabkd полностью соответствует содержимому таблицы с тем же названием из ассемблерного варианта программы.
В строках 7—38 описываются семь массивов для хранения семи мелодий. Массивы имеют тип unsigned char. Переменные этого типа занимают в памяти один байт, и все восемь битов этого байта используются для хранения информации. Содержимое каждого из этих массивов полностью соответствует содержимому соответствующих таблиц в ассемблерной версии программы.
В строке 39 описывается массив, содержащий адрес начала каждой из семи мелодий. Это не просто массив, а массив ссылок, на что указывает символ звездочки в тексте его описания. Так же, как и ссылочная переменная, каждый элемент массива ссылок предназначен для хранения ссылки. Данный массив тоже хранится в памяти программ, на что указывает управляющее слово flesh в его описании. Элементы этого массива хранят указатели на начало каждого из массивов мелодий, что указано при его инициализации (в фигурных скобках).
Строки 40—72 занимает функция main. Начинается функция с описания переменных (строки 41—45). Две рабочих переменных count и temp, а также переменная для хранения кода тона (tnota) и переменная для хранения кода длительности (dnota) нам уже знакомы. Мы использовали их в предыдущей программе.
Интерес представляет описание переменной not а. Это ссылочная переменная, которая предназначена для хранения указателей на объекты в программной памяти, имеющие тип unsigned char. Она
будет использоваться нами для обращения к элементам массивов, хранящим коды нот. Эти массивы, как уже говорилось, расположены в программной памяти. Поэтому в описании переменной имеется слово flash, а перед именем переменной в ее описании стоит символ звездочки. То есть это ссылка на массивы типа unsigned char, расположенные во flesh.
В строках 46—52 расположен блок инициализации. Эта часть программы полностью повторяет аналогичную часть программы из предыдущего примера (см. листинг 2.2).
Строки 53—72 занимает основной цикл программы. Цикл состоит всего из двух процедур. В начале цикла (строки 54—59) расположена процедура сканирования клавиатуры. Эта процедура один к одному скопирована из предыдущего примера (см. листинг 2.2 строки 14—21).
При обнаружении нажатой кнопки управление передается по метке m3 (в новой программе это строка 60). Как вы помните, номер нажатой кнопки при выходе из процедуры сканирования содержится в переменной count.
Строки 60—72 занимает процедура проигрывания мелодии. Проигрывание начинается с того, что в переменную nota помещается указатель на массив, содержащий нужную нам мелодию (строка 60). А указатель — это элемент массива tabm, с номером, равным коду нажатой кнопки. В строках 61—72 находится цикл, который последовательно считывает мелодию нота за нотой и проигрывает прочитанные ноты. Цикл организован при помощи оператора безусловного перехода (строка 72).
Для перемещения вдоль массива содержимое переменной nota каждый раз увеличивается на единицу (строка 71). В этом же цикле производится проверка состояния клавиатуры (нажата ли еще хоть одна кнопка) и проверка признака конца мелодии. Рассмотрим подробнее, как все это делается.
Проверка состояния клавиатуры происходит в строке 61. Если содержимое регистра FIND равно 0x7F, то воспроизведение мелодии прекращается. Управление передается по метке m2. Там происходит выключение звука, а затем переход по метке ml, то есть к началу основного цикла программы.
Если хоть одна кнопка еще нажата, перехода не происходит и воспроизведение мелодии продолжается. В строке 62 производится проверка на конец мелодии. Содержимое элемента массива, на который указывает ссылочная переменная nota (код ноты), про-
вернется на равенство числу OxFF. Если код ноты равен OxFF, то управление передается по метке m3, где указатель снова устанавливается на начало мелодии.
В строке 63 вычисляется значение кода тона. Для этого на код ноты, на который указывает переменная not а, накладывается маска. Наложение маски производится при помощи оператора «&». Полученный код тона записывается в переменную fnota.
В строке 64 производится вычисление кода длительности. Для этого применяется составное математическое выражение. Операция (*nota) >>5 сдвигает биты кода ноты на пять шагов вправо. При этом три старших разряда кода становятся тремя младшими. Мы применяем сдвиг вправо потому, что циклический сдвиг влево, использованный нами в Ассемблере, язык СИ не поддерживает. Язык СИ может выполнять только логический сдвиг, но не циклический. На полученное в результате сдвига число налагается маска 0x07. Полученный таким образом код длительности записывается в переменную dnota. ■
В строке 65 происходит проверка кода тона на равенство нулю. Если код окажется равным нулю, то управление передается по метке т5, то есть к строке, где формируется пауза, обходя строки, где формируется звук.
Звук формируется в строках 66, 67. Сначала в регистр совпадения OCR1A помещается коэффициент деления из массива tabkd. Причем указатель массива равен коду тона. Затем в регистр управления TCCR1A записывается код, который подключает таймер к выводу ОС1А и, тем самым, включает звук.
В строке 68 происходит вызов функции задержки. В качестве параметра в эту функцию передается коэффициент, извлекаемый из массива tabz. Указатель массива при этом равен коду длительности. После выхода из функции задержки звук выключается.
Для этого в регистр TCCR1А записывается нулевое значение (строка 69). В строке 70 формируется пауза между нотами. В качестве параметра для функции delay_ms в этом случае используется нулевой элемент массива tabz, то есть вырабатывается пауза минимальной длительности.
В строке 71, как уже говорилось, происходит приращение содержимого указателя not а. Оператор безусловного перехода в строке 72 замыкает цикл воспроизведения мелодии.
2.2. Кодовый замок
Постановка задачи
В качестве второго примера я подбирал задачу достаточно сложную и интересную, способную как увлечь, так и научить работать с еще неохваченными элементами микроконтроллера. Самым удобным примером, на мой взгляд, является кодовый замок. Вообще, микроконтроллеры AVR с их встроенной энергонезависимой памятью (EEPROM) дают широкий простор для разработчика подобных конструкций. Память EEPROM идеально подходит для хранения кода. Причем такой код всегда легко поменять.
При разработке замка мне не хотелось быть тривиальным. Поэтому я предлагаю не совсем обычный замок. Представьте себе кодовый замок, который может воспринимать в качестве кодовой комбинации не только отдельно нажимаемые кнопки, но и любые их сочетания. Например, попарно нажимаемые кнопки, комбинации типа
«Нажать кнопку 6 и, не отпуская, набрать код 257».
И вообще, выбрать любую комбинацию любых кнопок в любом сочетании. Мною был разработан такой замок. Его я и хочу предложить вашему вниманию.
Принцип действия замка следующий: в режиме записи кода владелец нажимает кнопки набора кода в любом порядке и в любых комбинациях. Микроконтроллер отслеживает все изменения на клавиатуре и записывает их в ОЗУ. Длина кодовой последовательности ограничена только размерами ОЗУ. Сигналом к окончанию ввода кода служит прекращение манипуляций с клавиатурой.
Считается, что манипуляции закончились, если состояние клавиатуры не изменилось в течение контрольного промежутка времени. Я выбрал его примерно равным одной секунде. Сразу по окончании процесса ввода кода (по окончании контрольного промежутка времени) микропроцессор записывает принятый таким образом код в EEPROM. Код представляет собой последовательность байтов, отражающих все состояния клавиатуры во время набора. После того, как коды будут записаны, замок можно перевести в рабочий режим. Для этого предусмотрен специальный тумблер выбора режимов.
В рабочем режиме замок ждет ввода кода. Для открывания двери необходимо повторить те же самые манипуляции с кнопками, ко-
торые вы делали в режиме записи. Микроконтроллер так же, как и в предыдущем случае, отслеживает эти манипуляции и записывает полученный таким образом код в ОЗУ. По окончании ввода кода (по истечении контрольного промежутка времени) программа переходит в режим сверки кода, находящегося в ОЗУ, и кода, записанного в EEPROM. Сначала сравнивается длина обоих кодов. Затем коды сверяются побайтно. Если сравнение прошло успешно, микроконтроллер подает сигнал на механизм открывания замка.
Итак, сформулируем задачу следующим образом:
«Создать схему и программу электронного кодового замка, имеющего десять кнопок для ввода кода, обозначенных цифрами от «О» до «9». Замок должен иметь переключатель режимов «Запись/Работа». В случае правильного набора кода замок должен включать исполнительный механизм замка (соленоид или электромагнитную защелку). Ввод кода должен производиться описанным выше способом».
Алгоритм
При составлении данного алгоритма нам не обойтись без такого понятия, как «код состояния клавиатуры». Что такое код состояния?. Все кнопки клавиатуры подключаются к микроконтроллеру при помощи портов ввода-вывода. Для подключения десяти кнопок (кнопки «О»—«9») одного порта недостаточно. Несколько кнопок придется подключить ко второму.
Контроллер читает содержимое этих портов и получает код, соответствующий их состоянию. Каждой кнопке клавиатуры в этом коде будет соответствовать свой отдельный бит. Когда кнопка нажата, соответствующий бит будет равен нулю. Когда отпущена — единице. Поэтому при разных сочетаниях нажатых и отпущенных кнопок код состояния клавиатуры будет иметь разные значения.
В момент включения питания все кнопки замка должны быть отпущены. Если это не так, то возникает неопределенность в работе замка. Поэтому наш алгоритм должен начинаться с процедуры ожидания отпускания всех кнопок. Как только все кнопки окажутся отпущенными или в случае, если они вообще не были нажаты, начинается другая процедура ожидания. На сей раз программа ожидает момента нажатия кнопок. Это как раз тот режим работы, в котором замок будет находиться большую часть времени. В момент нажатия любой из кнопок начинается цикл ввода ключевой комбинации.
Процедура ввода ключевой комбинации представляет собой многократно повторяющийся процесс, периодически считывающий код состояния клавиатуры. Каждый раз после очередного считывания кода программа проверяет, не изменился ли этот код. Как только код изменится, новое его значение записывается в очередную ячейку ОЗУ. В результате, пока состояние клавиатуры не изменяется, программа находится в режиме ожидания.
Как только состояние изменилось, происходит запись нового значения кода состояния в память. Поэтому ключевая комбинация, записанная в ОЗУ, будет представлять собой перечисление всех значений кода состояния клавиатуры, которое он принимал в процессе ввода ключевой комбинации. Длительность же удержания кнопок в каждом из состояний в память не записывается.
Однако это лишь приблизительный алгоритм процедуры ввода ключевой комбинации. Так сказать, ее костяк. На самом деле алгоритм немного сложнее. Обнаружив изменение состояния клавиатуры, программа не сразу записывает новый код в ОЗУ. В целях борьбы с дребезгом контактов, а также для компенсации неточности одновременного нажатия нескольких кнопок, программа сначала выдерживает специальную защитную паузу, затем повторно считывает код состояния клавиатуры и лишь после этого записывает новый код в ОЗУ. . '
Длительность защитной паузы выбрана равной 48 мс. Такая пауза особенно полезна в случае, если при наборе ключевой комбинации вы хотите использовать одновременное нажатие кнопок. Как бы вы не старались нажать кнопки одновременно, вам этого не удастся. Все равно будет какое-то расхождение в моменте замыкания контактов. Причем порядок замыкания контактов будет зависеть от многих факторов и практически является случайным.
Если не принять специальных мер, то в момент такого нажатия программа зафиксирует не одно, а несколько последовательных изменений кода состояния клавиатуры. Если полученная таким образом кодовая комбинация будет записана в EEPROM, то открыть такой замок будет практически невозможно.
При попытке повторить те же нажатия, замыкание контактов будут происходить в другом порядке. Программа воспримет его как совершенно другой код. Защитная пауза решает эту проблему. В каком бы порядке ни замыкались контакты при одновременном нажатии нескольких кнопок, после паузы все эти процессы закончатся. Повторное считывание даст уже устоявшийся код состояния клавиатуры. Повторить такую комбинацию не составит труда.
Кроме защитной паузы, для борьбы с дребезгом применяется многократное считывание кода состояния. То есть на самом деле каждый раз происходит не одно, а несколько последовательных операций по считыванию кода состояния. Считывание происходит до тех пор, пока несколько раз подряд будет получен один и тот же код.
Теперь поговорим о том, как программа выходит из процедуры ввода ключевой комбинации. Как уже говорилось ранее, для" выхода из процедуры используется защитный промежуток времени. Для формирования этого промежутка применяется таймер. Таймер должен работать в режиме Normal. В этом режиме он просто считает тактовые импульсы.
Процедура ввода кодовой комбинации устроена таким образом, что при каждом нажатии или отпускании любой из кнопок таймер сбрасывается в ноль. В промежутке между нажатиями его показания увеличиваются под действием тактового сигнала. Если в течение защитного промежутка времени не будет нажата ни одна кнопка, показания таймера увеличатся до контрольного предела. Программа постоянно проверяет это условие. Как только показания счетчика превысят контрольный предел, процедура ввода кодовой комбинации завершается. Величина контрольного промежутка времени равна 1 с.
Дальнейшие действия после выхода из процедуры ввода кодовой комбинации определяются состоянием переключателя режимов работы. Если контакты переключателя замкнуты, программа переходит к процедуре записи кодовой комбинации в EEPROM.
Сначала в EEPROM записывается длина кодовой комбинации. А затем байт за байтом и сама комбинация. Если контакты переключателя режима работы разомкнуты, то программа переходит к процедуре проверки кода. Эта процедура сначала извлекает из EEPROM записанную ранее длину кодовой комбинации и сравнивает ее с длиной только что введенной комбинации.
Если две эти величины не равны, процедура проверки кода сразу же завершается с отрицательным результатом. Если длина обеих комбинаций одинакова, то программа приступает к побайтному их сравнению. Для этого она поочередно извлекает из EEPROM ранее записанные туда байты и сравнивает каждый из них с соответствующими байтами в ОЗУ. При первом же несовпадении процесс сравнения также завершается. И завершается отрицательно.
И только в том случае, если все байты в ОЗУ и в EEPROM окажутся одинаковыми, сравнение считается успешным. В случае успешного
сравнения программа переходит к процедуре открывания замка. Процедура открывания начинается с выдачи открывающего сигнала на исполнительный механизм. Затем программа выдерживает паузу в 2 с и снимает сигнал. Этого времени достаточно для того, чтобы открыть дверь. Затем замок переходит в исходное состояние.
Схема
Возможный вариант схемы замка приведен на рис. 2.3. Кнопки S1—S10 служат для набора кода. Переключатель SI 1 предназначен для выбора режима работы. Если контакт переключателя SI 1 замкнут, замок переходит в режим «Запись». Разомкнутые контакты соответствуют режиму «Работа».
Схема управления механизмом замка состоит из транзисторного ключа VT1 и электромагнитного реле К1. Резистор R1 ограничивает ток базы ключа. Диод VD1 служит для защиты от напряжения самоиндукции, возникающей на катушке реле. Питание реле осуществляется от отдельного источника + 12 В (питание микроконтроллера +5 В). Если в качестве VT1 применять транзистор КТ315, то электромагнитное реле может иметь рабочее напряжение +12 В и рабочий ток не более 250 мА. Контакты реле должны быть рассчитаны на управление исполнительным механизмом (соленоидом).
Рис. 2.3. Схема кодового замка
Кроме защитной паузы, для борьбы с дребезгом применяется многократное считывание кода состояния. То есть на самом деле каждый раз происходит не одно, а несколько последовательных операций по считыванию кода состояния. Считывание происходит до тех пор, пока несколько раз подряд будет получен один и тот же код.
Теперь поговорим о том, как программа выходит из процедуры ввода ключевой комбинации. Как уже говорилось ранее, для" выхода из процедуры используется защитный промежуток времени. Для формирования этого промежутка применяется таймер. Таймер должен работать в режиме Normal. В этом режиме он просто считает тактовые импульсы.
Процедура ввода кодовой комбинации устроена таким образом, что при каждом нажатии или отпускании любой из кнопок таймер сбрасывается в ноль. В промежутке между нажатиями его показания увеличиваются под действием тактового сигнала. Если в течение защитного промежутка времени не будет нажата ни одна кнопка, показания таймера увеличатся до контрольного предела. Программа постоянно проверяет это условие. Как только показания счетчика превысят контрольный предел, процедура ввода кодовой комбинации завершается. Величина контрольного промежутка времени равна 1 с.
Дальнейшие действия после выхода из процедуры ввода кодовой комбинации определяются состоянием переключателя режимов работы. Если контакты переключателя замкнуты, программа переходит к процедуре записи кодовой комбинации в EEPROM.
Сначала в EEPROM записывается длина кодовой комбинации. А затем байт за байтом и сама комбинация. Если контакты переключателя режима работы разомкнуты, то программа переходит к процедуре проверки кода. Эта процедура сначала извлекает из EEPROM записанную ранее длину кодовой комбинации и сравнивает ее с длиной только что введенной комбинации.
Если две эти величины не равны, процедура проверки кода сразу же завершается с отрицательным результатом. Если длина обеих комбинаций одинакова, то программа приступает к побайтному их сравнению. Для этого она поочередно извлекает из EEPROM ранее записанные туда байты и сравнивает каждый из них с соответствующими байтами в ОЗУ. При первом же несовпадении процесс сравнения также завершается. И завершается отрицательно.
И только в том случае, если все байты в ОЗУ и в EEPROM окажутся одинаковыми, сравнение считается успешным. В случае успешного
сравнения программа переходит к процедуре открывания замка. Процедура открывания начинается с выдачи открывающего сигнала на исполнительный механизм. Затем программа выдерживает паузу в 2 с и снимает сигнал. Этого времени достаточно для того, чтобы открыть дверь. Затем замок переходит в исходное состояние.
Схема
Возможный вариант схемы замка приведен на рис. 2.3. Кнопки S1—S10 служат для набора кода. Переключатель SI 1 предназначен для выбора режима работы. Если контакт переключателя SI 1 замкнут, замок переходит в режим «Запись». Разомкнутые контакты соответствуют режиму «Работа».
Схема управления механизмом замка состоит из транзисторного ключа VT1 и электромагнитного реле К1. Резистор R1 ограничивает ток базы ключа. Диод VD1 служит для защиты от напряжения самоиндукции, возникающей на катушке реле. Питание реле осуществляется от отдельного источника + 12 В (питание микроконтроллера +5 В). Если в качестве VT1 применять транзистор КТ315, то электромагнитное реле может иметь рабочее напряжение +12 В и рабочий ток не более 250 мА. Контакты реле должны быть рассчитаны на управление исполнительным механизмом (соленоидом).
Рис. 2.3. Схема кодового замка
Модуль инициализации
43
1 n 11 .
—
Инициализация стека
44
Idi
temp RAMEND, Выбор адреса вершины стека
45
out
SPI. temp; Запись его в регистр стека
—
Инициализация портов В/В
46
Idi
temp,0x18. Инициализация порта РВ
4/
out
ODRB, temp
48
49
Idi out
temp,0хЕ7
PORTB. temp
50
Id i
temp, 0x7F: Инициализация порта PD
51
out
PORTO, temp
52
Idi
temp. 0
53
out
DDRD, temp
—
Инициализация (выключение) компаратора
54
Idi
temp. 0x80.
55
out
ACSR, temp
—
Инициализация таймера
56
Idi
temp high(kzad ). Записываем коэффициент задержки
5/
out
0CR1AH, temp
58
Idi
temo. low(kzad )
59
out
OCR 1 AL, temp
60
Idi
temp. 0x03: Выбор режима работы таймера
61
out
TCCR1B, temp
Начало основной программы
62
63
mam
Idi
Idi
codL, 0x7F
codH.0x07
; Код для сравнения (младший байт) . Код для сравнения (старший байт)
64
mO
rcail
incod
: Ввод и проверка кода клавиш
65
toe
mO
: Если хоть одна не нажата, продолжаем
66
ml:
rcail
incod
, Ввод и проверка кода клавиш
67
breq
ml
. Если не одна не нажата, продолжаем
68
m2
Idi
ZH high(bufr)
: Установка указателя на начало буфера
69
Id i
Zl, low(bufr)
70
ch
count
. Сброс счетчика байт
—
дикл ввода
кода
71
m3
Cll
: Запрет всех прерываний
72
Id;
data 1
■ Вызываем задержку первого типа
73
real 1
wat t
. К подпрограмме задержки
74
ni5
rcail
incod
Ввод и проверка кода кнопок
75
st
Z+.XL
. Записываем ето в буфер
/6
st
Z+.XH
7/
inc
count
Увеличение счетчика байтов
78
count
79
cpi
count bsiz'e
Проверяем, не конец ли буфера
80
brsn
Если конец, завершаем ввод кода
81
mov
codL XL
Записываем код как старый
82
mov
codH XH
83
84
101data.2. Вызываем задержку третьего типа
real!wait. К подпрограмме задержки
85
86
87
88
m6:rcall incod■ Ввод и проверка кода кнопок
Ртеm3Если изменилось, записываем в буфер
cpif lz. 1Проверка окончания фазы ввода кода
brne тб
; Опрос состояния тумблера
89
90
т7.sblC PINB.7, Проверка состояния тумблера
rjmp m9, К процедуре проверки кода
; Процедура записи кода
91
92
93
movdata,count;Помещаем длину кода в data
Idiaddre,klen.Адрес в EEPROM для хранения длиныкода
rcalleewr,Записываем в длину кода EEPROM
94
95
96
Idiaddre. bufe.В регистр адреса начало буфера вEEPROM
IdiZH, high(bufr):В регистровую пару Z записываем
IdiZL. low(bufr);адрес начала буфера в ОЗУ
97
98
99
100
m8:iddata, Z+Читаем очередной байт из ОЗУ
rcalleewr:Записываем в длину кода EEPROM
deccount,Декремент счетчика байтов
brnem3.Если не конец, продолжаем запись
101
rjmp m11; К процедуре открывания замка
: Процедура проверки кода
102
103
104
105
m9:idiaddre. klen: Адрес хранения длины кода
rcalleerd.Чтение длины кода и5 EEPROM
срcount,data:Сравнение с новым значением
brneт13;Если не равны, к началу
106
107
108
Idiaddre, bufe;В YL начало буфера в EEPROM
IdiZH. high(bufr).В регистровую пару Z записываем
IdiZL, low(bufr):адрес начала буфера в ОЗУ
109
110
mWrcall eerd; Читаем очередной байт из EEPROM
Idtemp. Z+Читаем очередной байт из ОЗУ
111
112
срdata, temp. Сравниваем два байта разных кодов
brneт13. Если не равны, переходим к началу
113
114
deccount; Уменьшаем содержимое счетчика байтов
brnem10: Если не конец, продолжаем проверку
; Процедура открывания замка
115
116
117
118
m11sbiPORTB. 4. Команда “Открыть замок"
Ididata, 3.Вызываем задержку третьеготипа
rcallwait
ebiPORTS,4:Команда 'Закрыть замок'
119
т13rjmp main: Перейти к началу
*Я**ЯЯ**Т******-хЯ*х*******«*Я**Ж»**Я»***Я*****ЯЯ***Я*Я
Вспомогательные процедуры
. _Ввод и проверка 2 байтов с клавиатуры
120
incod' push count
121
122
IdiXL 0. Обнуление регистровой пары X
IdiХН.О
123
id
Idi
count, kandr
. Константа ангидребезга
124
mov
drebL. XL
. Старое значение младший байт
125
РТЮУ
drebH, XH
. Старое значение старший байт
126
ic2
in
XL.FIND
: Вводим код (младший байт)
127
cbr
XL.0x80
Накладываем маску
128
in
XH.PINB
: Вводим код (старший байт)
129
cbr
XH.0xF8
. Накладываем маску
130
1СЗ:
cp
XL, drebL
. Сверяем младший байт
131
• brne
id
. Если не равен, начинаем с начала
132
cp
XH, drebH
: Сверяем старший байт
133
brne
id
, Если не равен, начинаем с начала
134
ic4.
dec
count
. Уменьшаем счетчик антидребезга
135
brne
ic2
. Если еще не конец, продолжаем
136
cp
XL, codL
. Сравнение с временным буфером
137
brne
ic5
, Если не равно, заканчиваем сравнение
138
cp
XL. codH
. Сравниваем старшие байты
139
i с5 ■
pop
count
140
ret
Подпрограмма задержки
141
wait.
cpi
data.1
; Проверяем код задержки
142
brne
wl
143
Idi
temp,0x40
. Разрешаем прерывание по совпадению
144
rjmp
w2
145
w1
Idi
temp,0x80
Разрешаем прерывания по переполнению
146
w2.
out
TIMSK,temp
. Записываем маску
147
148
clr out
temp TCNTIH.temp
: Обнуляем таймер
149
out
TCNT1L,temp
150
Idi
flz.O
: Сбрасываем флаг задержки
151
sei
: Разрешаем прерывания
152
cpi
data.2
; Если это задержка 2-го типа
153
breq
w4
; Переходим к концу подпрограммы
154
w3:
cpi
flz. 1
: Ожидание окончания задержки
155
brne
w3
156
cli
; Запрещаем прерывания
157
w4:
ret
. Завершаем подпрограмму
—
■ Запись байта в ячейку EEPROM
158
eewr
cli
: Запрещаем прерывания ,
159
sbic
EECR.
EEWE
. Проверяем готовность EEPROM
160
г jmp
eewr
. Если не готов ждем
161
out
EEAR,
add re
. Записываем адрес в регистр адреса
162
out
EEDR.
data
. Записываем данные в регистр данных
163
sbi
EECR.
EEMWE
; Устанавливаем биг разрешения записи
164
sbi
EECR
EEWE
: Устанавливаем биi записи
165
inc
add re
: Увеличиваем адрес в EEPROM
166
ret
. Выход из подпрограммы
■ Чтение байта из ячейки EEPROM-
167
ее rd
cli
Запрещаем прерывания
168
sbic
EECR
EEWE
: Проверяем готовность EEPROM
169
rjmp
ее rd
Если че ।отов ждем
170
out
EEAR.
addre
Устанавливаем бит инициализации чтения
171
172
173
174
sbiEECR. EERE. Устанавливаем бит инициализации чтения
indata. EEDRПомещаем прооранный байт в data
meadd reУвеличиваем адрес в EEPROM
ret. Выход из подпрограммы
*Процедура обработки прерываний-
: Прерывание по совпадению
175
176
ргорг- Idiflz. 1. Установка флага задержки
reti. Завершаем обработку прерывания,
1.—
Описание программы (листинг 2.3)
Строки 1, 2 программы, я думаю, вопросов не вызывают. В строках 3—11 происходит описание всех используемых в программе переменных. Назначение каждой из этих переменных мы рассмотрим в ходе описания принципов работы программы. Далее, в строках 12—14 происходит описание констант. Каждая из трех констант определяет один из параметров нашего устройства. Остановимся на этом подробнее.
Константа bsize (строка 12) определяет размер буфера для хранения кодовой комбинации. Этот размер выбран равным 60 ячейкам. Учитывая, что в буфер будут записываться коды состояния клавиатуры, а каждый такой код состоит из двух байтов, в буфер указанного размера можно записать последовательность из 30 кодов.
Если учитывать, что записи подлежит каждое изменение кода состояния, а его изменение происходит как при нажатии кнопки, так и при ее отпускании, то после нажатия и отпускания одной из кнопок в буфер запишется два кода.
Значит, объема буфера нам хватит на 15 последовательных нажатий. Этого вполне достаточно, так как типичная кодовая комбинация состоит обычно из 4—5 цифр. Если вы считаете, что этого недостаточно, вы можете увеличить размер буфера, просто поменяв значение константы bsize в строке 12. Максимально возможный размер ограничен объемом ОЗУ и равен примерно 100 байтам (полный размер ОЗУ 128 байт).
Учтите, что буфер не может занимать весь объем ОЗУ, так как в верхних адресах необходимо обязательно оставить пространство, которое будет использовать стековая память. Обращаю ваше внимание, что константа bsize используется для задания размера не только буфера в ОЗУ, но и для задания размера буфера в EEPROM, который предназначен для долговременного хранения кодовой комбинации.
Константа kzad (строка 13) определяет длительность защитной паузы. Назначение защитной паузы подробно описано выше. Константа представляет собой коэффициент пересчета для таймера, при котором величина сформированной задержки будет равна 48 мс.
Константа kandr (строка 14) — это константа антидребезга. Она используется в специальной антидребезговой процедуре. Константа определяет, сколько раз подряд должен повториться один и тот же код состояния клавиатуры, чтобы программа прекратила цикл антидребезга и перешла к обработке считанного кода.
После определения констант начинается блок резервирования оперативной памяти (строки 15—17). В строке 15 выбирается соответствующий сегмент памяти, в строке 16 устанавливается указатель на адрес 0x60. Соображения для выбора именно этого адреса уже приводились в предыдущем примере.
Собственно резервирование ячеек производится в строке 17. Директива byte резервирует необходимое количество ячеек ОЗУ, начиная с адреса, определяемого меткой buf г. В данном случае bufr будет равен 0x60. Количество резервируемых ячеек определяется константой bsize.
Далее, в строках 18—21 происходит резервирование ячеек в энергонезависимой памяти (EEPROM). В строке 18 выбирается сегмент EEPROM. В строке 19 устанавливается текущее значение указателя этого сегмента. Указателю присваивается значение 0x08. То есть размещение данных в памяти EEPROM будет начинаться с восьмой ячейки. Вообще-то в данном случае можно было начинать с нулевой ячейки. Это не сделано лишь из соображений надежности работы.
Фирма Atmel не рекомендует без особой необходимости использовать ячейку с нулевым адресом, так как именно она подвергается наибольшему риску потери информации при недопустимых перепадах напряжения питания, особенно если перепады напряжения возникают в момент записи информации в EEPROM. Так как EEPROM не работает со стеком, у нас есть запас по ячейкам. Поэтому мы отступили на целых восемь ячеек.
Собственно команды резервирования занимают строки 20 и 21. В строке 20 резервируется одна ячейка, в которой будет храниться длина ключевой комбинации. В строке 21 резервируется буфер длиной bsize, в котором будет храниться сама комбинация.
После резервирования ячеек мы переходим в сегмент программного кода (строка 22). И начинаем формирование программы с нулевого адреса (команда org в строке 23). Программный код начинается с таблицы переопределения векторов прерываний (строки 24—42). Как видите, в данном случае мы будем использовать два вида прерываний.
Это прерывание по совпадению в канале А таймера/счетчика 1 (строка 28) и прерывание по переполнению того же таймера (строка 29). Первое прерывание используется для формирования защитной задержки в 48 мс. А второе — для формирования контрольного промежутка времени в 1 с. Для обоих видов прерываний назначена одна и та же процедура обработки: ргорг. Почему одна и та же и как она работает, мы узнаем чуть позже.
В строках 44—61 расположен модуль инициализации. Начинается инициализация с программирования портов ввода—вывода (строки 46—53). Все разряды порта PD и большая часть разрядов порта РВ конфигурируются как входы. И лишь два разряда РВ.З и РВ.4 конфигурируются как выходы.
Разряд РВ.4 используется для управления механизмом замка. А разряд РВ.З вообще пока не используется (зарезервирован). Его мы будем использовать как выход звука, когда будем объединять в одно устройство наш кодовый замок и музыкальную шкатулку. Для всех разрядов обоих портов, настроенных на ввод, включаются внутренние нагрузочные резисторы. На обоих выходах (РВ.З и РВ.4) устанавливается низкий логический уровень.
В строках 54, 55 программируется аналоговый компаратор. Программирование таймера/счетчика 1 производится в строках 56—61. Сначала в обе половинки регистра совпадения (OCR1AH, OCR1AL) записывается код, определяющий длительность защитной задержки (строки 56—59). Затем в регистр состояния TCCR1B записывается код 0x03 (строки 60, 61). При записи этого кода таймер/счетчик 1 переводится в режим Normal с использованием предварительного делителя. А коэффициент предварительного деления становится равным 1/64.
Строки 62—119 занимает основной цикл программы, строки 120—174— набор вспомогательных подпрограмм, а строки 175 и
176 — процедура обработки прерываний. Рассмотрение программы удобнее начать со вспомогательных процедур.
И первая процедура, которую мы рассмотрим — это процедура ввода и предварительной обработки кода состояния клавиатуры. Процедура представляет собой подпрограмму с именем incod и расположена в строках 120—140. В процессе работы процедура использует регистровую пару X и две вспомогательные регистровые пары: codH, codL (описаны в строках 10, 11) и drebH, drebL (описаны в строках 3, 4).
Главная задача данной процедуры — получить код состояния клавиатуры, используя алгоритм многократного считывания для борьбы с антидребезгом. Кроме того, процедура выполняет еще одну, вспомогательную функцию. Она сравнивает полученный описанным выше способом код состояния клавиатуры с другим кодом, который хранится в паре регистров codH—codL. Такое сравнение используется в основной программе для оценки значения кода состояния.
Таким образом, процедура incod по окончании своей работы возвращает два разных значения. Во-первых, код состояния клавиатуры (в регистровой паре X), а во-вторых, результат сравнения кода с контрольным значением (используя флаг нулевого результата Z).
Рассмотрим работу процедуры подробнее. Во-первых, подпрограмма использует традиционное сохранение и восстановление содержимого регистров в стеке. На этот раз сохранению подлежит всего один регистр— регистр count. В строке 120 его значение сохраняется, а в строке 139 — восстанавливается. Основной же текст подпрограммы состоит из двух частей:
в первой части (строки 121—133) реализуется алгоритм ввода кода и борьбы с антидребезгом;
во второй части (строки 134—138) производится сравнение полученного кода с числом в буфере codH-codL.
Начнем с процедуры ввода кода и борьбы с антидребезгом. Эта процедура представляет собой бесконечный цикл, который при каждом проходе производит формирование кода состояния клавиатуры и при этом подсчитывает, сколько раз подряд полученный код будет иметь одинаковое значение. Для подсчета используется регистр count. Причем в начале в count записывается константа kandr, и каждый раз, когда новый код равен предыдущему, содержимое count уменьшается на единицу (используется обратный счет).
Если при очередном проходе код состояния изменит свое значение, то в регистр count снова записывается константа kandr, и подсчет начинается сначала. Заканчивается цикл считывания кодов лишь тогда, когда значение count достигнет нуля. Новое значение кода состояния клавиатуры формируется в регистровой паре X. Для того, чтобы новое значение можно было сравнивать со старым, старое записывается в буфер drebH—drebL.
Теперь текст описанной выше программы рассмотрим по порядку. Все начинается с подготовки регистровой пары X к принятию нового значения кода. В строках 121, 122 содержимое X обнуляется. Бесконечный цикл многократного считывания занимает строки 123—135.
В строке 123 в регистр count записывается начальное значение kandr. В строках 124, 125 содержимое регистровой пары X сохраняется в буфере drebH—drebL. Таким образом запоминается старое значение кода состояния перед тем, как будет получено новое. В строках 126—129 происходит считывание кодов из портов PD и РВ и наложение масок. Полученный в результате этих операций код состояния клавиатуры окажется в регистровой паре X.
В строках 130—133 производится сравнения старого и нового значений кодов. Сравнение происходит побайтно. Сначала сравниваются младшие байты (строки 130,131), затем старшие (строки 132, 133). Оператор brne выполняет переход по условию «не равно». Поэтому, если хотя бы одна из операций сравнения даст положительный результат (коды окажутся неодинаковыми), то управление перейдет по метке id. То есть к тому месту программы, где счетчику count снова присваивается значение kandr.
Если же обе операции сравнения дадут отрицательные результаты^ коды окажутся равными, управление перейдет к строке 134. В строке 134 происходит уменьшение содержимого регистра count на единицу. После этого производится проверка на ноль (строка 135). Если после уменьшения содержимого count оно еще не равно нулю, то оператор brne в строке 135 передает управление по метке ic2, и цикл антидребезга продолжается. В противном случае.цикл завершится, и управление переходит к строке 136.
В строках 136—138 находится процедура сравнения только что полученного значения кода состояния клавиатуры с числом в буфере codH—codL. Сравнение проходит побайтно. Сначала в строке 136 сравниваются младшие байты. Если они не равны, то дальнейшее сравнение не имеет смысла. Поэтому управление передается по метке ic5, и подпрограмма завершается.
Если младшие байты сравниваемых величин оказались равны, то окончательный результат сравнения теперь можно получить, просто сравнив между собой старшие байты. Это сравнение производится в строке 138. В результате, при выходе из подпрограммы incod:
флаг Z будет установлен, если сравниваемые коды равны между собой;
флаг Z будет сброшен, если коды не равны.
Следующая дополнительная процедура, обеспечивающая работу основной части программы, — это подпрограмма формирования задержки. Для формирования временных интервалов эта процедура использует таймер. Мы уже рассматривали два варианта подобных процедур. Одна из них использовала прямое чтение содержимого таймера и цикл ожидания, а вторая использовала прерывания.
В данном случае разработан еще один вариант, который представляет собой нечто среднее между двумя предыдущими. В этом варианте будут использоваться и прерывание, и цикл ожидания. Новый алгоритм реализует подпрограмма wait, которая занимает строки 141—157. Подпрограмма имеет три режима работы. Номер режима передается в подпрограмму при ее вызове.
Для этого он записывается в регистр data. В режиме номер 1 подпрограмма формирует задержку 48 мс. В режиме номер 3 формируется задержка в 1 с. В режиме номер 2 задержка не формируется. Подпрограмма просто настраивает таймер точно так же, как в режиме номер 3, разрешает прерывания и заканчивает свою работу. Контрольный интервал времени длительностью 1 с формируется уже вне подпрограммы wait (в основном тексте программы).
Основной принцип формирования задержки строится на использовании флага задержки. В качестве флага задержки применяется регистр f lz. Описание этого регистра вы можете видеть в строке 7 программы. Перед началом цикла задержки в регистр f lz записывается ноль. Затем запускается таймер и разрешается работа одного из видов прерываний (прерывание по совпадению или прерывание по переполнению).
В определенный момент времени будет вызвана процедура обработки прерывания. Эта процедура (строки 156, 176) запишет в регистр флага (flz) единицу. Единица в регистре f lz послужит индикатором того факта, что заданный промежуток времени закончился. Для обнаружения момента окончания задержки используется цикл ожидания.
В цикле ожидания программа постоянно проверяет содержимое регистра f lz. Пока f lz равно нулю, цикл продолжается. Заканчивается цикл в тот момент, когда f lz будет равен единице.
Для формирования разных значений длительности задержки используются разные виды прерываний. Прерывание по совпадению используется для формирования задержки в 48 мс. Для этого значение регистра совпадения выбрано таким образом, чтобы содержимое счетного регистра достигло этого значения именно через 48 мс. Прерывание по переполнению таймера используется для формирования интервала времени, равного одной секунде. Благо, что при коэффициенте пересчета предварительного делителя 1/64 и тактовой частоте в 4 МГц переполнение таймера произойдет именно через 1 с.
Рассмотрим текст подпрограммы wait подробнее. Начинается подпрограмма с проверки значение регистра data (строка 141). Как уже говорилось ранее, при помощи этого регистра в подпрограмму передается код номера режима. В данном случае нужно определить длительность формируемой задержки.
От этого зависит, какой из видов прерываний будет активизирован. Для активизации того либо другого вида прерываний в регистр маски таймера (TIMSK) мы будем записывать разные значения маски. В строках 141—145 как раз и выбирается это значение. Выбор сводится к проверке номера режима.
Если содержимое data равно 1, то выполняется строка 143, где в качестве маски выбирается число 0x40 (прерывание по совпадению). Выбранная маска записывается в регистр temp. Оператор безусловного перехода г jmp в строке 144 передает управление по метке w2 для того, чтобы «перепрыгнуть» строку 145, где выбирается другое значение маски.
Если код в регистре data не равен 1, то управление передается к строке 145, где в регистр temp записывается код 0x80. Маска 0x80 разрешает прерывание по переполнению. Подробнее о настройке таймера смотрите в главе 1. В строке 146 выбранное значение маски записывается в регистр TIMSK.
В строках 147—149 выполняется сброс таймера (в обе половины счетного регистра таймера записывается нулевое значение). С этого момента начинается отсчет времени задержки. В строке 150 сбрасывается в ноль регистр флага задержки (f lz). А в строке 151 производится глобальное разрешение прерываний. На этом все настройки, необходимые для работы процедуры задержки, заканчиваются.
Остается лишь ждать окончания заданного промежутка времени. Но прежде, чем начинать цикл ожидания, программа производит еше одну проверку номера режима (строки 152, 153). Дело в том, что для режима номер 2 цикл ожидания организовывать не нужно. В этом случае цикл ожидания располагается вне подпрограммы wait, в теле самой программы. Поэтому, если был задан режим номер 2, то работа подпрограммы в этом месте должна заканчиваться.
Оператор cpi в строке 152 проверяет содержимое регистра data, где хранится код номера режима на равенство цифре 2. Если код режима равен двум, то оператор условного перехода в строке 153 передает управление на конец подпрограммы. В противном случае программа переходит к циклу ожидания.
Цикл ожидания занимает всего две строки (154, 155). В строке 154 производится проверка содержимого регистра флага (flz) на равенство единице. Пока счетчик находится в процессе счета и прерывание еше не сработало, то содержимое регистра flz равно нулю, оператор в строке 155 передает управления назад на строку 154, и цикл продолжается. Как только процедура обработки прерывания запишет в flz единицу, цикл завершается, и управление переходит к строке 156. В этой строке происходит глобальный запрет всех прерываний. А в строке 157 подпрограмма wait завершается.
Две оставшиеся, еще не описанные вспомогательные процедуры предназначены для работы с EEPROM. При записи в этот вид памяти и чтения из нее нужно соблюдать определенную последовательность действий. Эта последовательность подробно описана в документации на микроконтроллеры AVR (см. главу 1).
Там же приведены примеры процедур, рекомендованные производителем для этих целей. Описываемые ниже процедуры являются практически полной копией рекомендованных процедур, дополненные лишь командой автоматического увеличения адреса. Для управления памятью EEPROM используются специальные регистры ввода—вывода:
EEAR — регистр адреса;
EEDR — регистр данных;
EECR — регистр управления.
Отдельные разряды регистра управления также имеют свои собственные имена:
EEWE — бит записи;
EEMWE — бит разрешения записи;
EERE — бит чтения.
Все названия введены фирмой-производителем и правильно понимаются транслятором, если вы не забыли присоединить в начале программы файл описаний.
Порядок записи байта в БЕРНОМ следующий. Байт данных, предназначенный для записи, должен быть помещен в регистр EEDR, а байт адреса — в регистр в EEAR. Для того, чтобы разрешить запись, необходимо установить бит EEMWE. Затем в течение четырех машинных циклов (то есть следующей же командой) нужно установить бит EEWE. Сразу же после установки бита EEWE начинается процесс записи. Этот процесс занимает довольно продолжительное время. Все это время бит EEWE остается установленным. По окончании процесса записи он сам сбрасывается в ноль. Такой многоступенчатый алгоритм придуман для предотвращения случайной записи.
Подпрограмма, реализующая описанный выше алгоритм записи байта, называется eewr и занимает строки 158—166. Байт данных, предназначенный для записи, передается в процедуру при помощи регистра data, а адрес ячейки, куда нужно записать данные, — через регистр addre. Работа подпрограммы начинается с глобального запрета всех прерываний (строка 158).
Это обязательное условие работы с EEPROM. Невовремя вызванное прерывание может помешать процессу записи. В данном случае запрет прерываний является избыточной мерой, так как программа построена таким образом, что при записи в EEPROM прерывания всегда запрещены.
В строках 159,160 расположен цикл проверки готовности EEPROM. Если бит EEWE установлен, это значит, что предыдущая операция записи еще не окончена. Поэтому в строке 159 проверяется значение этого бита. Пока значение бита равно единице, выполняется команда безусловного перехода в строке 160, и проверка выполняется снова и снова.
Когда значение бита окажется равным нулю, строка 160 будет пропущена (сработает команда sbic в строке 159), а цикл ожидания прервется. В строке 161 происходит запись адреса из регистра addre в регистр EEAR. В строке 162 в регистр EEDR записывается байт данных из регистра data.
В строке 163 устанавливается бит разрешения записи. В строке 164 — бит записи. После установки этого бита процесс записи будет
запушен. Запись будет идти своим чередом, а программа может продолжать свою работу. Главное — не менять содержимое регистров EEDR и EEAR, пока процесс записи не закончится. В строке 165 происходит приращение содержимого регистра addre.
И, наконец, в строке 166 подпрограмма завершается. Команда в строке 165 не относится к алгоритму записи в EEPROM. Но ее применение позволяет использовать подпрограмму eewr для последовательной записи цепочки байтов, в чем мы и убедимся дальше.
Порядок чтения байта гораздо проше. Достаточно в регистр EEAR записать адрес ячейки, содержимое которой нужно прочитать, а затем установить бит чтения (EERE). Прочитанный байт автоматически помещается в регистр EEDR.
Подпрограмма чтения байта из EEPROM называется eerd и занимает строки 167—174. Адрес ячейки, предназначенной для чтения, передается в подпрограмму через регистр addre. Прочитанный байт данных подпрограмма возвращает в регистре data. Начинается подпрограмма чтения, как и подпрограмма записи с запрета прерываний (строка 167).
Так как чтению может предшествовать запись, прежде чем изменять значения регистра EEAR, нужно проверить, закончился ли процесс записи. Поэтому в строках 168, 169 мы видим уже знакомый нам цикл ожидания готовности EEPROM. В строке 170 в регистр EEAR записывается содержимое регистра addre.
В строке 171 устанавливается бит чтения (EERE). Как только этот бит будет установлен, моментально происходит процесс чтения, и прочитанный байт данных появляется в регистре EEDR. В строке 172 этот байт помещается в регистр data. В строке 173 происходит приращение регистра адреса addre. Смысл этого приращения такой же, как и в предыдущем случае. Только теперь подобный прием позволяет читать из EEPROM цепочку байтов. В строке 174 подпрограмма eewr завершается.
Теперь перейдем к основной части программы. Как уже говорилось, она занимает строки 62—119. И первое, что выполняет основная программа, — цикл ожидания отпускания кнопок. В цикле используется описанная выше подпрограмма incod. Она будет не только считывать код состояния клавиатуры, но и сразу же производить его сравнение.
Если вы не забыли, код состояния клавиатуры при полностью отпущенных кнопках равен 0x7F, 0x07. В строках 62, 63 этот код записывается во вспомогательный буфер codL+codH. Цикл ожида-
ния отпускания кнопок расположен в строках 64, 65. В строке 64 вызывается подпрограмма incod. Она определяет код состояния клавиатуры и сравнивает полученный код с числом, записанным в буфереcodL+codH.
Если код состояния клавиатуры равен коду в буфере, то после выхода из подпрограммы флаг Z будет установлен. В противном случае— сброшен. Равенство кодов означает, что кнопки отпущены. Поэтому оператор условного перехода в строке 65 проверяет значение флага Z. Пока коды разные, управление передается по метке тО, и цикл ожидания продолжается. Как только коды окажутся равными, цикл прерывается, и управление переходит к строке 66.
В строке 66 начинается цикл ожидания нажатия кнопки. Цикл занимает строки 66, 67 и выглядит почти так же, как цикл ожидания отпускания. Различие состоит в операторе условного перехода. Вместо brne (переход по условию «не равно») применяется оператор breq (переход по условию «равно»).
В буфере codL+codH по-прежнему находится код состояния клавиатуры при полностью отпущенных кнопках. Поэтому выход из данного цикла произойдет тогда, когда будет нажата любая из кнопок (S1—S10).
Как только нажатие будет обнаружено, программа переходит в следующую стадию. Полученный код состояния клавиатуры должен стать первым кодом ключевой комбинации. Но прежде чем начинать цикл ввода этой комбинации, программа выполняет две очень важные операции: В строках 68, 69 в регистровую пару Z записывается адрес начала буфера в ОЗУ, куда будет помещаться вводимая комбинация. Регистр Z будет хранить текущий указатель этого буфера.
Вторая важная операция производится в строке 70. Тут обнуляется счетчик байтов, записанных в буфер. После этого начинается цикл ввода кодовой комбинации. Цикл занимает строки 71—88. Начинается работа цикла с формирования защитной задержки. Почему начинается с задержки, если мы только что получили первое нажатие кнопки?
А согласно алгоритму после нажатия положено формировать задержку. Для формирования защитной задержки используется подпрограмма wait, работающая в режиме 1. Сначала в строке 72 в регистр data записывается номер режима. Затем в строке 73 вызывается подпрограмма wait.
После окончания защитной задержки в строке 74 снова производится ввод кода состояния. В строках 75, 76 полученный код записывается в буфер. Для записи используются команды, увеличивающие значение указателя (Z). Поэтому после записи каждого очередного байта указатель передвигается в следующую позицию. Затем в строках 77, 78 увеличивается значение счетчика принятых байтов. Так как мы записали два байта, то и значение счетчика увеличивается дважды.
В строках 79, 80 производится оценка длины введенного кода. Если длина превысит размеры буфера, то цикл ввода кода досрочно прекращается. В строке 79 производится сравнение текущего значения счетчика с размером буфера.
В строке 80 находится оператор условного перехода, который передает управление по метке т7 в случае, если длина кода превысит размер буфера. В строках 81, 82 код состояния клавиатуры записывается в буфер codH—codL. Делается это для того, чтобы следующий введенный код состояния можно было сравнивать с текущим.
Дальше программа должна ожидать очередное изменения кода состояния. Но сначала нужно запустить таймер, чтобы он начал формирование защитного промежутка времени. Если в течение этого промежутка не будет нажата ни одна кнопка, то это должно послужить сигналом к выходу из цикла ввода ключевой комбинации. Запуск таймера производится при помощи подпрограммы wait в режиме номер два. В строке 83 в регистр data записывается номер режима, а в строке 84 вызывается сама подпрограмма.
В строках 85—88 организован комбинированный цикл ожидания. В теле цикла происходит сразу несколько операций. Во-первых, вводится новое значение кода состояния клавиатуры (строка 85). В процессе ввода новый код сравнивается со старым, который хранится в буфере codH—codL. Если коды не равны, то оператор условного перехода в строке 86 передает управление по метке m3, где происходит формирование защитной задержки, затем повторное считывание и запись кода в буфер и так далее.
Если новое значение кода равно старому, комбинированный цикл продолжается. В строке 87 производится проверка флага задержки f lz. Если флаг равен нулю, это значит, что защитный промежуток времени еще не закончился. В этом случае оператор условного перехода в строке 88 передает управление по метке тб, и комбинированный цикл продолжается сначала. Если значение флага f lz равно единице, то цикл завершается, и управление переходит к строке 89.
В строках 89, 90 происходит проверка переключателя режимов работы (S1J). В зависимости от состояния этого переключателя полученная только что кодовая комбинация либо записывается в EEPROM (режим «Запись»), либо поступает в процедуру проверки (режим «Работа»). Команда sbic в строке 89 проверяет значение седьмого бита регистра PINB.
Если бит равен нулю (контакты тумблера замкнуты), то строка 90 не выполняется, и управление переходит к строке 91, где начинается процедура записи в EEPROM. Если значение разряда равно единице (контакты тумблера не замкнуты), оператор условного перехода в строке 90 передает управление по метке т9 на начало процедуры сравнения.
Процедура записи ключевой комбинации в EEPROM
Эта процедура занимает строки 91—101. К началу этой процедуры кодовая комбинация уже находится в буфере ОЗУ. Длина комбинации содержится в переменной count. Нам остается только записать все это в EEPROM. .
В строках 91—93 в EEPROM записывается длина комбинации. В качестве адреса для записи используется метка klen. Эта метка указывает на ячейку, которая специально зарезервирована для этой цели (см. строку 20). Для записи байта в EEPROM используется подпрограмма eewr.
В строке 91 длина комбинации помещается в регистр data. В строке 92 адрес помещается в регистр addre. Затем вызывается подпрограмма eewr (строка 93).
В строках 97—100 расположен цикл записи всех байтов ключевой комбинации. Перед началом цикла в регистр addre записывается адрес первой ячейки буфера-приемника, находящегося в EEPROM (строка 94). А в регистровую пару Z записывается адрес первой ячейки буфера-источника, находящегося в ОЗУ (строки 95, 96).
В процессе записи ключевой комбинации регистр count используется для подсчета записанных байтов. В начале, как уже говорилось, он содержит длину комбинации. При записи каждого байта содержимое count уменьшается. Когда оно окажется равным нулю, цикл записи прекращается.
Цикл начинается с того, что очередной байт ключевой комбинации, находящейся в ОЗУ, помещается в регистр data (строка 97). Напомню, что адрес уже находится в регистре addre. В строке 98 вызывается подпрограмма, которая записывает байт в EEPROM. Та же подпрограмма увеличивает значение addre на единицу. В строке 99 уменьшается значение регистра count.
Проверку содержимого count на равенство нулю производит оператор Ьгпе в строке 100. Если содержимое не равно нулю, то оператор передает управление на метку т8, и цикл записи ключевой комбинации продолжается. В противном случае цикл завершается, и управление переходит к строке 101. То есть к процедуре открывания замка.
Теперь разберемся, зачем после записи кода вызывается процедура открывания замка. Это сделано для удобства. После ввода кодовой комбинации необходимо выдержать паузу в 1 с для того, чтобы введенная комбинация записалась в EEPROM. Для того, чтобы точно знать, когда заканчивается эта пауза, используется срабатывание замка. Как только щелкнет соленоид, можно считать, что ввод закончен.
Процедура проверки кода
Эта процедура занимает строки 102—114. Процедура проверки во многом похожа на процедуру записи. Для чтения байта из EEPROM используется подпрограмма eerd. Перед вызовом этой подпрограммы адрес ячейки, откуда будет прочитана информация, записывается в регистр addre. Прочитанное из EEPROM значение возвращается в регистре data.
В строках 102—105 происходит считывание длины последовательности из EEPROM и сравнение ее с длиной новой последовательности. Сначала в строке 102 адрес ячейки, где хранится длина кода, записывается в addre. Затем вызывается подпрограмма eerd (строка 103).
В строке 104 сравнивается полученное из EEPROM значение (регистр data) и новое значение длины кода (регистр count). В случае неравенства этих двух величин оператор условного перехода в строке 105 передает управление в начало программы. В этом случае дальнейшая проверка больше не производится. Дверь остается закрытой.
Если длина кода оказалась правильной, начинается цикл побайтной проверки кодов. Сначала в регистр addre записывается начальный адрес буфера в EEPROM (строка 106). В регистровую пару Z записывается начальный адрес буфера в ОЗУ (строки 107, 108). Сам цикл сравнения занимает строки 109—114.
В строке 109 вызывается подпрограмма, которая читает очередной байт из EEPROM. Байт помещается в регистр data. В строке 110 читается байт из ОЗУ. Этот байт помещается в регистр temp. В строке 111 эти два байта сравниваются. Если байты не равны, оператор условного перехода в строке 112 прерывает процесс сравнения и передает управление на начало программы. То есть дверь и в этом случае остается закрытой.
Если байты равны, выполняется уменьшение содержимого счетчика count (строка 113). Если после уменьшения содержимое count еще не достигло нуля, управление передается по метке ш10 (оператор brne в строке 114), и цикл сравнения продолжается. Когда содержимое count окажется равным нулю, процесс сравнения заканчивается. Это означает, что все байты обеих версий ключевой комбинации оказались равны. Поэтому программа плавно переходит к процедуре открывания замка (к строке 115).
Процедура открывания замка
Эта процедура занимает строки 115—119. Процедура очень проста. Для открывания замка на четвертый разряд порта РВ подается единичный сигнал, который открывает транзистор ключа VT1 (см. рис. 2.3), Реле срабатывает, и замок открывается. Подав открывающий сигнал, программа выдерживает паузу, а затем сигнал снимает. После этого замок закрывается. Длительность паузы равна одной секунде. Этого времени достаточно, чтобы открыть дверь.
Подача открывающего сигнала на выход осуществляется в строке 115. В строках 116, 117 производится вызов процедуры задержки. При этом выбирается режим номер 3. Сначала в регистр data помещается код режима задержки (строка 116). Затем вызывается подпрограмма wait (строка 117). В строке 118 снимается сигнал открывания двери. В строке 119 процедура открывания замка завершается. Оператор безусловного перехода, находящийся в этой строке, передает управление на начало программы. И весь процесс начинается сначала.
Программа на языке СИ
Возможный вариант программы кодового замка на языке СИ приведен в листинге 2.4. Программа реализует тот же самый алгоритм, что и приведенная выше программа на Ассемблере. Прежде чем начать рассмотрение программы, хочу заметить, что в приведенной программе применяется команда, которая не входит в стандартный набор команд языка СИ. Что бы исключить разночтение, ниже приводится ее краткое описание.
#pragma
Директива, задающая специальные команды для компилятора. В качестве параметра в директиве указывается задаваемая команда. Ниже приведен ряд примеров использования этой директивы.
Включение/отключение сообщений об ошибках.
#pragma warn- // Отключает предупреждающие сообщения. .
#pragma warn + И Включает предупреждающие сообщения.
Включение/отключение оптимизации результирующего кода.
#pragma opt- // Отключает оптимизацию.
#pragma opt+ // Включает оптимизацию.
Описание программы (листинг 2.4)
Кардинальным отличием программы на языке СИ является тот факт, что все шестнадцатиразрядные значения, используемые в программе, теперь не нужно разбивать на отдельные байты. Для хранения каждой такой величины программа использует либо переменную, либо константу соответствующего типа.
Например, для хранения разных вариантов кода состояния клавиатуры в программе используется несколько переменных:
codO — строка 17;
codl — строка 18;
cods — строка 37.
1
Project . Пример 10■
Version 1
Date ■ 07 03 2006
Author • Belov
Company : Home
Comments
Кодовый замок
Chip type: ATtiny2313-
Clock frequency4.000000 MHz
Memory model: Tiny
Data Stack size 1 32
**w****w*»*»*****»**i**w*W*'**»*ir******e*»ie**w**'ir****/
«include <tiny2313 h>
2
3
4
5
«define klfree 0x77F •//Код состояния при полностью отпущенных кнопках
«define kzad 3000ЦКод задержки при сканировании
«define Kandr 20//Константа антидребезга
«define bsize 30//Размер буфера для хранения кода
6 7
8 9 10
11
unsigned char flz,// Флаг задержки
unsigned int bufr[bsize],// Буфер в ОЗУ для хранения кода
«pragma warn-
eeprom unsigned char klen;// Ячейка для хранения длины кода
eeprom unsigned int bufe[bsize]:// Буфер в EEPROM для хранения кода
«pragma warn-
12
// Прерывание по переполнению Таймера 1 interrupt [TIM1_0VF] void timert_ovf_isr(void)
13
1 flz=1:
// Прерывание no совпадению в канале А Таймера 1
14
interrupt [TIM1_C0MPA] void timer1_compa_isr(void)
15
{ flz=1; )
16
// Функция опроса клавиатуры и антидребезга unsigned int incod (void)
{/7 Создаем локальные переменные
17
18
19
unsigned int codO=O:// Вспомогательная переменная
unsigned int codl:// Еще одна вспомогательная переменная
unsigned char k:// Параметр цикла антидребезга
20
for (k=0. k<kandr; k++)// Цикл антидребезга
21
22
23
cod1=PINB80x7.// Формируем первый байт кода
cod1 = (cod1<<8) + (PIND&Ox // Формируем полный код состояния клавиатуры
7F);■
if (codO1=codl)// Сравниваем с первоначальным кодом
24
25
к=0,// Если не равны сбрасываем счетчик
cod0=cod1// Новое значение первоначального кода
26
return codV.
27
// Процедура формирования задержки void wait (unsigned char kodz)
28
29
30
31
32
if (kodz==1) TIMSK=0x40.H Выбор маски прерываний по таймеру
else TIMSK-0x80
TON11=0.//Обнуление таймера
flz=O.//Сброс фгзаиа задержки
«asm( sei')НРазрешаем прерывания
33
if tkodz'-?) while(tlz==0):// Цикл задержки
34
// Основная функция
void main(void)-
35
36
37
unsigned char ii.// Указатель массива
unsigned char i,// Вспомогательный указатель
unsigned ini codS:H Старый код
38
39
P0RTB=0xE7'// Порт 8
DDAB=0x18:
40
41
P0RTD=0x7F,// Порт 0
DDRD=0x00;
42
43
44
45
TCCRIA-OxOOЦТаймер/Счетчик 1
TCCR18=0x03,
TCNT1=0.ЦОбнуление счетного регистра
0CR1A=kzad;//Инициализация регистра совпадения
46
ACSR=0x80// Аналоговый компаратор
47
while (1)
48
49
50
51
52
53
54
55
ml:while (incod() ! = klfree): // Ожидание отпускания кнопок
while (incodt) =- klfree); // Ожидание нажатия кнопок ii=0;
m2;#asm("cli");// Запрещаем прерывания
wait(1);// Задержка 1-го типа
codS=incod(),// Ввод кода и запись как старого
bufr[ii++]=codS;// Запись очередного кода в буфер
if (ii>=bsize) goto m4;// Проверка конца буфера
56
57
58
wait(2):// Задержка 2-го типа1
m3:if (incod() 1= codS) goto m2; И Проверка, не изменилось ли состояние
if (flz==O) goto m3.// Проверка флага окончания задержки
59
m4.if (PINB.7==1) goto comp. // Проверка переключателя режимов
// Запись кода в EEPROM
60
61
62
klen-n,// Запись длины кода
for (1=0: idi i++) bufe[i]=bufr[i], // Запись всех байтов кода goto zamok.Ц К процедуре открывания замка
//- Проверка кода
63
64
comp-if (klen* =ii) goto mi,// Проверка длины кода
for (1=0: кп: i++) if (bufe[i]! =bufr[ i ]) goto ml, //Проверка кода
//Открывание замка
65
66
67
zamok:P0RTB.4=1:// Открываем замок
wait(3):// Задержка 3-го типа
PORTS 4=0;// Закрываем замок
И все они имеют тип uns igned char. При этом сам этот код представляет собой шестнадцатиразрядное двоичное число, старшие восемь разрядов соответствуют содержимому порта РВ, а младшие восемь разрядов — содержимому порта PD (на все это наложена маска).
Начинается наша программа, с присоединения библиотечного файла (строка 1). Далее идет блок описания констант (строки 2—5). Первая константа имеет имя klfree и значение 0x77F. Это значение представляет собой код состояния клавиатуры при отпущенных кнопках. Константа используется в операциях сравнения.
Следующие три константы: kzad (код задержки), kandr (константа антидребезга) и bsize (размер буфера для кодовой комбинации) по своему назначению аналогичны соответствующим константам в программе на Ассемблере. У них даже значения одинаковы. Отличие только в значении константы bsize. В нашем случае она равна не 60, а 30.
Почему буфер стал вдвое короче? Дело в том, что на Ассемблере буфер представлял собой набор ячеек памяти размером в один байт каждая. Любое новое значение записывалось в буфер в виде двух отдельных байтов. В программе на СИ в качестве буфера будет использоваться массив, состоящий из шестнадцатиразрядных элементов. Каждое значение в такой буфер заносится как один отдельный элемент.
В строках 6—11 находится блок описания переменных и массивов. Все переменные и массивы имеют свои аналоги в программе на Ассемблере. В строке 6 описывается переменная f lz, которая используется как флаг задержки. В строке 7 описывается массив для оперативного хранения ключевой комбинации. Все значения этого массива будут размещены в ОЗУ (буфер в ОЗУ). Длина массива выбирается равной bsize.
В строках 9, 10 описываются переменная и массив, которые будут храниться в EEPROM. Переменная klen предназначена для хранения длины кодовой комбинации. Массив buf е предназначен для хранения самой этой комбинации.
При описании переменных и массивов, которые будут размещаться в EEPROM, данная версия языка СИ требует обязательной их инициализации. То есть требует указать значение всех элементов по умолчанию. Указанные таким образом значения в процессе «прошивки» микроконтроллера попадают непосредственно в EEPROM.
Если соблюдать указанные выше требования, то строки 9 и 10 нашей программы должны выглядеть примерно так:
eeprom unsigned char klen=0x4;
eeprom unsigned ink bufe[bsize]={0x76F, 0x77F, 0x7FE, 0x77F);
Если мы воспользуемся данной редакцией команд описания, то мы получим программу электронного кодового замка. В ней уже на стадии изготовления заложена некоторая начальная ключевая кодовая комбинация, которую, впрочем, в любой момент владелец замка может изменить на новую.
Но мне интересно показать, что можно сделать, если закладывать код заранее нежелательно. Если вы не стали указывать начальные значения для переменной и массива, то это не является критической ошибкой. Программа будет успешно оттранслирована, а результирующий код полностью работоспособен. Единственное неудобство— сообщение о некритичной ошибке. По-английски оно называется «Warning» (предупреждение). Оно будет возникать каждый раз при трансляции программы. Можно, конечно, просто не обращать на него внимание.
Однако более правильно будет временно отключить сообщение при помощи директивы #pragma и команды warn, как это и сделано в программе на листинге 2.4. В строке 8 вывод предупреждений отключается, а в строке 11 включается снова. Отключать предупреждения навсегда не рекомендуется. Так можно пропустить другие, более важные предупреждения.
Далее в программе начинается описание всех составляющих ее функций. Данная программа состоит из пяти функций:
две функции обработки прерываний (строки 12, 13 и 14, 15);
функция ввода кода состояния клавиатуры (строки 16—26);
функция формирования задержки (строки 27—33);
главная функция программы (строки 34—67).
Рассмотрение данной программы удобно начинать с главной функции main.
Функция main начинается с описания локальных переменных (строки 35—37). Кроме переменной cods, предназначенной для временного хранения кода состояния клавиатуры, здесь определяются еще две вспомогательные переменные с именами i и ii. После описания переменных начинается блок инициализации (строки 38—46). Блок инициализации данной программы по выполняемым
действиям полностью повторяет аналогичный блок в программе на Ассемблере.
Эти действия сводятся к настройке портов ввода—вывода, таймера и компаратора. При настройке таймера не только выбирается его режим работы, но и обнуляется значение счетного регистра TCNT1 (строка 44), а в регистр совпадения OCR1A записывается код задержки kzad (строка 45).
Основной цикл программы занимает строки 47—67. Рассмотрим подробнее его работу. В строке 48 находится цикл ожидания отпускания кнопок. Он представляет собой пустой цикл while. Тело цикла полностью отсутствует. За ненадобностью не поставлены даже фигурные скобки. Весь цикл состоит лишь из оператора while и выражения в круглых скобках, определяющего условие продолжения этого цикла.
Условие простое: цикл выполняется все время, пока код состояния клавиатуры и константа klfree не равны между собой. Значение константы равно коду состояния клавиатуры при всех отпущенных кнопках. Для определения кода состояния клавиатуры используется функция incod () .Функция incod () выполняет те же самые действия, что одноименная процедура из программы на Ассемблере. То есть считывает состояние портов, накладывает маски и применяет при этом антидребезговый.алгоритм. Подробнее работу функции мы рассмотрим в конце этого раздела.
Как только все кнопки будут отпущены, цикл в строке 48 завершается, и программа переходит к строке 49, в которой находится цикл ожидания нажатия любой кнопки. Этот цикл очень похож на предыдущий. Изменилось только условие. Знак ! = (не равно) заменен на == (равно). Как только будет нажата любая кнопка, цикл в строке 49 заканчивается, и управление переходит к строке 50.
Теперь пора начинать цикл ввода ключевой кодовой комбинации. Но сначала нужно обнулить переменную ii, которая будет использоваться как счетчик принятых кодов и указатель текущего элемента в буфере bufr. Обнуление выполняется в строке 50. Цикл ввода кодовой комбинации занимает строки 51—58. Начинается цикл с глобального запрета всех прерываний (строка 51). Затем формируется защитная пауза. Для формирования паузы используется функция wait ().
Действие этой функции полностью аналогично действию одноименной процедуры из программы на Ассемблере. В строке 52 формируется задержка первого вида (48 мс), то есть вызывается
функция wait ( ) с параметром, равным единице. По окончании задержки (строка 53) программа повторно считывает код состояния клавиатуры и записывает его в переменную cods.
В строке 54 считанный код записывается в буфер ОЗУ (bufr). Одновременно указатель буфера увеличивается на единицу. В строке 55 проверяется условие переполнения буфера. Такая проверка принудительно завершает работу цикла при попытке ввода слишком длинной кодовой комбинации. Если значение ii превысило величину константы bsize, значит, буфер уже полностью заполнен. В этом случае управление передается по метке т4, то есть на конец цикла.
Если значение ii не достигло конца буфера, то перехода не происходит, и управление переходит к строке 56. В этом месте запускается процесс формирования контрольного промежутка времени. Для запуска этого процесса используется функция wait (). В данном случае она формирует задержку второго типа, поэтому вызывается с параметром, равным двум.
Так же, как и в программе на Ассемблере, задержка второго типа лишь производит все настройки таймера, но не выполняет цикл ожидания. Комбинированный цикл ожидания находится вне функции задержки, а точнее в строках 57, 58. В строке 57 считывается новый код состояния клавиатуры и сравнивается со старым, который хранится в переменной cods.
Если коды не равны (состояние клавиатуры изменилось), комбинированный цикл ожидания прерывается, и управление передается по метке m2. То есть на начало цикла ввода кодовой комбинации. А уже там, в начале цикла, снова формируется защитная задержка, и очередной код состояния помещается в буфер.
Если при проверке в строке 57 старый и новый коды оказались все же равны между собой, перехода не происходит, и выполняется строка 58. В этой строке проверяется значение флага f lz. Если контрольный промежуток времени еще не истек, то значение флага равно нулю, и управление передается по метке m3. Комбинированный цикл продолжается.
Если же контрольный промежуток времени уже закончится, значение флага f lz равно единице. Поэтому перехода не происходит, и управление переходит к строке 59. На этом и комбинированный цикл ожидания, и цикл ввода кодовой комбинации заканчиваются.
В строке 59 проверяется состояние тумблера sll. В зависимости от этого состояния выполняется либо запись только что принятой
кодовой комбинации в EEPROM, либо извлечение из EEPROM и сравнение двух кодовых комбинаций. Для проверки состояния переключателя оценивается значение седьмого разряда порта РВ. Если контакты переключателя разомкнуты (PINB.7 равен единице), то управление передается по метке comp (к процедуре сравнения кодов). В противном случае выполняется процедура записи.
Процедура записи кода в EEPROM занимает строки 60—62. В строке 60 длина кодовой комбинации записывается в переменную klen. Так как при описании переменной klen (см. строку 9) ее местом расположения выбран EEPROM, то записанное в переменную значение автоматически туда и попадает. Язык СИ сам выполняет все необходимые для этого процедуры. Как видите, в языке СИ запись в EEPROM происходит гораздо проще, чем на Ассемблере.
В строке 61 находится цикл, который производит запись в EEPROM самой кодовой комбинации. Цикл просто по очереди записывает каждый элемент массива buf г в соответствующий элемент массива bufe. A buf е целиком находится в EEROM. В качестве параметра цикла используется переменная 1. По ходу работы цикла значение этой переменной меняется от нуля до ii. То есть перебираются номера всех элементов кодовой комбинации (ii равно ее длине). Тело цикла составляет всего одно выражение. Это выражение записывает значение очередного элемента буфера bufг в буфер bufe.
Причем в качестве указателя для обоих массивов используется одна и та же переменная. Поэтому в буфере bufe элементы попадают в те же позиции, какие они занимали в буфере buf г. По окончании цикла записи управление переходит к строке 62. В этой строке находится оператор безусловного перехода, который передает управление по метке zamok. То есть к процедуре открывания замка. Щелчок механизма замка оповещает об окончании процесса записи.
Процедура проверки занимает строки 63, 64. Напомним, что к началу этой процедуры переменная ii содержит длину только что введенной кодовой комбинации, а буфер bufг — саму эту комбинацию. Сначала, в строке 63, сравнивается значение переменной klen (длина, записанная ранее в EEPROM) и значение переменной i i. Язык СИ сам извлекает значение klen из EEPROM, используя все необходимые процедуры.
Если в результате проверки эти две длины окажутся не равными, то управление передается по метке ml. То есть к началу всей программы. Дальнейшее сравнение кодов не производится, и замок не открывается. Если оба значения одинаковы, то программа переходит к сравнению кодовых комбинаций. Цикл, производящий это
сравнение, находится в строке 64. Этот цикл в качестве параметра тоже использует переменную i.
В процессе работы цикла значение этой переменной также меняется от нуля до ii. В теле цикла выполняется оператор сравнения if. Этот оператор сравнивает значения элементов двух массивов, один из которых (bufr) находится в EEPROM, а второй (bufe) расположен в ОЗУ. При первом же несовпадении кодов оператор безусловного перехода передает управление по метке ml. В этом случае цикл проверки досрочно прерывается, и замок не открывается. Если в процессе работы цикла проверки все коды оказались одинаковыми, то цикл завершается нормальным образом, и управление переходит к строке 65. То есть к процедуре открывания замка.
Процедура открывания замка очень проста. Она занимает строки 65—67. В строке 65 подается команда, открывающая механизм замка (в четвертый разряд порта РВ записывается единица). Затем вызывается задержка третьего типа (строка 66). По окончании задержки открывающий сигнал снимается (строка 67). С окончанием процедуры открывания замка заканчивается тело основного цикла программы. Так как основной цикл бесконечный, то управление передается на его начало. То есть на строку 48. Работа программы начинается сначала.
Теперь вернемся к вспомогательным функциям программы, которые мы пропустили вначале этого описания. Начнем по порядку. В строках 12, 13 и 14, 15 размещены две разные по названию, но одинаковые по содержанию функции. Первая из них является процедурой обработки прерывания по переполнению таймера/счетчи- ка1. А вторая — процедурой обработки прерывания по совпадению в канале А того же таймера.
В программе на Ассемблере оба вида прерываний вызывали одну и ту же общую процедуру. Данная версия языка СИ не позволяет использовать одну и ту же функцию в качестве процедуры обработки двух разных видов прерываний. В теле каждой из функций имеется всего одна строка. В этой строке присваивается единица переменной f lz. То же самое делает процедура обработки прерывания в программе на Ассемблере.
Строки 16—26 занимает функция ввода состояния клавиатуры. Алгоритм работы этой функции немного отличается от алгоритма работы аналогичной процедуры на Ассемблере. Функция incod () в программе на языке СИ производит лишь считывание содержимого портов, наложение маски и антидребезговый алгоритм.
Операция сравнения в теле данной функции не выполняется. Так как функция incod () должна возвращать код состояния клавиатуры, тип возвращаемого значения определен как unsigned int (см. строку 16). Функция не имеет параметров, на что указывает слово void.
Рассмотрим подробнее, как работает функция incod (). В строках 17—19 производится описание локальных переменных. Переменные codO и codl используются для хранения промежуточных значений кода состояния клавиатуры. Причем переменная codl используется для хранения нового значения кода, а переменная codO — для хранения старого значения (не путайте с буфером cods основной программы). При описании переменной codO (строка 17) одновременно производится ее инициализация (присваивается нулевое значение). Этот ноль необходим для правильных) начала цикла антидребезга. Для того чтобы при первом сравнении новый код не был равен старому. Еще одна переменная с именем к используется в качестве параметра цикла антидребезга.
Основу функции incod () составляет цикл антидребезга (строки 20—25). По сути, тело функции состоит только из этого цикла. Задача цикла — ввести код состояния клавиатуры заданное количество раз (определяется константой kandr). В данном случае используется стандартный цикл for (см. строку 20).
Цикл выполнится полностью (нужное количество раз) в том случае, если за время его работы код состояния клавиатуры не изменится. Если в процессе выполнения цикла состояние кнопок изменяется, то специальные команды внутри цикла перезапускают его работу сначала. Вычисление кода состояния производится в строках 21 и 22. Оператор if (строка 23) сравнивает старое и новое значения кодов. Если эти значения не равны, выполняются команды перезапуска цикла (строки 24, 25). По окончании работы цикла антидребезга команда return определяет возвращаемое значение (строка 26). На этом функция завершается.
Разберемся с отдельными элементами цикла антидребезга подробнее-. И начнем со строк 21 и 22, где, как уже говорилось, происходит формирование кода состояния клавиатуры. Суть производимых вычислений наглядно проиллюстрирована на рис. 2.4. Источником информации для этих вычислений является содержимое регистров PINB и PIND, которые, как известно, непосредственно подключены к выводам портов РВ и PD.
На содержимое обоих портов накладываются соответствующие маски, а затем все это объединяется в одно шестнадцатиразрядное
число и помещается в регистр codl. Выражение в строке 21 соответствует первому этапу на рис. 2.4. В правой части выражения выполняется операция логического умножения (операция «И») между содержимым порта РВ и маской 0x07. Результат выражения записывается в переменную codl.
Выражение в строке 22 объединяет этапы 2 и 3. Правая часть этого выражения представляет собой сумму двух слагаемых. Первое слагаемое представляет собой операцию логического сдвига содержимого переменной codl на восемь разрядов влево. Этот сдвиг соответствует этапу номер 2 на рисунке. В результате сдвига восемь младших разрядов числа становятся старшими.
Второе слагаемое — это еще одна операция логического умножения. На этот раз умножается содержимое порта PD и константа 0x7F, представляющая собой маску для этого порта. Результатом сложения двух этих слагаемых является искомый код состояния клавиатуры, который записывается в переменную codl. Вычисление второго слагаемого и сложение их обоих и соответствует этапу номер 3 на рис. 2.4. Символом «X» на рисунке обозначаются разряды, значение которых не определено. Разряды, значение которых зависит от той либо иной кнопки клавиатуры, обозначается названием этой кнопки. Остальные разряды равны либо «0», либо «1».
Итак, в результате выполнения описанных выше операций переменная codl содержит новое значение кода состояния клавиатуры. В строке 23 этот код сравнивается со старым значением, которое хранится в переменной codO. Если коды не равны, то выполняются команды перезапуска цикла (строки 24, 25). В строке 24 переменной к (параметру цикла) присваивается нулевое значение. В строке 25 значение переменной codl записывается в переменную codO. Теперь новое, только что полученное значение кода становится старым.
В строках 27—33 расположена функция формирования задержки. Алгоритм работы и этой функций повторяет алгоритм работы аналогичной процедуры на Ассемблере. Функция не возвращает никаких значений, но зато имеет входной параметр: код вида задержки.
Как и процедура на Ассемблере, функция wait () формирует три вида задержки. Параметр, определяющий номер задержки, имеет имя kodz и тип unsigned char. Работа функции начинается с определения значения маски прерываний. Для этого в строках 28, 29 оценивается значение переменной kodz. Если значение kodz
1-й этап (чтение порта РВ, маска)
PIN ВМаска
I X | X | X I X I X ]sio|S9]ss| |o|o|o|o|o|l|l|l|
2-й этап (сдвиг на 8 разрядов влево)
Cod1
Направление сдвига
Рис. 2.4. Формирование кода состояния клавиатуры
равно 1, то в регистр маски прерываний TIMSK записывается код 0x40. Этот код разрешает прерывание по совпадению в канале А.
Если kodz не равен единице, то регистру TIMSK присваивается значение 0x80 (прерывание по переполнению). Таким образом, в режиме 1 будет работать прерывание по совпадению в канале А. При этом формируется задержка длительностью 48 мс. В остальных режимах (2, 3) используется прерывание по переполнению таймера. В этом случае формируется задержка длительностью в одну секунду.
В строке 30 обнуляется значение счетного регистр таймера. С момента обнуления таймера начинается формирование заданного временного интервала. В строке 31 обнуляется значение флага задержки. В строке 32 выполняется команда глобального разрешения прерываний. На этом настройка таймера и системы прерываний заканчиваются. Теперь остается лишь организовать цикл ожидания.
Цикл ожидания, предназначенный для работы в режимах 1 и 3, организован в строке 33. Это пустой цикл, организованный при помощи оператора while. В качестве условия продолжения цикла выбрано равенство флага f lz нулю. То есть пока flz равен нулю, цикл ожидания будет продолжаться. А закончится он в тот момент, когда процедура обработки прерывания изменит значение флага flz на единичное.
В режиме 2 используется другой цикл ожидания, который находится вне функции wait (). Поэтому в строке 33, кроме цикла ожидания, имеется оператор сравнения if. Он проверяет значение переменной kodz. Благодаря оператору сравнения, цикл ожидания в строке 33 выполняется только в том случае, когда kodz не равен двум.
2.3. Кодовый замок с музыкальным звонком
Ну и в заключении приведу пример, как можно объединить вместе две разные задачи. Посмотрим, как можно соединить описанный выше кодовый замок и музыкальную шкатулку. Музыкальная шкатулка с успехом может выполнять функцию дверного звонка. Нужно лишь немного изменить алгоритм запуска музыкальной программы и заставить шкатулку играть разные мелодии при нажатии одной кнопки.
Постановка задачи
Естественно, далеко не любые две задачи можно объединить в одном устройстве. Но данные две задачи прекрасно объединяются. Если немного доработать музыкальную шкатулку, то легко заставить ее работать от одной кнопки. Менять мелодии можно при каждом очередном нажатии этой кнопки.
Звучание мелодии должно начинаться при нажатии кнопки и продолжаться до’ее отпускания. При следующем нажатии должна звучать другая мелодия. Доработанная таким образом программа будет использовать всего две линии порта. В схеме электронного замка как*раз есть две свободные линии.
С точки зрения объединения двух программ тоже нет никаких проблем. Так как обе эти программы вполне могут работать по отдельности. Действительно, кто же будет одновременно звонить в звонок и набирать кодовую комбинацию?
Итак, мы можем сформулировать последнюю нашу задачу следующим образом: «Объединить два разработанных ранее устройства: музыкальную шкатулку (см. раздел 2.1) и электронный кодовый замок (см. раздел 2.2) в одно универсальное устройство, обладающее обеими этими функциями. Устройство должно иметь десять кнопок набора кода, тумблер выбора режима, выходной каскад для управления электромагнитом замка, а также кнопку звонка и выходной каскад звука».
Алгоритм
Итак, нам нужно объединить два алгоритма. Как уже говорилось выше, эти два алгоритма не должны работать одновременно. Поэтому каждый алгоритм останется практически без изменений.
Но их нужно все же соединить вместе. Как может выглядеть это соединение?
Для соединения алгоритмов достаточно объединить их процедуру ожидания. Такая процедура есть и в программе музыкальной шкатулки, и в программе замка. В первом случае такая процедура должна ожидать нажатия кнопки звонка, а во втором — нажатия одной из кнопок набора кода. Обе эти процедуры нужно объединить в одну. Объединенная процедура ожидания должна сначала опрашивать кнопку звонка, а затем проверять, не нажаты ли кнопки набора кода.
Если обнаружится нажатие кнопки звонка, выполняется алгоритм музыкальной шкатулки. Если нажатыми окажутся кнопки набора кода, то выполняется алгоритм электронного замка. Если ничего не нажато, цикл ожидания продолжается.
В том случае, если начнется выполнение музыкального алгоритма, программа будет целиком занята этим алгоритмом, пока кнопка звонка не будет отпущена. Если начнется выполнение алгоритма замка, то программа будет выполнять его до конца. То есть пока набранная комбинация не запишется в память или пока не закончится процедура проверки. И только тогда, когда выбранный алгоритм закончит свою работу, управление передается к объединенной процедуре ожидания.
Схема
За основу схемы объединенного устройства удобнее взять схему электронного замка (см. рис. 2.3). Она потребует минимальной доработки. Новая схема приведена на рис. 2.5. К старой схеме добавлены всего два элемента. Во-первых, это выходной каскад звука, подключенный к выходу РВЗ. Именно этот выход используется в музыкальной шкатулке (рис 2.1). А во-вторых, кнопка звонка, которую мы подключим к линии РВ6.
Обратите внимание, что звуковая часть и сам микроконтроллер питаются от напряжения +5 В. А электромагнит замка питается от отдельного источника +12 В. Напряжение питания, подаваемое на микроконтроллер, обязательно должно быть стабилизированным. Питание на электромагнит стабилизировать совершенно необязательно. Для повышения громкости звонка и для защиты от помех питание для звуковой схемы можно осуществлять от напряжения, поступающего на вход стабилизатора.
Обычно напряжение на входе стабилизатора равно +7... +11 В. Поэтому можно электромагнит и звуковую схему запитывать от одного нестабилизированного источника +12 В. Те же 12 В можно подавать на вход стабилизатора, с выхода которого снимать напряжение +5 В для микроконтроллера.
Рис. 2.5. Схема усовершенствованного кодового замка
Программа на Ассемблере
На листинге 2.5 приведен возможный вариант объединения двух программ на Ассемблере. Новая программа, как и любая другая программа на Ассемблере, имеет свой модуль описания переменных и констант, свой модуль резервирования памяти, свою таблицу векторов прерывания и свою собственную основную часть.
Каждая из этих частей является результатом объединения аналогичных частей двух исходных программ. Блок описаний переменных и констант в новой программе занимает строки 3—18. При создании объединенного блока описаний учитывался тот факт, что в исходных программах широко используются одинаковые переменные. В объединенном блоке описаний каждая такая переменная описывается только один раз.
В строках 19—22 находится объединенный блок резервирования ОЗУ. В строке 21 резервируется буфер buf г для электронного замка. Такой же буфер резервировался и в исходной программе. В строке 22 резервируется ячейка melod. Это новая ячейка, введенная в связи с доработкой алгоритма музыкальной шкатулки. В этой ячейке будет храниться текущий номер мелодии. При каждом последующем нажатии кнопки звонка этот номер будет изменяться.
В строках 23—25 находится блок резервирования ячеек в EEPROM. Этот блок целиком взят из исходной программы электронного замка. В строках 28—46 находится таблица переопределения векторов прерываний. Она тоже объединена из двух таблиц. Однако в связи с тем, что программа музыкальной шкатулки прерываний не использует, новая таблица полностью повторяет таблицу из программы электронного замка.
Модуль инициализации занимает строки 47—60. В данном случае в новый блок попали те команды, которые в исходных блоках обеих программ одинаковы. Это команды инициализации стека, инициализации портов ввода—вывода и инициализации (выключения) компаратора. Команды инициализации таймера для каждой из исходных программ отличаются друг от друга. Поэтому они исключены из общего блока инициализации. Инициализация таймера будет производиться по- разному в зависимости от выбранного режима работы (звонок или замок). •
В строке 61 начинается основная часть программы. За основу этой части взята программа электронного замка. Программа звонка подключается к основной части путем доработки процедуры ожидания нажатия кнопки. В остальном программа замка не претерпела ни каких изменений.
Начинается основная программа с инициализации таймера под задачи замка (строки 61—66). Затем в строках 67, 68 записывается контрольное значение в буфер codH+codL. В качестве контрольного значения используется код состояния клавиатуры при полностью отпущенных кнопках. Этот код будет использоваться далее в цикле ожидания отпускания кнопок и в цикле ожидания нажатия кнопок. В строках 69, 70 находится цикл ожидания отпускания кнопок. До сих пор программа замка не имела принципиальных изменений.
В строках 71—75 находится цикл ожидания нажатия кнопок. Именно этот цикл изменен таким образом, что выполняет теперь комбинированный опрос не только кнопок ввода кода, но и кнопки звонка. И начинается цикл с опроса кнопки звонка (строки 71—73). В строке 71 содержимое порта РВ считывается и помещается в регистр temp.
В строке 72 проверяется значение бита номер шесть полученного числа. Именно этот бит отвечает за кнопку звонка. Если кнопка звонка нажата, то значение данного бита будет равно нулю. В этом случае команда условного перехода в строке 73 передаст управление по метке kkl, где находится программа воспроизведения мелодий. Если кнопка звонка не нажата, то управление передается к строке ,74. В строках 74 и 75 находится знакомая нам процедура проверки кнопок набора кода.
Если ни одна из кнопок набора кода не нажата, то управление передается на начало комбинированного цикла (по метке ml), и цикл продолжается. При обнаружении факта нажатия одной или нескольких кнопок набора кода управление переходит к строке 76. С этой строки программа электронного замка не имеет отличий от оригинала.
Вся оставшаяся часть программы занимает строки 76—127. Вспомогательные процедуры занимают строки 128— 185.
Программа музыкального звонка расположена в строках 186—295. Ее пришлось немного доработать. Прежде всего, из программы был исключен модуль опроса клавиатуры, который в программе «Музыкальная шкатулка» (листинг 2.1) по нажатию одной из кнопок определял номер воспроизводимой мелодии. Вместо этой процедуры в программу введена другая, которая использует в качестве номера мелодии содержимое ячейки melod. При каждом нажатии кнопки номер мелодии увеличивается на единицу.
Если полученный таким образом номер превысит общее количество * мелодий, то он сбрасывается в ноль, а подсчет мелодий начинается сначала. В новой шкатулке используется не семь, а восемь мелодий. Других принципиальных изменений музыкальная программа не имеет.
Начинается музыкальная программа с модуля инициализации таймера (строки 186—189). В данном случае таймер настраивается на нужды программы воспроизведения звука. В строках 190—195 расположен упомянутый выше модуль, определяющий номер мелодии. В строке 190 текущее значение номера мелодии читается из ячейки памяти melod и помещается в регистр count.
В строке 191 номер мелодии увеличивается на единицу. В строке 192 полученный таким образом новый номер мелодии сравнивается с числом 8. Если номер меньше восьми, то оператор условного перехода в строке 193 передает управление по метке km2, и строка 194 не выполняется. Если номер мелодии равен или больше восьми, то выполняется строка 194, где номеру мелодии присваивается нулевое значение.
В строке 195 новый номер мелодии записывается обратно в ячейку памяти melod. Там он хранится до следующего нажатия кнопки звонка. Кроме того, номер мелодии остается также и в регистре count. Именно в этот регистр помещала номер мелодии процедура сканирования клавиатуры в программе «музыкальная шкатулка».
После определения номера мелодии управление переходит к строке 196. В этой строке начинается уже известная нам программа воспроизведения мелодий. Она почти без изменений перенесена из программы (листинг 2.1). Но без изменений все же не обошлось.
Во-первых, пришлось переименовать некоторые метки, так как в программе электронного замка были использованы метки с теми же именами. Второе изменение связано с условием выхода из процедуры воспроизведения мелодии. В исходной программе для этого проверялось состояние сразу семи управляющих кнопок. И если хотя бы одна из них оставалась нажатой, воспроизведение мелодии продолжалось.
В нашем случае нам нужно проверить лишь одну кнопку — кнопку звонка. Доработанная процедура проверки расположена в строках 204—206. В строке 204 читается содержимое порта РВ и помещается в регистр temp. В строке 205 проверяется разряд номер 6. Именно этот разряд связан- с кнопкой звонка.
Если разряд равен нулю (кнопка нажата), то воспроизведение мелодии продолжается. Если разряд равен единице (кнопка отпущена), то оператор условного перехода в строке 206 передает управление по метке ктб, где происходит завершение процедуры формирования звука. После выключения звука команда безусловного перехода в строке 223 передает управление по метке main, то есть на начало программы замка. И первыми операциями этой программы будет перенастройка таймера под требования этой основной задачи.
В строках 289—295 находятся таблицы всех мелодий. В целях сокращения занимаемого места в данном примере все мелодии максимально сокращены. При повторении данной конструкции вы можете использовать мелодии целиком, взяв их из листинга 2.1. Еще проще скачать эту и все остальные программы в электронном виде с сайта http://book.microprocessor.by.ru. Там все восемь мелодий представлены в полном виде.
Листинг 2.5
ЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙ
йй
йй
ЙЙ
Пример 11
йй
ЙЙ
Кодовый замок
йй
йй
с музыкальным звонком
йй
ЙЙ
йй
Йййййййййййййййййййййййййййййййййййййййййййййй
Псевдокоманды управления
1
2
include list
' tn2313def me'
Присоединение файла описании
Включение листинга
3
def
drebt
- Я1
Буфер антидребезга младший байт
4
def
drebH
= R2
Буфер антидребезга старший байт
5
def
tempi
= R3
Вспомогательный регистр
6
. def
temp =
Я16
Второй вспомогательный peiисто
7
.def
data =
Я17
Регистр передачи данных
8
.def
flz =
P.18
Фаза работы замка
9
. def
count
= R19
Регистр передачи данных
10
def
addre
- R20
Указатель адреса в EEPROM
11
. def
codL =
R21
Временный буфер кода младший байт
12
def
codH =
R22
Временный буфер кода старший байт
13
def
loop =
R23
Регистр счетчика
14
def
fnota
= R24
Частота текущей ноты
15
.def
dnota
= 825
Длительность текущей ноты
—
—
Определение констант
16
. eou
bsize
= 60
Размер буфера для хранения кода
17
equ
kzad
= 3000
Задержка при сканировании кнопок
18
equ
kandr
= 20
Константа антидребезга
19
dseg
—
Резервирование ячеек памяти (SRAM)
Выбираем сегмент ОЗУ
20
.org
0x60
Устанавливаем текущий адрес сегмента
21
but r
byte
bsize
Буфер для приема кода
22
me! od
. byte
1
Номер текущей мелодии
23
eseg org
0x08
Резервирование ячеек памяти (EEPROM)
Выбираем сегмент EEPROM
Устанавливаем текущий адрес сегмента
24
klon ■
. byte
1
Ячейка для хранения длины кода
25
bufe
byte
bsize
Буфер для хранения кода
26
cseg
—
Начало программного кода
Выбор сегмента программного кода
27
org
0
Установка текущего адреса на ноль
28
29
30
31
start:
rjmp reti ret i ret i
imt
Переход на начало программы
Внешнее прерывание 0
Внешнее прерывание 1 Таймер/счетчик 1. захват
32
rjmp
proor
Таймер/счетчик 1. совпадение канал А
33
34
r]mp ret i
proor
Таймер/счетчик 1, прерывание по переполнению
Таймер/счегчик 0. прерывание по переполнению
35
reti
. Прерывание UARI прием завершен
36
ret 1
Прерывание UART регистр данных пуст
37
reti
, Прерывание UART передача завершена
38
reti
. Прерывание по компаратору
39
reti
. Прерывание по изменению на любом контакте
40
reti
; Таймер/счетчик 1 Совпадение, канал В
41
reti
. Таймер/счетчик 0 Совпадение, канал В
42
reti
; Таймер/счетчик 0 Совпадение, канал А
43
reti
, USI готовность к cTapiy
44
■ reti
; USI Переполнение
45
reti
■ БЕРНОМ Готовность
46
reti
; Переполнение охранного таймера
Модуль инициализации
*t*#*<*t»e*****x***w***-*****»w*
init:
Инициализация стека
47
Idi
temp, RAMEND
; Выбор адреса вершины стека
48
out
SPL. temp
; Запись его в регистр стека
—
Инициализация портов B/B
49
Idi
temp 0x18
: Инициализация порта РВ
50
out
DDRB. temp
51
Idi
temp, 0xE7
52
out
PORTB temp
53
Idi
temp, 0x7F
: Инициализация порта PD
54
out
PORTO. temp
55
Idi
temp. 0
56
out
DDRD. temp
Инициализация (выключение) компаратора
57
Idi
temp 0x80
58
out
ACSR, temp
Номер мелодии
59
Idi
temp,0
Сбрасываем в ноль
,60
sts
melod.temp
^яе**ж***я*******»*е*1
W * • * . ,
Начало основной
программы
main
:Инициализация таймера
61'
idi
temp. high(kzad )
), Записываем коэффициент задержки
62
out
0CR1AH. temp
63
Idi
temp low(kzad )
64
out
0CR1AL. temp
65
Idi
temp. 0x03
: Выбор режима работы таймера
66
out
TCCR1B, temp
67
Idi
codt Ox7F,
Код для сравнения (младший байт)
68
Idi
codh.0x07
. Код для сравнения (старший байт)
69 mO’
rcall
incod
. Ввод и проверка кода клавиш
70
brne
mO
; Если хоть одна не нажата, продолжаем
71 ml
in
temp.PINB
; Проверка кнопки звонка
72
73
Sbrs rjmp
temp. 6
kk1
: Если нажата, переходим к звуковой части
74
rcall
incod
: Ввод и проверка кода клавиш
75
breq
m!
: Если не одна не нажата, продолжаем
76 m2
Idi
ZH. high(bufr)
: Установка указателя на начало буфера
77
Idi
ZL low(bufr)
78
clr
count
: Сброс счетчика байт
—
Цикл ввода
кода
79 m3
Cll
-
; Запрет всех прерываний
80
Idi
data,1
: Вызываем задержку первого типа
81
rcall
wai t
: К подпрограмме задержки
82 m5:
rcall
incod
, Ввод и проверка кода кнопок
83
st
Z+.XL
; Записываем его в буфер
84
85
st inc
Z+.XH count
, Увеличение счетчика байтов
86
87
inc cpi
count
count, bsize
; Проверяем, не конец ли буфера
88
brsh
m7
: Если конец, завершаем ввод кода
89
mov
codl. XI
; Записываем код как старый
90
mov
codH. XH
91
Idi
data.2
: Вызываем задержку третьего типа
92
rcall
wait
, К подпрограмме задержки
93 m6:
rcall
incod
: Ввод и проверка кода кнопок
94
brne
m3
; Если изменилось, записываем в буфер
95
cpi
flz. 1
; Проверка окончания фазы ввода кода
96
brne
m6
97 m7'
SblC
PINB, 7
. Проверка состояния тумблера
98
rjmp
m9
: К процедуре проверки кода
Процедура записи кода
99
mov
data, count
: Помещаем длину кода в data
100
Idl
addre. klen
Адрес в EEPROM для хранения длины кода
101
rcall
eewr
Записываем в длину кода EEPROM
102
Idi
addre. bufe
. В регистр адреса начало буфера в EEPROM
103
Idi
ZH. high(bufr)
■ В регистровую пару Z записываем
104
Idi
ZE low(bufr)
. адрес начала буфера в ОЗУ
105 m8
Id ■
data Z+
. Читаем очередной байт из ОЗУ
106
f call
eewr
. Записываем в длину кода EEPROM
107
dec
count
. Декремент счетчика байтов
108
brne
m8
: Если не конец, продолжаем запись
109
r jmp
m11
: К процедуре открывания замка
Процедура проверки кода
110 ш9
Idi
addre. klen
. Адрес хранения длины кода
111
112
113
real 1 cp brne
eerd count, data
m13
. Чтение длины кода из EEPROM Сравнение с новым значением
. Если не равны, к началу
114
Idi
addre. bufe
, В YL начало буфера в EEPROM
115
Idi
ZH hjgh(bufr)
: В регистровую пару Z записываем
116
Idi
ZL. low(bufr)
. адрес начала буфера в ОЗУ
117 m10:
г call
eerd
: Читаем очередной байт из EEPROM
118
Id
temp. Z+
. Читаем очередной байт из ОЗУ
119
cp
data, temp
. Сравниваем два байта разных кодов
120
brne
m 13
; Если не равны, переходим к началу
121
dec
count
: Уменьшаем содержимое счетчика байтов
122
brne
miO
. Если не конец продолжаем проверку
—
Процедура открывания замка
123 m11:
sbi
PORTS,4
. Команда ' Открыть замок'
124
Idi
data,3
. Вызываем задержку третьего типа
125
real]
wait
126
cbi
PORTS,4.
: Команда "Закрыть замок"
127 m13:
rjmp
main
. Перейти к началу
' **тг******е*******-******е**********ж***-***-****х**-1**1«ж*
, •Вспомогательные процедуры*
—
Ввод и проверка 2 байтов с клавиатуры
128
incod■
push
count
129
Idi
XL.O
; Обнуление регистровой пары X
130
Idi
XH,0
131
id:
Idi
count, kandr
, Константа ангидребезга
132
MOV
drebL, XL
; Старое значение младший байт
133
mov
drebH, XH
, Старое значение старший байт
134
ic2:
in
XL,PIND
Вводим код (младший байт)
135
Cbr
XL,0x80
; Накладываем маску
136
in
XH,PINS
. Вводим код (старший байт)
137
Cbr
XH,0xF8
. Накладываем маску
138
тсЗ'
cp
XL. drebL
Сверяем младший байт
139
brne
id
. Если не равен начинаем с начала
140
cp
XH, drebH
■ Сверяем старшин байт
141
br ne
id
. Если не равен, начинаем с начала
142
1С4
dec
count
Уменьшаем счетчик антидребезга
143
brne
ic2
Если еще не конец, продолжаем
144
cp
XL. COdL
: Сравнение с временным буфером
145
brne
1C5
. Если не равно заканчиваем сравнение
146
cp
XL. codH
1 Сравниваем старшие байты
147
1 с5:
poo
count
148
ret
318
—
Подпрограмма задержки
149 wait: cpidata, 1
; Проверяем код задержки
150brnew1
151iditemp,0x40
. Разрешаем прерывание по совпадению
152rjmpw2
153 wriditemp, 0x80
, Разрешаем прерывания по переполнению
154
155 w2outTIMSK,temp
: Записываем маску
156clrtemp
157out ■ TCNT1H,temp
; Обнуляем таймер
158outTCNTlL.temp
159Idiflz.O
. Сбрасываем флаг задержки
160sei
: Разрешаем прерывания
161cpidata, 2
: Если это задержка 2-го типа
162breqw4
; Переходим к концу подпрограммы
163 w3:cpiflz.1
Ожидание окончания задержки
164brne . w3
165cli
■ Запрещаем прерывания
166 w4ret
. Завершаем подпрограмму
Запись байта в ячейку EEPROM
167 eewr cli
; Запрещаем прерывания
168sbicEECR. EEWE
: Проверяем готовность ЕЕРЙОМ
169rjmpeewr
; Если не готов ждем
170outEEAR. add re
v : Записываем адрес в регистр адреса
171out - EEDR. data
; Записываем данные в регистр данных
172sbiEECR. EEMWE
; Устанавливаем бит разрешения записи
173sbiEECR. EEWE
: Устанавливаем бит записи
174incaddre
. Увеличиваем адрес в EEPROM
, 175ret
, Выход из подпрограммы
—
Чтение байта из ячейки ЕЕРЙОМ
176 eerd: ell
: Запрещаем прерывания
177sbicEECR. EEWE
; Проверяем готовность ЕЕРЙОМ
178rjmpeerd
. Если не готов ждем
179outEEAR. addre
: Устанавливаем бит инициализации чтения
180sbiEECR. EERE
. Устанавливаем биг инициализации чтения
181mdata. EEDR
: Помещаем прочитанный байт в data
182incaddre
: Увеличиваем адрес в ЕЕРЙОМ
183ret
. Выход из подпрограммы
Процедура обработки
прерываний*
• Прерывание no совпадению
184 propr idiUz. 1
Установка флага задержки
185
reti; Завершаем обработку прерывания
. ЯЯйййЯЯйййЯйййййййЯйЯйЯййййЯййЯЯЯйЯйййййЯНйЯЯЯйййЯЯйЯй
:ЯЯ
; яМелодичный звонокя
.«Я
;ййяйййяйййяйяйяяййййййййййяяййййяйййййяййяййййяййяйййй
kkl.
Инициализация таймера Т1
186
187
188
189
Iditemp, 0x09■ Включаем режим СТС
outTCCR1B, temp
kmi:Iditemp, 0x00; Выключаем звук
outTCCR1A, temp
:Определение номера текущей мелодии
190
191
192
193
194
195
idscount,melod ;Читаем код текущеймелодии
inccount .: Увеличение номера мелодии на 1
cpicount,8;Проверка на последнюю мелодию
brnekm2■,Если не последняя,переход
clrcount;Обнуление счетчика
km2.stsmelod. count : Помещаем номер в ячейку памяти
Выбор мелодии
196
197
198
199
km3:movYL. count; Вычисляем адрес, где
IdiZL,low(tabm*2),хранится начало мелодии
idiZH,high(tabm*2)
rcalladdw:К подпрограмме 16-разрядногосложения
200
201
1pmXL. Z+: Извлекаём адреса из таблицы
1pmХН, Z: и помещаем в X
; Воспроизведение мелодии
202
203
km4;movZH, ХН, Записываем в Z начало мелодии'
movZL, XL
204
205
206
km5:intemp. PINB; Читаем содержимое порт В
sbrctemp. 6; Проверяем нажата ли еще кнопка звонка
rjmp- km6: Если равно (кнопки отпущены) в начало
207
208
209
1pmtemp,Z:Извлекаем код ноты
cpitemp.OxFF:Проверяем, не конец ли мелодии
breqm4;Если конец, начинаем мелодию сначала
210
211
212
213
214
215
216
217
218
anditemp.Gx1F:Выделяем код тона из коданоты
movfnotatemp:Записываем в регистр кодатона
1pmtemp,Z+.Еще раз берем код ноты
roltemp;Производим четырехкратныйсдвиг кода ноты
roltemp
roltemp
roltemp
anditemp, 0x07.Выделяемкод длительное!и
movdnota. temp.Помещаемеев регистрдлтельносги
219
rcall notaК подпрограмме воспроизведения ноты
220
rjmpkm5. В начало цикла (следующая нога)
221 ктб:
Idi
temp. 0x00
Выключаем звук
222
out
TCCR1A, temp
223
rjmp
main
. Переходим к началу
Вспомогательные подпрограммы
2J4
; Подпрограмма 16-ти разрядного сложения
addw:
push
YH
225
226
227
228
Isl lol add adc
YL: Умножение первого слагаемого на 2
YH. 0Второй байт первого слагаемого = 0
ZL, YL ' Складываем два слагаемых
ZH, YH
229
230
pop . ret
YH
231
232
233
234
nota
push push push push
Подпрограмма исполнения одной ноты
ZH
ZL
YL
temp
235
236
cpi breq
fnota. 0x00,
nt1'
Проверка, не пауза ли
Если пауза, переходим сразу к задержке
237
238
*239
240
mov Idi Idi rcall
YL. fnota.
ZL. low(tabkd*2)
ZH, high(tabkd*2) addw,
Вычисляем адрес, где хранится
; коэффициент деления для текущей ноты
К подпрограмме 16-разрядного сложения
241
242
243
244
245
246
1pm "
I pm out out
Idi out
temp, Z+,
tempi, Z1
0CR1AH. tempi,
OCR1AL, temp.
temp. 0x40;
TCCR1A, temp
Извлекаем мл. разряд КД для текущей ноты Извлекаем ст. разряд КД для текущей ноты Записать в старт, часть регистра совпадения Записать в младш. часть регистра совпадения
Включить звук
247
nt 1'
rcall
waitl,
К подпрограмме задержки
248
249
Idi out
temp. 0x00.
TCCR1A, temp
Выключить звук
250
251
Idi rcall
dnota.O;
waitl:
Сбрасываем задержку для паузы между нотами Пауза между нотами
252
253
254
255
256
pop pop pop pop ret
temp:
YL
ZL
ZH
Завершение подпрограммы
257
258
259
260
wait 1:
push push push push
Подпрограмма формирования задержки
ZH
ZL
YH
YL
261
mov
YL.
dnota
. Вычисляем адрес где хранится
262
Idi
ZL,
low(tabz*2)
; нужный коэффициент задержки
263
Idi
ZH.
nigh(tabz*2)
264
rcall
addw
; К подпрограмме 16-разрядно1о сложения
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
1pmYL.Z+;Читаем первый байт коэффициентазадержки
1pmYHZ;Читаем второй байт коэффициентазадержки
cl гZL:Обнуляем реч истровую пару 2
clrZH
: Цикл задержки
ww1:
Idiloop, 255; Пустой внутренний цикл
ww2
decloop
brneww2
adiwR30.1:Увеличениеpet метровой пары Z на единицу
срYL.ZL:Проверкамладшегоразряда
brneww1
срYH,ZH,Проверкастаршегоразряда
brneww1
popYL;Завершениеподпрограммы
popYH
popZL
popZH
ret
: •••••»
ew*»e*-e»***w»w**«efc*ii*****itie**********ww*****ir**
Таблица длительности задержек■
tabz:
.dw128,256,512.1024,2048,4096, 8192
w***t*wrt1w*»*<***ir**w*»«»**t*e-r*w*»**** + *ii*t*»»
Таблица коэффициентов деления*
, ******
tabkd:
. dw0,
dw4748.4480 4228.3992,3768,3556,3356.3168.2990.2822.2664, 2514
.dw2374.2240.2114.1996.1884,1778.1678.1584,1495,1411,1332, 1257
.dw1187.1120.1057, 998. 942, 889. 839. 792
■ * * * • * *
w»*w**wlr*,*'«*»***A****»1t***************ee*w***w**
Таблица начал всех мелодий•
tabm'
dwmel1*2.mel2*2.me!3*2,me!4*2
dwmel5*2.mel6*2,mel7*2
Таблица мелодий•
,
#»»**ww*****»"W*********w***"r*ww***iwMiriewTweitri
В траве сидел кузнечик
mel 1
db109 104.109.104.109.108 108.96,108,104 108.104 108.109.109.96,255
Песенка крокодила Гены
mel2
db109.110 141.102.104 105.102.109.110 141 104.105 107.104 109,110.255
8 лесу родилась елочка•
me!3.
db132.141 141 139.141 137.132.132.132 141 141 М2 139.176 128 144.255
Happy births day to you
292 №14. db 107.107 141.139.144,143 12S,107 107.141.139 146.144.128,107 1G7, 255
С чего начинается родина
293 meI5 .db 99 175. 109.107.106.102 99. 144. 111. 175.96.99 107 107 107.107 102.255
.Песня из кинофильма 'Веселые ребята
294 meJ6db105.109.112.149.116 64.80,148 114.64.78.146 112,96.105.105.109,255
.Улыбка
295 me!7.db107.104,141 139.102.105.104 102.164.128 104.107.109,109.109.111,255
Программа на языке СИ
Объединение программ на языке СИ происходит точно таким же образом, как и на Ассемблере. То есть отдельно объединяются блоки описания, блоки инициализации и основные части программ. Возможный вариант комбинированной программы приведен в листинге 2.6. В строках 3—13 описываются глобальные переменные, константы и массивы. Сюда вошли элементы, используемые в обеих объединяемых программах. В строках 14—25 описаны массивы, используемые при генерации мелодий. Причем для экономии места все мелодии здесь также сокращены.
Строки 29—47 занимают вспомогательные функции для программы электронного замка. Сюда входят:
две процедуры обработки прерываний (строки 26—29);
процедура опроса клавиатуры (строки 30—40);
процедура формирования задержки (строки 41—47).
Все эти процедуры перенесены из исходной программы без изменений.
Как и в программе на Ассемблере, за основу основной процедуры программы на СИ взята программа электронного замка. Поэтому музыкальная программа оформлена в виде отдельной функции muz, которая занимает строки 48—67. Функция представляет собой практически полную копию основной программы музыкальной шкатулки за исключением небольших изменений, о которых мы поговорим чуть дальше.
Все переменные, относящиеся именно к задаче воспроизведения звука, описываются внутри функции muz (строки 49—51). Лишь для хранения кода текущей мелодии используется глобальная переменная melod (описывается в строке 9).
Процедура сканирования кнопок из программы воспроизведения мелодии исключена и заменена небольшой процедуркой в строке 67. В этой строке происходит увеличение переменной melod на единицу и сравнение полученной величины с числом 8. Если melod больше либо равно 8, ему присваивается нулевое значение. .
Второе изменение программы воспроизведения мелодии состоит в доработке процедуры проверки нажатой кнопки. Данная проверка занимает всего одну строку. В новой программе это строка 54. Теперь программа проверяет состояние шестого бита порта РВ. Именно этот бит связан с кнопкой звонка. В остальном программа воспроизведения мелодий полностью повторяет аналогичную программу из листинга 2.2.
Программа кодового замка выполнена в виде главной процедуры программы и занимает строки 68—105. Текст этой программы почти полностью повторяет аналогичный текст в листинге 2.4. Главное отличие состоит в новой редакции процедуры ожидания отпускания кнопки. Она доработана и превращена в комбинированную процедуру ожидания.
В новой программе она занимает строки 85—86. Это все тот же цикл while, но на этот раз он не пустой. В данном случае цикл содержит один оператор. Это оператор if в строке 86. О том, что оператор i f входит в тело цикла, свидетельствует отсутствие сим; вола «точка с запятой» в конце строки 85. Для сравнения, в строке 84 точка с запятой есть. Поэтому цикл в строке 84 не имеет в своем теле никаких команд.
Внимание. Напоминаю, что в языке СИ конец строки не является признаком окончания команды. Операторы языка СИ отделяются друг от друга символом точки с запятой. Если точки с запятой нет, то все, что идет за очередным оператором, считается его продолжением.
При этом вас не должно смущать даже наличие комментария в строке 85. Комментарий начинается символом «//» и заканчивается в конце строки. Для компилятора любой комментарий не существует. Поэтому команда в строке 86 считается продолжением команды в строке 85. Как видите, простота и эффективность языка СИ имеет и свою обратную сторону. Наличие или отсутствие всего одного символа может кардинально изменить весь алгоритм программы.
Других изменений программа электронного замка не имеет. Нам даже не пришлось переименовывать метки.
Внимание. В функции main и в функции muz новой программы используются одинаковые имена меток. В программе на Ассемблере в подобной ситуации нам пришлось пе-
*реименовать метки одной из программ. В языке СИ
метки, проставленные внутри одной из функций, не «видны» из другой. Поэтому переименовывать метки не обязательно.
Однако в том случае, когда вы пишете программу с нуля, все же желательно не применять одинаковых имен в разных частях программы. Просто для того, чтобы самому не запутаться в этих именах.
Листинг 2.6
/■
Project . Пример 11
Version . 1
Date : 07.03.2006
Author Belov
музыкальным звонком• ATtiny2313: 4 000000 MHz■ Tiny: 32музыкальным звонком• ATtiny2313: 4 000000 MHz■ Tiny: 32Company Home Comments: Кодовый замок с
музыкальным звонком
• ATtiny2313
: 4 000000 MHz
■ Tiny
: 32
музыкальным звонком
• ATtiny2313
: 4 000000 MHz
■ Tiny
: 32
Chip type
«include <tiny2313 h>«include <delay h>«define klfree 0x77F«define kzad 3000«define kandr20. «define bsize30unsigned charflz:unsigned int bufr[bsize],unsigned cnar melod.«pragma warn-eeprom unsigned char klen.eeprom unsigned mt bufe[bsize],«pragma warn-«include <tiny2313 h>«include <delay h>«define klfree 0x77F«define kzad 3000«define kandr20. «define bsize30unsigned charflz:unsigned int bufr[bsize],unsigned cnar melod.«pragma warn-eeprom unsigned char klen.eeprom unsigned mt bufe[bsize],«pragma warn-Clock frequency Memory model Data Stack size
«include <tiny2313 h>
«include <delay h>
«define klfree 0x77F
«define kzad 3000
«define kandr20
. «define bsize30
unsigned charflz:
unsigned int bufr[bsize],
unsigned cnar melod.
«pragma warn-
eeprom unsigned char klen.
eeprom unsigned mt bufe[bsize],
«pragma warn-
«include <tiny2313 h>
«include <delay h>
«define klfree 0x77F
«define kzad 3000
«define kandr20
. «define bsize30
unsigned charflz:
unsigned int bufr[bsize],
unsigned cnar melod.
«pragma warn-
eeprom unsigned char klen.
eeprom unsigned mt bufe[bsize],
«pragma warn-
// Код состояния при полностью отпущенных кнопках
// Код задержки при сканировании
// Константа антидребезга
Н Размер буфера для хранения кода
// Флаг задержки
// Буфер в ОЗУ для хранения кода
И Текущий номер мелодии
П Отмена предупреждающих сообщений
// Ячейка для хранения длины кода
// Буфер в БЕРНОМ для хранения кода
// Разрешение предупреждающих сообщений
// Обьявление и инициализация массивов
И Таблица задержек
14 flash unsigned inr tabz[] = (16.32 64 128.256.512.1024},
// Массив коэффициентов деления
15 flash unsigned mt tabkdf ] = {0.4748, 4480. 4228.3992. 3768,3556, 3356. 3168. 2990, 2822,
162664,2514 2374.2240.2114,1996.1884.1778 1678.1584,1495.1411.1332 1257.
17118 7,1120.1057. 998,942.889.839,792}
// Таблицы мелодий
18flash unsigned char mel1[] = {109.104, 109,104,109.108,108.96.108,104,108,104.255}:
19flash unsigned char mel2[] = {109.110,141,102,104 105.102,109,110,141.104.105. 255};
20flashunsignedcharmeL3[ ]={132.141.141,139.141,137.132,132,132.141141,142,255},
21flashunsignedcharmel4[ ]={ 107.107.141.139.144.143.128,107.107141.139.146.255}
22 flash unsigned char mel5[] = {99 175.109,107,106,102.99.144.111,175,96,99.107, 255}.
23flashunsignedcharmel6[]={105 109 112.149.116.64,80,148,114,64.78.146112.255}:
24flashunsignedcharmel7[]={107,104.141.139. 102. 105.104, 102,164.128.Ю4107,255};
И Таблица начал всех мелодий
25 flash unsigned char *саЬт[] = {mell, me!2, mel3, mel4. mel5. me!6. me!7};
// Прерывание no переполнению Таймера 1
26 interrupt [TIM1_0VF] void timer1_ovf_isr(void) {
27 flz=1:
// Прерывание no совпадению в канале А Таймера 1
28interrupt [TIM1_COMPA] void timer1_compa_isr(void)
29 flz=1:
1
// Функция опроса клавиатуры и антидребезга
30
unsigned int incod (void)
31
unsigned int codO=O.
// Создаем локальные переменные
32
unsigned int cod1:
33
unsigned char k.
34
for (k=0; k<kandr k++)
// Цикл антидребезга
35
cod1-PINB&Ox7;
Н Формируем первый байт кода
36
cod1=(codK<8)t(PIND&0x7F):
// Формируем полный код состояния клавиагуры
37
if (codO’^codl)
// Сравниваем с первоначальным кодом
38
k=0:
// Если не равны сбрасываем счетчик
39
cod0=codl-
// Новое значение первоначального кода
40
return cod1:
И Процедура формирования задержки
41
void wait (unsigned char kodz)
42
if (kodz==1)' TIMSK=0x40
// Выбор маски прерываний по таймеру
43
else TIMSK=0x80.
44
TCNT1=O.
// Обнуление таймера
45
46
47
fl 7=0:// Сброс флао задержки
4asm( sci )// Разрешаем прерывания
if (kodz' =2) while(flz==0).// Цикл задержки
// Музыкальная программа
48
void muz (void)■
49
50
51
unsigned char fnota:// Код тона ноты
unsigned char dnota;И Код длительности ноты
flash unsigned char *nota.// Ссылка на текущую ноту
52
TCCRlA=OxOO;// Выключение звука
// Воспроизведение мелодии
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
m3:nota = tabm[melod]://Устанавливаем указатель на первуюноту
m4:if (PINB.6!=0) goto m2://Если кнопка звонка -не нажата, закончить
if (-nota™OxFF) goto m3;//Проверка на конец мелодии
fnota = (*nota)&0х1F://Определяем код тона
dnota = ((-nota)»5)&0x07://Определяем код длительности
if (fnota==0) goto m5://Если пауза не воспроизводим звук
0CR1A=tabkd[fnota].//Программируем частоту звука
TCCR1А=0х40,//Включаем звук
ш5'delay_ms (tabz[dnota]);ИФормируем задержку
TCCR1A=0x00.//Выключаем звук
delay_ms (tabz[0])://Задержка между нотами
nota++;// Перемещаем указатель на следующую ноту
goto m4.//К началу цикла
m2:TCCRlA=0x00;//Выключаем звук
if (++melod>=8) melod=0. // Увеличиваем счетчик мелодий }
// Основная .функция
68
void main(void)
69
70
71
72
73
74
75
76
77
78
79
80
81
unsigned charи;//Указатель массива
unsigned chari;//Вспомогательныйуказатель
unsigned in I codS,//Старый код
P0RTB=0xE7://Порт В
DDRB=0x18;
P0RTD=0x7F:// Порт D■
DDRD=0x00.
TCCR1A=0x00;// Таймер/Счетчик 1
TCCR1B=0x03.
ГСМ 1=0
OCRlA=kzad;■
ACSR=0x80:// Аналоговый компаратор
melod=0;// Сбрасываем счетчик мелодий
82 ’
83
84
85
86
87
88
89
90
91
92
while (1)
ml.while (incod() '= klfree)"// Ожидание отпускания кнопок
while (incod() == klfree)И Ожидание нажатия кнопок
if (PINB 6==0) muz().ПК музыкальному звонку
TCCR1B=0x03.ЦНастройка таймера
п=0//Сброс счетчика байтов .
m21#asm("cli")// Запрещаем прерывания
wait(1).НЗадержка 1-го типа
codS=incod(),// Ввод кеда и запись, как старого
bufr[ii++]=c,odS./7 Запись очередного кода в буфер
93
if (ii^=bsize) goto
m4,H Проверка конца буфера
94
wait(2).
И Задержка 2-го типа
95
iti3
if (incodO 1 = codS)
goto m2.// Проверка, не изменилось ли состояние
96
if (flz"0) goto m3.
// Проверка флага окончания задержки
97
Ы.
if (PINB.7==1) goto comp.// Проверка переключателя режимов
//
—
- Запись кода в EEPROM
98
klen=ii;
Ц Запись длины кода
99
for (i-O: l<u: i++)
bufe[i]=bufr[i];// Запись всех байтов кода
100
goto zamok;
// К процедуре открывания замка
//
- Проверка кода
101
comp:
if (klen'^ti) goto ml.// Проверка длины кода
102
for (1=0: i<ii: i++)
if (bute[i ]' -buf r[i]) goto ml; //Проверка кода
//
- Открывание замка
103
zamok:
PORTB 4=1:
Ц Открываем замок
104
wait(3),
Ц Задержка 3-го типа
105
}
}
PORTB.4=0:
// Закрываем замокv
ПРИЛОЖЕНИЕ
Сводная таблица команд Ассемблерамикроконтроллеров AVR ’
группа команд логических операций
группа команд арифметических операций
группа команд операций с разрядами
группа команд сравнения
группа команд операций сдвига
группа команд пересылки данных
группа команд управления системой
группа команд передачи управления (безусловная передача управления)
группа команд передачи управления (пропуск команды по условию)
группа команд передачи управления (передача управления по условию)
Группа команд логических операций
Мнемоника
Описание
Операция
Циклы
Флаги
AND Rd, Rr
«Логическое И» двух РОН
Rd <- Rd ■ Rr
1
Z, N. V
ANDI Rd, К
«Логическое И» РОН и константы
Rd <- Rd - К
1
Z, N, V
EOR Rd. Rr
«Исключающее ИЛИ» двух РОН
Rd <- Rd © Rr
1
Z, N, V
OR Rd, Rr
«Логическое ИЛИ» двух РОН
Rd <- Rd v Rr
1
Z, N, V
ORI Rd, К
«Логическое ИЛИ» РОН и константы
Rd <- Rd v К
1
Z, N, V
COM R(<
Перевод в обратный код
Rd <- OFFH - Rd
1
Z, C, N, V
NEG Rd
Перевод в дополнительный код
Rd e OOH - Rd
1
Z, C, N, V, H
CUR Rd
Сброс всех разрядов РОН
Rd <- Rd © Rd
1
Z, N, V
SER Rd
Установка всех разрядов РОН
Rd <- OFFH
1
—
TST Rd
Проверка РОН на отрицательное(нулевое) значение
Rd <- Rd - Rd
1
z, N, V
Группа команд арифметических операций
Мнемоника
Описание
Операция
Циклы
Флаги
ADD Rd, Rr
Сложение двух РОН
Rd е Rd + Rr
1
z, C, N, V, H
ADC Rd, Rr
Сложение двух РОН с переносом
Rd <- Rd + Rr + С
1
z, C, N, V, H
ADIW Rd, К
Сложение регистровой пары с константой
Rdh'.Rdl <-Rdh: Rd! + К
2
z, C, N, V. S
SUB Rd, Rr
Вычитание двух РОН
Rd <- Rd - Rr
1
z, C, N, v, H
SUB! Rd, К
Вычитание константы из РОН
Rd e Rd — К
1
z, C, N, v, H
SBC Rd, Rr
Вычитание двух РОН с заемом
Rd e Rd - Rr — С
1
z, C, N, V, H
SBC! Rd, К
Вычитание константы из РОН с заемом
Rd <- Rd — К — С
1
z, c, N, V, H
SBIW Rd, К
Вычитание константы из регистровой пары
RdhrRdl ^ Rdh: Rd! - К
2
Z, С, N, V, S
DEC Rd
Декремент РОН
Rd <- Rd — 1
1
Z, N, V
INC Rd
Инкремент РОН
Rd e Rd + 1
1
Z, N, V
Группа команд операций с разрядами
Мнемоника
Описание
Операция
Циклы
Флаги
CBR Rd, К
Сброс разряда(ов) РОН
Rd е Rd * (OFFH — К)
1
Z, N, V
SBR Rd, К
Установка разряда(ов) РОН
Rd е Rd К
1
Z, N, V
*CBI А, b
Сброс разряда РВВ
A.b е 0
2
—
SB1 А, b
Установка разряда РВВ
A.b е 1
2
—
BCLR s
Сброс флага
SREG.s e O
1
SREG.s
BSET s
Установка флага
SREG.s e 1
1
SREG.s
BLD Rd, Ь
Загрузка разряда РОН из флага Т (SREG)
Rd.b eT
1
—
BST Rr, b
Запись разряда РОН в флаг Т(SREG)
Те Rd.b
1
T
CLC
Сброс флага переноса
Ct-0-
1
c
SEC
Установка флага переноса
C e 1'
1
c
CLN
Сброс флага отрицательного числа
N eO
1
N
SEN
Установка флага отрицательного числа
N e 1
1
• N
CLZ
. Сброс флага нуля
ZeO
1
Z
SEZ
Установка флага нуля
Z e 1
1
Z
■CLI
Общий запрет прерываний
I eO
1
1
SEI
Общее разрешение прерываний
1 e 1
1
1
CIS
Сброс флага знака
S eO
1
s
SES
Установка флага знака
S e 1
1
s
CLV
Сброс флага переполнения дополнительного кода
VeO
1
V
,SEV
Установка флага переполнения дополнительного кода
Ve 1
1
V
CLT
Сброс пользовательского флага Т
TeO
1
T
SET
Установка пользовательского флага Т
Те 1
1
T
CLH
Сброс флага половинного . переноса
H e 0
1
H
SEH
Установка флага половинного переноса
H e 1
1
H
Группа команд сравнения
Мнемоника
Описание
Операция
Циклы
Флаги
СР Rd, Rr
Сравнение двух РОН
? (Rd — Rr)
1 '
Z, N, V, С, Н
CPC Rd, Rr
Сравнение РОН с учетом переноса
? (Rd — Rr - С)
1
Z, N, V, С, Н
CPI Rd, К
Сравнение РОН с константой
? (Rd - К)
1
Z, N, V, С, н
Группа команд операций сдвига
Мнемоника
Описание
Операция
Циклы
Флаги
ASR Rd
Арифметический сдвиг вправо
Rd? з Rd6 -> Rd5 ^ Rd4 -> Rd3 -> Rd2 ^ Rd1 ^ RdO
1
z, C, N, V
LSL Rd
Логический сдвиг влево
C ^ Rd? ^ Rd6 e Rd5 <- Rd4 ^ Rd3 <- Rd2^Rd1 «-RdOeO
1
Z, C, N, V
LSR Rd
Логический сдвиг вправо
0 -> Rd? -> Rd6 -> Rd5 -> Rd4 -> Rd3 -> Rd2 з Rd1 RdO -> C
1 '
Z, C, N, V
ROL Rd
Сдвиг влево через перенос
C <- Rd? ^ Rd6 e Rd5 ^ Rd4 <- Rd3 ^ Rd2 <- Rd1 <- RdO eC
1
z, c. N, V
ROR Rd
Сдвиг вправо через перенос
C -> Rd? ^ Rd6 -> Rd5 -> Rd4 -> Rd3 ^ Rd2^Rd1 ^RdO^C
1
Z, C, N, V
SWAP Rd
Обмен местами тетрад
Rd(3-0) w Hd(7-4)
1
—
Группа команд пересылки данных
Мнемоника
Описание
Операция
Циклы
Флаги
MOV Rd, Rr
Пересылка между РОН
Rd е Rr
1
—
MOVW Rd, Rr
Пересылка между парами регистров
Rd + 1:Rd e Rr+1:Rr
1
—
LDI Rd, К
Загрузка константы в РОН
Rd e К
1
—
LD Rd, X
Косвенное чтение
Rd e [X]
2
—
LD Rd,X+
, Косвенное чтение с постикрементом
Rd e [X], XeX+1
2
—
LD Rd,-X
Косвенное чтение с преддекрементом
X + X-1, Rd e [X]
2
—
LD Rd, Y
Косвенное чтение
Rd e [Y]
2
—
LD Rd,Y+
Косвенное чтение с постикрементом
Rd ^ [Y], Ye Y+1
2
—
LD Rd, -Y
Косвенное чтение с преддекрементом
Y e Y-1, Rd e [Y]
2
—
LD Rd, Y+q
Косвенное относительное чтение
Rd e [Y+q]
2
—
LD Rd, Z
Косвенное чтение
Rd e [Z]
2
—
LD Rd, Z+
Косвенное чтение с постикрементом
Rde[Z],ZeZ+1
2
—
LD Rd, -Z
Косвенное чтение с преддекрементом
Z + Z-1, Rd e [Z]
2
—
LD Rd, Z+q
Косвенное относительное чтение
Rd e [Z+q]
2
—
LDS Rd, k
Непосредственное чтение из ОЗУ
Rd e [k]
2
—
ST X, Rr
Косвенная запись
[X] e Rr
2
—
ST X+, Rr
Косвенная запись с постикрементом
[X] e Rr, X eX+1
2
—
ST -X, Rr
Косвенная запись с преддекрементом
X + X-1, [X] e Rr
2
—
ST Y, Rr
Косвенная запись
[Y] e Rr
2
—
. ST Y+, Rr
Косвенная запись с постикрементом
[Y]eRr, YeY+1
2
—
ST -Y, Rr
Косвенная запись с преддекрементом
Y e Y-1, [Y] ^ Rr
2
—
ST Y+q, Rr
Косвенная относительная запись
[Y+q]+ Rr
2
—
ST Z, Rr
Косвенная запись
[Z] e Rr
2
—
ST Z+, Rr
Косвенная запись с постикрементом
[Z] e Rr, Z + Z+1
2
—
Мнемоника
Описание
Операция
Циклы
Флаги
ST -Z, Rr
Косвенная запись с преддекрементом
ZeZ-1, [Z] е Rr
2
—
ST Z+q, Rr
Косвенная относительная запись
{Z+q]е Rr
2
—
STS k, Rr
Непосредственная запись в ОЗУ
(kJ e Rr .
2
—
LPM
Загрузка данных из памяти программ
RO e {Z}
3
—
LPM Rd, Z
Загрузка данных из памяти программ
Rd + {Z}
3
—
LPM Rd, Z+
Загрузка данных из памяти программ и постдекремент Z
Rd + {Z), ZeZ+1
3
—
SPM
Запись в программную память
{Z}eR1:R0
-
—
IN Rd, P
Пересылка из РВВ в РОН
Rd e P
1
—
OUT P, Rr'
Пересылка из РОН в РВВ
P e Rr
1
—
PUSH Rr
Сохранение байта в стеке
STACK <- Rr
2
—
POP Rd
Извлечение байта из стека
Rd eSTACK
2
—
Группа команд управления системой
Мнемоника
.. Описание.
■ Операция
Циклы
Флаги
NOP
Нет операции
-
1
—
SLEEP
Переход в «спящий» режим
3
—
WDR
Сброс сторожевого таймера
-
1
—
BREAK
Приостановка программы
Используется только при отладке
—
Группа команд передачи управления (безусловная передача управления)
Мнемоника
Описание
Операция
Циклы
Флаги
RJMP
Относительный безусловный переход
PC «- PC + к + 1
2
—
1JMP
Косвенный безусловный переход
PC*Z
2
—
RCALL
Относительный вызов подпрограммы
PC <- PC + к + 1
3
—
ICALL
Косвенный вызов подпрограммы
PC Z
3
—
RET
Возврат из подпрограммы
PC ^ STACK
4
—
RETI
Возврат из подпрограммы обработки прерываний
PC <r STACK
4
I
Группа команд передачи управления (пропуск команды по условию)
Мнемоника
,Описание
Условие
Циклы
Флаги
Все команды этой группы пропускают следующую за ней команду ( PC е PC + 1 ) при разных условиях:
CPSE Rd, Rr
Сравнение и пропуск следующей команды при равенстве
Если Rd = Rr
1/2/3
—
SBRC Rr, b
Пропуск следующей команды если разряд РОН сброшен
Если Rr,b = 0
1/2/3
—
SBRS Rr, b
Пропуск следующей команды если разряд РОН установлен
Если Rr.b = 1
1/2/3
—
SBIC A, b
Пропуск следующей команды если разряд РВВ сброшен
Если A.b = 0
1/2/3
—
SBIS A, b
Пропуск следующей команды если разряд РВВ установлен
Если A.b = 1
1/2/3
—
Группа команд передачи управления (передача управления по условию)
Мнемоника
Описание
Условие
Циклы
Флаги
Все команды этой группы выполняют переход ( PC е PC + к + 1 ) при разных условиях:
BRBC s, к
Переход, если флаг s регистра SREG сброшен
Если SREG.s = 0
1/2
— '
BRBS s, к
Переход, если флаг s регистра SREG установлен
Если SREG.s = 1
1/2
—
BRCS к
Переход по переносу
Если С = 1
1/2
—
BRCC к
Переход, если нет переноса
Если С = 0
1/2
—
BREQ к
Переход по условию«равно»
ЕслиZ= 1
1/2
—
BRNE к
Переход по условию«неравно»
Если Z = 0
1/2
—
BRSH к
Переход по условию «больше или равно»
Если 0 = 0
1/2
—
BRLO к
Переход по условию «меньше»
Если С = 1
1/2
—
BRMI к
Переход по условию «отрицательное значение»
Если N = 1
1/2
—
BRPL к
Переход по условию «положительное значение»
Если N = 0
1/2
—
BRGE к
Переход по условию «больше или равно» (со знаком)
Если (N V) = 0
1/2
—
BRLT к
Переход по условию «меньше» (со знаком)
Если (N V) = 1
1/2
-
BRHS к
Переход по половинному переносу
Если Н = 1
1/2
—
BRHC к
Переход, если нет половинного переноса
ЕслиН = 0
1/2
—
BRTS к
Переход, если флаг Т установлен
ЕслиТ = 1
1/2
—
BRTC к
Переход, если флаг Т сброшен
Если Т„= 0
1/2
—
BRVS к
Переход по переполнению дополнительного кода
Если V = 1
1/2
—
BRVC к
Переход, если нет переполнения дополнительного кода
Если V = 0
1/2
—
BRID к
Переход, если прерывания запрещены
Если I = 0
1/2
—
BRIE к
Переход, если прерывания разрешены
Если I = 1
1/2
-
Список литературы
Евстифеев А. В. Микроконтроллеры AVR семейства Tiny и Mega фирмы «Atmel». — М.: Издательский дом «Додэка». — 2004
Белов А. В. Конструирование устройств на микроконтроллерах. — Санкт-Петербург: Наука и Техника. — 2005
Бепов А.В. Самоучитель по микропроцессорной технике. Изд. 2-е, перераб. и доп. — Санкт-Петербург: Наука и Техника. — . 2007
Белов А.В. Создаем устройства на микроконтроллерах. — Санкт- Петербург: Наука и Техника. — 2007
Список полезных ссылок на ресурсы Интернет http://book.microprocessor.by.ru — официальный сайт книги http://avbelov.by.ru — сайт автора
http://www.atmeLcom — сайт фирмы Atmel, производителя микроконтроллеров AVR
http://www.atmel.ru — русскоязычная версия сайта Atmel http://www.atmel.ru/Software/Software.htm — адрес для скачивания программы AVR Studio
http://www.hpinfotech.ro — сайт разработчика программы Code Vision AVR
http://www.Iancos.com — сайт программы Pony Prog.
http://www.nit.com.ru — официальный сайт издательства Наука и Техника и интернет-магазин с возможностью отправки книг ■ издательства в любую страну мира
А.В. Белов
GND
*» —*Внимание Нижнюю адкуприжап к к опусу
б
МИКРОКОНТРОЛЛЕРЫ
Впервые: подробное описание микроконтроллера ATiny2313 популярной серии AVR фирмы Atmel
Схемные решения с описанием наиболее интересных конструкции.
Бонус: таблица команд Ассемблера микроконтроллеров AVR
Л у ч ш и е книг и п о м и к р о к о н т роллер и л.
самоучитель по
МИКРОПРОЦЕССОРНОЙ
технике
www.nit.com.ru
Самоучитель по микропроцессорной технике
Это переработанное издание популярного учебника по микроэлектронике: от принципов работы простейшей электронной логики до структуры микропроцессорного устройства и принципов его работы.
Самоучитель написан доступно, снабжен схемами, иллюстрациями и примерами.
Создаем устройства на микроконтроллерах
Отличное практическое пособие по разработке схем с применением новейших микроконтроллеров.
Основа книги - практические примеры, которые от простого к сложному раскрывают хитрости написания программ, рассматривают их трансляцию и отладку, использование программатора.
Микроконтроллеры
AVR в радиолюбительской практике .
Данная книга представляет собой справочник, где детально рассмотрен микроконтроллер ATiny2313 семейства AVR.
Имеется практический раздел для радиолюбителей: схемы устройств, выполненных на его базе с описанием и примером управляющей программы на Ассемблере и СИ
Россия: С -П^и'рчУР* МР Ооух.' они хюроны дляпиг- ’• Ю20?9 Санкт П“’‘Д> ург а 1
(812) р6/ 7056/ /0 ’6. ■ (bail iv* ^‘т.ъ wp
Украина: 02 166. Kikui 166 ул Е,рча|/ц.а 9
<0441■' т би E mail: nit: ■ ib •