Author: Гребнев В.В.
Tags: электротехника микрорадиоэлектронная аппаратура микроэлектроника микроконтроллеры
ISBN: 5-93037-091-5
Year: 2002
Text
УДК IVI i 1.1 .К J.’ H-M. I Г 79 Гребнев В. В. Г79 Микроконтроллеры семейства AVR фирмы Atmel. — М.: ИП РадиоСофт, 2002— 176 с.: ил. ISBN 5-93037-091-5 Книга предназначена для разработчиков аппаратуры различного назначения, содержащей встроенные однокристальные микро-ЭВМ-микроконтроллеры. Микроконтроллеры семейства AVR отличаются высоким быстродействием и низким энергопотреблением. В книге рассматриваются структура, система команд, периферийные устройства и работа микроконтроллеров, выпускаемых фирмой Atmel и поступающих в продажу по состоянию на конец 2001 г. Изложенный материал позволяет выбрать микроконтроллер определенного типа, разработать функциональную схему устройства, содержащего микроконтроллер, и разработать программу работы микроконтроллера на языке AVR Ассемблера фирмы Atmel. УДК 621.3 ББК 32.844.1 ISBN 5-93037-091-5 © Гребнев В. В., 2002 © Оформление. ИП РадиоСофт, 2002 Содержание Предисловие..................................................5 Введение.....................................................7 I lana 1. Структура микроконтроллера........................9 1.1. Обобщенная структурная схема.........................9 1.2. Генератор тактового сигнала.........................12 1.3. Процессор...........................................14 I А. Запоминающее устройство FlashROM....................15 1.5. Запоминающее устройство SRAM........................16 1.6. Запоминающее устройство EEPROM......................18 1.7. Внешнее запоминающее устройство ERAM................18 1.8. Периферийные устройства.............................19 I лава 2. Система команд...................................24 2.1. Общие сведения о системе команд.....................24 2.2. Команды регистровых операций........................29 2.3. Команды с обращением по адресу SRAM.................31 2.4. Команды с обращением к регистрам ввода-вывода.......32 2.5. Команда с обращением к FlashROM.....................33 2.6. Команды операций с битами...........................33 2.7. Команды управления ходом программы..................34 2.8. Дополнительные команды в системе команд микроконтроллеров тина ml63 и ml03.......................36 Глава 3. Работа периферийных устройств.......................40 3.1. Параллельные порты ввода-вывода.......................40 3.2. Последовательный порт ввода-вывода SPI..............43 3.3. Последовательный порт ввода-вывода UART.............47 3.4. Последовательный порт ввода-вывода TWSI (I2C).......51 3.5. Таймеры-счетчики общего назначения..................57 3.5.1. Таймер-счетчик типа А...........................58 3.5.2. Таймер-счетчик типа В...........................59 3.5.3. Таймер-счетчик типа С...........................63 3.5.4. Таймер-счетчик типа D...........................65 3.5.5. Таймер-счетчик типа Е...........................69 3.6. Сторожевой таймер...................................70 3.7. Аналого-цифровой преобразователь....................72 3.8. Аналоговый компаратор...............................75 3.9. Программируемый аппаратный модулятор................77 3.10. Блок прерываний....................................80 Глава 4. Работа микроконтроллера...........................85 4.1. Программирование микроконтроллера...................85 4.2. Пуск и перезапуск микроконтроллера..................90 4.3. Энергосберегающие режимы работы.....................94 4 Содержание Прил ожения................................................96 Ш. Маркировка микроконтроллеров..........................96 П2. Выводы микроконтроллеров.............................98 ПЗ. Альтернативные функции выводов портов................98 П4. Регистры ввода-вывода...............................100 П5. Разряды регистров ввода-вывода......................102 П6. Установочные биты (Fuse Bits).......................106 П7. Двоичный вычитатель............................... 106 П8. Разработка программы на языке AVR Ассемблера фирмы Atmel.............................................108 П9. Аппаратно-программные средства поддержки разработок на основе микроконтроллеров AVR фирмы Atmel..........115 Программные средства поддержки разработок............116 Создание и трансляция проекта........................117 Режимы работы отладчика..............................120 Отладка проекта при помощи программного симулятора...120 Аппаратные средства поддержки разработок.............127 Стартовые наборы разработчика........................128 Внутрисхемные эмуляторы..............................134 Внутрисхемные программаторы..........................139 Специализированные наборы разработчика...............143 П10. Примеры программ для микроконтроллеров семейства AVR...........................................144 Программа LED.ASM....................................145 Программа KBD.ASM....................................146 Программа UART.ASM...................................148 Программа FIFO.ASM...................................152 Программа LCD.ASM....................................158 Программа BCD.ASM....................................163 Программа ADC.ASM....................................166 Литература.................................................172 Предисловие Корпорация Atmel (США) хорошо известна как на мировом, так и на российском рынках электронных компонентов и является одним из признанных мировых лидеров в разработке и производстве сложных изделий современной микроэлектроники — устройств энергонезависимой памяти высокого быстродействия и минимального удельного энергопотребления, микроконтроллеров общего назначения и микросхем программируемой логики. Настоящая книга, которую Вы держите в руках, познакомит Вас с одним из интересных и активно развиваемых Atmel Corp, направлений современной микроэлектроники — линией 8-разрядных высокопроизводительных RISC {Reduced Instruction Set Computers} микроконтроллеров общего назначения, объединенных общей маркой AVR. Серийное производство AVR началось в 1996 году. AVR — микроконтроллеры, пожалуй, одно из самых интересных направлений, развиваемых корпорацией Atmel. Они представляют собой мощный инструмент для создания современных высокопроизводительных и экономичных контроллеров многоцелевого назначения, в том числе и встраиваемых. На настоящий момент соотношение "цена — производительность — энергопотребление" для AVR является одним из лучших на мировом рынке 8-ми разрядных микроконтроллеров. Объемы продаж AVR в мире удваиваются ежегодно. В геометрической прогрессии растет число сторонних фирм, разрабатывающих и выпускающих разнообразные программные и аппаратные средства поддержки разработок для этих микроконтроллеров. Можно считать, что AVR постепенно становится еще одним индустриальным стандартом среди 8-разрядных микроконтроллеров общего назначения. В настоящее время в производстве у Atmel Corp, находятся три семейства AVR — "tiny", "classic" и "mega". 6 Предисловие Области применения AVR многогранны. Для "tiny" AVR это интеллектуальные автомобильные датчики различного назначения, игрушки, игровые приставки, материнские платы персональных компьютеров, контроллеры защиты доступа в мобильных телефонах, зарядные устройства, детекторы дыма и пламени, бытовая техника, разнообразные инфракрасные пульты дистанционного управления. Для "classic" AVR это модемы различных типов, современные зарядные устройства, изделия класса Smart Cards и устройства чтения для них, спутниковые навигационные системы для определения местоположения автомобилей па трассе, сложная бытовая техника, пульты дистанционного управления, сетевые карты, материнские платы компьютеров, сотовые телефоны нового поколения, а также разнообразные промышленные системы контроля и управления. Для "mega" AVR это аналоговые (NMT, ETACS, AMPS) и цифровые (GSM, CDMA) мобильные телефоны, принтеры и ключевые контроллеры для них, контроллеры аппаратов факсимильной связи и ксероксов, контроллеры современных дисковых накопителей и CD-ROM и т. д. Российские специалисты уже ио достоинству оценили высокую скорость работы и мощную систему команд AVR, наличие двух типов энергонезависимой памяти на одном кристалле и активно развивающуюся периферию. Немаловажную роль в этом играет политика Atmel Corp, в вопросе развития и распространения разнообразных, доступных средств поддержки разработок. Это позволяет разработчикам и производителям электронной техники надеяться на сохранение полноценной поддержки для перспективного семейства микроконтроллеров, закладывая AVR в свои новые изделия. AVR — это относительно молодой продукт корпорации Atmel, активно развиваемая линия встраиваемых многоцелевых микроконтроллеров общего назначения. В этой линии постоянно появляются новые семейства и кристаллы, обновляются версии уже существующих микросхем, совершенствуется и расширяется программное обеспечение поддержки. Поэтому будьте внимательны, разрабатывая Ваши конечные системы и программное обеспечение с использованием этой книги, потому что многое может изменяться. Так, первое официальное издание — каталог Atmel, посвященный AVR, датирован маем 1997 года. В него были включены всего четыре первых AVR — микроконтроллера семейства АТ90 "classic". Второе, существенно расширенное издание каталога вышло в августе 1999 года, и в него уже были включены три семейства AVR — "tiny", "classic" и "mega". И до сих пор более "свежей" версии каталога в печатном виде нс существует, постоянно обновляются лишь технические данные в электронном виде (Data Sheet), которые Atmel Corp, размещает на информационной странице в Интернет http://www.atmel.com. Скорее всего, к моменту выхода книги в свет представленная информация будет нуждаться в дополнениях и коррективах. Пожалуйста, регулярно следите за обновлениями технической документации, выпускаемой Atmel Corp. И. В. Кривченко Введение Микроконтроллер семейства AVR фирмы Atmel представляет собой восьмиразрядную однокристальную микро-ЭВМ с упрощенной (сокращенной) системой команд — RISC (Restricted (Reduced) Instruction Set Computer}. Большинство команд, входящих в систему команд, выбираются из памяти за один такт и выполняются за одни такт работы микроконтроллера. При выполнении последовательности таких команд выборка из памяти очередной команды совмещается во времени с исполнением ранее выбранной команды. При этом число команд, выполняемых за 1 с, совпадает с тактовой частотой работы микроконтроллера. Микроконтроллеры изготавливаются по высококачественной КМОП (CMOS) технологии, содержат энергонезависимые запоминающие устройства для хранения программы и данных, выполненные по Flash и EEPROM технологиям, и отличаются низким энергопотреблением при высокой тактовой частоте. Запись программы п исходных данных в память может выполняться после установки микроконтроллера в аппаратуре, где ему предстоит работать. В состав семейства AVR входят микроконтроллеры трех серий — АТ90, ATtiny и ATmega. В каждую серию входят микроконтроллеры нескольких типов. Микроконтроллеры серии АТ90 по своим структурным характеристикам (объем памяти, состав периферийных устройств) близки к микроконтроллерам семейств АТ89 фирмы Atmel и MCS-51 фирмы Intel. По своим вычислительным возможностям они занимают среднее положение между микроконтроллерами серий ATtiny и ATmega. Микроконтроллеры серии ATtiny имеют наименьшие, а микроконтроллеры серии ATmega — наибольшие вычислительные возможности в семействе AVR. 8 Введение В табл. В1 указаны полные и сокращенные обозначения типа микроконтроллера (МК), число выводов корпуса микроконтроллера NB, число команд в системе команд NK, максимальное значение тактовой частоты Finax и ток потребления I у микроконтроллеров разных типов семейства AVR. Сокращенное обозначение типа микроконтроллера используется далее в тексте книги. Ток потребления зависит от напряжения питания, тактовой частоты и температуры окружающей среды. В таблице указано значение тока потребления при напряжении питания 3 В, тактовой частоте 4 МГц и температуре окружающей среды +25 °C. Таблица В 1 Тип МК NB NK ^(МГц) /(мА) полное сокращенное ATtiny 11 t11 8 90 6 2,2 ATtiny 12 t12 8 90 8 2,2 ATtinyl 5 t15 8 90 1,6 3,0* AT90S2323 2323 8 118 10 2,4 AT90S2343 2343 8 118 10 2,4 AT90S1200 1200 20 89 12 2,0 AT90S2313 2313 20 118 10 2,8 ATtiny28 t28 28 90 4 3,0 AT90S4433 4433 28 118 8 3,4 AT90S8515 8515 40 118 8 3,0 AT90S8535 8535 40 118 8 6,4 ATmega 163 m163 40 130 8 5,0 ATmega 103 m103 64 121 6 5,5 ‘ — при F™ Микроконтроллеры одного типа выпускаются в нескольких вариантах, различающихся диапазоном допустимых значений напряжения питания, максимальным допустимым значением тактовой частоты, типом корпуса и диапазоном допустимых значений температуры окружающей среды. Варианты типов микроконтроллеров и их маркировка описаны в приложении П1. Фирма Atmel выпускает программные и аппаратные средства поддержки разработок на базе микроконтроллеров семейства AVR. Средства поддержки разработок рассмотрены в приложении П9, которое написано Р. Н. Золотухо. В приложении П10, написанном Т. И. Кривченко, приведены примеры разработки программ для микроконтроллеров семейства AVR. Структура микроконтроллера 1.1. Обобщенная структурная схема Микроконтроллеры семейства AVR имеют единую базовую структуру. Обобщенная структурная схема микроконтроллера (МК) изображена на рис. 1.1. Рис. 1.1 10 Глава 1 В состав микроконтроллера входят: генератор тактового сигнала (GCK); процессор (CPU); постоянное запоминающее устройство для хранения программы, выполненное по технологии Flash, (FlashROM): оперативное запоминающее устройство статического типа для хранения данных (SRAM); постоянное запоминающее устройство для хранения данных, выполненное по технологии EEPROM, (EEPROM): набор периферийных устройств для ввода и вывода данных и управляющих сигналов и выполнения других функций. В микроконтроллерах типа til, tl2. 115, 1200 и t28 запоминающее устройство SRAM отсутствует. В микроконтроллерах типа til и t28 отсутствует также запоминающее устройство EEPROM. К микроконтроллерам типа 8515 и ш103 может быть подключено внешнее запоминающее устройство для хранения данных (ERAM). Команды программы хранятся только во внутреннем запоминающем устройстве FlashROM. Выводы VCC и GND предназначены для подключения источника напряжения питания микроконтроллера. Уровень напряжения всех сигналов в микроконтроллере отсчитывается относительно уровня на шине GND, принимаемого за 0В. Допустимые значения напряжения питания у микроконтроллеров разных типов и вариантов указаны в приложении П1 в табл. П1.3. Другие выводы микроконтроллеров разных типов указаны в приложении П2. Функции этих выводов описываются при рассмотрении устройств, в работе которых они используются. В состав процессора (CPU) входят: счетчик команд (PC); арифметико-логическое устройство (ALU); блок регистров общего назначения (GPR, General Purpose Registers') и другие элементы, не показанные на схеме рис. 1.1. Кроме регистров общего назначения в микроконтроллере имеются регистры специальных функций, которые в семействе AVR называются регистрами ввода-вывода (I/O Registers, IOR). С участием этих регистров осуществляются: управление работой микроконтроллера и отдельных его устройств; определение состояния микроконтроллера и отдельных его устройств; ввод данных в микроконтроллер и отдельные его устройства и вывод данных и выполняются другие функции. Таб ли ца 1.1 Тип МК Flash (байт) ISP SRAM (байт) EEPROM (байт) ERAM IOR P I/O ALT t11 1K 14 1 6 6 112 1K + 64 18 1 6 6 115 1K + 64 27 1 6 6 2323 2K + 128 128 17 1 3 2 2343 2K + 128 128 17 1 5 3 1200 1K + 64 18 2 15 4 2313 2K + 128 128 32 2 15 10 t28 2K 17 3 20 6 4433 4K + 128 256 44 3 20 20 8515 8K + 512 512 + 45 4 32 31 8535 8K + 512 512 54 4 32 26 m163 16K + 1024 512 63 4 32 28 m103 128K + 4000 4K + 60 6 48 47 SPI UART TWSI т/со Т/С1 Т/С2 ADC АС РИМ IU Тип МК А + 5 111 А + 6 И 2 А в 4 + 9 115 А 3 2323 А 3 2343 А + 4 1200 + А D + 11 2313 А + + 6 128 + + А D 6 + 14 4433 + + А Е + 13 8515 + + А Е С 8 + 17 8535 + + + А Е с 8 + 18 m163 + + С Е в 8 + 24 m103 Структура микроконтроллера 12 Глава 1 Для нумерации регистров ввода-вывода используются номера от О до 63 (от $00 до $3F, где $ — указатель шестнадцатеричного кода). Каждому регистру присвоено имя, связанное с выполняемой этим регистром функцией. Микроконтроллеры разных типов имеют разный состав регистров ввода-вывода, при этом регистры с одинаковыми номерами могут иметь разные имена. Число регистров ввода-вывода у микроконтроллеров разных типов указано в табл. 1.1, в колонке IOR. Имена и номера регистров ввода-вывода у микроконтроллеров разных типов приведены в приложении П4. Функции, выцолняемые регистрами ввода-вывода, описываются при рассмотрении устройств, в работе которых они участвуют. Работа некоторых устройств микроконтроллера зависит от состояния дополнительных однобитовых запоминающих элементов — установочных битов {Fuse Bits}. Исходные значения установочных битов записываются на заводе-изготовителе. Значение установочного бита может быть изменено только при программировании микроконтроллера. В приложении П6 перечислены установочные биты в микроконтроллерах разных типов и указаны их исходные значения. Функции установочных битов рассматриваются при описании устройств, работа которых зависит от их значения. 1.2. Генератор тактового сигнала Микроконтроллеры семейства AVR являются устройствами синхронного типа. Действия, выполняемые в микроконтроллере, привязаны к импульсам тактового сигнала. Микроконтроллеры имеют полностью статическую структуру и могут работать при тактовой частоте от 0 Гц. Максимальные значения тактовой частоты у микроконтроллеров разных типов и вариантов указана в приложении П1, в таблице П1.3. В качестве генератора тактового сигнала (GCK) используются: внутренний генератор с внешним кварцевым или керамическим резонатором (XTAL); внутренний RC-генератор (IRC); внутренний генератор с внешней RC-цепочкой (ERC); внешний генератор (EXT). Генераторы тактового сигнала, используемые в микроконтроллерах разных типов, указаны в табл. 1.2. У микроконтроллеров, имеющих внутренний генератор с внешним резонатором (XTAL), резонатор подключается к выводам XTAL1 и XTAL2, которые через конденсаторы малой емкости (20—30 пФ) соединяются с шиной GND. Тактовая частота определяется рабочей частотой резонатора. У микроконтроллера типа t28 при нулевом значении установочного бита INTCAP подключение выводов XTAL1 и XTAL2 к шине GND выполняется через внутренние конденсаторы емкостью 50 пФ. Структура микроконтроллера 13 Таб ли ца 1.2 Тип GCK Тип МК t11 t12 t15 2323 2343 1200 2313 t28 4333 8515 8535 m163 m103 XTAL + + + + + + + + + + +* IRC + +* +* + + +* +* ERC + + + + EXT + + + + + + + + + + + + ’ — возможно изменение частоты программными средствами У микроконтроллеров типа til и t!2 в качестве выводов XTAL1 и XTAL2 используются выводы РВЗ и РВ4. Внешний генератор (EXT) подключается к выводу XTAL1, при этом вывод XTAL2 остается неподключенным. У микроконтроллера типа 2343, не имеющего выводов XTAL, внешний генератор подключается к выводу РВЗ. В генераторах с RC-цепочкой тактовая частота определяется параметрами цепочки, но изменяется в значительных пределах при изменении напряжения питания микроконтроллера. В микроконтроллерах типа 2343 и 1200 внутренний RC-генератор (IRC) используется при нулевом значении установочного бита RCEN. В микроконтроллерах типа til, tl2, t28 и ш163 выбор генератора для работы определяется комбинацией значений установочных битов CKSEL. У микроконтроллеров типа til таких битов три (CKSEL2 — 0), у микроконтроллеров остальных типов — четыре (CKSEL3 — 0). В табл. 1.3 приведены числа, двоичные коды которых являются комбинацией значений установочных битов CKSEL при выборе типа генератора. Биту CKSEL0 соответствует младший разряд двоичного кода. Таб лица 1.3 Тип GCK CKSEL2 — 0 CKSEL3 — 0 XTAL 6,7 8—15 IRC 4 2—4 ERC 5 5—7 EXT 0 0,1 В микроконтроллерах, имеющих внутренний генератор с внешней RC-цепочкой (ERC), резистор (3—100 кОм) подключается между выводом XTAL1 и шиной VCC, а конденсатор (не менее 20 пФ) — между выводом XTAL1 и шиной GND. 14 Глава I В микроконтроллерах типа tl2, tl5, t28 и ml63 при использовании внутреннего RC-генератора тактовая частота может изменяться программными средствами путем изменения кода, записываемого в регистр OSCCAL. При записи кода $00 тактовая частота имеет наименьшее значение, при записи кода $FF — наибольшее значение. В микроконтроллере типа ml03 программными средствами может изменяться тактовая частота генератора с кварцевым резонатором. Значение тактовой частоты FCK определяется по формуле р . =________5г______ 129-(XDIV.6-0)' где Fq — рабочая частота кварцевого резонатора; (XD1V.6 — 0) — число, двоичный код которого записан в младших семи разрядах регистра XDIV (№ $ЗС). Изменение тактовой частоты возможно при XDIV.7 = 1. 1.3. Процессор Процессор (CPU) формирует адрес очередной команды, выбирает команду из памяти и организует ее выполнение. Код команды имеет формат "слово" (16 бит) или "два слова". Система команд микроконтроллеров семейства AVR рассматривается в главе 2. В состав процессора кроме счетчика команд (PC), арифметико-логического устройства (ALU) и блока регистров общего назначения (GPR),изображенных на структурной схеме рис. 1.1, входят: регистр состояния микроконтроллера SREG; регистр-указатель стека SP или SPL и SPH и другие элементы, далее не рассматриваемые. В счетчике команд адрес очередной команды формируется путем добавления 1 к числу, код которого хранится в счетчике команд. При пуске и перезапуске микроконтроллера в счетчик команд заносится код числа 0 и первая команда выбирается из FlashROM по адресу 0. В арифметико-логическом устройстве (ALU) выполняются арифметические и логические операции. Операнды поступают из регистров общего назначения (GPR). При выполнении одноместных операций результат записывается в регистр, из которого поступил операнд. При выполнении двухместных операций результат записывается в регистр, из которого поступил первый операнд. Блок регистров общего назначения (GPR) содержит 32 восьмиразрядных регистра, которым присвоены имена R0, R1, ..., R31. В некоторых операциях в ALU могут участвовать лишь регистры со старшими номерами (от R16 до R31). Регистры с именами от R24 до R31 могут образовывать пары, используемые для хранения слов, при этом регистр Структура микроконтроллера 15 г четным номером хранит младший байт, а регистр с нечетным номером — старший байт. Паре регистров R26, R27 присвоено имя X, паре регистров R28, R29 — имя Y, паре регистров R30, R31 — имя Z. Эти пары регистров используются для хранения адресов при обращениях к памяти с косвенной адресацией. Регистр состояния микроконтроллера SREG (№ $3F) содержит восемь разрядов (SREG.7, SREG.6, ..., SREG.0). Разряд SREG, 7 (I) используется для разрсшения/запрещения прерываний. При 1 = 0 все прерывания запрещены. При 1=1 любое прерывание может быть разрешено. Разряд SREG.6 (Т) используется для хранения бита при выполнении операций с битами. Остальные разряды регистра SREG используются для хранения признаков результатов арифметических и логических операций, выполняемых в ALU. Назначение этих разрядов рассматривается при описании системы команд микроконтроллера. Регистр-указатель стека SP(№ $3D) хранит и формирует адрес при обращении к стеку типа LIFO. В микроконтроллерах типа til, tl2, tl5, 1200 и t28 в качестве стека используется специальное запоминающее устройство (аппаратный стек). Этот стек используется только для хранения адресов возврата при прерываниях и обращениях к подпрограммам. В системе команд отсутствуют команды обращения к стеку. В микроконтроллерах других типов в качестве стека используется выделяемая пользователем область в SRAM. В системе команд есть команды для обращению к стеку. Запись байтов в стек выполняется в порядке уменьшения адресов в SRAM. При пуске и перезапуске микроконтроллера в регистр-указатель стека заносится код числа 0. Для нормальной работы стека в регистр-указатель необходимо занести другой начальный адрес. В микроконтроллерах с большой емкостью SRAM регистр-указатель состоит из двух регистров — SPL и SPH (№№ $3D и $ЗЕ). 1.4. Запоминающее устройство FlashROM Постоянное запоминающее устройство FlashROM предназначено для хранения кодов команд программы и констант. Ячейка памяти содержит 16 разрядов. В ней могут храниться код команды формата "слово", половина кода команды формата "два слова" или коды двух констант. Емкость FlashROM (в числе бантов!) у микроконтроллеров разных типов указана в табл. 1.1. в колонке Flash. При чтении кодов команд адрес в FlashROM поступает из счетчика команд. При чтении констант адрес поступает из пары Z регистров общего назначения. 16 Глава 1 Запись кодов в FlashROM выполняется в процессе программирования побайтно. В микроконтроллерах с большим числом выводов (20 и более) байт может вводиться параллельно или последовательно. В микроконтроллерах с малым числом выводов (8) байт вводится последовательно. Программирование может выполняться с использованием дополнительного источника напряжения + 12 В или без использования дополнительного источника. Последовательное программирование без использования дополнительного источника напряжения производится с использованием трех выводов микроконтроллера и может выполняться после установки микроконтроллера в аппаратуре, где ему предстоит работать, (Downloading). Типы микроконтроллеров, в которых этот способ программирования реализуется, отмечены знаком "+" в табл. 1.1 в колонке ISP (In-System Programming). В микроконтроллере типа ml63 имеется возможность вводить и записывать в FlashROM коды в процессе работы микроконтроллера. Эта процедура (Self-programming) выполняется под управлением специальной программы (Boot Loader), которая составляется программистом и записывается в специальную секцию FlashROM. При выполнении этой программы используется регистр SPMCR (№ $37). Команда, с использованием которой выполняется запись кодов в FlashROM в процессе работы микроконтроллера, рассмотрена в п. 2.8. 1.5. Запоминающее устройство SRAM Оперативное запоминающее устройство статического типа SRAM предназначено для хранения данных, получаемых в процессе работы микроконтроллера. При выключении напряжения питания микроконтроллера данные в SRAM теряются. Ячейка памяти содержит 8 разрядов. Емкость SRAM (в числе байтов) у микроконтроллеров разных типов указана в табл. 1.1 в колонке SRAM. Адрес байта при обращении к SRAM может быть указан в коде команды с обращением к SRAM (прямая адресация) или предварительно записан в пару регистров X, Y или Z (косвенная адресация). Обращение к SRAM может выполняться с использованием адреса, хранящегося в регистре-указателе стека. Байт для записи в SRAM поступает из регистра общего назначения. Байт, считанный из SRAM, поступает в регистр общего назначения. В адресное пространство SRAM кроме адресов, по которым выполняется обращение к ячейкам памяти SRAM, включены 32 адреса для обращения к регистрам общего назначения (адреса от $00 до $1F) и 64 адреса для обращения к регистрам ввода-вывода (адреса от $20 до $5F). Структура микроконтроллера 17 Первой ячейке в SRAM соответствует адрес $60. Адрес для обращения к регистру общего назначения по команде обращения к SRAM совпадает с номером регистра (0—31 = $00—$1F). Адрес для обращения к регистру ввода-вывода по команде обращения к SRAM равен его номеру, увеличенному на число 32 ($20). В микроконтроллерах, допускающих подключение внешнего запоминающего устройства ERAM, адреса для обращения к ячейкам ERAM включены в адресное пространство SRAM и расположены после старшего адреса SRAM. Типы микроконтроллеров, в которых возможно подключение ERAM, отмечены знаком "+" в табл. 1.1 в колонке ERAM. На рис. 1.2, в качестве примера, показано распределение адресов в адресном пространстве SRAM между регистрами общего назначения (GPR), регистрами ввода-вывода (IOR), ячейками памяти в SRAM и ячейками памяти в ERAM у микроконтроллера типа 8515. Запись в стек выполняется в порядке убывания адресов. В качестве исходного адреса для обращений к стеку, который заносится в регистр-указатель стека в начале программы, целесообразно использовать старший адрес SRAM. В рассмотренном на рис. 1.2 примере таким адресом является адрес $025Е 18 Глава 1 1.6. Запоминающее устройство EEPROM Постоянное запоминающее устройство EEPROM предназначено для хранения данных, записанных при программировании микроконтроллера и получаемых в процессе выполнения программы. При выключении напряжения питания данные сохраняются. Ячейка памяти содержит 8 разрядов. Емкость EEPROM (в числе байтов) у микроконтроллеров разных типов указана в табл. 1.1 в колонке EEPROM. EEPROM имеет обособленное адресное пространство. При обращении к EEPROM адрес записывается в регистр адреса EEAR (№ $1Е). В микроконтроллерах типа 8515, 8535, ml63 и ml03 регистр адреса содержит два восьмизарядных регистра — EEARL и EEARH (№№ $1Е и $1F). Байт, предназначенный для записи, заносится в регистр данных EEDR (№ $1D). Байт, получаемый при чтении, поступает в этот же регистр. Для управления процедурами записи и чтения используется регистр управления EECR (№ $1С). Для записи байта в EEPROM необходимо: 1) записать адрес в регистр адреса; 2) записать байт в регистр данных; 3) установить в единичное состояние разряд EEMWE регистра EECR, 4) при EEMWE = 1 установить в единичное состояние разряд EEWE регистра EECR. Процедура записи выполняется в зависимости от величины напряжения питания за 2,5—4 мс. При завершении записи разряд EEWE регистра EECR аппаратно сбрасывается в нулевое состояние. Разряд EEMWE сохраняет единичное состояние в течение 4-х тактов после установки и аппаратно сбрасывается в нулевое состояние. В микроконтроллерах типа tl2, 115, 4433, 8535, ml63 и ml03 при нулевом состоянии разряда EEWE формируется запрос прерывания ЕЕ RDY. Прерывание по данному запросу разрешено при единичном состоянии разряда EERIE регистра EECR. Для чтения байта из EEPROM необходимо: 1) записать адрес в регистр адреса; 2) установить в единичное состояние разряд EERE регистра EECR. Считанный байт поступает в регистр данных. Разряд EERE регистра EECR аппаратно сбрасывается в нулевое состояние. 1.7. Внешнее запоминающее устройство ERAM Внешнее запоминающее устройство предназначено для хранения байтов данных. Оно может быть подключено к микроконтроллерам типа 8515 и ш103. Схема подключения ERAM к микроконтроллеру изображена на рис. 1.3. Структура микроконтроллера 19 Рис. 1.3. Для подключения используются: 8 выводов порта А (РА), через которое выдается младший байт кода адреса и байт данных для записи и принимается байт данных при чтении; 8 выводов порта С (PC), через которые выдается старший байт кода адреса; вывод ALE, через который выдается импульс для записи младшего байта кода адреса во внешний регистр RG; вывод WR, через который в ERAM выдается импульс управления записью; вывод RD, через который в ERAM выдается импульс управления чтением. В микроконтроллере типа 8515 для выдачи сигнала ALE используется отдельный вывод, а сигналы WR и RD выдаются через выводы PD6 и PD7 соответственно. В микроконтроллере типа ml03 сигналы управления выдаются через отдельные выводы. Обращение к внешней памяти по командам обращения к SRAM возможно после установки в единичное состояние разряда SRE регистра MCUCR (№ $35). Обращение выполняется за 3 такта. Если требуется, в цикл обращения может быть введен дополнительный такт (такт ожидания). Дополнительный такт вводится при единичном состоянии разряда SRW в регистре MCUCR. 1.8. Периферийные устройства В группу периферийных устройств входят: параллельные порты ввода-вывода; последовательный порт SPI; последовательный порт UART; последовательный порт TWSI (I2C); таймеры-счетчики общего назначения; сторожевой таймер; 20 Глава 1 аналого-цифровой преобразователь; аналоговый компаратор; программируемый аппаратный модулятор; блок прерываний. Параллельный порт ввода-вывода (Port, Р) предназначен для ввода и вывода данных. Микроконтроллеры семейства AVR имеют от одного до шести портов. Порт может иметь от трех до восьми выводов. Число параллельных портов ввода-вывода и суммарное число выводов портов у микроконтроллеров разных типов, указано в табл. 1.1 в колонках Р и I/O соответственно. Вывод порта может работать в режиме входа или в режиме выхода. Направление передачи бита устанавливается для каждого вывода в отдельности. Некоторые выводы портов кроме ввода и вывода битов данных могут использоваться для выполнения альтернативных функций при работе других устройств. Суммарное число выводов параллельных портов, которые могут выполнять альтернативные функции у микроконтроллеров разных типов, указано в табл. 1.1 в колонке ALT. В это число не включены выводы, выполняющие альтернативные функции только при программировании микроконтроллера. Альтернативные функции выводов портов у микроконтроллеров разных типов указаны в приложении ПЗ. Последовательный порт ввода-вывода SPI (Serial Peripheral Interface) предназначен для ввода и вывода байтов при обмене данными с другими устройствами, имеющими порт SPI. Обмен выполняется под управлением тактового сигнала порта. Устройство, инициализирующее обмен и вырабатывающее тактовый сигнал, является ведущим (master). Устройство, выполняющее обмен при поступлении тактового сигнала, является ведомым (slave). В процессе обмена оба устройства последовательно бит за битом одновременно выдают и принимают байт. Обмен выполняется с использованием трех шин. Максимальная скорость приема/передачи (в битах в секунду) равна 1/4 частоты тактового сигнала микроконтроллера (у МК типа ш163 — 1/2 тактовой частоты). К одному ведущему устройству могут быть подключены несколько ведомых. Функции ведущего и ведомого могут меняться в процессе работы системы. Порт SPI, который может работать в режиме ведущего и ведомого и использоваться для обмена данными в процессе работы, имеется у микроконтроллеров типа 4433, 8515, 8535, ml63 и ml03 (табл. 1.1, колонка SPI). Микроконтроллеры других типов, кроме til и t28, имеют порт SPI, который может работать только в режиме ведомого и используется при последовательном программировании микроконтроллера без дополнительного источника напряжения (Downloading). Структура микроконтроллера 21 Последовательный порт ввода-вывода UART (Universal Asynchronous Receiver-Transmitter) предназначен для передачи и приема байтов данных по двухпроводным линиям связи (например, по интерфейсу RS-232C или "токовая петля"). Прием и передача могут вестись одновременно. При передаче байта формируется последовательность из десяти или одиннадцати битов (кадр), содержащая стартовый бит, имеющий нулевое значение, восемь битов байта (DO, D1, ..., D7) и столовый бит, имеющий единичное значение. Между старшим битом байта (D7) и стоповым битом может помещаться дополнительный бит. Порт UART входит в состав периферийных устройств микроконтроллеров типа 2313, 4433, 8515, 8535, ш163 и шЮЗ (табл. 1.1, колонка UART). Последовательный порт ввода-вывода TWSI {Two-Wire Serial Interface) предназначен для обмена байтами данных с другими устройствами по двухпроводной шине IC {Integrated Circuit). К шине могут подключаться до 127 устройств. Устройство, подключенное к шине IC, может работать в качестве ведущего {master) или ведомого {slave). Ведущее устройство при освобождении шины от обмена между другими устройствами посылает в шину сигнал начала обмена и занимает шину, затем посылает адресный байт для выбора одного из ведущих устройств и задания направления обмена, передает или принимает байты данных и посылает сигнал окончания обмена. Ведомое устройство, опознав свой адрес, в зависимости от указанного направления обмена принимает или передает данные. Устройство, принимающее байты данных, после приема каждого байта посылает в шину сигнал подтверждения приема. Адресный байт может содержать общий адрес для передачи данных одновременно во все ведомые устройства. Скорость обмена задается ведущим устройством, обмен может вестись со скоростью до 400000 бит/с. Последовательный порт TWSI имеется у микроконтроллера типа ш163. Таймер-счетчик общего назначения {General Purpose Timer/Counter) предназначен для формирования запроса прерывания при истечении заданного интервала времени (режим таймера) или свершении заданного числа событий (режим счетчика). Микроконтроллеры семейства AVR могут иметь от одного до трех таймеров-счетчиков общего назначения Т/СХ (X — номер таймера-счетчика, X = 0, 1, 2). Основным элементом таймера-счетчика является базовый счетчик, который ведет счет на сложение. При его переполнении формируется запрос прерывания Т/СХ OVF. Таймер-счетчик общего назначения может выполнять дополнительные функции: 22 Глава 1 функцию захвата; функцию сравнения; функцию широтно-импульсного модулятора; функцию счета реального времени. Функция захвата (capture) заключается в запоминании кода, сформированного в базовом счетчике, в специальном регистре захвата при изменении значения определенного внешнего или внутреннего сигнала. При этом формируется запрос прерывания Т/СХ С APT. Функция сравнения (compare) заключается в изменении значения сигнала на определенном выходе микроконтроллера при совпадении кода, формируемого в базовом счетчике, с кодом в специальном регистре сравнения. При этом формируется запрос прерывания Т/СХ СОМР. Функция широтно-импульсного модулятора (PWM) заключается в формировании на определенном выходе микроконтроллера импульсной последовательности с заданными периодом повторения и длительностью импульсов. Функции сравнения и PWM реализуются с использованием одного и того же оборудования. Выбор нужной функции выполняется программными средствами. Функция счета реального времени (Real Time Clock) реализуется в таймере-счетчике при использовании дополнительного внутреннего генератора с внешним кварцевым резонатором с частотой 32768 Гц ("часовой" кварц). При этом параметры процессов в таймере-счетчике с высокой точностью привязаны к единице измерения реального времени — секунде. В зависимости от разрядности счетчика и выполняемых дополнительных функций могут быть выделены пять типов таймеров-счетчиков общего назначения, входящих в группу периферийных устройств микроконтроллеров семейства AVR. Тип А. Восьмиразрядный таймер-счетчик без дополнительных функций. Тип В. Восьмиразрядный таймер-счетчик с функцией сравнения/PWM. Тип С. Восьмиразрядный таймер-счетчик с функцией сравнения/PWM и функцией счета реального времени. Тип D. Шестнадцатиразрядный таймер-счетчик с функциями захвата и сравнения/PWM. Тип Е. Шестнадцатиразрядный таймер-счетчик с функцией захвата и двумя каналами для выполнения функций сравнения/PWM. В табл. 1.1, в колонках Т/СО, Т/Cl и Т/С2 указаны типы таймеров-счетчиков, входящих в группу периферийных устройств под этими именами у микроконтроллеров разных типов. Таймер-счетчик одного типа в микроконтроллерах разных типов может иметь разные имена. Сторожевой таймер (Watchdog Timer, WDT) предназначен для ликвидации последствий сбоя в ходе программы путем перезапуска микроконтроллера при обнаружении сбоя. Сторожевой таймер имеется у микроконтроллеров всех типов. Структура микроконтроллера 23 Аналого-цифровой преобразователь (Analog-to-Digital Converter') формирует десятиразрядный двоичный код числа, пропорционального величине напряжения аналогового сигнала на входе микроконтроллера. В микроконтроллерах AVR к преобразователю могут подключаться от четырех до восьми входов микроконтроллера. Аналого-цифровой преобразователь входит в состав периферийных устройств микроконтроллеров типа 115, 4433, 8535, ml63 и тЮЗ. Число подключаемых входов у микроконтроллеров названных типов указано в табл. 1.1, в колонке ADC. Аналого-цифровой компаратор (Analog Comparator, АС) сравнивает по величине аналоговые сигналы, поступающие на два входа микроконтроллера, и формирует запрос прерывания ANA COMP, когда разность их значений меняет знак. При этом также может быть выдан сигнал для выполнения функции захвата в таймере-счетчике общего назначения. Аналоговый компаратор входит в состав периферийных устройств микроконтроллеров всех типов, кроме 2323 и 2343 (табл. 1.1, колонка АС). Программируемый аппаратный модулятор (Programmable Hardware Modulator, РНМ) предназначен для формирования импульсного сигнала на выводе РА2 для питания светодиодных индикаторов. Длительность импульса и скважность сигнала задаются программными средствами. Ток нагрузки может иметь величину до 25 мА при напряжении питания 1,8 В. Программируемый аппаратный модулятор имеется у микроконтроллеров типа 128. Блок прерываний (Interrupt Unit, IU) организует переход к выполнению прерывающей программы при поступлении запроса прерывания, если прерывание по данному запросу разрешено и он имеет более высокий приоритет, чем другие запросы, поступившие одновременно с ним. Прерывание разрешено, если разряд I регистра SREG находится в единичном состоянии и в единичном состоянии находится разряд, разрешающий/запрещающий прерывание по данному запросу, расположенный в одном из регистров ввода-вывода. Приоритетность запросов задана аппаратно. При переходе к выполнению прерывающей программы разряд I регистра SREG сбрасывается в нулевое состояние и сохраняется в этом состоянии до завершения прерывающей программы. Разряд I может быть переведен в единичное состояние по команде в прерывающей программе. Запросы в блок прерываний поступают из внешних источников и источников, расположенных во внутренних устройствах микроконтроллера. Общее число запросов прерывания у микроконтроллеров разных типов указано в табл. 1.1, в колонке IU. ва 2 Система команд 2.1. Общие сведения о системе команд В семействе AVR система команд у микроконтроллеров разных типов содержат от 89 до 130 команд (табл. В1, колонка NK). У микроконтроллеров типа 2323, 2343, 2313, 4433, 8515 и 8535 в систему команд входят 118 команд. Эту систему команд будем называть базовой. В табл. 2.1—2.13 описаны операции, выполняемые по командам базовой системы, и приведены мнемокоды команд, используемые при разработке программы на языке AVR Ассемблера. В таблицах дана сквозная нумерация команд, используемая далее в тексте. Базовая система команд содержит: 33 команды регистровых операций, при выполнении которых используются только регистры общего назначения (команды №№ 1—33); 26 команд с обращением по адресу в адресном пространстве SRAM (команды №№ 34—59); 2 команды с обращением к регистрам ввода-вывода (команды №№ 60 и 61); 1 команда с обращением к FlashROM (команда № 62); 22 команды операций с битами в разрядах регистров общего назначения и регистров ввода-вывода (команды №№ 63—84); 34 команды управления ходом программы (команды №№ 85—118). Система команд 25 В систему команд микроконтроллеров типа til, tl2, tl5, 1200 и t28, у которых нет SRAM, не входят команды с обращением по адресу в адресном пространстве SRAM за исключением команд с мнемокодами LD Rd, Z (№ 40) и ST Z, Rr (№ 41), по которым производится обращение к регистрам общего назначения и регистрам ввода-вывода с использованием косвенной адресации. В систему команд у этих микроконтроллеров не входят также 2 команды регистровых операций iX«№ 32 и 33) и две команды управления ходом программы (№№ 86 и 88). У микроконтроллеров типа 1200 в систему команд не входит также команда с обращением к FlashROM (№ 62). В систему команд микроконтроллеров типа ml63 и ml03 входят дополнительные команды. Появление некоторых из них связано с увеличенным объемом FlashROM, а у микроконтроллера типа ml63, кроме того, с наличием аппаратного умножителя. Дополнительные команды рассматриваются в п. 2.8. При разработке программы работы микроконтроллера кроме мнемокодов команд используются директивы ассемблера и другие средства ассемблера. Особенности разработки программы на языке AVR Ассемблера фирмы Atmel рассмотрены в приложении П8. Таб ли ца 2.1 № Операция Мнемокод команды Признаки результата H S V N z c 1 SOO—Rj 1%) CLR Rd 0 0 0 1 2 (Rd)-Rd ((Rd)A(Rd)-Rd) TST Rd + 0 + + 3 (Rd)->Rd ($FF-(Rd)->Rd) COM Rd + 0 + + 1 4 NEG Rd + + + + + + 5 (Rd)+1->Rd INC Rd + + + + 6 (Rd)-i-*Rd DEC Rd + + + + 7 0-(RdHC LSR Rd + + 0 + + *— 8 C-(Rd)-0 LSL Rd + + + + + + —» 9 C-(RdHC ROR Rd + + + + + <— 10 C-(Rd)-C ROL Rd + + + + + + 11 R,7-(R,6-Rd.0HC ASR Rd + + + + 12 Rd.4-7~Rd.0-3 SWAP Rd 13 (RrHRd MOV Rd, Rr 14 (RdHRrHRd ADD Rd, Rr + + + + + + 26 Глава 2 Окончание табл. 2. 1 № Операция Мнемокод команды Признаки результата H S V N z c 15 (Rd)+(Rr)+C-*Rd ADC Rd, Rr + + + + + + 16 (Rd)-(Rr)-*Rd SUB Rd, Rr + + + + + + 17 (Rd)-(Rr)-c->Rd SBC Rd, Rr + + + + + + 18 (Rd)-(Rr) CP Rd, Rr + + + + + + 19 (Rd)-(Rr)-c CPC Rd, Rr + + + + + + 20 (RJMRrHRd AND Rd, Rr + 0 + + + 21 (RdMRrHRd OR Rd, Rr + 0 + + 22 (Rd)©(Rr)-*Rd EOR Rd, Rr + 0 + + d = 0—31; г = 0—31 Таб ли ца 2.2 Ns Операция Мнемокод команды Признаки результата H S V N z c 23 $FF-*Rd SER Rd 24 K-*Rd LDI Rd, К 25 (Rd) - K-Rd SUBI Rd, К + + + + + + 26 (Rd) - К - C-»Rd SBCI Rd, К + + + + + + 27 (Rd) - к CPI Rd, К + + + + + + 28 (Rd)AK-Rd ANDI Rd, К + 0 + + 29 (Rd)AK-Rd CBR Rd, К + 0 + + 30 (Rd)vK-Rd ORI Rd, К + 0 + + 31 (Rd)vK-*Rd SBR Rd, К + 0 + + d = 16—31 (!); К = 0—255 Таб лица 2.3 Ns Операция Мнемокод команды Признаки результата H S V N Z c 32 (Rd+1, Rd)+ K~»Rd+1, Rd ADIW Rd, К + + + + + 33 (Rd+i> Rd) _ K-*Rd+1, Rd SBIW Rd, К + + + + + d - 24, 26, 28, 30; К = 0—63 Система команд 27 Таб ли ца 2.4 Ns Операция Мнемокод команды № Операция Мнемокод команды 34 (A4kHRd LDS Rd, к 35 (Рг)-»Ячк STS k, Rr d, г = 0—31; к — адрес из адресного пространства SRAM Таб ли ца 2.5 Ns Операция Мнемокод команды Ns Операция Мнемокод команды 36 (R4(X)HRd LD Rd, X 37 (Rr)-*R4(X) ST X, Rr 38 (A4(Y))-*Rd LD Rd, Y 39 (RrHR4(Y) ST Y, Rr 40 (R4(Z))->Rd LD Rd, Z 41 (RrHR4(Z) ST Z, Rr 42 1. (R4(X))->Rd 2. (X)+1-X LD Rd, X+ 43 1. (Rr)-»R4(X) 2. (X)+1-*X ST X+, Rr 44 1. (R4(Y))-»Rd 2. (Y)+1-»Y LD Rd, Y+ 45 1.(Rr)-R4(Y) 2. (Y)+1-*Y ST Y+, Rr 46 1,(R4(Z))-Rd 2. (Z)+1-*Z LD Rd, Z+ 47 1. (Rr)-*R4(Z) 2. (Z)+1-Z ST Z+, Rr 48 1. (X)-1-*X 2. (R4(X)HRd LD Rd, -X 49 1. (X)-1-X 2. (Rr)-*R4(X) ST -X, Rr 50 1. (Y)-1-Y 2.(R4(Y))-»Rd LD Rd, -Y 51 1. (Y)-1-Y 2. (Rr)-R4(Y) ST -Y, Rr 52 1,(Z)-1->Z 2. (A4(Z))-Rd LD Rd, -Z 53 1.(Z)-1->Z 2. (Rr)-R4(Z) ST -Z, Rr 54 (R4(Y)+qHRd LDD Rd, Y+q 55 (Rr)->R4(Y)+q STD Y+q, Rr 56 (R4(Z)+q)->Rd LDD Rd, Z+q 57 (RrKR4(Z)+q STD Z+q, Rr 58 1. (SP)+1-*SP 2. (CTEK)->Rd POP Rd 59 1. (RJ-CTEK 2. (SP)-1-*SP PUSH Rr d, г = 0—31; q = 0—63 Таб ли ца 2.6 Ns Операция Мнемокод команды Ns Операция Мнемокод команды 60 (PrP)-Rd IN Rd, P 61 (Pr)->PrP OUT P, Rr d, г = 0—31; Р = 0—63 = $00—$3F 28 Глава 2 Таб ли ца 2.7 Ns Операция Мнемокод команды (Z.15-1) — адрес в FlashROM Z.0 = 0 - мл. байт; Z.0 - 1 — ст. байт 62 (Rm(Z))-R0 LPM Таб ли ца 2.8 Ns Операция Мнемокод команды Ns Операция Мнемокод команды 63 T-Rd.b BLD Rd, b 64 Rr.b—Т BST Rr, b 65 О-РгР.Ь CBI Р, b 66 1-РгР.Ь SBI Р, b 67 0-SREG.b BCLR b 68 1-SREG.b BSETb d, г = 0—31; Р = 0—31 (!); Ь = 0—7 Таб ли ца 2.9 Ns Операция Мнемокод команды Ns Операция Мнемокод команды 69 0—I CLI 70 1-1 SEI 71 0-Т CLT 72 1-Т SET 73 о-н CLH 74 1-Н SEH 75 0-S CLS 76 1-S SES 77 0-V CLV 78 1-V SEV 79 0-N CLN 80 1-N SEN 81 0-Z CLZ 82 1-Z SEZ 83 о-с CLC 84 1-С SEC Таб ли ца 2.10 Ns Операция Мнемокод команды Ns Операция Мнемокод команды 85 (PC)+1+k-PC RJMPk 86 (Z)-PC IJMP 87 1. (PC)+1-CTEK 2. (SP)-2—SP 3. (PC)+1+k-PC RCALL k 88 1. (PC)+1—СТЕК 2. (SP)-2—SP 3. (Z)-PC ICALL 89 1. (SP)+2—SP 2. (СТЕК)—PC RET 90 1. (SP)+2—SP 2. (CTEK)-PC 3. 1—1 RETI к = -2048 — +2047 Система команд 29 Таб ли ца 2. 1 1 Ns Условие Мнемокод команды Ns Условие Мнемокод команды 91 1 = 0 BRIDk 92 1=1 BRIE k 93 Т = 0 BRTC k 94 T= 1 BRTSk 95 Н = 0 BRHCk 96 H= 1 BRHSk 97 s = o BRGEk 98 S = 1 BRLTk 99 v = o BRVCk 100 V- 1 BRVSk 101 N = 0 BRPLk 102 N = 1 BRMIk 103 z = o BRNEk 104 Z= 1 BREQk 105 c = o BRCCk 106 C= 1 BRCS k 107 c = o BRSH k 108 C = 1 BRLO k 109 SREG.b = 0 BRBC b, k 110 SREG.b =1 BRBS b, k к « -64 — +63; b - 0-7 Таб ли ца 2.12 Ns Условие Мнемокод команды Ns Условие Мнемокод команды 111 Rr.b = 0 SBRC Rr, b 112 Rr.b = 1 SBRS Rr, b 113 PrP.b = 0 SBIC P, b 114 PrP.b = 1 SBIS P, b 115 (Rd) - (Rr) CPSE Rd, Rr d, г« 0-31; Р -0—31 (!);Ь = 0—7 Таб ли ца 2.13 Ns Операция Мнемокод команды 116 МК -> режим энергосбережения SLEEP 117 Перезапуск WDT WDR 118 Нет NOP 2.2. Команды регистровых операций В группу регистровых операций входят пересылочные, арифметические и логические операции. Команды регистровых операций описаны в табл. 2.1, 2.2 и 2.3. Машинные коды всех команд регистровых операций имеют формат "слово", команды №№ 1—31 выполняются за один такт, а команды №№ 32 и 33 — за два такта. При описании операций в табл. 2.1—2.3 используются следующие обозначения: 30 Глава 2 Rd, Rr — регистры общего назначения с номерами биг соответственно; (Rd), (Rr) — байты в регистрах Rd и Rr соответственно; Rd.b — разряд b (Ь = 0—7) регистра Rd, бит в разряде Rd.b; $ — указатель шестнадцатеричного кода; л, v, © - знаки логических операций И, ИЛИ, исключающее ИЛИ соответственно; ( )> ( )> ( ) — знаки операций ИЕ, сдвиг кода вправо, сдвиг кода влево соответственно. Арифметические операции — сложение и вычитание — могут выполняться с числами без знака в двоичном коде и с числами со знаком в дополнительном двоичном коде. В отличие от микроконтроллеров многих других семейств, в которых вычитание сводится к сложению с числом с измененным знаком (X-Y = X + (-Y )), в микроконтроллерах семейства AVR вычитание выполняется с помощью аппаратного двоичного вычитателя. Работа двопчпого вычитателя рассмотрена в приложении П7. При выполнении арифметических и логических операций кроме кода результата формируются значения признаков результата. При выполнении операций сравнения (команды №№ 18, 19 и 27) формируются только значения признаков результата. Значения признаков результата представлены состоянием разрядов регистра состояния SREG (№ $3F). Используются шесть признаков результата, которым присвоены имена С (SREG.O), Z (SREG.l) N (SREG.2), V (SREG.3), S (SREG.4) и Н (SREG.5). В табл. 2.1-2.3 признаки, значения которых формируются при выполнении команд, отмечены знаком "+" или указано их значение. При выполнении разных операций значение признаков формируются по разным правилам. Признак С принимает единичное значение: при появлении единицы переноса из старшего разряда при выполнении операции сложения (команды №№ 14, 15 и 32); при появлении единицы займа в старший разряд при выполнении операции вычитания (команды №№ 4, 16, 17, 18, 19, 25, 26, 27 и 33); при выходе единицы за пределы разрядной сетки при выполнении операции сдвига (команды №№ 7, 8, 9, 10 и И). Единичное значение признака С при выполнении операций сложения и вычитания с числами без знака свидетельствует о получении неправильного результата операции вследствие переполнения разрядной сетки. Признак Z принимает единичное значение при получении нулевого результата операции. При выполнении операции вычитания с учетом займа (команды №№ 17, 19 и 26) Z « 1, если нулевой результат получен при выполнении данной и предшествующей операций. Система команд 31 Признак N имеет значение, равное значению старшего разряда кода результата. При выполнении арифметических операций с числами со знаком и отсутствии переполнения разрядной сетки он представляет знак результата. Признак V принимает единичное значение, если при выполнении арифметической операции с числами со знаком возникло переполнение разрядной сетки. Признак S = N © V представляет знак результата при выполнении арифметических операций с числами со знаком вне зависимости от переполнения разрядной сетки. При переполнении разрядной сетки (V = 1) знак результата противоположен значению в старшем разряде кода результата. Признак Н принимает единичное значение при наличии единицы переноса из разряда D3 в разряд D4 при выполнении операции сложения, при наличии единицы займа в разряд D3 из разряда D4 при выполнении операции вычитания и при передаче единицы из разряда D3 в разряд D4 при выполнении операции сдвига кода влево. 2.3. Команды с обращением по адресу SRAM По командам с обращением по адресу в адресном пространстве SRAM выполняются операции пересылки (копирования) байта между регистром общего назначения и элементом, которому соответствует адрес в адресном пространстве SRAM. Таким элементом может быть регистр общего назначения (адреса от $00 до $1F), регистр ввода-вывода (адреса от $20 до $5F), ячейка памяти в SRAM (адреса от $60 до максимального адреса в SRAM), ячейка памяти в ERAM (адреса от максимального адреса в SRAM +1 до максимального адреса в ERAM) (см. п. 1.5). Команды с обращением по адресу в адресном пространстве SRAM описаны в табл. 2.4 и 2.5. Машинные коды команд №№ 34 и 35 имеют формат "2 слова", машинные коды остальных команд — формат "слово". Команды выполняются за 2 такта, а при обращении к ячейкам в ERAM — за 3 такта. В случае необходимости в цикл выполнения команды при обращении к ERAM может быть введен дополнительный такт ожидания. В табл. 2.4 и 2.5 используются следующие новые обозначения: ЯчА — регистр общего назначения, регистр ввода-вывода, ячейка памяти в SRAM, ячейка памяти в ERAM, к которым производится обращение с использованием адреса А из адресного пространства SRAM; (ЯчА) — байт в ЯчА; 32 Глава 2 X, Y, Z — пара регистров общего назначения X (R26, R27), Y (R28, R29), Z (R30, R31) соответственно; (X), (Y), (Z) — слово в паре регистров X, Y, Z соответственно; СТЕК — ЯчА, к которой производится обращение с использованием адреса, хранящегося в регистре-указателе стека SP; (СТЕК) - байт в СТЕК, е; (SP) — код числа в регистре SP. В командах №№ 34 и 35 реализуется прямая адресация. Адрес байта (А = к) указывается в коде команды. В командах №№ 36—57 реализуется косвенная адресация. Адрес байта находится в паре регистров X, Y или Z. При выполнении команд №№ 42—47 после выполнения пересылки адрес в паре регистров аппаратно увеличивается на единицу. При выполнении команд №№ 48—53 до выполнения пересылки адрес в паре регистров аппаратно уменьшается на единицу. При выполнении команд №№ 54—57 адрес, по которому производится обращение, равен адресу в паре регистров Y или Z, увеличенному на число q, которое указано в коде команды. Адрес в паре регистров остается без изменения. В командах №№ 58 и 59 в качестве кода адреса используется код, находящийся в регистре-указателе стека. При запуске микроконтроллера в регистр-указатель стека заносится код числа 0. Для нормальной работы стека в регистр-указатель стека в начале программы необходимо занести код другого числа. Обычно в качестве такого числа используют старший адрес в SRAM. Например, для микроконтроллера типа 8515 таким адресом является число $025F (см. рис. 1.2). 2.4, Команды с обращением к регистрам ввода-вы вода По командам с обращением к регистрам ввода-вывода выполняются операции пересылки (копирования) байта между регистром общего назначения и регистром ввода-вывода с использованием для выбора регистра ввода-вывода его номера ($00 - $3F). Команды с обращением к регистрам ввода-вывода описаны в табл. 2.6. Машинные коды команд имеют формат "слово". Команды выполняются за один такт. В табл. 2.6 используются следующие новые обозначения; РгР — регистр ввода-вывода с номером Р; (РгР) — байт в регистре РгР. При записи мнемокода команды вместо конкретного номера регистра может использоваться его символическое имя. Все регистры ввода-вывода имеют штатные имена. Имена регистров ввода-вывода и их система команд 33 номера приведены в приложении П4. У микроконтроллеров разных ’ инов регистры ввода-вывода, имеющие одинаковые имена, могут иметь эазные номера. При записи в мнемокодах имен регистров вместо их номера необходимо использовать версию AVR-Ассемблера для микроконтроллера данного типа. 2.5. Команда с обращением к FlashROM По команде с обращением к FlashROM выполняется пересылка < копирование) байта из половины ячейки памяти в FlashROM в регистр эбщего назначения R0. Команда описана в табл. 2.7. Машинный код команды имеет формат "слово". Команда выполняется за три такта. До выполнения команды необходимо адрес, соответствующий ячейке памяти в FlashROM, в которой хранится константа, умножить на 2 и записать в пару регистров Z (№№ $30, $31). При умножении на 2 (сдвиг кода влево на один разряд) в младшем оазряде регистра ZL ($30) оказывается цифра 0. При нулевом значении младшего разряда выбирается байт из младшей половины ячейки FlashROM. Для выбора байта из старшей половины ячейки необходимо число, код которого находится в паре регистров Z, увеличить на 1 с использованием команды № 33 с мнемокодом ADIW R30, 1 или ADIW ZL, 1. Запись констант в FlashROM выполняется при программировании микроконтроллера. 2.6. Команды операций с битами Команды операций с битами описаны в табл. 2.8 и 2.9. Машинные коды всех команд имеют формат "слово". Команды №№ 65 и 66 выполняются за 2 такта, остальные команды — за 1 такт. В табл. 2.8 используется следующее новое обозначение: РгР.Ь — разряд b (Ь = 0—7) регистра ввода-вывода с номером Р (Р = $00 - $1F (!)), бит в разряде РгР.Ь. По командам №№ 63 и 64 выполняется пересылка (копирование) бита между указанным разрядом регистра общего назначения и разрядом Т регистра SREG. По командам №№ 65 и 66 устанавливается в требуемое состояние (0 или 1 соответственно) указанный разряд регистра ввода-вывода, а по командам №№ 67 и 68 — указанный разряд регистра SREG. При записи мнемокодов команд №№ 65 и 66 вместо номера регистра (Р) может быть указано его символическое имя (см. приложение П4), а вместо номера разряды (Ь) — символическое имя разряда. В микроконтроллерах семейства AVR разряды многих регистров ввода-вывода 34 Глава 2 имеют штатные имена. Эти имена приводятся в тексте при рассмотрении устройств, в которых эти разряды используются. Штатные имена разрядов регистров ввода-вывода, управляющих работой различных устройств микроконтроллера и отражающих состояние этих устройств приведены в приложении П5. В микроконтроллерах некоторых типов разряды одноименных регистров с одинаковыми именами имеют разные номера. При использовании штатных имен регистров ввода-вы вода и штатных имен разрядов в них необходимо использовать версию AVR Ассемблера для микроконтроллера соответствующего типа. При назначении штатного имени разряда подразумевалось, что этот разряд принадлежит определенному регистру ввода-вывода, однако в мнемокоде команд №№ 65 и 66 необходимо указывать и имя/номер регистра и имя разряда. Требуемое значение бита (0 или 1) в разрядах регистров ввода-вывода с номерами от $20 до S3F устанавливается с использованием команд регистровых операций с мнемокодами CBR (№ 29) и SBR (№ 31) соответственно. В табл. 2.9 приведены мнемокоды команд, по которым устанавливается в определенное состояние (0 или 1) разряды регистра SREG без указания в мнемокоде команды номера разряда. 2.7. Команды управления ходом программы В группу команд управления ходом программы входят команды безусловного и условного переходов, перехода в энергосберегающий режим, перезапуска сторожевого таймера и "холостая" команда. В табл. 2.10 описаны команды безусловного перехода (№№ 85 и 86), безусловного перехода с возвратом (№№ 87 и 88), возврата из подпрограммы (№ 89) и возврата из прерывающей программы (№ 90). В таблице используются следующие новые обозначения: PC — счетчик команд; (PC) — код числа в счетчике команд; к — приращение числа в счетчике команд. При записи программы на языке ассемблера в мнемокодах команд №№ 85 и 87 вместо приращения к указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой нужно перейти. Приращение вычисляется и помещается в машинный код команды в процессе ассемблирования. Машинные коды команд, описанные в табл. 2.10, имеют формат "слово". Команды безусловного перехода (№№ 85 и 86) выполняются за 2 такта, команды безусловного перехода с возвратом (№№ 87 и 88) — за 3 такта, команды возврата (№№ 89 и 90) — за 4 такта. Система команд 35 Группа команд условного перехода делится на две подгруппы. В командах первой подгруппы в качестве условия используется равенство нулю или равенство единице одного из битов в регистре SREG. Условия и мнемокоды команд первой подгруппы приведены в табл. 2.11. Если условие выполняется, совершается переход по адресу, который формируется с использованием приращения к, указанного в коде команды ((PC) + 1 + k-PC; -64sk<63). Если условие не выполняется, происходит переход к следующей команде в программе ((PC) + 1-»РС). Фрагмент структурной схемы программы с командой условного перехода из первой подгруппы изображен на рис. 2.1. Рис. 2.1. Рис. 2.2. При записи программы на языке ассемблера в мнемокоде команд, описанных в табл. 2.11, вместо приращения к указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой нужно перейти, если условие выполняется. Машинные коды команд первой подгруппы (табл. 2.11) имеют формат "слово". При выполнении условия команда выполняется за 2 такта, при невыполнении условия — за 1 такт. Команды условного перехода второй подгруппы и используемые в них условия описаны в табл. 2.12. Если условие не выполняется, совершается переход к очередной команде в программе ((PC) + 1-*РС). Если условие выполняется, происходит переход к выполнению команды, следующей за очередной ((PC) + 1 + 1/2-»РС). Приращение числа в счетчике команд (1 или 2) определяется форматом машинного кода очередной команды (1 слово или 2 слова соответственно). Фрагмент структурной схемы программы с командой условного перехода из второй подгруппы изображен на рис. 2.2. Машинные коды команд условного перехода второй подгруппы (табл. 2.12) имеют формат "слово". Команды выполняются за один такт, если условие не выполняется, за 2 такта, если условие выполняется и очередная команда (К1) имеет формат "слово", или за 3 такта, если условие не выполняется и очередная команда (К1) имеет формат "2 слова". 36 Глава 2 В табл. 2.13 приведены мнемокоды команд, при выполнении которых совершается переход микроконтроллера в один из энергосберегающих режимов (№ 116), выполняется перезапуск сторожевого таймера (№ 117) или в ходе программы появляется "холостой" такт, в котором не выполняются какие-либо операции (№ 118). Энергосберегающие режимы работы микроконтроллера рассмотрены в п. 4.3. Работа сторожевого таймера описана в п. 3.6. 2.8. Дополнительные команды в системе команд микроконтроллеров типа т163 и тЮЗ Операции, выполняемые по командам, и мнемокоды дополнительных команд описаны в табл. 2.14. Знаком "+" отмечено вхождение команды в систему команд микроконтроллера указанного типа. Таб ли ца 2.14 № Операция Мнемокод команды Тип MK m163 m103 119 (Rr+i> RrHRd+1, Rd d, г = 0,2 30 MOVW Rd, Rr + 120 (Rd)x(Rr)-»R1, RO d, r - 0—31 MUL Rd, Rr + 121 (Rd)x(Rr)-*R1, R0 d,r = 16 — 31 MULS Rd, Rr + 122 (Rd)x(Rr)->Rl, R0 d, r= 16—23 MULSU Rd, Rr + 123 1. (Rd)x(Rr)-*R1, R0 FMUL Rd, Rr + 124 < 2. C*-(R1, R0)*-0 FMULS Rd, Rr + 125 d, r = 16—23 FMULSU Rd, Rr + 126 k-»PC JMPk + + 1. (PC) + I^CTEK CALL k + + 127 2. (SP)—2^SP 3. k-*PC 128 (R4(Z))-Rd d = 0—31 LPM Rd, Z + 1. (R4(Z))-»Rd LPM Rd, Z+ + 129 2. (Z)+1-Z d = 0—31 130 (A4(Z'))-R0 (Z‘) = RAMPZO, (Z) ELPM + 131 см. табл. 2.15 SPM + Система команд 37 По команде регистровой операции с мнемокодом 'MVF/4'v ^kd, 5kr (№ 119) выполняется пересылка (копирование) слова из одной пары регистров общего назначения в другую пару регистров. Машинный код команды имеет формат "слово", команда выполняется за один такт. По трем командам регистровых операций с мнемокодами MUL Rd, Rp MULS Rd, Rr и MULSU Rd, Rr (№№ 120, 121 и 122) выполняется операция умножения, в которой участвует целые числа без знака (MUL), целые числа со знаком (MULS) и целое число со знаком и целое число без знака (MULSU). При выполнении операции формируются значения признаков результата С и Z (С = R1.7, Z = 1, если после выполнения операции (R1) • 0 и (R2) = 0). По трем командам регистровых операций с мнемокодами операции FMUL, FMULS и FMULSU (№№ 123, 124, 125) выполняется операция умножения с увеличением результата в два раза, в которой участвуют дробные числа без знака (FMUL), дробные числа со знаком (FMULS) и дробное число со знаками и дробное число без знака (FMULSU). Операнды имеют формат 1.7, а результат — формат 1.15, где справа от точки указано число дробных разрядов. При выполнении операции формируются значения признаков результата С и Z (С — результат сдвига влево кода произведения, Z = 1, если после выполнения операции (R1) = 0 и (R0) = 0.) Машинные коды команд №№ 120—125 имеют формат "слово". Команды выполняются за два такта с использованием аппаратного умножителя. По командам с мнемокодами JMP к (№ 126) и CALL к (№ 127) совершаются безусловный переход и безусловный переход с возвратом в пределах всего адресного пространства FlashROM. Машинные коды этих команд имеют формат "2 слова". Команды выполняются за 3 (JMP) и 4 (CALL) такта. По командам пересылочных операций с обращением к FlashROM с мнемокодами LPM Rd, Z и LPM Rd, Z+ (№№ 128, 129) выполняется операция пересылки (копирования) константы из половины ячейки FlashROM в любой регистр общего назначения. До выполнения команды необходимо адрес, соответствующий ячейке памяти, в которой хранится константа, умножить на 2 и записать в пару регистров Z. Если требуется прочитать байт из старшей половины ячейки, к числу, код которого записан в паре регистров Z, необходимо добавить 1. При выполнении команды с мнемокодом LPM Rd, Z+ после пересылки байта число, код которого хранится в паре регистров Z, увеличивается на 1 аппаратно. Машинные коды команд №№ 128 и 129 имеют формат "слово". Команды выполняются за 3 такта. По команде с мнемокодом ELPM (№ 130) выполняется пересылка константы из половины ячейки FlashROM в регистр R0 (см. команду 38 Глава 2 № 62). В микроконтроллере типа ml03 FlashROM содержит 64 К ячеек памяти. Для размещения старшего разряда кода после умножения на 2 используется разряд RAMPZ0 регистра RAMPZ (№ $ЗВ). Машинный код команды имеет формат "слово". Команда выполняется за 3 такта. Команда с мнемокодом SPM (№ 131) предназначена для записи байтов в FlashROM в процессе выполнения программы. При выполнении команды используется регистр управления SPMCR (№ $37) и пара регистров Z. С использованием команды с мнемокодом SPM выполняются следующие операции: 1) пословное заполнение буферного запоминающего устройства (BUF) емкостью 64X16 бит; 2) стирание в FlashROM страницы — группы из 64-х ячеек; 3) перепись 64-х слов из буферного ЗУ в "очищенную" страницу FlashROM. Для задания номера ячейки в буферном ЗУ используются разряды Z6—Z1 в паре регистров Z. Для задания номера страницы (начального адреса в странице) используются разряды Z13—Z7 в паре регистров Z. Выбор операции, выполняемой по команде с мнемокодом SPM, определяется кодом, который до выполнения команды SPM, но не ранее, чем за 4 такта до ее выполнения, записывается в регистр SPMCR. Коды, записываемые в регистр SPMCR, и операции, выполняемые при этом по команде SPM, указаны в табл. 2.15. Таб ли ца 2.15 (SPMCR) Операция $01 (R1, R0HBUF (Z.6—Z.1) $03 $FF-*Rh (Z.13—Z.7, 0...0Х) $FF-Rm (Z.13—Z.7, 1...1X) $05 (BUF)-Rm (Z.13—Z.7, 0...0X) -*Яч (Z.13—Z.7, 1...1X) $09 (R0.5—2)-*BLB12, BLB11, BLB02, BLBO1 При (SPMCR) = $01 по команде SPM слово, рапее записанное в пару регистров Rl, R0, пересылается (копируется) в ячейку буферного ЗУ, номер которой указан в разрядах с шестого по первый в паре Z регистров общего назначения. Буферное ЗУ может заполняться в произвольном порядке. Система команд 39 При (SPMCR) = $03 происходит стирание группы ячеек в FlashROM с номерами в двоичном коде от Z.13, Z.7, 0, 0, 0, 0, 0, 0, X до Z.13, .... Z.7, 1, 1, 1, 1, 1, 1, X. При (SPMCR) = $05 происходит перепись 64-х слов из буферного ЗУ в ранее стертую страницу FlashROM. При (SPMCR) = $09 производится установка битов защиты (Lock Bits) BLB12, BLB11, BLB02 и BLB01, которые разрешают/запрещают выполнять запись в FlashROM с использованием команды SPM и чтение из FlashROM с использованием команды LPM. —______ J* лава w Работа периферийных устройств В работе периферийных устройств участвуют регистры ввода-вывода. Работа периферийных устройств определяется состоянием разрядов регистров управления, а состояние периферийных устройств отражается состоянием разрядов регистров состояния. Имена и номера регистров ввода-вывода у микроконтроллеров разных типов указаны в приложении П4. Имена и номера разрядов регистров управления и разрядов регистров состояния приведена в приложении П5. 3.1. Параллельные порты ввода-вывода Число параллельных портов ввода-вывода, суммарное число выводов портов и суммарное число выводов, выполняющих альтернативные функции, у микроконтроллеров разных типов указано в табл. 1.1 в колонках Р, I/O и ALT соответственно. В табл. 3.1 приведены имена портов и указано число выводов (в числителе) и число выводов, выполняющих альтернативные функции (в знаменателе) для каждого порта в отдельности. В состав порта РХ (X = А, В, С, D, Е) входят три регистра ввода-вывода с именами DDRX, PORTX и PINX. Регистр PINX не имеет Работа периферийных устройств 41 аппаратной реализации. Это имя используется в командах, по которым выполняется чтение байтов на выводах порта. Число разрядов в регистрах равно числу выводов порта. Таб ли ца 3.1 Тип МК Имя порта PA PB PC PD PE PF t11 6/6 t12 6/6 t15 6/6 2323 3/2 2343 5/3 1200 8/2 7/2 2313 8/3 7/7 t28 4/1 8/5* 8/0 4433 6/6 6/6 8/8 8515 8/8 8/8 8/8 8/7 8535 8/8 8/8 8/2 8/8 m163 8/8 8/8 8/4 8/8 m103 8/8 8/8 8/8* 8/7 8/8 8/8* * — PC — только выходы; РВ, PF — только входы. На рис. 3.1. изображена структурная схема разряда Y (Y = 0, 1, ..., 7) порта РХ. Рис. 3.1 Состояние разряда DDRX.Y определяет направление передачи бита через вывод порта PX.Y. При DDRX.Y = 0 вывод PX.Y работает в режиме входа, при DDRX.Y = 1 — в режиме выхода. В режиме входа состояние разряда PORTX.Y определяет состояние вывода PX.Y При PORTX.Y = 0 вывод находится в высокоимпедансном состоянии (Z-состояние), при PORTX.Y = 1 вывод порта через внут 42 Глава 3 ренний резистор с сопротивлением 30—120 кОм подключается к шине VCC. В режиме входа вывод PX.Y соединен с шиной данных ШД.У. Значение входного сигнала на отдельном выводе порта может быть определено с использованием команд условного перехода с мнемокодом SBIC PINX, Y (№ ИЗ) или SBIS'PINX, Y (№ 114). При одном значении сигнала выбирается одно продолжение программы, при другом значении сигнала — другое продолжение. В режиме выхода разряд PORTX.Y определяет значение выходного сигнала на выводе PX.Y. При PORTX.Y = 0 выходной сигнал имеет низкий уровень напряжения (U0L), при PORTX.Y = 1 — высокий уровень напряжения (U0H). В табл. 3.2 указано состояние вывода порта PX.Y при различных комбинациях состояний разрядов DDRX.Y и PORTX.Y. Таб ли ца 3.2 DORX.Y PORTX.Y PX.Y 0 0 Вход, (Z) 0 1 Вход, (R) 1 0 Выход, (U0L) 1 1 Выход, (U0H) В статическом состоянии при низком уровне выходного сигнала ток нагрузки /OL должен быть не более, чем 20 мА, при высоком уровне сигнала ток нагрузки /он должен быть не более, чем 3 мА. При этом суммарный ток нагрузки для всех выводов микроконтроллера должен быть не более, чем некоторое пороговое значение (200—400 мА для микроконтроллеров разных типов) и суммарный ток нагрузки для выводов микроконтроллера, расположенных на одной стороне корпуса микросхемы, также должен быть не более, чем некоторое пороговое значение (100—200 мА для микроконтроллеров разных типов). Задание значения выходного сигнала на отдельных выводах порта выполняется с использованием команд с мнемокодами CBI PORTX, Y (№ 65) (для низкого уровня) и SBI PORTX, Y (№ 66) для высокого уровня. При совместном использовании всех разрядов порта для приема и выдачи байтов используются команды с мнемокодами IN Rd, PINX (№ 60) и OUT PORTX, Rr (№ 61) соответственно. Обращение к параллельному порту для приема и выдачи байтов может быть выполнено с использованием команд с обращением по адресам в адресном пространстве SRAM (№№ 34—57). При этом в качестве адресов используются номера регистров ввода-вывода, увеличенные на $20. Работа периферийных устройств 43 При пуске и перезапуске микроконтроллера все разряды регистров DDRX и PORTX всех портов сбрасываются в нулевое состояние и выводы портов работают в режиме входов и находятся в Z состоянии. Исключением является разряд PORTA.2 регистра PORTA в микроконтроллере типа t28, который устанавливается в единичное состояние. В микроконтроллере типа ml63 при установке в единичное состояние разряда PUD регистра SFIOR (№ $30) во всех разрядах всех портов разрывается цепь, связывающая вывод порта с шиной VCC через резистор. В микроконтроллере типа tl5 разряд PUD входит в регистр MCUCR (№ $35). В микроконтроллере типа t28 выводы порта РВ подключаются через резисторы к шине VCC при единичном состоянии разряда PLUPB регистра MCUCS. 3.2. Последовательный порт ввода-вывода SPI Порт SPI входит в состав периферийных устройств микроконтроллеров типа 4433, 8515, 8535, ш163 и ш103. Основным элементом порта SPI является восьмиразрядный реверсивный сдвигающий регистр, который используется для параллельного ввода из шины данных микроконтроллера байта, предназначенного для выдачи: последовательной выдачи байта на выход микроконтроллера с одновременным последовательным вводом байта со входа микроконтроллера и параллельной выдачи введенного байта в буферный регистр для последующей передачи в шину данных микроконтроллера. Сдвигающий регистр и буферный регистр имеют одно имя — SPDR (№ $0F). Запись байта в сдвигающий регистр выполняется по команде OUT SPDR, Rr, чтение байта из буферного регистра — по команде IN Rd, SPDR. В состав порта SPI входят также регистр управления SPCR (№ $0D), регистр состояния SPSR (№ $0Е) и элементы, управляющие работой порта. Структурная схема порта SPI изображена на рис. 3.2. Порт SPI переводится в рабочее состояние при установке в единичное состояние разряда SPE регистра SPCR. При этом выводы порта MOSI, MISO, SCK и SS подключаются к внешним выводам микроконтроллера в соответствии с табл. 3.3. Таб ли ца 3.3 Выводы порта SPI ТипМК 4433 8515 8535 m163 m103 MOSI РВЗ РВ5 РВ5 РВ5 РВ2 MISO РВ4 РВ6 РВ6 РВ6 РВЗ SCK РВ5 РВ7 РВ7 РВ7 РВ1 SS РВ2 РВ4 РВ4 РВ4 РВО 44 Глава 3 Рис. 3.2 Порт SPI может работать в режиме ведущего (master) или ведомого (slave). Выбор режима определяется состоянием разряда MSTR регистра SPCR. При MSTR=1 порт работает в режиме ведущего. При этом вывод MOSI является выходом, вывод MISO — входом, вывод SCK — выходом. Функция вывода SS зависит от состояния разряда DDRB.X (X = 2, 4, 0) регистра DDRB. Если DDRB.X = 1 (вывод РВ.Х является выходом), вывод SS порта SPI не подключен к выводу РВ.Х порта РВ. Если DDRB.X = 0 (вывод РВ.Х является входом), значение сигнала на этом входе влияет на работу порта SPI. При единичном значении сигнала на этом входе порт работает в режиме ведущего, а при появлении нулевого значения сигнала он переводится в режим ведомого и для возвращения в режим ведущего после появления единичного значения сигнала на входе SS требуется вновь установить разряд MSTR регистра SPCR в единичное состояние. В режиме ведущего обмен байтами начинается при записи байта в сдвигающий регистр SPDR (W). В схеме управления СУ1 вырабатывается серия из восьми импульсов, которая управляет сдвигом в регистре SPDR (W) и выдается на выход SCK для управления сдвигом в регистре ведомого порта. Работа периферийных устройств 45 Полярность импульсов определяется состоянием разряда CPOL регистра SPCR. При CPOL = 0 сигнал на выходе SCK в исходном состоянии имеет нулевое значение, импульс формируется при переходе сигнала к единичному значению. При CPOL = 1 сигнал в исходном состоянии имеет единичное значение и импульс формируется при переходе сигнала к нулевому значению. Направление сдвига в регистре и порядок следования битов на выходе MOSI определяется состоянием разряда DORD регистра SPCR. При DORD = 0 выдача байта начинается со старшего бита (D7), при DORD = 1 выдача начинается с младшего бита (DO). При выдаче каждого бита на выход MOSI соответствующий бит из ведомого порта поступает на вход MISO и вводится в сдвигающий регистр. Серия из восьми импульсов в ведущем порте формируется из тактового сигнала СК путем деления частоты в пересчетной схеме ПС. Коэффициент деления К определяется комбинацией состояний разрядов SPR0 и SPR1 регистра SPCR в соответствии с табл. 3.4. В микроконтроллере типа ш163 в регистре состояния SPSR есть дополнительный разряд SPI2X, при единичном состоянии которого скорость передачи увеличивается в два раза. Таб ли ца 3.4 SPR1 SPR0 к К1* 0 0 4 2 0 1 16 8 1 0 64 32 1 1 128 64 * — в МК типа т163 при SPI2X = 1 При завершении выдачи/приема байта устанавливается в единичное состояние разряд SPIF регистра состояния SPSR и при единичном состоянии разряда SPIE регистра SPCR в блок прерываний поступает запрос прерывания SPI STC (SPI Serial Transfer Complete). Разряд SPIF сбрасывается в нулевое состояние аппаратно при переходе к выполнению соответствующей прерывающей программы или при чтении регистра SPSR перед записью нового байта в регистр SPDR (W). При записи нового байта в регистр SPDR (W) в процессе сдвига ранее записанного байта устанавливается в единичное состояние разряд WCOL регистра SPSR (ошибка при вводе). Разряд WCOL сбрасывается в нулевое состояние при чтении регистра SPSR. При MSTR = 0 порт работает в режиме ведомого. В этом случае вывод MOSI работает как вход, вывод MISO — как выход, выводы SCK и SS — как входы. Выводы порта подключаются к соответствующим 46 Глава 3 выводам порта РВ при установке в единичное состояние разряда SPE регистра SPCR. Порт переходит в рабочее состояние при нулевом значении сигнала на входе SS. При поступлении серии импульсов на вход SCK из регистра SPDR (W) на вывод MISO последовательно выводится байт, ранее записанный в этот регистр. Одновременно в регистр вводится байт, поступающий на вход MOSI. При завершении обмена байтами устанавливается в единичное состояние разряд SPIF регистра SPSR и при единичном состоянии разряда SPIE в регистре SPCR в блок прерываний поступает запрос прерывания SPI STC. Состояние разрядов CPOL и DORD в регистре SPCR у ведомого порта должно совпадать с состоянием одноименных разрядов у ведущего порта. Состояние разрядов SPR0 и SPR1 не влияет на работу порта. Состояние разряда С РИА определяет значение сигнала на выходе MISO при переходе порта в рабочее состояние (SS = 0) до и после обмена байтами. При СРНА = 0 при переходе порта в рабочее состояние на выходе MISO появляется значение бита, который будет выдаваться первым, а значение сигнала после выдачи восьмого бита является неопределенным. При СРНА = 1 значение сигнала на выходе MISO при переходе порта в активное состояние является неопределенным, а после передачи восьмого бита на выходе MISO сохраняется значение переданного бита. Временные диаграммы сигналов на выходах SCK и MOSI ведущего микроконтроллера и выходе MISO ведомого микроконтроллера при разных состояниях разрядов CPOL, DORD и СРНА изображены па рис. 3.3. 5W ff0£-« CPOL = 1 ППОП-П —- — I I I I +-J I J 1— 1 1 Г” "T" 1 1 1 1 1 1 — — — — UUi\U-U MOSI ПОРП-1 07 DO 1 । DO j D7 rs “L_ 1 1 1 1 1 1 1 1 1 1 1 I CPHA.-O D7/0 MISO ' ? CPHA-I ? D7/0 Рис. 3.3 Работа периферийных устройств 47 При подключении к ведущему порту нескольких ведомых портов шины MOSI, MISO и SCK являются общими для всех портов, а выводы SS ведомых микроконтроллеров должны быть соединены со специальными выходами ведущего микроконтроллера с помощью отдельных шин. В качестве специальных выходов ведущего микроконтроллера могут использоваться любые выводы любых портов, не используемые в иных целях. 3.3. Последовательный порт ввода-вывода UART Порт UART входит в состав периферийных устройств микроконтроллеров типа 2313, 4433,8515, 8535, т163 и шЮЗ. Порт UART содержит передатчик, приемник, тактовый генератор и аппаратуру управления передачей и приемом. Передатчик получает байт из шины данных микроконтроллера и формирует и выдает последовательность битов (кадр), которая кроме битов, составляющих байт (DO, D1, .., D7), содержит стартовый бит (start), имеющий пулевое значение, и столовый бит (stop), имеющий единичное значение. Между старшим битом байта (D7) и стоповым битом может помещаться дополнительный бит (СВ). Структура кадра, содержащего 10 и И битов, показана на рис. 3.4,а и б соответственно. а) '__ \ /DO\D1\D2\D3^D4\D5\D6\D~^7 ' Start st°P ® /00^02^0ф5^07\св/ \ Start Stop Рис. 3.4 Приемник выделяет стартовый бит, принимает кадр, формат которого (число битов) задан, расформировывает принятый кадр и подготавливает байт для выдачи в шину данных микроконтроллера. Тактовый генератор формирует сигнал, определяющий скорость передачи и приема битов и позволяющий выделять биты при приеме кадра. В состав порта входят регистр данных передатчика UDR (Т), регистр данных приемника UDR (R), регистр управления UCR или UCSRB (№ $0А), регистр состояния USR или UCSRA (№ $0В), регистр задания скорости передачи/приема UBRR (№ $09) и другие элементы. Регистры данных передатчика и приемника имеют один номер — $0С. При обращении для записи выбирается регистр UDR (Т), при обращении для чтения — регистр UDR (R). Структурная схема порта UART изображена на рис. 3.5. 48 Глава 3 Рис. 3.5 Передатчик готов к работе при установке в единичное состояние разряда TXEN регистра управления UCR. При этом выход передатчика TXD подключается к выводу определенного порта микроконтроллера. Передача кадра начинается при загрузке байта в регистр UDR (Т). Загрузку можно выполнять при единичном состоянии разряда UDRE регистра состояния USR. При сбросе микроконтроллера в исходное состояние устанавливается UDRE = 1. Загруженный байт передается в сдвигающий регистр передатчика TSR и происходит выдача кадра на выход микроконтроллера TXD. При нулевом состоянии разряда CHR9 регистра UCR формируется кадр из десяти битов. При CHR9 = 1 кадр содержит одиннадцать битов. Значение дополнительного бита в этом случае должно быть указано в разряде ТХВ8 регистра UCR. Первый байт при загрузке немедленно передается в регистр TSR и разряд UDRE регистра USR сохраняет единичное состояние, что позволяет сразу после загрузки первого байта загружать в регистр UDR (Т) Работа периферийных устройств 49 второй байт. Второй и последующие байты сохраняются в регистре UDR (Т) до завершения выдачи из регистра TSR предыдущего кадра. При этом разряд UDRE регистра USR находится в нулевом состоянии и загрузка очередного байта в регистр UDR (Т) запрещена. При завершении выдачи кадра из регистра TSR и отсутствии очередного байта в регистре UDR (Т) устанавливается в единичное состояние разряд ТХС регистра USR и при единичном состоянии разряда TXCIE регистра UCR в блок прерываний поступает запрос прерывания UART ТХС. Разряд ТХС регистра USR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению соответствующей прерывающей программы или программно при выполнении команды установка бита в единичное состояние (!). При единичном состоянии разряда UDRE регистра USR и единичном состоянии разряда UDRIE регистра UCR в блок прерываний поступает запрос прерывания UART DRE. Разряд UDRE сбрасывается в нулевое состояние при записи байта в регистр UDR (Т). Прерывающая программа, выполняемая по запросу прерывания UART DRE, должна содержать команду записи в регистр UDR (Т) для прекращения действия этого запроса прерывания. Приемник готов к работе при установке в единичное состояние разряда RXEN регистра UCR. При этом вход приемника RXD подключается к выводу определенного порта микроконтроллера. При обнаружении на входе RXD отрицательного фронта сигнала, приемник определяет уровень сигнала в момент времени, отстоящий от фронта на половину интервала, отводимого на передачу бита при заданной скорости передачи. При обнаружении нулевого уровня принимается решение о приеме стартового бита и далее определяются уровни сигнала в моменты времени, отстоящие друг от друга на интервал, отводимый на передачу бита. Получаемая последовательность значений вводится в сдвигающий регистр приемника RSR. Если принимается кадр из одиннадцати битов (CHR9 = 1), дополнительный бит принимается в разряд RXB8 регистра UCR. Если на месте ожидаемого стопового бита сигнал имеет нулевое значение, устанавливается в единичное состояние разряд FE регистра USR (ошибка формата). Разряд FE сбрасывается в нулевое состояние при появлении единичного значения стопового бита. Принятый байт из регистра RSR переписывается в регистр UDR (R). При этом устанавливается в единичное состояние разряд RXC регистра USR и при единичном состоянии разряда RXCIE регистра UCR в блок прерываний поступает запрос прерывания UART RXC. Разряд RXC регистра USR сбрасывается в нулевое состояние при чтении регистра UDR (R). Прерывающая программа, выполняемая по запросу прерывания UART RXC, должна содержать команду чтения из регистра UDR для прекращения действия этого запроса. 50 Гпава 3 Если при завершении приема кадра принятый ранее байт не считан из регистра UDR (R), устанавливается в единичное состояние разряд OR регистра USR (состояние переполнения). Разряд OR сбрасывается в нулевое состояние при передаче байта из регистра RSR в регистр UDR (R). Тактовый генератор BRG формирует сигнал, определяющий скорость передачи и приема битов и дополнительный сигнал, обеспечивающий выделение битов при приеме кадра. Скорость передачи и приема BR, бит/с, зависит от частоты тактового сигнала микроконтроллера FCK и числа (UBRR), двоичный код которого записан в регистре UBRR, и определяется по формуле: 16((UBRR) + 1) ‘ Для работы со стандартными скоростями приема-передачи (4800, 9600,14400, 19200, 28800, 38400, 57600, 76800 и 115200 бит/с) используются кварцевые резонаторы со специальными значениями резонансной частоты (3, 6864; 7,3728; 11,059 Мгц). В порте UART микроконтроллеров типа 4433 и ml63 регистр управления вместо имени UCR имеет имя UCSRB, а регистр состояния вместо имени USR — имя UCSRA. Регистр UCSRA имеет дополнительный разряд МРСМ. При единичном состоянии разряда приемник принимает кадры, у которых дополнительный бит (СВ) имеет единичное значение и игнорирует кадры при СВ = 0. При нулевом состоянии разряда МРСМ принимаются кадры с любым значением дополнительного бита. Наличие разряда МРСМ позволяет организовать простейшую локальную сеть (мультипроцессорную систему), в которой имеется один ведущий контроллер и несколько ведомых. Каждому ведомому контроллеру присваивается определенный номер. В исходном состоянии у всех ведомых контроллеров МРСМ = 1. Ведущий контроллер передает кадр, в котором СВ = 1, а байт является номером ведомого котроллера, который должен принять данные из ведущего. Все ведомые контроллеры принимают кадр. Контроллер, опознавший свой номер, сбрасывает разряд МРСМ в нулевое состояние. Далее ведущий контроллер передает кадры, в которых СВ = 0, а байты представляют собой данные для выбранного ведомого контроллера. Эти кадры принимаются только ведомым контроллером, у которого МРСМ = 0. Прп обнаружении кадра с СВ - 1 выбранный контроллер переводит разряд МРСМ в единичное состояние и переходит в исходное состояние. В микроконтроллере типа ш163, кроме того, регистр UCSRA имеет дополнительный разряд U2X, а для задания скорости передачи используются два регистра — регистр UBRR (№$09) для задания младших Работа периферийных устройств 51 восьми разрядов кода числа и регистр UBRRHI (№$20) для задания старших четырех разрядов кода числа. Скорость передачи определяется по формуле K((UBRRHI, UBRR) + 1) ’ где К = 16 при U2X = 0, К = 8 при U2X = 1. В табл. 3.5. указаны выводы портов микроконтроллеров, используемые в качестве входа приемника (RXD) и выхода передатчика (TXD) у микроконтроллеров разных типов. Таблица 3.5 Вывод порта UART Тип МК 2313 4433 8515 8535 m163 тЮЗ RXD PD0 PD0 PDO PDO PDO PEO TXD PD1 PD1 PD1 PD1 PD1 PE1 3.4. Последовательный порт ввода-вывода TWSI (I2C) Порт TWSI входит в состав периферийных устройств микроконтроллера типа ml63. Через порт TWSI микроконтроллер подключается к двухпроводной шине IC. Схема подключения нескольких устройств (У 1, ..., УЫ) к шине IC изображена на рис. 3.6. Рис. 3.6 Устройство может работать в качестве ведущего или ведомого. Статус микроконтроллера, подключенного к шине IC, устанавливается программными средствами. Линия SCL предназначена для передачи синхросигнала из веду него устройства в ведомое. Линия SDA совместно с линией SCL используется для передачи сигналов начала и конца обмена, адресных байтов и байтов данных и сигналов подтверждения приема байта. Линии SCL и SDA соединены с одноименными выводами подключенных устройств. 52 Глава 3 Кроме того, они через резисторы R1 и R2 подключены к шине VCC. При отсутствии обмена в линиях SCL и SDA устанавливается высокий уровень сигнала. Ведущее устройство после перевода его в активное состояние дожидается освобождения шины от обмена между другими устройствами и формирует в шине посылку начала обмена {Start, ST), которая представлена переходом сигнала в линии SDA от высокого уровня к низкому уровню при высоком уровне сигнала в линии SCL. После выдачи посылки ST в линии SCL устанавливается низкий уровень сигнала и далее формируется последовательность из девяти положительных импульсов. Установка требуемого значения бита в линии SDA производится при низком уровне сигнала в линии SCL. Передача байта начинается со старшего разряда. Первым байтом, выдаваемом в шину ведущим устройством после выдачи посылки ST, является адресный байт. Старшие семь битов адресного байта представляют номер (адрес) ведомого устройства, с которым будет выполняться обмен, (А6, ..., АО), а младший бит W/R определяет направление обмена. При W/R = 0 байты данных будут передаваться из ведущего устройства в ведомое, при W/R = 1 — в противоположном направлении. Ведомое устройство после получения восьмого бита устанавливает в линии SDA низкий уровень сигнала, что является подтверждением приема байта для ведущего устройства, {Acknowledge, АСК). После адресного байта ведущее устройство передает (при W/R = 0) или принимает (при W/R = 1) байты данных. При передаче байта данных принимающее устройство после приема восьмого бита устанавливает в линии SDA низкий уровень сигнала (АСК), а передающее устройство при появлении девятого импульса опрашивает состояние линии SDA. Низкий уровень сигнала является подтверждением приема байта данных. При обнаружении высокого уровня подтверждения нет {No Acknowledge, NAC), что свидетельствует об отсутствии обмена или ошибке при передаче байта. После успешной передачи байта данных возможны три варианта продолжения работы ведущего устройства: 1) передача следующего байта в том же направлении с участием того же ведомого устройства; 2) выбор другого ведомого устройства или смена направления обмена или то и другое; 3) окончание обмена с освобождением линии. В первом случае ведущее устройство формирует последовательность из девяти импульсов и выполняется пересылка очередного байта данных. Во втором случае ведущее устройство формирует посылку ST и выдает новый адресный байт. В третьем случае ведущее устройство формирует посылку конца обмена {Stop, SP), которая представляется переходом Работа периферийных устройств 53 гигнала в линии SDA от низкого уровня к высокому при высоком уровне сигнала в линии SCL. На рис. 3.7 изображены временные диаграммы сигналов в линиях SDA и SCL при начале обмена (а), при завершении передачи адресного байта (б), при начале передачи байта данных (в) и при завершении обмена (г). _М4 С_ \ АО \ W/R \ АСК Рис. 3.7 Все ведомые устройства при обнаружении в шине посылки ST принимают адресный байт и сравнивают полученный адрес с собственным адресом, который хранится в одном из регистров порта. При совпадении адресов формируется посылка АСК и устройство переводится в режим ожидания очередной серии из девяти импульсов для приема или передачи байта данных в зависимости от значения бита W/R в принятом адресном байте. Все перечисленные операции в ведомом устройстве выполняются аппаратно. Порт TWSI у микроконтроллера типа ml63 содержит 5 регистров ввода-вывода: регистр данных TWDR (№ $03); регистр адреса TWAR (№ $02); регистр состояния TWSR (№ $01); регистр задания скорости передачи TWBR (№ $00); регистр управления TWCR (№ $36). Структурная схема порта TWSI изображена на рис. 3.8. Порт переводится в активное состояние при установке в единичное состояние разряда TWEN регистра TWCR. При этом выводы порта SCL и SDA подключаются к внешним выводам микроконтроллера PC0 и РС1 соответственно. 54 Глава 3 Рис. 3.8 Порт начинает работать в качестве ведущего после установки в единичное состояние разряда TWSTA регистра TWCR. При работе в качестве ведущего генератор G формирует импульсный сигнал, который через буферную схему I/OCL выдается в линию SCL. Скорость передачи битов определяется числом, код которого записан в регистре TWBR. Положение фронтов импульсов в импульсном сигнале связано с выполнением определенных операций в порте и может изменяться в некоторых пределах. Осредненное значение скорости передачи BR, бит/с, определяется по формуле ск RR - 16 + 2(TWBR) + £АЛзк где FCK — тактовая частота микроконтроллера; (TWBR) — число, код которого записан в регистр TWBR ((TWBR)>7); tA — показатель, учитывающий растяжение некоторых интервалов между фронтами импульсов (tA = 200—600 нс). Работа периферийных устройств 55 При работе порта в качестве ведомого порядок его работы определяется импульсной последовательностью, которая через вывод SCL и буферную схему I/OCL поступает в схему управления СУ. Регистр TWDR имеет цепи для сдвига кода влево. В него параллельно записываются байты, предназначенные для последовательного вывода в линию SDA через буферную схему I/ODA, и последовательно вводятся байты, поступающие из линии SDA через буферную схему I/ODA. Импульсы сдвига поступают из схемы управления. Регистр TWAR используется только при работе порта в качестве ведомого. Код, записанный в старших семи его разрядах, представляет собственный адрес микроконтроллера (А6,..., АО). Этот код сравнивается с помощью схемы сравнения СС с кодом в старших семи битах адресного байта, принятого в регистр TWDR. Младший разряд TWGCE регистра TWAR разрешает прием байтов данных (при TWGCE = 1) после получения адресного байта с адресом общего вызова для всех ведомых микроконтроллеров ($00). Регистр TWCR содержит разряды, определяющие работу схемы управления, (TWEA, TWSTA, TWSTO и TWEN), отражающие состояние порта (TWINT и TWWC) и разряд TWIE, разрешающий поступление запроса прерывания из порта в блок прерываний. Запрос прерывания TWSI поступает в блок прерываний при TWINT = 1 и TWIE = 1. Код, формируемый в регистре TWSR, отражает состояние порта TWSI на различных этапах его работы. Порт может работать в следующих режимах: 1) ведущий с передачей байтов данных; 2) ведущий с приемом байтов данных; 3) ведомый с приемом байтов данных; 4) ведомый с передачей байтов данных. В табл. 3.6. описан порядок управления портом TWSI при работе его в качестве ведущего с передачей байтов (табл. 3.6,а) и с приемом байтов (табл. 3.6,6) при отсутствии ошибок в процессе обмена. В таблице используются следующие обозначения: SLA, W/R — адресный байт, где SLA — адрес ведомого устройства; DATA — байт данных; (TWSR) — байт в регистре TWSR; (TWDR) — байт в регистре TWDR; := — знак операции установки разряда регистра TWCR в указанное состояние. В исходном состоянии разряд TWEN в регистре TWCR находится в единичном состоянии, остальные разряды — в нулевом состоянии. В табл. 3.7. описан порядок управления портом TWSI при работе его в качестве ведомого с приемом байтов (в табл. 3.7,я) и с передачей байтов (в табл. 3.7,6) при отсутствии ошибок в процессе обмена. 56 Глава 3 В исходном состоянии разряды TWEN и TWEA регистра TWCK находятся в единичном состоянии, другие разряды — в нулевом состоянии; в регистре TWAR записан байт SLA, 0/1. Таб ли ца 3.6 № шага Операция по команде в программе Условие перехода к следующему шагу а) ведущий с передачей байтов данных 1 TWSTA.-1 TWINT-1, (TWSR)-$08 2 SLA, 0-TWDR 3 TWINT:=0 TWINT-1, (TWSR)-$18 4 DATA-*TWDR 5 TWINT.-O TWINT-1, (TWSR)=$28 Выполнение шагов 4, 5 N TWSTO:=1 - конец передачи, освобождение шины IC N TWSTO:=1,TWSTA:=1 TWINT-1, (TWSR)-$10 N+1 Выполнение шага 2 в табл, а) или б) и далее б) ведущий с приемом байтов данных 1 TWSTA:=1 TWINT-1, (TWSR)=$08 2 SLA, 1-TWDR 3 TWINT:=0 TWINT-1, (TWSR)-$40 4 (TWDR)-Rd 5 TWINT:=0 TWINT-1, (TWSR)-$50 ... Выполнение шагов 4, 5 м TWSTO:=1 — конец приема, освобождение шины IC м TWSTO:=1,TWSTA:=1 TWINT-1, (TWSR)-$10 М+1 Выполнение шага 2 в табл, а) или б) и далее Таб ли ца 3.7 № шага Условие выполнения шага Операция по команде в программе а) ведомый с приемом байтов данных 1 TWINT-1, (TWSR)=$60/$70 (TWDR)—Rd 2 TWINT:=0 3 TWINT-1, (TWSR)=$80/$90 (TWDR)-Rd 4 TWINT:=0 ... Далее шаги 3, 4 Работа периферийных устройств 57 Окончание табл. 3.7 № шага Условие выполнения шага Операция по команде в программе б) ведомый с выдачей байтов данных 1 TWINT-1, (TWSR)=$A8 DATA-*TWDR 2 TWINT:=0 3 TWINT-1, (TWSR)=$B8 DATA-»TWDR 4 TWINT:=0 Далее шаги 3, 4 Единичное состояние разряда TWINT в процессе обмена может определяться программными средствами с использованием команды условного перехода или аппаратными средствами по запросу прерывания TWSI. Во втором случае при инициализации порта необходимо установить в единичное состояние также разряд TWIE регистра TWCR. При появлении ошибок в процессе обмена в регистре состояния TWSR появляются коды иные, чем указаны в табл. 3.6 и 3.7. Разряд TWWC регистра TWCR устанавливается в единичное состояние при попытке записать код в регистр TWDR во время сдвига кода в регистре. 3.5. Таймеры-счетчики общего назначения Таймер-счетчик Т/СХ (X = 0, 1, 2 — цифра в имени таймера-счетчика) любого типа содержит базовый счетчик TCNTX, имеющий восемь или шестнадцать разрядов, и восьмиразрядный регистр управления TCCRX. Кроме того, в состав таймера-счетчика входят один или несколько разрядов регистра запросов, прерывания TIFR (№ $38, у МК типа t28 — № $05) и столько же разрядов регистра маскирования прерываний TIMSK (№ $39, у МК типа t28 - № $06). Регистры TIFR и TIMSK являются общими для всех таймеров-счетчиков микроконтроллера. Разряд регистра TIFR устанавливается в единичное состояние при формировании в таймере-счетчике определенного запроса прерывания. Запрос прерывания проходит в блок прерываний при единичном состоянии соответствующего разряда регистра TIMSK. Разряд регистра TIFR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению соответствующей прерывающей программы или программно при выполнении команды установки бита в единичное состояние (!). В состав таймера-счетчика, выполняющего функцию сравнения/PWM, входит регистр сравнения OCRX, а в состав таймера-счетчика, выполняющего функцию захвата, — регистр захвата ICRX. Разрядность регистров OCRX и ICRX равна разрядности базового счетчика TCNTX. 58 Глава 3 Для записи кода в шестнадцатиразрядный счетчик или регистр сначала выполняется команда записи (OUT) байта в старшую половину разрядов (Н), при этом поступавший из регистра общего назначения старший байт запоминается в регистре временного хранения. Затем выполняется команда записи (OUT) младшего байта в младшую половину разрядов (L), при этом оба байта одновременно записываются в счетчик или регистр. Для чтения кода из шестнадцатиразрядного счетчика или регистра сначала выполняется команда чтения (IN) байта из младшей половины разрядов (L), при этом считанный младший байт поступает в регистр общего назначения, а старший байт запоминается в регистре временного хранения. Затем выполняется команда чтения байта из старшей половины разрядов (Н), при этом старший байт из регистра временного хранения поступает в указанный в команде регистр общего назначения. 3.5.1. Таймер-счетчик типа А Таймер-счетчик типа А есть у микроконтроллеров всех типов кроме микроконтроллера типа шЮЗ. Он имеет имя Т/СО (X = 0). Таймер-счетчик типа А формирует запрос прерывания Т/СО OVF при переполнении восьмиразрядного базового счетчика TCNT0 (№ $32, у МК типа t28 — № $03). Структурная схема таймера-счетчика типа А изображена на рис. 3.9. Рис. 3.9 Тактовый сигнал микроконтроллера СК поступает в пересчетную схему (prescaler) ПС, представляющую собой десятиразрядный счетчик, где выполняется деление частоты тактового сигнала на 8, 64, 256 и 1024 Сигналы с четырех выходов пересчетной схемы поступают в схему управления СУ (мультиплексор). При наличии в микроконтроллере таймера-счетчика Т/Cl эти же сигналы поступают в Т/С1. Работа периферийных устройств 59 В схему управления поступают также тактовый сигнал СК и сигнал из внешнего источника, принимаемый на вход ТО. В качестве входа ТО у микроконтроллеров типа 1200, 2313 и 4433 используется вывод порта PD4, у микроконтроллеров типа 2323, 2343 и серии ATtiny — вывод порта РВ2, а у микроконтроллеров типа 8515, 8535 и ml63 — вывод порта РВО. Схема управления в зависимости от комбинации состояний разрядов CS00, CS01 и CS02 регистра управления TCCR0 (№$33, у МК тип 128 — № $04) передает один из поступающих сигналов на счетный вход базового счетчика TCNT0, ведущего счет на сложение. Сигналы, используемые для счета в счетчике TCNT0 при разных комбинациях значений в разрядах регистра TCCR0, указаны в табл. 3.8. Таблица 3.8 CS02 CS01 CS00 сигнал 0 0 0 нет 0 0 1 СК 0 1 0 СК/8 0 1 1 СК/64 1 0 0 СК/256 1 0 1 СК/1024 1 1 0 Отрицательный фронт на ТО 1 1 1 Положительный фронт на ТО При переполнении счетчика TCNT0 устанавливается в единичное состояние разряд TOVO регистра T1FR и при единичном состоянии разряда TOIEO регистра TIMSK в блок прерываний поступает запрос прерывания Т/СО OVF. В микроконтроллере типа tl5 в работе таймера-счетчика типа А участвуют разряд PSR0 регистра SFIOR (№ $2С). При установке этого разряда в единичное состояние сбрасывается в исходное (нулевое) состояние пересчетная схема ПС. Разряд PSR0 возвращается в нулевое состояние аппаратно. В микроконтроллере типа ml63 аналогичная операция выполняется при установке в единичное состояние разряда PSR10 регистра SFIOR (№ $30). 3.5.2. Таймер-счетчик типа В Таймер-счетчик типа В входит в состав периферийных устройств микроконтроллеров типа tl5 (Т/Cl) и ml03 (Т/С2). Он формирует запрос прерывания Т/СХ OVF при переполнении восьмиразрядного базового счетчика TCNTX и выполняет функцию сравпепия/PWM с фор 60 Глава 3 мированием запроса прерывания Т/СХ СОМР. Структурная схема таймера-счетчика типа В микроконтроллера типа ml03 (X = 2) изображена на рис. 3.10. Тактовый сигнал микроконтроллера СК поступает в пересчетную схему ПС, где частота сигнала делится на 8, 64, 256 и 1024. Сигналы с четырех выходов пересчетной схемы поступают в схему управления СУ1 и в таймер-счетчик Т/Cl типа Е. В схему управления СУ1 поступают также тактовый сигнал СК и сигнал из внешнего источника, принимаемый на вход Т2 (вывод порта PD7). При выполнении функции сравнения/PWM вывод порта РВ7 используется в качестве выхода OC2/PWM2 для выдачи сигнала, формируемого при совпадении сравниваемых кодов или сигнала PWM2. Схема управления СУ1 в зависимости от комбинации состояний разрядов CS20, CS21 и CS22 регистра управления TCCR2 передает на счетный вход базового счетчика TCNT2 один из поступающих сигналов в соответствии с табл. 3.8 (при X = 2). При переполнении базового счетчика устанавливается в единичное состояние разряд TOV2 регистра TIFR и при единичном состоянии разряда TOIE2 регистра TIMSK в блок прерываний поступает запрос прерывания Т/С2 OVF. Режим работы таймера-счетчика определяется комбинацией состояний разрядов PWM2, СОМ21 и СОМ20 регистра TCCR2. При нулевом состоянии трех названных разрядов формируется только запрос прерывания Т/С2 OVF. При PWM2 = 0 и других комбинациях состояний Работа периферийных устройств(з f разрядов С0М21 и СОМ20 выполняется функция сравнения. Код, формируемый в базовом счетчике TCNT2, с помощью компаратора К сравнивается с кодом, записанным в регистре OCR2. При совпадении кодов устанавливается определенное значение сигнала на выходе ОС2 (вывод порта РВ7), переводится в единичное состояние разряд OCF2 регистра TIFR и при единичном состоянии разряда OCIE2 регистра TIMSK в блок прерываний поступает запрос прерывания Т/С2 СОМР. Значение сигнала, устанавливаемого на выходе ОС2 при совпадении кодов, определяется комбинацией состояний разрядов СОМ20 и СОМ21 регистра TCCR2 в соответствии с табл. 3.9. Таб ли ца 3.9 СОМ21 СОМ20 Значение сигнала 0 1 изменяется 1 0 0 1 1 1 Работа базового счетчика при выполнении функции сравнения зависит от состояния разряда СТС2 регистра TCCR2. При СТС2 = 0 базовый счетчик после совпадения кодов продолжает счет до переполнения и далее выполняет счет, начиная с 0. При СТС2 = 1 базовый счетчик при совпадении кодов сбрасывается в нулевое состояние и продолжает счет, начиная с 0. При PWM2 = 1 и СОМ21 = 1 выполняется функция PWM. Базовый счетчик ведет счет на сложение до получения кода максимального числа (255), переводится в режим счета на вычитание и в этом режиме ведет счет до получения кода минимального числа (0) и далее вновь переходит в режим счета на сложении. Акт переполнения (переход от кода числа 255 к коду числа 0) в данном случае отсутствует. Запрос прерывания Т/С2 OVF формируется при переходе от числа 0 к числу 1. Состояние разряда СОМ20 определяет вид изменения выходного сигнала при совпадении кодов в счетчике и регистре сравнения. На рис. 3.11 изображены графики изменения числа в счетчике TCNT2 и временные диаграммы сигнала PWM на выходе ОС2 при заданном коде числа в регистре сравнения (OCR2) при разных состояниях разряда СОМ20. Период сигнала PWM (Т) в 510 раз больше периода сигнала, поступающего на счетный вход базового счетчика. При записи байта в регистр OCR2 (по команде с мнемокодом операции OUT) байт принимается в регистр временного хранения, из регистра которого переписывается в регистр OCR2 при появлении в базовом счетчике кода числа 255. При этом исключается появление в сигнале PWM импульса со случайной длительностью. 62 Гпава 3 a) СОМ20=0 б) С ОМ 20= / Рис. 3.11 Таймер-счетчик типа В в микроконтроллере типа 115 имеет имя Т/С1 (X = 1). Исходный сигнал для работы таймера-счетчика (РСК) имеет частоту 25,6 МГц при частоте тактового сигнала микроконтроллера 1,6 МГц (1/16 РСК). В регистре управления имеется дополнительный разряд CS13. Выбор сигнала для передачи на счетный вход базового счетчика определяется комбинацией состояний разрядов CS13, CS12, CS11 и CS10 в соответствии с табл. 3.10. Вход для приема сигнала из внешнего источника отсутствует. Таб ли ца 3.10 CS13 CS12 CS11 CS10 Сигнал 0 0 0 0 нет 0 0 0 1 РСК (16 СК) 0 0 1 0 РСК/2 (8 СК) 0 0 1 1 РСК/4 (4 СК) 0 1 0 0 РСК/8 (2 СК) 0 1 0 1 РСК/16(СК) 0 1 1 0 СК/2 0 1 1 1 СК/4 1 0 0 0 СК/8 1 0 0 1 СК/16 1 0 1 0 СК/32 1 0 1 1 СК/64 1 1 0 0 СК/128 1 1 0 1 СК/256 1 1 1 0 СК/512 1 1 1 1 СК/1024 Работа периферийных устройств 63 В состав таймера-счетчика входят два регистра сравнения — OCR10 н OCR11. Регистр OCR10 используются при выполнении функции сравнения. Регистр OCR11 используется совместно с регистром OCR10 при выполнении функции PWM. Базовый счетчик работает в режиме счета на сложение и ведет счет от 0 до числа, код которого записан в регистре OCR11. Графики изменения числа в базовом счетчике и временные диаграммы сигнала PWM изображены на рис. 3.12. Сигнал 0C1/PWM выдается на вывод порта РВ1. РВ1 РВ1 з) сомю=о б) СОМ1О=1 Рис. 3.12 В микроконтроллере типа tl5 в работе таймера-счетчика Т/Cl участвуют разряды FOC1A и PSR1 регистра SFIOR (№ $2С). В режиме сравнения при установке в единичное состояние разряда FOCI А на выходе ОС1 устанавливается требуемое значение сигнала немедленно, не дожидаясь совпадения кодов в базовом счетчике и регистре сравнения. При этом запрос прерывания Т/Cl СОМР не формируется п базовый счетчик не сбрасывается в нулевое состояние при СТС1 = 1. Разряд FOCI А сбрасывается в нулевое состояние аппаратно. В режиме PWM он не используется. При установке в единичное состояние разряда PSR1 сбрасывается в исходное (нулевое) состояние пересчетная схема ПС. Разряд сбрасывается в нулевое состояние аппаратно. 3.5.3. Таймер-счетчик типа С Таймер-счетчик типа С входит в состав периферийных устройств микроконтроллеров типа 8535 и ml63 (Т/С2) и типа ш103 (Т/СО). Он формирует запрос прерывания Т/СХ OVF при переполнении восьмиразрядного базового счетчика TCNTX, может выполнять функцию сравнения/PWM и работать в режиме счета реального времени. В структуру таймера-счетчика типа С входят все элементы таймера-счетчика типа В (рис. 3.10) и, кроме того, регистр ASSR (№ $30), мультиплексор 64 Глава 3 М и внутренний генератор G. Дополнительные элементы изображены на схеме рис. 3.13 (для микроконтроллера типа ml03, X = 0). TOSC2 Рис. 3.13 В качестве исходного сигнала для работы базового счетчика TCNT0 может использоваться тактовый сигнал микроконтроллера СК или сигнал TOSC1 из дополнительного внутреннего генератора G, к которому через выводы TOSC1 и TOSC2 подключен кварцевый резонатор КР2. При частоте резонатора 32768 Гц ("часовой" кварц) параметры процессов в таймере-счетчике с высокой точностью привязаны к единице измерения реального времени — секунде. При нулевом состоянии разряда AS0 регистра ASSR используется тактовый сигнал СК, при единичном состоянии — сигнал генератора G (режим реального времени). Выбранный сигнал РСКО с выхода мультиплексора М поступает в пересчетную схему ПС, в которой выполняется деление частоты на 8, 32, 64, 128, 256 и 1024. Сигналы с шести выходов пересчетной схемы и сигнал с выхода мультиплексора поступают в схему управления СУ1. Выбор сигнала для передачи на счетный вход базового счетчика определяется комбинацией состояний разрядов CS00, CS01 и CS02 регистра управления TCCR0 в соответствии с табл. 3.11. Таб ли ца 3.1 1 CS02 CS01 CS00 Сигнал 0 0 0 нет 0 0 1 РСКО 0 1 0 РСКО/8 0 1 1 РСКО/32 1 0 0 РСКО/64 1 0 1 РСКО/128 1 1 0 РСКО/256 1 1 1 РСК0/1024 Работа периферийных устройств 65 При работе в режиме реального времени (AS0 =1) процесс счета в базовом счетчике привязан к сигналу TOSC1, а запись в регистры TCCR0 и OCRO и в счетчик TCNT0 — к сигналу СК. Для исключения конфликтных ситуаций в счетчике TCNT0 в режиме реального времени используются регистры временного хранения. При записи кода (по команде OUT) байт принимается в соответствующий регистр временного хранения, при этом устанавливается в единичное состояние соответствующий разряд регистра ASSR — TCN0UB при записи в счетчик TCNTO, OCROUB при записи в регистр OCRO, TCR0UB при записи в регистр TCCR0. Перепись байта из регистра временного хранения в основной регистр или счетчик привязана к сигналу TOSC1, при этом соответствующий разряд регистра ASSR сбрасывается в нулевое состояние. Очередная запись в регистр или счетчик по команде OUT может производиться при нулевом состоянии соответствующего разряда регистра ASSR. У микроконтроллеров типа 8535 и ml63 для подключения кварцевого резонатора КР2 используются выводы порта РС6 и РС7, а у микроконтроллеров типа ml03 — специальные выводы корпуса. В таймере-счетчике типа С в микроконтроллере типа ml63 (X = 2) в регистре TCCR2 имеется дополнительный разряд FOC2 и в регистре SFIOR — дополнительный разряд PSD2. В режиме сравнения при установке в единичное состояние разряда FOC2 сигнал на выходе ОС2 принимает требуемое значение немедленно, не дожидаясь совпадения сравниваемых кодов. При этом запрос прерывания Т/С2 СОМР не формируется и базовый счетчик не сбрасывается. Сброс разряда FOC2 в нулевое состояние выполняется аппаратно. В режиме PWM разряд FOC2 не используется. При установке в единичное состояние разряда PSR2 сбрасывается в исходное (нулевое) состояние пересчетная схема ПС. Сброс разряда PSR2 в нулевое состояние выполняется аппаратно. 3.5.4. Таймер-счетчик типа D Таймер-счетчик типа D входит в состав периферийных устройств микроконтроллеров типа 2313 и 4433, и имеет имя Т/Cl. Он содержит шестнадцатиразрядный базовый счетчик п выполняет функции захвата и сравпепия/PWM. Структурная схема таймера-счетчика изображена на рис. 3.14. На счетный вход шестнадцатиразрядного базового счетчика TCNT1H, L с выхода схемы управления СУ1 может поступать тактовый сигнал микроконтроллера СК, или один из четырех сигналов из пересчетной схемы, которая является общей для таймеров-счетчиков Т/СО и Т/С1 (см. рис. 3.9.), или сигнал из внешнего источника, принимаемый на вход Т1. В качестве входа Т1 используется вывод порта PD5. Выбор 66 Глава 3 сигнала определяется комбинацией состояний разрядов CS10, CS11 г CS12 регистра управления TCCR1B в соответствии с табл. 3.8 (X = 1 Т0 = Т1). При переполнении базового счетчика устанавливается в единичное состояние разряд TOV1 регистра TIFR и при единичном состоянии разряд TOIE1 регистра TIMSK в блок прерываний поступает запрос прерывания Т/Cl OVF. Рис. 3.14 Схема управления СУ2 управляет выполнением функции захвата, которая заключается в передаче кода, сформированного в базовом счетчике, через ключевую схему КС в шестнадцатиразрядный регистр захвата ICR1H, L. При этом устанавливается в единичное состояние разряд ICF1 регистра TIFR и при единичном состоянии разряда TICIE1 регистра TIMSK в блок прерываний поступает запрос прерывания Т/Cl С APT. Захват выполняется при изменении значения внешнего сигнала, поступающего на вход ICP, или внутреннего сигнала АСО, поступающего из аналогового компаратора. Выбор сигнала определяется состоянием разряда ACIC регистра ACSR, который входит в состав аналогового компаратора. При ACIC = 0 используется внешний сигнал, при ACIC = 1 — внутренний. Вид изменения сигнала, при котором выполняется захват, определяется состоянием разряда ICES1 регистра TCCR1B. При ICES1 = О Работа периферийных устройств 67 захват выполняется при появлении отрицательного фронта сигнала, а при ICES 1 » 1 — положительного фронта. В качестве входа ICP у микроконтроллера типа 2313 используется вывод порта PD6, а у микроконтроллера типа 4433 — вывод порта РВО. Разряд ICNC1 регистра TCCR1B управляет работой схемы подавления помех. При ICNC1 = 0 захват выполняется при каждом появлении фронта заданной полярности. При ICNC1 = 1 захват происходит, если перед появлением фронта в течение четырех тактов сигнал сохраняет постоянное значение. Схема управления СУЗ управляет выполнением функции сравне-иия/PWM. Функция сравнения заключается в выдаче определенного значения сигнала на выходе ОС1 при совпадении кодов в базовом счетчике и шестнадцатиразрядном регистре сравнения OCR1H, L, которое выявляется с помощью компаратора К. При этом также устанавливается в единичное состояние разряд OCF1A регистра TIFR и при единичном состоянии разряда OCIE1A регистра TIMS К в блок прерываний поступает запрос прерывания Т/Cl СОМР. Функция PWM заключается в выдаче на выход ОС1 импульсного сигнала с заданным периодом повторения и заданной длительностью импульса. При этом также периодически формируется запрос прерывания Т/Cl СОМР. Работа схемы СУЗ определяется комбинацией состояний разрядов PWM10, PWM11, СОМ1АО и СОМ1А1 регистра управления TCCR1A. При нулевом состоянии всех четырех разрядов функция сравнения/PWM не выполняется и выход ОС1 отключен от вывода порта. При PWM10 = 0, PWM11=O и других комбинациях состояний разрядов СОМ1АО и СОМ1А1 выполняется функция сравнения. Значение сигнала, устанавливаемое на выходе ОС1 при совпадении кодов, указано в табл. 3.12. Таб ли ца 3.12 СОМ1А1 СОМ1АО Значение сигнала 0 1 изменяется 1 0 0 1 1 1 При выполнении функции сравнения режим работы базового счетчика зависит от состояния разряда СТС1 регистра управления TCCR1B. При СТС1 = 1 базовый счетчик при совпадении кодов сбрасывается в нулевое состояние и продолжает счет, начиная с 0. При СТС1 = 0 он продолжает счет до переполнения и далее ведет счет, начиная с 0. При единичном состоянии хотя бы одного из разрядов PWM10 и PWM11 и единичном состоянии разряда СОМ1А1 выполняется функция PWM. В этом случае базовый счетчик ведет счет на сложение до 68 Глава 3 получения числа 255 или 511 или 1023, переходит в режим счета на вычитание, ведет счет на вычитание до получения числа 0 и вновь возвращается в режим счета на сложение. Выбор максимального числа, (Miiax)- Д° которого ведется счет на сложение, определяется комбинацией состояний разрядов PWM11 и PWM10 регистра управления TCCR1A в соответствии с табл. 3.13. Таб ли ца 3.13 PWM11 PWM10 Wmax 0 1 255 1 0 511 1 1 1023 Сигнал PWM формируется путем изменения значения сигнала на выходе ОС1 при совпадении кодов в базовом счетчике и регистре OCR1 в процессе счета на сложение и на вычитание. Вид изменения сигнала зависит от состояния разряда СОМ 1 АО. На рис. 3.15 изображены графики изменения числа в базовом счетчике (TCNT1) и временные диаграммы сигнала PWM при разных состояниях разряда СОМ 1 АО. а) СОМ1А0=0 б) СОМ1АО=1 Рис. 3.15 Период сигнала PWM (Т) зависит от максимального числа, до которого выполняется счет на сложение. При МП1ах = 255 период в 510 раз больше периода следования импульсов на счетном входе базового счетчпка. При МП1ах = 511 и 1023 это отношение равно 1022 и 2046 соответственно. Разряд СТС1 регистра TCCR1B в режиме PWM не используется. Запрос прерывания Т/Cl OVF формируется при переходе базового счетчика от числа 0 к числу 1. При записи кода в регистр OCR1 код запоминается в регистре временного хранения. Перепись кода в регистр OCR1 выполняется при появлении в базовом счетчике максимального числа, что предотвращает появление в сигнале PWM импульса со случайной длительностью. В качестве выхода ОС1 у микроконтроллера типа 2313 используется вывод порта РВЗ, а у микроконтроллера типа 4433 — вывод порта РВ1. Работа периферийных устройств 69 3.5.5. Таймер-счетчик типа Е Таймер-счетчик типа Е входит в состав периферийных устройств микроконтроллеров типа 8515, 8535, ml63 и ml03 и имеет имя Т/С1. Он содержит шестнадцатиразрядный базовый счетчик и выполняет функцию сравнения/PWM в двух каналах (А и В) и функцию захвата. В структуру таймера-счетчика типа Е входят все элементы структуры таймера-счетчика типа D (рис. 3.14). Элементы на схеме рис. 3.14, используемые при выполнении функции сравнения/PWM, образуют канал А. Дополнительные элементы, образующие канал В, изображены на схеме рис. 3.16. Рис. 3.16 Дополнительными элементами являются компаратор канала В (КВ), регистр сравнения OCR1BH, L, два дополнительных разряда СОМ 1 ВО и СОМ1В1 в регистре TCCR1A, дополнительный разряд OCF1B в регистре T1FR и дополнительный разряд OCIE1В в регистре TIMSK. В канале В формируется запрос прерывания Т/Cl СОМРВ. Сигнал, изменяемый при выполнении функции сравнения, и сигнал PWM поступают на выход ОС1В. Выводы микроконтроллера, используемые в качестве входов Т1 и ICP и выходов ОС1А и ОС1В у микроконтроллеров разных типов, указаны в табл. 3.14. Таб ли ца 3.14 Выводы Т/С1 Тип МК 8515 8535 т163 m103 Т1 РВ1 РВ1 РВ1 PD6 ICP о.в. PD6 PD6 PD4 ОС1А PD5 PD5 PD5 РВ5 ОС1В О.В. PD4 PD4 РВ6 О.В. - отдельный вывод корпуса. 70 Глава 3 В микроконтроллере типа ml63 в регистре TCCR1A имеются два дополнительных разряда — FOCI А и FOCI В. При установке разряда в единичное состояние при выполнении функции сравнения сигнал на выходе ОС1А/В принимает требуемое значение немедленно, не дожидаясь совпадения сравниваемых кодов. Запрос прерывания при этом не формируется и базовый счетчик в нулевое состояние не сбрасывается. Разряд сбрасывается в нулевое состояние аппаратно. В режиме PWM эти разряды не используются. В регистре SFIOR имеется дополнительный разряд PSR10. При установке этого разряда в единичное состояние пересчетная схема сбрасывается в исходное (нулевое) состояние. Разряд PSR10 сбрасывается в нулевое состояние аппаратно. 3.6. Сторожевой таймер В состав сторожевого таймера входят автономный генератор, пересчетная схема, регистр управления WDTCR (№ $21, у МК типа t28 — №$01) и схема управления. Структурная схема сторожевого таймера изображена на рис. 3.17. WDR Рис. 3.17 Генератор GWDT формирует импульсную последовательность. Частота следования импульсов зависит от напряжения питания микроконтроллера (1 МГц при Vcc = 5 В, 350 кГц при Vcc = 3 В). В пересчетной схеме ПС, содержащей многоразрядный счетчик, выполняется деление частоты сигнала генератора. На восьми выходах пересчетной схемы фор Работа периферийных устройств 71 мируются сигналы, частота которых в N раз меньше частоты входного сигнала. Выбор выхода пересчетной схемы с требуемым коэффициентом деления У определяется комбинацией состояний разрядов WDPO, WDP1 и WDP2 регистра WDTCR в соответствии с табл. 3.15. Таб ли ца 3.15 WDP2 WDP1 WDP0 N TOUT, Vcc-5 В TOUT, Vcc-ЗВ 0 0 0 16К 15 мс 47 мс 0 0 1 32 К 30 мс 94 мс 0 1 0 64 К 60 мс 190 мс 0 1 1 128 К 120 мс 380 мс 1 0 0 256 К 240 мс 750 мс 1 0 1 512 К 490 мс 1,5с 1 1 0 1024 К 970 мс 3,0 с 1 1 1 2048 К 1,9с 6,0 с При единичном состоянии разряда WDE регистра WDTCR на выходе схемы управления СУ с частотой выбранного сигнала формируется запрос прерывания WDT Reset, при появлении которого происходит перезапуск микроконтроллера WDT Reset (п.4.2). По команде с мнемокодом WDR (№ 117) выполняется сброс пересчетной схемы в исходное (нулевое) состояние. Для запуска сторожевого таймера необходимо в ходе программы выполнить команду WDR и затем установить в единичное состояние разряд WDE регистра WDTCR. Для остановки сторожевого таймера необходимо установить в единичное состояние разряд WDTOE регистра WDTCR и одновременно повторно установить в единичное состояние разряд WDE, затем не позднее, чем через четыре такта после этого сбросить в нулевое состояние разряд WDE. Разряд WDTOE сбрасывает в нулевое состояние аппаратно через четыре такта после установки его в единичное состояние. У микроконтроллера типа 1200 разряд WDTOE отсутствует. Перезапуск сторожевого таймера происходит при выполнении команды WDR в ходе программы при единичном состоянии разряда WDE. Программа, в которой предусмотрено использование сторожевого таймера, должна периодически с интервалом меньшим, чем период формирования запроса прерывания WDT Reset, с использованием команды WDR перезапускать сторожевой таймер. Если при появлении сбоя команда WDR своевременно не выполняется, происходит перезапуск микроконтроллера. Интервал времени TOUT, через который следует выполнять команду WDR в ходе программы, при разных значениях коэффициента деления N и напряжения питания указан в табл. 3.15. 72 Глава 3 3.7. Аналого-цифровой преобразователь Аналого-цифровой преобразователь входит в состав периферийных устройств микроконтроллеров типа tl5, 4433, 8535, гл 163 и ml03. Аналого-цифровой преобразователь содержит базовый преобразователь, выполняющий преобразование аналогового сигнала в десятиразрядный двоичный код методом последовательных приближений, аналоговый мультиплексор для подключения одного из входов микроконтроллера к входу базового преобразователя, регистр управления ADMUX (№ $07), регистр управления-состояния ADCSR (№ $06) и шестнадцатиразрядный регистр результата ADCH, L (№№ $05, $04). На рис. 3.18 изображена структурная схема аналого-цифрового преобразователя микроконтроллера типа 8535. ADMUX AVCC AGND AREF Рис. 3.18 Для подачи напряжения питания и опорного напряжения используются отдельные выводы микроконтроллера AVCC, AGND и AREF. Вывод AGND соединяется с выводом GND микроконтроллера. Напряжение на выводе AVCC не должно отличаться от напряжения на выводе VCC микроконтроллера более, чем на ± 0,3 В. Напряжение на выводе AREF должно находиться в пределах от уровня на выводе AGND до уровня на выводе AVCC. Аналоговые сигналы принимаются на выводы микроконтроллера ADC0, ADC1...ADC7. Величина напряжения аналогового сигнала может Работа периферийных устройств 73 находиться в пределах от уровня на шине AGND до уровня на шине AVCC. Аналоговый мультиплексор AM подключает один из входов микроконтроллера к входу базового преобразователя CONV. Двоичный код номера подключаемого входа задается комбинацией состояний разрядов MUX2, MUX1, MUX0 регистра ADMUX. Преобразование аналогового сигнала в цифровой код в преобразователе CONV выполняется под управлением тактового сигнала, частота которого должна находиться в пределах от 50 кГц до 200 кГц. Тактовый сигнал формируется в пересчетной схеме ПС путем деления частоты тактового сигнала микроконтроллера СК. Пересчетная схема работает при единичном состоянии разряда ADEN регистра ADCSR. Коэффициент деления частоты (К) определяется комбинацией состояний разрядов ADPS2, ADPS1, ADPS0 регистра ADCSR в соответствии с табл. 3.16. Таб ли ца 3.16 ADPS2 ADPS1 ADPS0 к 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Преобразование начинается при установке в единичное состояние разряда ADSC регистра ADCSR. Разряд ADSC сохраняет единичное состояние до завершения преобразования и затем аппаратно переводится в нулевое состояние. Сформированный десятиразрядный код переписывается в регистр результата ADCH, L, при этом устанавливается в единичное состояние разряд ADIF регистра ADCSR и при единичном состоянии разряда ADIE регистра ADCSR в блок прерываний поступает запрос прерывания ADC СС (ADC Conversion Complete). Разряд ADIF регистра ADCSR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению прерывающей программы или при выполнении команды установки бита в единичное состояние. Чтение результата из шестнадцатиразрядного регистра ADCH, L должно начинаться с чтения младшего байта. При этом блокируется занесение нового результата из базового преобразователя в регистр результата и считанный затем старший байт принадлежит тому же результату, что и считанный ранее младший байт. 74 Гпава 3 Преобразователь может работать в одиночном режиме и в циклическом режиме. Выбор режима определяется состоянием разряда ADFR регистра ADCSR. При ADFR « 0 преобразователь работает в одиночном режиме. Преобразование начинается при установке в единичное состояние разряда ADSC и выполняется за 14 тактов. Для выполнения следующего преобразования необходимо вновь установить в единичное состояние разряд ADSC. При ADFR = 1 преобразователь работает в циклическом режиме. Работа начинается при установке в единичное состояние разряда ADSC. Преобразование выполняется за 13 тактов, после чего сразу начинается следующее преобразование. Работа в циклическом режиме прекращается после сброса в нулевое состояние результата ADFR. В обоих режимах на выполнение первого преобразования после пуска пересчетной схемы затрачивается на 12 тактов больше, чем на выполнение последующих преобразований. Эти такты обеспечивают инициализацию преобразователя. Для уменьшения помех, вызываемых работой процессора, предусмотрена возможность выполнения преобразования с переводом контроллера в режим холостого хода. Преобразователь должен находиться в одиночном режиме (ADFR = 0), пересчетная схема работает (ADEN = 1), прерывания разрешено (ADIE =1), запуск преобразования отсутствует (ADSC = 0). Контроллер переводится в режим холостого хода (п.4.3), при этом аппаратно запускается преобразователь. При завершении преобразования поступает запрос прерывания ADC СС, контроллер выходит из режима холостого хода, выполняет прерывающую программу и возвращается к выполнению программы с точки перехода в режим холостого хода. Аналого-цифровые преобразователи микроконтроллеров других типов имеют некоторые отличия от рассмотренного преобразователя. В микроконтроллере типа 4433 имеется возможность подключения к входу базового преобразователя внутреннего источника эталонного напряжения 1,22 ±0,05 В. Подключение выполняется при установке в единичное состояние дополнительного разряда ADCBG в регистре ADMUX. В микроконтроллере типа 115 в качестве опорного напряжения кроме напряжения от внешнего источника, подаваемого на вывод AREF, может использоваться напряжение на выводе VCC или напряжение от внутреннего источника. Выбор источника осуществляется путем установки определенной комбинации состояний дополнительных разрядов REFS1, REFS0 регистра ADMUX. В качестве входного сигнала может использоваться разность напряжений на входах ADC2 и ADC3. В этом случае напряжение на этих входах должно изменяться в пределах от 0 до 2,56 В, а разностный сигнал перед преобразованием может усиливаться в 20 раз. Разностный сигнал без усиления используется при комбинации Работа периферийных устройств 75 состояний ПО в разрядах MUX2, MUX1, MUX0, а разностный сипнал . усилением — при комбинации 111. В регистре ADMUX, кроме того, имеется дополнительный разряд ADLAR. При ADLAR 0 код результата размещается в младших десяти ?азрядах пары регистров ADC Н, L, а при ADLAR = 1 — в старших десяти разрядах этой пары регистров. В микроконтроллере типа ml03 аналого-цифровой преобразователь -:е работает в циклическом режиме и в регистре ADCSR отсутствует зазряд ADFR. Комбинация ООО разрядов ADPS2, ADPS1, ADPS0 регистра ADCSR не используется. В микроконтроллере типа ml63 в качестве опорного напряжения южет использоваться напряжение 2,56 В от внутреннего источника или напряжения на выводе VCC. Выбор опорного напряжения определяется - омбинацией состояний дополнительных разрядов REFS1 и REFS0 регистра ADMUX. Кроме того, в регистре ADMUX имеется дополнительный разряд ADLAR. При ADLAR = 1 десятиразрядиый код эезультата помещается в старшие десять разрядов регистра ADCH, L. При чтении старшего байта получают восьмиразрядный код результата. Микроконтроллеры типа П5 и ml63 могут переводиться в энергосберегающий режим работы с подавлением помех в работе аналогового преобразователя (п.4.3). В табл. 3.17 указаны выводы микроконтроллера, используемые в качестве входов аналого-цифрового преобразователя у микроконтроллеров разных типов. У микроконтроллера типа 115 для подачи опорного напряжения используется вывод РВО. Таб ли ца 3.17 Тип МК Входы ADC ADCO ADC1 ADC2 ADC3 ADC4 ADC5 ADC6 ADC7 t15 PB5 PB2 РВЗ PB4 4433 PCO PC1 PC2 РСЗ РС4 РС5 8535 РАО PA1 PA2 РАЗ РА4 РА5 РА6 РА7 m163 РАО PA1 PA2 РАЗ РА4 РА5 РА6 РА7 m103 PFO PF1 PF2 PF3 PF4 PF5 PF6 PF7 3.8. Аналоговый компаратор Аналоговый компаратор входит в состав периферийных устройств микроконтроллеров всех типов, кроме 2323 и 2343. Аналоговый компаратор имеет два входа — AIN0 и AIN1, на которые поступают аналоговые сигналы, сравниваемые по величине напряжения. В состав аналогового компаратора кроме базового компаратора входит регистр 76 Глава 3 управления-состояния ACSR (№ $08) и элементы, управляющие работой схемы. Результатом работы компаратора является запрос прерывания ANA COMP, который формируется, когда разность значений напряжения на входах компаратора меняет знак. Структурная схема аналогового компаратора изображена на рис. 3.19. vcc ACSR Рис. 3.19 Базовый компаратор К имеет два входа — положительный (+) и отрицательный (-). Выходной сигнал базового компаратора АСО имеет единичное значение, если напряжение на входе больше напряжения на входе Схема управления СУ при определенном изменении сигнала АСО устанавливает в единичное состояние разряд ACI регистра ACSR и при единичном состоянии разряда ACIE регистра ACSR в блок прерываний поступает запрос прерывания ANA COMP. Разряд ACI сбрасывается в нулевое состояние аппаратно при переходе к выполнению прерывающей программы или программно путем записи единицы в разряд ACI. Выбор вида изменения сигнала АСО на входе схемы управления СУ, при котором формируется запрос прерывания, определяется комбинацией состояний разрядов ACIS0 и ACIS1 регистра ACSR в соответствии с табл. 3.18. Таблица 3.18 ACIS1 ACIS0 Изменение сигнала АСО 0 0 любое 0 1 — 1 0 1-»0 1 1 0^1 Работа периферийных устройств 77 В микроконтроллерах, имеющих таймер-счетчик, который выполняет функцию захвата, (Т/С типа D или Е) сигнал АСО с выхода базового компаратора при единичном состоянии разряда ACIC принимается в таймер-счетчик в качестве сигнала, управляющего захватом. При установке в единичное состояние разряда ACD регистра ACSR отключается питание базового компаратора и уменьшается ток потребления микроконтроллера. В микроконтроллерах типа 112,115, 4433 и in 163 имеется возможность подключать к входу базового компаратора вместо входа AINO выход внутреннего источника эталонного напряжения VR (1,22 ±0,05 В). Подключение источника VR выполняется при единичном состоянии разряда AINBG регистра ACSR. В микроконтроллерах других типов элементы схемы VR и М и разряд AINBG в регистре ACSR отсутствуют. В микроконтроллере типа ml63, кроме того, имеется возможность подключать к входу базового компаратора входы аналого-цифрового преобразователя ADC0...ADC7. Подключение выполняется при нулевом состоянии разряда ADEN регистра ADCSR (№ $06) и единичном состоянии разряда АСМЕ регистра SFIOR (№ $30). Выбор подключаемого входа определяется комбинацией состояний разрядов MUX2, MUX1 и MUX0 регистра ADMUX (№ $07). В табл. 3.19 указаны выводы микроконтроллера, используемые в качестве входов AIN0 и AIN1, у микроконтроллеров разных типов. Таб ли ца 3.19 Вход t11 tl 2 t15 t28 1200 2313 4433 8515 8535 m163 m103* AINO РВО РВО РВО PD6 РВ2 РВ2 РЕ2 AIN1 РВ1 PB1 РВ1 PD7 РВЗ РВЗ РЕЗ * — АС+, АС- S. 9. Программируемый аппаратный модулятор Программируемый аппаратный модулятор входит в состав периферийных устройств микроконтроллера типа t28. Программируемый аппаратный модулятор включен между выходом разряда PORTA.2 регистра PORTA (№ $1В) и внешним выводом РА2 порта РА. Вывод РА2 работает только в режиме выхода. Состояние разряда РА2НС регистра управления PACR (№ $1А) определяет в данном случае не направление передачи бита, а нагрузочную способность выхода. При РА2НС = 0 ток /0L может иметь величину до 15 мА (при Есс=1,8 В), при РА2НС = 1 он может быть увеличен до 25 мА (при Vcc = 1,8 В). 78 Глава 3 В состав модулятора входит регистр управления MODCR (№ $02), с помощью которого задаются длительность импульса и скважность импульсного сигнала на выходе РА2. Работа модулятора связана с работой таймера-счетчика Т/СО типа А, который у микроконтроллера типа t28 имеет некоторые особенности. На рис. 3.20 изображены структурные схемы таймера-счетчика Т/СО и модулятора и показаны элементы порта РА, участвующие в работе модулятора. Управляющая импульсная последовательность с заданными параметрами формируется в пересчетной схеме модулятора (ПСМ), на один из входов которой поступает тактовый сигнал микроконтроллера (СК). Длительность интервала, в течение которого сигнал на выходе РА2 имеет низкий уровень, определяется по формуле: т _ (ONTIM)+1 ON г* > ^СК где (ONTIM) — число, код которого записан в разрядах ONTIM4 — ONTIMO регистра MODCR; FCK — тактовая частота микроконтроллера. Работа периферийных устройств 79 Скважность сигнала DC, определяемая по формуле DC = ^ - 100 %, где Т — период следования импульсов, задается кодом, записанным в разрядах MCONF2—MCONFO регистра MODCR в соответствии с табл. 3.20. В таблице указаны также состояние разряда PORTA2 регистра PORTA, период следования импульсов Т и состояние выхода РА2 (L — низкий уровень, Н — высокий уровень, ИМП — импульсная последовательность.) Таб ли ца 3.20 MCONF2 — 0 PORTA2 DC т PA2 ООО 0 100% —— L 001 0 50% 2Fon ИМП. 010 0 33 % 3Fon ИМП. 011 0 25 % 4Ton ИМП. 100 0 67% 37oN ИМП. 101 0 75% 4Fon ИМП. 110 0 — —— ? 111 0 50 %* ИМП. XXX 1 0% —— H * — W СК Выходной сигнал с заданной с использованием разряда РА2НС регистра PACR допустимой величиной тока нагрузки формируется на выходе управляющей схемы модулятора (УСМ). В таймере-счетчике Т/СО пересчетная схема ПС делит частоту тактового сигнала на 64, 256 и 1024. Сигнал с трех выходов пересчетной системы поступает в схему управления СУ1, в которую также поступают сигнал с вывода ТО, тактовый сигнал микроконтроллера и сигнал с дополнительного выхода пересчетной схемы модулятора. Схема управления СУ1 в зависимости от комбинации состояний разрядов CS00—CS02 регистра TCCR0 (№ $ 04) передает один из сигналов на счетный вход базового счетчика TCNT0 (№ $03) в соответствии с табл. 3.21. При переполнении базового счетчика устанавливается в единичное состояние разряд TOVO регистра IFR (№ $05) и при единичном состоянии разряда TOIE0 регистра ICR (№ $06) в блок прерываний поступает запрос прерывания Т/СО OVF. 80 Глава 3 Кроме того, сигнал переполнения поступает в схему управления СУ2, которая в зависимости от комбинации состояний разрядов ООМОО и ООМ01 регистра TCCR0 изменяет состояние разряда PORT2 регистра PORTA в соответствии с табл. 3.22. Таб лица 3.2 1 CS02 CS01 CS00 Сигнал 0 0 0 нет 0 0 1 СК 0 1 0 ПСМ 0 1 1 СК/64 1 0 0 СК/256 1 0 1 СК/1024 1 1 0 отрицательный фронт на ТО 1 1 1 положительный фронт на ТО Таб ли ца 3.22 OOMQ1 ООМОО (P0RTA2) 0 0 не изменяется 0 1 изменяется 1 0 0 1 1 1 При установке в единичное состояние разряда FOVO регистра TCCR0 сбрасывается в пулевое состояние базовый счетчик TCNT0 и поступает сигнал переполнения в схему СУ2. Запрос прерывания Т/СО OVF при этом не формируется. Разряд FOVO сбрасывается в нулевое состояние аппаратно. 3.10. Блок прерываний Блок прерываний принимает запросы прерывания и организует переход к выполнению определенной прерывающей программы. Запросы прерывания поступают из внешних источников и из источников, расположенных в различных устройствах микроконтроллера. В качестве входов для приема запросов из внешних источников используются выводы параллельных портов ввода-вывода, для которых эта функция является альтернативной. При выполнении альтернативной функции вывод порта имеет альтернативное имя INTx (х = 0, 1, ..., 7). Работа периферийных устройств 81 Запрос прерывания из внешнего источника может быть представлен низким уровнем сигнала (L), переходом от высокого уровня к низкому (HL), переходом от низкого уровня к высокому (LH) или переходом любого направления (LH/HL). Выбор способа представления определяется комбинацией состояний разрядов ISCxO и ISCxl в регистре MCUCR (№ $D5), в микроконтроллере типа тЮЗ — в регистре EICR (№ $ЗА). В табл. 3.23 указаны способы представления запроса прерывания при разных комбинациях состояний названных разрядов. Таб ли ца 3.2 3 ISCX1 ISCX0 Способ 0 0 L 0 1 LH/HL 1 0 HL 1 1 LH В микроконтроллерах серии ATtiny в качестве запроса прерывания могут использоваться любые изменения значения сигнала (для микроконтроллеров тина til, t!2, t!5) или низкий уровень сигнала (для микроконтроллера типа t28) на любом выводе порта РВ. Запрос прерывания, формируемый при этом, имеет имя I/O PINS, а в микроконтроллере типа t28 — LLI PINS. В табл. 3.24 указаны выводы параллельных портов, выполняющие альтернативную функцию приема запроса прерывания из внешнего источника, и отмечены особенности представления запроса прерывания у микроконтроллеров разных типов. Любой запрос прерывания поступает в блок прерываний, если прерывания в микроконтроллере разрешены (I ~ SREG.7 = 1) и разрешено прерывание по данному запросу. Прерывание по отдельному запросу разрешено, если в единичном состоянии находится маскирующий разряд (MASK) для данного запроса прерывания, расположенный в одном из регистров ввода-вывода. При появлении запроса прерывания устанавливается в единичное состояние флажковый разряд (FLAG) для данного запроса прерывания, расположенный в одном из регистров ввода-вывода. Состояние флажкового разряда опрашивается аппаратно и, кроме того, может быть опрошено программными средствами. В табл. 3.25 указаны устройства, в которых расположены источники запросов прерывания, приведены в виде дроби имена маскирующих и флажковых разрядов (в числителе) и регистров ввода-вывода, в которых они расположены, (в знаменателе) у микроконтроллеров разных типов. 82 Глава 3 Таблица 3.24 Тип МК INTO INT1 I/O PINS t15 2323, 2343 1200 2313 t28 4433 8515 8535 m163 PB1 PB2 PB1 (1) PD2(1) PD2 (1) PB3 PD2 PD2 (1) PD2(1) PD2 PD3(1) PB4 PD3 PD3 (1) PD3 (1) PD3 PBO—PB5 (2) PBO—PB5 (2) PBO—PB7 (3) m103 INTO—INT3 INT4—INT7 PDO—PD3 (3) PE4 - PE7 (1) (1) — кроме LH/HL; (2) - только LH/HL; (3) - только L Таблица 3.25 Устройство Запрос прерывания MASK FLAG CPU, WDT RESET Внешние INTO INT1 INTO/GIMSK INT1/GIMSK INTFO/GIFR INTF1/GIFR INTO—INT3 INT4—INT7 INTO—INT3/EIMSK INT4—INT7/EIMSK INTF4 - INTF7/ EIFR I/O PINS LLI PINS PCIE/GIMSK LLIE/ICR PCIF/GIFR T/C2 T/C2 COMP T/C2 OVF OCIE2/TIMSK TOIE2/TIMSK OCF2/TIFR TOV2/TIFR T/C1 T/C1 CAPT T/C1 COMPA T/C1 COMPB T/C1 OVF TICIE1/TIMSK OCIE1A/TIMSK * OCIE1B/TIMSK TOIE1/TIMSK ICF1/TIFR OCF1A/TIFR* OCF1B/TIFR TOV1/TIFR T/CO T/CO COMP T/CO OVF OCIEO/TIMSK TOIEO/TIMSK OCFO/TIFR TOVO/TIFR SPI SPI STC SPIE/SPCR SPIF/SPSR UART UART RXC UART UDRE UART TXC RXCIE/UCR “ UDRIE/UCR TXCIE/UCR RXC/USR “ UDRE/USR TXC/USR ADC ADC CC ADIE/ADCSR ADIF/ADCSR EEPROM EERDY EERIE/EECR AC ANA COMP ACIE/ACSR ACI/ACSR TWSI TWSI TWIE/TWCR TWINT/TWCR * — у МК типа 44 133 OCIE1 и OCF1 ** — у МК типа 163 UCR = UCSRB, USR = UCSRA Работа периферийных устройств 83 При поступлении запроса блок прерываний организует аппаратный безусловный переход к выполнению команды, адрес которой (вектор прерывания) однозначно связан с именем запроса прерывания. По этому адресу в микроконтроллерах серий ATtiny и АТ90 должна быть записана команда безусловного перехода с мнемокодом RJMP к (№ 85), машинный код который имеет формат "слово", а в микроконтроллерах серии ATmega может быть записана команда безусловного перехода с мнемокодом JMP к, машинный код которой имеет формат "два слова". По этой команде выполняется программный безусловный переход к первой команде соответствующей прерывающей программы, которая может быть расположена в любом месте в FlashROM. При одновременном поступлении в блок прерываний нескольких запросов в блоке выделяется запрос с наиболее высоким приоритетом среди всех поступивших и выполняется переход по адресу, соответствующему этому запросу. В табл. 3.26 и 3.27 указаны в шестнадцатеричном коде адреса (векторы прерывания), по которым совершается аппаратный переход у микроконтроллеров разных типов. Высший приоритет имеет запрос прерывания RESET. Приоритет других запросов убывает в порядке увеличения адреса, по которому совершается переход. У микроконтроллеров разных типов запросам прерывания с одинаковым именем соответствуют разные векторы перехода. Таб ли ца 3.2 6 Запрос прерывания Тип MK t11 t12 t15 2323 2343 1200 RESET 000 000 000 000 000 000 INTO 001 001 001 001 001 001 I/O PINS 002 002 002 T/C1 COMP 003 T/C1 OVF 004 T/CO OVF 003 003 005 002 002 002 EE RDY 004 006 ANA COMP 004 005 007 003 ADC CC 008 При переходе к выполнению прерывающей программы разряд I в регистре SREG аппаратно сбрасывается в нулевое состояние и прерывания по всем запросам оказываются запрещенными. Разряд I устанавливается в единичное состояние при выполнении команды возврата из прерывающей программы с мнемокодом RETI (№ 90). Разряд I 84 Глава 3 может быть установлен в единичное состояние программно ио команде SEI в прерывающей программе. Программа, которая выполняется при пуске микроконтроллера и по запросу RESET, не содержит команды RETI и для выполнения прерываний должна содержать команду SEL Прерывание по запросу RESET выполняется вне зависимости от состояния разряда I в регистре SREG. Опрос состояния входов блока прерываний выполняется в каждом такте. При обнаружении запроса код из счетчика команд заносится в стек, на что затрачивается 2 такта, и выполняется безусловный переход по команде с мнемокодом RJMP к (2 такта) или JMP к (3 такта). Если при обнаружении запроса прерывания процессор не закончил выполнение текущей многотактовой команды, до перехода к прерывающей программе завершается выполнение этой команды. Таб ли ца 3.27 Запрос прерывания Тип MK 2313 t28 4433 8515 8535 m163 m103 RESET 000 000 000 000 000 000 000 INTO 001 001 001 001 001 002 002 INT1 002 002 002 002 002 004 004 INT2 006 INT7 010 LLI PINS 003 T/C2 COMP 003 006 012 T/C2 OVF 004 008 014 T/C1 CAPT 003 003 003 005 00A 016 T/C1 COMPA 004 004 004 006 OOC 018 T/C1 COMPB 005 007 00E 01A T/C1 OVF 005 005 006 008 010 01C T/CO COMP 01E T/CO OVF 006 004 006 007 009 012 020 SPI STC 007 008 00A 014 022 UART RXC 007 008 009 00B 016 024 UART UDRE 008 009 00A OOC 018 026 UART TXC 009 00A 00B 00D 01A 028 ADC CC 00B 00E 01C 02A EE RDY OOC OOF 01E 02C ANA COMP 00A 005 00D OOC 010 020 02E TWSI 022 Глава 4 Работа микроконтроллера 4.1. Программирование микроконтроллера Программирование микроконтроллера заключается в записи: кодов команд программы и констант в FlashROM; кодов исходных данных в EEPROM; требуемых значений установочных битов {Fuse Bits)-, требуемых значений битов защиты {Lock Bits). В микроконтроллерах, поступающих в продажу, во всех ячейках FlashROM записан код SFFFF, во всех ячейках EEPROM — код $FF, биты защиты имеют единичное значение, а установочные биты могут иметь разные значения. Исходные значения установочных битов у микроконтроллеров разных типов указаны в приложении П6. Кроме того, в трех специальных ячейках памяти записаны сигнатурные байты, определяющие тип микроконтроллера. Коды, записанные в FlashROM и EEPROM, сигнатурные байты и значения установочных битов и битов защиты могут быть прочитаны для контроля правильности записи и определения типа и состояния микроконтроллера. В микроконтроллерах семействах AVR имеются два бита защиты — LB1 и LB2. При единичном значении обоих битов возможны и запись, и чтение кодов. После программирования бита LB1 (LB1 = 0) дальней 86 Глава 4 шая запись кодов в FlashROM и EEPROM и изменение значения установочных битов невозможны. После программирования бита LB2 (LB1=O, LB2 = 0) невозможно также чтение кодов, записанных в FlashROM и EEPROM, и значений установочных битов. При перепрограммировании микроконтроллера (программировании микроконтроллера, ранее прошедшего программирование) необходимо предварительно "стереть" прежнюю запись. При стирании во всех ячейках FlashROM и EEPROM восстанавливаются коды $FFFF и $FF соответственно, биты защиты принимают единичное значение, а установочные биты и сигнатурные байты остаются без изменения. Допускается выполнить до 1000 циклов "стирание-запись” для ячеек FlashROM и до 100000 циклов для ячеек EEPROM. Запись и чтение кодов при программировании выполняются побайтно. Ввод и вывод битов в байте могут выполняться параллельно или последовательно. В микроконтроллерах семейства AVR реализуются следующие способы программирования: 1. Параллельное программирование с использованием дополнительного источника напряжения +12 В {High-Voltage Parallel Programming, HVPP); 2. Последовательное программирование с использованием дополнительного источника напряжения +12 В {High-Voltage Serial Programming, HVSP); 3. Последовательное программирование без использования дополнительного источника напряжения {Low-Voltage Serial Programming, LVSP). 4. Самопрограммирование {Self-Programming, SLFP). Возможность использования названных способов программирования в микроконтроллерах разных типов отмечена знаком "+" в табл. 4.1. Программирование с использованием дополнительного источника напряжения (HVPP и HVSP) выполняется с помощью программатора до установки микроконтроллера в аппаратуре, где ему предстоит работать. Последовательное программирование без использования дополнительного источника напряжения (LVSP) может выполняться после установки микроконтроллера в аппаратуре {In-System Programming). Программирование по способу LVSP возможно при нулевом значении установочного бита SPIEN. При программировании по способу LVSP микроконтроллер находится в рабочем состоянии, значения напряжения питания и тактовой частоты лежат в пределах, установленных для микроконтроллера данного типа (приложение П1). Вывод RESET соединен с шиной GND. Ввод и вывод байтов при программировании выполняются с использованием трех выводов — MOSI, MISO и SCK. Схема подключения микроконтроллера для программирования изображена на рис. 4.1. Работа микроконтроллера 87 Таблица 4. 1 Тип МК Способ программирования Выводы порта SPI HVPP HVSP LVSP* SLFP MOSI MISO SCK t11 + t12 + + PBO PB1 PB2 t15 + + PBO PB1 PB2 2323 + + PBO PB1 PB2 2343 + + PBO PB1 PB2 1200 + + PB5 PB6 PB7 2313 + + PB5 PB6 PB7 t28 + 4433 + + PB3 PB4 PB5 8515 + + PB5 PB6 PB7 8535 + + PB5 PB6 PB7 m163 + + + PB5 PB6 PB7 m103 + + PB2** PB3** PB1 * — выполняется при SPIEN = 0; ‘ — при программировании RXD и TXD. В микроконтроллерах, имеющих последовательный порт ввода-вывода SPI (табл. 1.1), используются выводы этого порта. В микроконтроллерах без порта SPI находится вспомогательный порт SPI, работающий только при программировании в режиме ведомого устройства. Функции выводов MOSI, MISO и SCK выполняют выводы параллельных портов ввода-вывода. Выводы микроконтроллера, используемые в качестве входов MOSI и SCK и выхода MISO у микроконтроллеров разных типов указаны в табл. 4.1. В микроконтроллере типа ml03 вместо выводов MOSI п MISO используются выводы RXD и TXD соответственно. 88 Глава 4 У микроконтроллеров типа т163 и тЮЗ запись байтов в FlashROM выполняется за два этапа. На первом этапе байты записываются в буферное запоминающее устройство. На втором этапе выполняется перепись всех кодов из буферного запоминающего устройства в страницу FlashROM. Страница у микроконтроллеров типа ml63 и ml03 имеет емкость 128 и 256 байтов соответственно. При программировании по способу LVSP в микроконтроллере могут выполняться следующие операции: 1) разрешение LVSP {Programming Enable); 2) стирание записи {Chip Erase); 3) запись байта в FlashROM {Write Program Memory); 4) запись байта в буферные ЗУ {Load Flash Page); 5) перепись из буферного ЗУ в FlashROM {Write Flash Page); 6) чтение байта из FlashROM {Read Program Memory); 1) запись байта в EEPROM {Write EEPROM); 8) чтение байта из EEPROM {Read EEPROM); 9) запись битов защиты {Write Lock Bits); 10) чтение битов защиты {Read Lock Bits); 11) запись установочных битов {Write Fuse Bits); 12) чтение установочных битов {Read Fuse Bits); 13) чтение сигнатурного байта {Read Signature Byte); 14) чтение калибровочного байта {Read Calibration Byte). Операции №№ 10 и 12 у микроконтроллеров некоторых типов объединены в одну операцию. При выполнении операции "Запись байта в EEPROM" автоматически перед записью выполняется стирание соответствующей ячейки EEPROM. Операции №№ 1, 2, 6, 7, 8, 9, 13 выполняются в микроконтроллерах всех типов. Возможность выполнения других операций у микроконтроллеров разных типов отмечена знаком "+" в табл. 4.2. Таб лица 4.2 ТипМК t12 t15 2323 2343 1200 2313 4433 8515 8535 m163 m103 Write Program Memory + + + + + + + + + Load Flash Page + + Write Flash Page + + Read Lock Bits + + + + + + + + Write Fuse Bits + + +* +* +* +* +* +* Read Fuse Bits + + + + + + + + Read Calibration Byte + + + * — кроме SPIEN Работа микроконтроллера 89 Если операция "запись установочных битов" в микроконтроллере не выполняется, а значения этих битов перед программированием (перепрограммированием) отличаются от требуемых, необходимо до установки микроконтроллера в аппаратуре выполнить запись требуемых значений установочных битов с помощью программатора. Для выполнения любой операции в микроконтроллер через вход MOSI вводится последовательность из четырех байтов, в которую входят один или два байта, определяющие тип операции, и байты, используемые при выполнении операции (адресный байт, записываемый байт, байт, содержащий значения установочных битов и битов защиты, холостой байт). При выполнении операции чтения одновременно с вводом одного из байтов выводится считанный байт через выход MISO. Байты вводятся и выводятся, начиная со старшего бита. Частота следования импульсов на входе SCK должна быть не более 1/4 частоты тактового сигнала микроконтроллера. Сигнал на входе SCK при отсутствии импульсов должен иметь низкий уровень. После завершения программирования по способу LVSP при размыкании ключа К (см. схему на рис. 4.1) микроконтроллер переходит к выполнению записанной программы, начиная с команды, записанной по адресу $0000. В микроконтроллере типа ml03 программирования по способу LVSP может выполняться при высоком уровне напряжения на входе RESET, если при подаче напряжения питания вывод PEN был соединен с шиной GND, и это соединение сохранялось до конца программирования. Самопрограммирование микроконтроллера осуществляется в процессе его работы. Самопрограммирование может выполняться в микроконтроллере типа ш!63. В этом микроконтроллере FlashROM разделена на две секции. Одна секция {Application Section, APS) предназначена для рабочей программы. В другой секции {Boot Loader Section, BLS) размещается программирующая программа {Flash-Resident Boot Loader), введенная ранее в FlashROM. Деление FlashROM на две секции определяется комбинацией значений установочных битов BOOTSZ1 и BOOTSZO в соответствии с табл. 4.3. Таб ли ца 4.3 BOOTSZ1 BOOTSZO Объем BLS (слов) Начальный адрес BLS 0 0 1024 $ 1С00 0 1 512 $ 1Е00 1 0 256 $ 1F00 1 1 128 $ 1F80 90 Глава 4 Если установочный бит BOOTRST имеет нулевое значение, при пуске микроконтроллера первая команда программы выбирается не по адресу $0000, а по адресу, указанному в табл. 4.3. Программирование осуществляется с использованием команды SPM (№ 131), выполнение которой зависит от кода, записанного в регистр SPMCR (№ $37) не ранее, чем за четыре такта до выборки кода команды SPM из FlashROM (табл. 2.15). Программирующая программа может записывать коды в обе секции FlashROM и модифицировать саму себя. Для защиты секций FlashROM кроме битов защиты LB1 и LB2 в микроконтроллере типа ml63 используются дополнительные биты защиты — BLB01 и BLB02 для защиты секции APS и BLB11 и BLB12 для защиты секции BLS. 4.2. Пуск и перезапуск микроконтроллера Пуск микроконтроллера происходит при подаче напряжения питания на его выводы VCC и RESET (Power-On Reset, POR). Перезапуск в процессе работы выполняется при появлении на выводе RESET нулевого уровня сигнала с последующим возвращением к высокому уровню (External Reset, EXR) и при переполнении сторожевого таймера (Watchdog Reset, WDTR). В микроконтроллерах типа tl2, tl5, 4433 и ml63 перезапуск происходит также при понижении напряжения питания на выводе VCC ниже определенного уровня с последующим возвращением к рабочему уровню (Brown-Out Reset, BOR). При пуске и перезапуске принимает активное значение внутренний сигнал Internal Reset, который сохраняет это значение в течение определенного интервала времени (Start-Up Time). При активном значении сигнала все регистры ввода-вывода переводятся в исходное состояние и в счетчик команд (PC) записывается код числа 0. По истечении интервала Start-Up Time микроконтроллер приступает к выполнению программы, начиная с команды, записанной в FlashROM по нулевому адресу. В исходном состоянии регистров ввода-вывода все разряды регистров находятся в нулевом состоянии. Исключением являются: регистр состояния USR или UCSRA (№ $0В) в порте UART, в который заносится код $20 (UDRE = 1); регистр управления UCR или UCSRB (№ $0А) в порте UART, в который заносится код $02 (RXB8 =1); регистр OCR1B (№ $2D) в таймере-счетчике Т/Cl микроконтроллера типа tl5, в который заносится код $FF; Работа микроконтроллера 91 регистр SPDR в порте SPI, исходное состояние которого является неопределенным; регистры EEAR, EEARL и EEARH (№№ $1Е и $1F) в блоке управления EEPROM микроконтроллеров типа 112,115, 2323, 4423, 4433, 8535 и ml63, исходное состояние которых является неопределенным; регистр PORTA (№$1В) микроконтроллера типа t28, в который заносится код $04. На рис. 4.2. изображена обобщенная структурная схема цепей, формирующих сигнал Internal Reset. Элементы и связи, изображенные пунктирными линиями, имеются не у всех микроконтроллеров. Рис. 4.2 В табл. 4.4 отмечено наличие таких элементов у микроконтроллеров разных типов и указаны их характеристики. На рис. 4.3 изображены временные диаграммы напряжения на выводах микроконтроллера при пуске (POR), перезапуске с использованием вывода RESET (EXR) и перезапуске при понижении напряжения питания (BOR). При пуске микроконтроллера (рис. 4.3,а) при достижении напряжением питания уровня Троти с помощью схемы PORC устанавливается в единичное состояние триггер Т и сигнал Internal Reset принимает активное значение. При достижении уровня запускается схема 92 Глава 4 временной задержки, выполненная на базе счетчика {Counter). По истечении времени задержки ZT0LIT сигнал на выходе триггера принимает пассивное значение. Таб ли ца 4.4 Элемент схемы ТипМК tl 1 112 115 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 MCUSR 2 4 4 2 2 3* 4 2 4 2 BORC + + + + СК + + . + + CKSEL 2—0 3—0 1—0 3—0 2—0 о I co FSTRT + + + + + SUT 1—0 * — MCUCS (№$07) Рис. 4.3 При перезапуске с использованием вывода RESET (рис. 4.3,6) активное значение сигнала Internal Reser устанавливается с использованием схемы EXRC при переходе напряжения на выводе RESET через пороговое значение V[<ST в сторону понижения напряжения, а схема задержки запускается при переходе этого напряжения через значение в сторону повышения. При переполнении сторожевого таймера WDT формируется короткий импульс, по переднему фронту которого устанавливается активное значение сигнала, а по заднему фронту запускается схема задержки. При наличии схемы BORC (табл. 4.4) и нулевом значении установочного бита BODEN активное значение сигнала Internal Reset устанавливается при переходе напряжения на входе VCC через пороговое значение ЕВОт в сторону понижения, а запуск схемы задержки происходит при переходе напряжения через пороговое значение Евот в сторону повышения. Уровень Твот может иметь одно из двух значений в зависимости от значения установочного бита BODLEVEL. Работа микроконтроллера 93 В микроконтроллерах, не имеющих схемы BORC (табл. 4.4), после выключения напряжения питания повторный пуск микроконтроллера путем подачи напряжения питания (POR) возможен, если напряжение питания на выводе VCC упало ниже уровня Рротг Если этот уровень не пройден, микроконтроллер начнет выполнять случайную произвольную программу (рис. 4,в). Ориентировочные значения пороговых уровней указаны в табл. 4.5. Таб ли ца 4.5 ^РОТН (В) ^POTF (В) ^RST (В) Vbot(B) BODLEVEL 1 0 1,2—1,4 0,4—0,6 (0,6- 0,8)1/сс 2,7 4,0 Величина временной задержки Агоит может быть постоянной или задаваться разработчиками путем изменения значений установочных битов CKSEL, которых у микроконтроллеров разных типов может быть от двух до четырех, и установочного бита FSTRT, а у микроконтроллера типа ml03 — установочных битов SUT1 и SUT0 (табл. 4.4). В качестве сигнала, подаваемого на счетный вход счетчика Count, могут использоваться сигнал генератора сторожевого таймера GWDT или тактовый сигнал микроконтроллера СК. Выбор источника сигнала выполняется с помощью схемы управления СУ1 путем изменения значений установочных битов CKSEL. Величина задержки /'тост может изменяться от нескольких десятков мкс до нескольких сотен мс. В микроконтроллерах, имеющих регистр MCUSR (№ $34), имеется возможность программными средствами определять способ запуска/пе-резапуска микроконтроллера, по которому началось выполнение текущей программы. В регистре MCUSR в этих целях используются 2, 3 или 4 разряда (табл. 4.4). При наличии четырех или трех разрядов способам запуска POR, EXR, WDTR и BOR соответствует единичное состояние разрядов PORF, EXTRF, WDRF и BORF регистра MCUSR соответственно. При наличии двух разрядов (PORF и EXTRF) способ записи (POR, EXR или WDTR) определяется путем опроса состояния разрядов в начале запущенной/перезапущенной программы со сбросом обоих разрядов в нулевое состояние. Если при опросе PORF = 1, был пуск POR, если EXTRF = 1, был перезапуск EXR, если оба разряда имеют нулевое состояние, был перезапуск WDTR. При медленном нарастании напряжения питания на входе VCC после включения источника напряжения питания в процессоре (CPU) и EEPROM выполняются случайные операции, в результате которых 94 Глава 4 может произойти произвольная запись случайного байта в EEPROM. Для предотвращения этого явления следует удерживать нулевой уровень сигнала на выводе RESET до появления рабочего значения напряжения на выводе VCC. Эту операцию можно выполнить с помощью внешней схемы формирования сигнала RESET (Brown-Out Detector, BOD). 4.3. Энергосберегающие режимы работы Микроконтроллеры семейства AVR могут быть переведены в энергосберегающие режимы работы. У микроконтроллеров всех типов возможны два энергосберегающих режима — режим холостого хода (Idle Mode, IM) и режим пониженного энергопотребления (Power-Down Mode, PDM). Микроконтроллеры, имеющие таймеры-счетчики с режимом счета реального времени (8535, ml63, ml03), кроме того, могут быть переведены в режим энергосохранения (Power Save Mode, PSM). Микроконтроллеры типа tl5 и ш163, имеющие аналого-цифровой преобразователь, кроме того, могут переводиться в режим подавления помех работе АЦП (ADC Noise Reduction Mode, ANRM). Переход в энергосберегающий режим происходит в ходе программы при выполнении команды с мнемокодом SLEEP, если разряд SE регистра MCUCR (№$35) установлен в единичное состояние. Выбор режима в микроконтроллерах, которые могут находиться в двух энергосберегающих режимах, определяется состоянием разряда SM регистра MCUCR. При SM = 0 устанавливается режим холостого хода, при SM = 1 — режим пониженного энергопотребления. В микроконтроллерах, которые могут находиться в трех и четырех энергосберегающих режимах, выбор режима определяется комбинацией состояний разрядов SM1 и SM0 регистра MCUCR в соответствии с табл. 4.6. Таб ли ца 4.6 SM1 SMO Тип МК t15 8535 m163 m103 0 0 IM IM IM IM 0 1 ANRM — ANRM — 1 0 PDM PDM PDM PDM 1 1 — PSM PSM PSM Выход из энергосберегающего режима происходит при поступлении разрешенного запроса прерывания или перезапуске микроконтроллера. При выходе по запросу прерывания выполняется прерывающая программа и далее совершается переход к команде, расположенной после команды SLEEP, по которой произошел переход в данный режим. Работа микроконтроллера 95 В режиме холостого хода (IM) процессор остановлен, периферийные устройства продолжают работать, коды в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода, расположенных в пассивных периферийных устройствах, сохраняются неизменными. Ток потребления 1СС у микроконтроллеров разных типов уменьшается в 2—4 раза. Если аналоговый компаратор не используется для выхода из режима, разряд ACD в регистре ACSR (№ S28) для уменьшения тока потребления должен быть установлен в единичное состояние. В режиме пониженного энергопотребления (PDM) остановлен процессор и генератор тактового сигнала. Периферийные устройства, кроме сторожевого таймера и блока прерываний, не работают. Коды в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода сохраняются неизменными. Ток потребления /сс у микроконтроллеров разных типов имеет величину от нескольких единиц до нескольких десятков мкА. Напряжение питания Vcc может быть снижено до величины 2 В. Выход из режима возможен при перезапуске микроконтроллера и по разрешенному запросу прерывания из внешнего источника при представлении запроса уровнем сигнала. Сигнал должен сохранять низкий уровень в течение некоторого времени, пока генератор тактового сигнала входит в установившийся режим. В микроконтроллере типа ml63, имеющем порт TWSI, выход из режима возможен также по запросу прерывания при опознании портом собственного адреса в поступившем адресном байте. Режим энергосохранения (PSM) в микроконтроллерах, имеющих таймер-счетчик с режимом счета реального времени, отличается от режима пониженного энергопотребления возможностью сохранения работы данного таймера после перехода в режим и возможностью выхода из режима по запросу прерывания от этого таймера при его работе в режиме счета реального времени. В режиме подавления помех работе АЦП (ANRM) процессор остановлен. Работают только аналого-цифровой преобразователь, блок прерываний и сторожевой таймер. Выход из режима происходит по запросу прерывания из внешнего источника при представлении запроса уровнем сигнала, по запросу прерывания от АЦП и при перезапуске микроконтроллера. В микроконтроллере типа ml63 выход из режима возможен также по запросу прерывания при опознании портом TWSI собственного адреса. Приложения П1. Маркировка микроконтроллеров На корпусе микроконтроллера обозначен его тин. В обозначении типа могут присутствовать дополнительные буквы, не указанные в полном обозначении типа в табл. В.1. После обозначения типа через дефис следует суффикс, состоящий из трех полей. В первом поле находятся одна или две цифры, обозначающие максимальное значение тактовой частоты, МГц, для данного варианта микроконтроллера. Во втором поле находится буква, обозначающая тип корпуса (табл. П1.1), в третьем поле записана буква, обозначающая диапазон допустимых значений температуры окружающей среды t, °C (табл. П1.2). Таб ли ца П1. 1 Буква Тип корпуса Шаг выводов (мм) А TQFP 0,8 J PLCC 1,27 М MLE 0,5 Р PDIP 2,54 S SOIC 1,27 Y SSOP 0,65 В таблице П1.3 приведена маркировка микроконтроллеров, содержащая обозначение типа и первое поле суффикса, указаны диапазон Маркировка микроконтроллеров 97 допустимых значений напряжения питания (Vcc), максимальное значение тактовой частоты (F^), число выводов и тип корпуса для микроконтроллера данного типа и варианта. Таб ли ца П1.2 Буква t, °C С 0...+70 -40...+85 Таб ли ца П1.3 Маркировка Vcc(B) Рпвх(МГц) Корпус ATtinyl 1L-2 2,7—5,5 2 8P, 8S ATtinyl 1-6 4,0—5,5 6 ATtinyl 2V-1 1,8—5,5 1 ATtinyl 2L-4 2,7—5,5 4 8P, 8S ATtinyl 2-8 4,0—5,5 8 ATtinyl 5L-1 2,7—5,5 1,6 8A, 8S AT90LS2323-4 2,7—6,0 4 8P, 8S AT90S2323-10 4,0—6,0 10 AT90LS2343-4 2,7—6,0 4 8P,8S AT90S2343-10 4,0—6,0 10 AT90S1200-4 2,7—6,0 4 20P, 20S, 20Y AT90S1200-12 4,0—6,0 12 AT90S2313-4 2,7—6,0 4 20P, 20S AT90S2313-10 4,0—6,0 10 ATtiny28L-4 2,7—5,5 4 32A, 28P, 32M ATtiny28V-1 1,8—5,5 1,2 AT90LS4433-4 2,7—6,0 4 32A, 28P AT90S4433-8 4,0—6,0 8 AT90S8515-4 2,7—6,0 4 44A, 44J, 40P AT90S8515-8 4,0—6,0 8 AT90LS8535-4 2,7—6,0 4 44A, 44J, 40P AT90S8535-8 4,0—6,0 8 ATmega163L-4 2,7—5,5 4 44A, 40P ATmega 163-8 4,0—5,5 8 ATmega103L-4 2,7—3,6 4 64A ATmega103-6 4,0—5,5 6 98 Приложения П2. Выводы микроконтроллеров В табл. П2.1 приведены имена выводов у микроконтроллеров разных шш. Альгержтивиыё функции вывдеш рясскгят’рй'яяют’ся' при описяншт устройств, при работе которых они выполняются, и указаны в приложении ПЗ. Таб ли ца П2. 1 Тип МК til t12 t15 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 RESET RESET RESET RESET RESET RESET RESET RESET RESET XTAL1.2 XTAL1.2 XTAL1,2 XTAL1,2 XTAL1,2 XTAL1.2 XTAL1.2 XTAL1.2 PAO-3 PAO-7 PAO-7 PAO-7 PAO-7 РВО-5 РВО-2 РВО-4 РВО-7 PBO-7 PBO-5 PBO-7 PBO-7 PBO-7 PBO-7 PCO-5 PCO-7 PCO-7 PCO-7 PCO-7 PDO-6 PDO-7 PDO-7 PDO-7 PDO-7 PDO-7 PDO-7 PEO-7 PFO-7 AVCC AVCC AVCC AVCC AGND AGND AGND AGND AREF AREF AREF AREF ALE ALE ICP RD OC1B WR TOSC1 TOSC2 I PEN ПЗ. Альтернативные функции выводов портов В табл. П3.1 и П3.2 указаны альтернативные функции выводов параллельных портов. Таб ли ца П3. 1 PXY Тип MK til t12 t15 2323 2343 1200 2313 t28 PA2 IR PBO AINO AINO MOSI AINO AREF MOSI MOSI MOSI AINO AINO AINO Альтернативные функции выводов портов 99 Окончание табл. ПЗ. 1 PXY Тип МК til t12 t15 2323 2343 1200 2313 t28 РВ1 AIN1 INTO AIN1 INTO MISO AIN1 OC1A MISO INTO MISO INTO MISO AIN1 AIN1 AIN1 РВ2 ТО SCK TO ADC1 INTO SCK TO SCK TO SCK TO TO РВЗ XTAL1 XTAL1 ADC2 CLOCK OC1 INTO РВ4 XTAL2 XTAL2 ADC3 INT1 РВ5 RESET RESET ADCO RESET MOSI MOSI РВ6 РВ7 MISO SCK MISO SCK PD0 PD1 PD2 PD3 PD4 PD5 PD6 INTO TO RXD TXD INTO INT1 TO T1 ICP Таб ли ца П3.2 PXY 4433 8515 8535 m163 m103 РАО ADO ADCO ADCO ADO PEO RXD PA1 AD1 ADC1 ADC1 AD1 PE1 TXD PA2 AD2 ADC2 ADC2 AD2 PE2 AC+ РАЗ AD3 ADC3 ADC3 AD3 PE3 AC- PA4 AD4 ADC4 ADC4 AD4 PE4 INT4 PA5 ADS ADC5 ADC5 AD5 PE5 INT5 PA6 AD6 ADC6 ADC6 AD6 PE6 INT6 PA7 AD7 ADC7 ADC7 AD7 PE7 INT7 РВО ICP TO TO TO SS PFO ADCO PB1 ОС1 T1 T1 T1 SCK PF1 ADC1 PB2 ss AINO AINO AINO MOSI PF2 ADC2 РВЗ MOSI AIN1 AIN1 AIN1 MISO PF3 ADC3 РВ4 MISO SS SS SS OCO PF4 ADC4 РВ5 SCK MOSI MOSI MOSI OC1A PF5 ADC5 РВ6 MISO MISO MISO 0C1B PF6 ADC6 РВ7 SCK SCK SCK OC2 PF7 ADC7 РСО ADCO A8 SCL A8 РС1 ADC1 A9 SDA A9 РС2 ADC2 A10 A10 100 Приложения Окончание табл. П3.2 PXY 4433 8515 8535 m163 m103 РСЗ ADC3 А11 A11 РС4 ADC4 А12 A12 РС5 ADC5 А13 A13 РС6 А14 TOSC1 TOSC1 A14 РС7 А15 TOSC2 TOSC2 A15 PD0 RXD RXD RXD RXD INTO PD1 TXD TXD TXD TXD INT1 PD2 INTO INTO INTO INTO INT2 РОЗ INT1 INT1 INT1 INT1 INT3 PD4 ТО OC1B OC1B IC1 PD5 Т1 OC1A OC1A OC1A PD6 AINO WR ICP ICP T1 PD7 AIN1 RD OC2 OC2 T2 П4. Регистры ввода-вывода В табл. П4 перечислены имена регистров ввода-вывода (I0R) и указаны их номера (в шестнадцатеричном коде) у микроконтроллеров разных типов. Таб ли ца П4 Имя IOR Тип MK til t12 tl 5 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 ACSR 08 08 08 08 08 08 08 08 08 08 08 ADCH 05 05 05 05 05 ADCL 04 04 04 04 04 ADCSR 06 06 06 06 06 ADMUX 07 07 07 07 07 ASSR 22 22 30 DDRA 1A 1A 1A 1A DDRB 17 17 17 17 17 17 17 17 17 17 17 17 DDRC 14 14 14 14 DDRD 11 11 11 11 11 11 11 11 DDRE 02 EEAR EEARH 1E 1E 1E 1E 1E 1E 1E 1F 1F 1F 1F EEARL 1E 1E 1E 1E EECR 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C EEDR 1D 1D 1D 1D 1D 1D 1D 1D 1D 1D 1D EICR ЗА EIFR 38 EIMSK GIFR ЗА ЗА ЗА ЗА ЗА ЗА ЗА ЗА ЗА ЗА 39 Регистры ввода-вывода 101 Продолжение табл. П4 Тип МК Имя IOR til t12 t15 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 GIMSK 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ICR 06 ICR1H 25 27 25 27 27 27 ICR1L 24 26 24 26 26 26 IFR 05 MCUCR 35 35 35 35 35 35 35 35 35 35 35 35 MCUCS 07 MCUSR 34 34 34 34 34 34 34 34 34 MODCR 02 OCRO 31 OCR1A 2E OCR1AH 2B 2B 2B 2B 2B 0CR1AL 2A 2A 2A 2A 2A OCR1B 2D OCR1BH 29 29 29 29 0CR1BL 28 28 28 28 OCR1H 2B 0CR1L 2A OCR2 23 23 23 OSCCAL 31 31 00 31 PACR 1A PINA 19 19 19 19 19 PINB 16 16 16 16 16 16 16 16 16 16 16 16 16 PINC 13 13 13 13 PIND 10 10 10 10 10 10 10 10 PINE 01 PINF 00 PORTA 1B 1B 1B 1B 1B PORTB 18 18 18 18 18 18 18 18 18 18 18 18 PORTC 15 15 15 15 15 PORTD 12 12 12 12 12 12 12 12 PORTE 03 RAMPZ 3B SFIOR 2C 30 SP 3D SPCR 0D OD OD OD OD SPDR OF OF OF OF OF SPH 3E 3E 3E 3E SPL 3D 3D 3D 3D 3D 3D 3D SPMCR 37 SPSR OE OE OE OE OE SREG 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 102 Приложения Окончание табл. П4 Имя IOR Тип МК til t12 t15 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 TCCR0 33 33 33 33 33 33 33 04 33 33 33 33 33 TCCR1 30 TCCR1A 2F 2F 2F 2F 2F 2F TCCR1B 2E 2E 2E 2E 2E 2E TCCR2 25 25 25 TCNT0 32 32 32 32 32 32 32 03 32 32 32 32 32 TCNT1 2F TCNT1H 2D 2D 2D 2D 2D 2D TCNT1L 2C 2C 2C 2C 2C 2C TCNT2 24 24 24 TIFR 38 38 38 38 38 38 38 38 38 38 38 36 TIMSK 39 39 39 39 39 39 39 39 39 39 39 37 TWAR 02 TWBR 00 TWCR 36 TWDR 03 TWSR 01 UBRR 09 09 09 09 09 09 UBRRHI 03 20 UCR 0A 0A 0A OA UCSRA 0B OB UCSRB 0A OA UDR ОС ОС ОС ОС ОС ОС USR 0B 0B 0B OB WDTCR 21 21 21 21 21 21 21 01 21 21 21 21 21 XDIV 3C Всего: 14 18 27 17 17 18 32 17 44 45 54 63 60 П5. Разряды регистров ввода-вывода В табл. П5.2 приведены штатные имена разрядов регистров управления и регистров состояния. Для указания типа микроконтроллера, в котором находится регистр и разряд регистра, используются номера, указанные в табл. П5.1. Знак перед номером означает, что разряд с данным именем в данном регистре в контроллере с указанным номером типа отсутствует. Таблица П5. 1 Тип MK t11 t12 t15 2323 2343 1200 2313 t28 4433 8515 8535 m163 m103 № 1 2 3 4 5 6 7 8 9 10 11 12 Таб ли ца П5.2 Регистр Ns разряда 7 6 5 4 3 2 1 0 ACSR ACD AINBG 2, 8 AGO ACI ACIE ACIC ACIS1 ACISO 1—3, 5—12 ACBG 6, 8, 9, 3, 11 10, 11 ADCSR ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPSO 3, 8, 10—12 —12 ADMUX REFS1 REFSO ADLAR MUX4 MUX3 MUX2 MUX1 MUXO 3, 8, 10—12 3, 11 3, 11 ADCBG 8 3, 11 11 11 ASSR AS2 TCN2UB OCR2UB TCR2UB 10—12 ASO TCNOUB OCROUB TCROUB 12 12 12 12 EECR EERIE EEMWE EEWE EERE 2—6, 8—12 —4, —6, 9 —5 EICR (12) ISC71 ISC70 ISC61 ISC60 ISC51 ISC50 ISC41 ISC40 EIFR (12) INTF7 INTF6 INTF5 INTF4 EIMSK (12) INT7 INT6 INT5 INT4 INT3 INT2 INT1 INTO GIFR INTF1 INTFO PCIF 1—4, 6, 8—11 6, 8—11 1—3 GIMSK INT1 INTO PCIE 1—6, 8—11 6, 8—11 1—3 ICR (7) INT1 INTO LLIE TOIEO ISC11 ISC10 ISC01 ISCOO IFR (7) INTF1 INTFO TOVO Разряды регистров ввода-вывода о GJ Продолжение табл. П5.2 Регистр Ns разряда 7 6 5 4 3 2 1 0 MCUCR 1—6, 8—12 SRE 9, 12 SRW 9, 12 SE 10, 11 PUD 2,3 SE SM1 10, 11 SM SMO 10, 11 SM1 3, 12 ISC11 6, 8—11 SMO 3, 12 ISC10 6, 8—11 —12 ISC01 —7, 12 ISCOO —7, 12 MCUCS(7) PLUPB SE SM WDRF EXTRF PORF MCUSR 1—4, 8, 10—12 WDRF 2, 3, 8, 11 BORF 2, 3, 8, 11 EXTRF PORF MODCR(7) PACR(7) ONTIM4 ONT1M3 ONTIM2 ONTIM1 ONTIMO DDA3 MCONF2 PA2HC MCONF1 DDA1 MCONFO DDAO SFIOR 3, 11 ACME 11 FOC1A PUD 11 PSR1 PSR2 11 PSRO PSR10 11 SPCR(8—12) SPIE SPE DORD MSTR CPOL CPHA SPR1 SPRO SPMCR(11) ASRE BLBSET PGWRT PGERS SPMEN SPSR(8—12) SPIF WCOL SPI2X 11 TCCRO 1—12 FOVO 7 PWMO 12 COM01 12 OOM01 7 COMOO 12 OOMOO 7 CTCO 12 CS02 CS01 CSOO TCCR1(3) CTC1 PWM1 COM1A1 COM 1 AO CS13 CS12 CS11 CS10 TCCR1A 6, 8—12 COM1A1 COM11 8 COM 1 AO COM 10 8 COM1B1 —6,8 COM1BO —6, 8 F0C1A 11 FOC1B 11 PWM 11 PWM10 104 Приложения Окончание табл. 5.2 Регистр Ns разряда 7 6 5 4 3 2 1 0 TCCR1B 6, 8—12 ICNC1 ICES1 CTC1 CS12 CS11 CS10 TCCR2 10—12 FOC2 11 PWM2 C0M21 COM20 CTC2 CS22 CS21 CS20 TIFR 1—6, 8—12 T0V1 6, 8, 9 OCF2 10—12 TOV2 10—12 OCF1A 3, 6, 9 OCF1(8) ICF1 10—12 OCF1B 9 OCF1A 10—12 OCF1B 10—12 ICF1 6, 8, 9 TOV1 3, 10—12 TOVO 1—6, 8, 9 OCFO 12 TOVO 10—12 TIMSK 1—6, 8—12 TOIE1 6, 8, 9 OCIE2 10—12 TOIE2 10—12 OCIE1A 3, 6, 9 0CIE1(8) TICIE1 10—12 OCIE1B 9 OCIE1A 10—12 OC1E1B 10—12 TICIE1 6, 8, 9 TOIE1 3, 10—12 TOIEO 1—6, 8, 9 OCIEO 12 TOIEO 10—12 TWCR(11) TWSR(11) TWINT TWS7 TWEA TWS6 TWSTA TWS5 TWSTO TWS4 TWWC TWS3 TWEN TWIE UCR(6, 9, 10, 12) RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 UCSRA(8, 11) RXC TXC UDRE FE OR U2X 11 RXB8 MPCM UCSRB(8, 11) RXCIE TXCIE UDRIE RXEN TXEN CHR9 TXB8 USR(6, 9, 10, 12) RXC TXC UDRE FE OR WDTCR(1—12) WDTOE —5 WDE WDP2 WDP1 WDP0 о Oi 106 Приложения П6. Установочные биты (Fuse Bits) В табл. П6 перечислены имена установочных битов у микроконтроллеров семейства AVR и указаны исходные значения установочных битов, имеющихся у микроконтроллеров разных типов. Таблица П6 Fuse Bits Тип МК т— ф* см ф* ю т-Ф4 2323 2343 1200 2313 со С4 ы 4433 8515 8535 т163 m103 BODEN 1 1 1 1 BODLEVEL 0 0 1 1 BOOTRST 1 BOOTSZO 1 BOOTSZ1 1 CKSELO 0 0 0 0 0 0 CKSEL1 0 1 0 1 1 1 CKSEL2 1 0 0 0 0 CKSEL3 0 0 0 EESAVE 1 FSTRT 1 0 1* 1* 1 INTCAP 1 RCEN 0 1‘ RSTDISBL 1 1 1 SPIEN 0 0 0 0 0 0 0 0 0 0 0 SUTO 1 SUT1 1 * — можно изменить при заказе МК П7. Двоичный вычитатель Многоразрядный двоичный вычитатель состоит из одноразрядных двоичных вычитателей, соединенных цепями передачи сигнала займа. Одноразрядный двоичный вычитатель имеет три входа — а, Ь, и с и два выхода — R и С. На вход а подается сигнал, представляющий цифру уменьшаемого, на вход b — сигнал, представляющий цифру вычитаемого, на вход с — сигнал, представляющий цифру займа из данного разряда в соседний младший разряд. На выходе R формируется сигнал, представляющий цифру разности, на выходе С — сигнал, представляющий цифру займа в данный разряд из соседнего старшего разряда. Двоичный вычитатель 107 На рис. П7.1 изображена схема соединения одноразрядного вычита- теля в разряде с весом 2' с соседними разрядами. а б с Рис. П7.1 В одноразрядном вычитателе выполняется операция a-b-с. Значения переменных R и С при разных значениях переменных а, b и с приведены в табл. П7.1. Табли ца П7. 1 а ь с R с 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 Формула для определения значения переменной С в зависимости от значений переменных а, b и R имеет вид: С «f(a, b, R) - ab R v abR v abR v abR = aRv abv bR. При выполнении операции вычитания с числами без знака единичное значение переменной С в старшем разряде свидетельствует о получении неверного результата, поскольку в разрядной сетке отсутствует разряд, из которого требуется занять единицу. Числа со знаком представляются в дополнительном двоичном коде. При этом старший разряд (п) имеет вес (-2"), а соседний младший разряд — вес +2”'1. Единица займа из старшего разряда должна иметь вес +2П = 2 • 2”’1. Операция вычитания в старшем разряде выполняется по общему для всех разрядов правилу (табл. П7.1). Результат, который должен быть получен в старшем разряде при выполнении операции a-b-с с учетом весов разрядов дополнительного кода при разных комбинациях значений переменных а, b и с, указан в табл. П7.2. 108 Приложения Таб ли ца П7.2 abc R a-b-c И ООО 0 0(-2л)-0(-2п)-0(+2п) = 0(-2л) 0 001 1 0(-2л)-0(-2л)-1 (+2П) = 1(-2л) 0 010 1 0(-2л)-1(-2л)-0(+2л) = 1(+2п) 1 011 0 0(-2л)-1 (-2л)-1 (+2П) = 0(-2л) 0 100 1 1 (-2л)-0(-2п)-0(+2п) = 1(-2л) 0 101 0 1(-2л)-0(-2л)-1(+2л) = 2(-2л) 1 110 0 1(-2л)-1(-2л)-0(+2л) = 0(-2л) 0 111 1 1(-2л)-1(-2л)-1(+2л) = 1(-2л) 0 Результат, получаемый в третьей и шестой строках табл. П7.2, не может быть представлен в данной разрядной сетке. В этом случае признак переполнения разрядной сетки при выполнении операций с числами со знаком (v) должен иметь единичное значение. Формула для определения значения переменной V в зависимости от значений переменных а, b и R имеет вид: V=f(a, b, R) = abR v abR. П8. Разработка программы на языке AVR Ассемблера фирмы Atmel П8.1. Программа на языке ассемблера представляется в виде одного или нескольких текстовых файлов. Файл состоит из одного или нескольких сегментов. Программа может иметь в своем составе сегменты трех типов — CSEG, ESEG и DSEG. Сегмент типа CSEG является обязательным. Запись программы выполняется построчно. Строка может содержать до 120 символов (буквы, цифры, знаки, пробелы). Строка может быть пустой. В строке выделяются три поля. Слева находится поле для записи метки. Метка представляет собой последовательность из букв, цифр и некоторых знаков и начинается с буквы. Запись метки заканчивается знаком ":Поле метки может быть пустым. Справа от поля метки находится поле для записи мнемокодов команд и директив ассемблера. Поле может быть пустым. Далее находится поле для записи комментария. Запись комментария начинается со знака ";Поле комментария может быть пустым. Разработка программы на языке AVR Ассемблера фирмы Atmel 109 В процессе ассемблирования мнемокоды команд преобразуются в машинные коды команд, директивы ассемблера и метки используются при формировании программы в машинных кодах. Комментарии игнорируются. Они используются программистами в качестве пояснений к программе. Мнемокоды команд рассмотрены при описании системы команд (см. главу 2) и приведены в табл. 2.1—2.14. Директивы ассемблера выполняют следующие функции: определяют тип сегмента (директивы .CSEG, .ESEG, .DSEG); распределяют память микроконтроллера (директивы .ORG, .DB, .DW, .BYTE); присваивают имена и значения (директивы .DEF, .EQU, .SET); управляют процессом ассемблирования (директивы .DEVICE, .INCLUDE, .EXIT, .MACRO, .ENDMACRO); управляют формированием листинга (директивы .NOLIST, .LIST, .LISTMAC). П8.2. Сегмент тип CSEG начинается с директивы .CSEG. Если запись программы начинается с сегмента этого типа, директива может отсутствовать. В сегменте типа CSEG записываются мнемокоды команд и могут записываться все директивы ассемблера, кроме директивы .BYTE. Метка является символическим адресом в адресном пространстве FlashROM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, записанной в начале сегмента после директивы CSEG. В программе могут находиться несколько сегментов типа CSEG. При отсутствии директивы .ORG в первом из них в качестве исходного принимается нулевой адрес в FlashROM. В сегменте типа CSEG директива .DB определяет байт или группу байтов, которые должны быть записаны в FlashROM в качестве констант, начиная с адреса, обозначенного меткой перед директивой. Пример 1. .CSEG .ORG $140 NUM: .DB $12, $34, $56, $78 Байт $12 записывается в FlashROM по адресу NUM = $140 в младшую половину ячейки, байт $34 — по этому же адресу в старшую половину ячейки, байт $56 — по адресу NUM+1 = $141 в младшую половину ячейки, байт $78 — по адресу NUM+1 в старшую половину ячейки. Запись выполняется при программировании микроконтроллера. Директива .DW определяет слово или группу слов, которые должны быть записаны в FlashROM в качестве констант, начиная с адреса, обозначенного меткой перед директивой. 110 Приложения Пример 2. NUMS: . DW $1234, $5678, $9АВС Слово $1234 записывается в FlashROM по адресу NUMS, слово $5678 — по адресу NUMS+1, слово $9АВС — по адресу NUMS+2. Реальные адреса вычисляются в процессе ассемблирования. Запись в FlashROM выполняется при программировании микроконтроллера. Кроме символических адресов, указанных в сегменте CSEG в поле метки и используемых в мнемокодах команд безусловного и условного перехода, при записи программы на языке ассемблера могут вводиться символические имена для регистров общего назначения и отдельных разрядов в них, для регистров ввода-вывода и отдельных разрядов в них, для переменной К в мнемокодах команд в табл. 2.2 и 2.3 и для переменной q в мнемокодах команд в табл. 2.5. Директива .DEF присваивает символическое имя регистру общего назначения. Это имя может указываться в мнемокодах команд вместо стандартного обозначения (7?d, RT). Пример 3. .DEF TEMP = R16 LDI TEMP, $F0 В регистр общего назначения R16 заносится байт $F0. Директивы .EQU и .SET присваивают значение имени, введенному программистом. Пример 4. .EQU DDRCINIT = $ЗВ LDI TEMP, DDRCINIT OUT $14, TEMP Коду, который должен быть занесен в регистр DDRC (№$14), программист присвоил имя DDRCINIT. При выполнении программы в регистр DDRC будет занесен двоичный код 00111011, который определяет направление передачи через выводы порта С. Пример 5. .DEF MASTEST = R20 . EQU KTEST = 6 SBRC MASTEST. KTEST Выполнение команды, условного перехода (команда №111) зависит от состояния шестого разряда в регистре общего назначения R20. Разработка программы на языке AVR Ассемблера фирмы Atmel 111 Пример 6. . EOU STACKINIT = $025F Коду, предназначенному для занесения в регистр-указатель стека, программист присвоил имя и задал значение. Значение, присвоенное директивой .EQU, остается неизменным для всей программы. Значение, присвоенное директивой .SET, может быть изменено в другом месте программы. Регистры ввода-вывода и отдельные разряды в некоторых из них имеют штатные символические имена. Штатные имена регистров ввода-вывода у микроконтроллеров разных типов приведены в приложении П4. Штатные имена разрядов регистров ввода-вывода приведены в тексте книги при описании работы устройств, в которых эти регистры используются, и указаны в приложении П5. С использованием штатного имени мнемокод второй команды в примере 4 принимает вид: OUT DDRC, TEMP Директива .DEVICE определяет тип микроконтроллера, для которого составляется программа. По этой директиве в ассемблере выбирается служебный файл, в котором присвоены имена регистрам ввода-вывода и их разрядам, указана емкость запоминающих устройств и отмечены другие особенности микроконтроллера используемого типа. Пример записи директивы: .DEVICE AT90S8515 Директива .INCLUDE указывает имя дополнительного файла, который должен быть использован в процессе ассемблирования. Пример записи директивы: .INCLUDE "UART.ASM", где UART.ASM — имя дополнительного файла. Директива .EXIT указывает конец используемой при ассемблировании части файла, если не требуется использовать весь файл. Директивы .MACRO и .ENDMACRO обрамляют участок программы (макроопределение), который должен ассемблироваться каждый раз, когда в поле для мнемокодов команд и директив ассемблера появляется имя, заданное директивой .MACRO. Пример 7. .MACRO EEWR SBI EECR, 2 SBI EECR, 1 .ENDMACRO 112 Приложения При появлении в программе на языке ассемблера в среднем поле имени EEWR (макровызов) ассемблируются мнемокоды SBI EECR, 2 и SBI EECR, 1 и в программу на машинном языке вставляются машинные коды этих команд. В макроопределении вместо конкретных имен и значений могут вводиться обобщенные обозначения параметров @0, @1, @9. В макровызове после имени указываются значения параметров для данного макровызова в порядке их номеров. Пример 7А. .MACRO ADD16 ADD @0, @1 ADDC @2, @3 .ENDMACRO .CSEG ADD16 R4, R10. R5, R11 При ассемблировании данного макровызова будут ассемблироваться команды с мнемокодом ADD R4, R10 ADDC R5, R11 В процессе ассемблирования формируется файл для выдачи листинга. С использованием директив .NOLIST и .LIST выделяется участок программы, который не требуется выводить на листинг. Директива LIST МАС, записанная перед именем, которое было указано в директиве .MACRO, включает в листинг команды, обрамленные директивами MACRO и ENDMACRO, и помечает их знаком П8.3. Сегмент типа ESEG начинается с директивы .ESEG. В сегменте записываются директивы .DB, .DW и .ORG. Метка является символическим адресом в адресном пространстве EEPROM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, заданной в начале сегмента после директивы .ESEG. В программе могут быть несколько сегментов этого типа. При отсутствии директивы .ORG в первом из них в качестве исходного принимается нулевой адрес в EEPROM. Директива .DB определяет байт или группу байтов, которые должны быть записаны в ячейки EEPROM, начиная с адреса, обозначенного меткой перед директивой .DB. Пример 8. .ESEG .ORG $20 .EMAS:.DB $02, $13, $24 Разработка программы на языке AVR Ассемблера фирмы Atmel 113 Байт $02 будет записан в EEPROM по адресу EMAS = $20, байт $13 — по адресу EMAS+1 = $21, байт $24 — по адресу EMAS+2. Запись в EEPROM выполняется в процессе программирования микроконтроллера. Директива .DW определяет слово или группу слов, которые должны быть записаны в пары ячеек EEPROM, начиная с адреса, обозначенного меткой перед директивой .DW. Пример 9. . ESEG EMASW:.DW $1357, $2468 Слово $1357 будет записано в EEPROM побайтно по адресам EMASW и EMASW+1, слово $2468 — по адресам EMASW+2 и EMASW+3. П8.4. Сегмент типа DSEG начинается с директивы .DSEG. В сегменте записываются директивы .BYTE и .ORG. Метка является символическим адресом в адресном пространстве SRAM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, записанной в начале сегмента после директивы .DSEG. В программе могут быть несколько сегментов типа .DSEG. При отсутствии директивы ORG в первом из них в качестве исходного принимается адрес $60. Директива.ВУТЕ определяет количество ячеек в SRAM, к которым будет производиться обращение для записи и чтения байтов, начиная с адреса, обозначенного меткой перед директивой .BYTE. Пример 10. .DSEG .ORG $60 DMAS:.BYTE 3 . CSEG MST: STS DMAS+1, R5 В SRAM зарезервированы три ячейки, к которым обращаются по адресам DMAS = $60, DMAS+1 = $61 и DMAS+2 = $62. По команде, записанной в FlashROM по адресу MST, выполняется пересылка байта из регистра общего назначения R5 в ячейку SRAM по адресу $61. П8.5. Вместо конкретных значений переменных в мнемокодах команд и директивах ассемблера могут записываться выражения (формулы), по которым в процессе ассемблирования эти значения вычисляются. В качестве операндов в выражение могут входить числа, символические имена и адреса, текущее значение в счетчике команд (PC). Числа могут быть представлены в десятичном, шестнадцатеричном или двоичном коде. Для обозначения шестнадцатеричного кода используются указатели $ или ОХ, для обозначения двоичного кода — указатель ОЬ. 114 Приложения Пример записи числа: 75 = $4В = 0Х4В = ObO 1001011. При составлении выражений могут использоваться арифметические операции (АО), логические операции (ЛО) и операции отношения (ОО). Результатом арифметической операции является число, результатом логической операции — код, значения битов в котором являются результатом выполнения данной логической операции с битами в разрядах кодов-операндов, результатом операции отношения является 1 ($01), если отношение выполняется, или 0 ($00), если отношение не выполняется. В табл. П8 указаны тип операции, знак операции, правило получения результата и очередность выполнения операций при вычислении выражения. Очередность выполнения может быть изменена путем заключения в круглые скобки части выражения, которая должна выполняться раньше других. Таб ли ца П8 Тип операции Знак операции Результат операции Очередность ОО !N 1,если N = 0 0, если N # 0 1 ЛО ~N $FF—$N 1 АО —N $00—$N 1 АО N*M NxM 2 АО N/M N : M 2 АО N + M N + M 3 АО N-M N-M 3 ЛО M«N M раз (ObN) <- 0 4 ЛО N»M M раз 0 -> (ObN) 4 ОО N<M 1, если N < M 0, если N a M 5 ОО N <= M 1,если N s M 0, если N > M 5 ОО N>M 1,если N > M 0, если N s M 5 ОО N >= M 1, если N г M 0, если N < M 5 ОО N==M 1, если N = M 0, если N # M 6 Аппаратно-программные средства поддержки разработок 115 Окончание табл. П8 Тип операции Знак операции Результат операции Очередность 00 N!=M 1, если N # М 0, если N = М 6 ло N&M N л М 7 ло N л М N®M 8 ло NIM N v М 9 00 N&&M 1, если N * Q и М * О 0 в противном случае 00 NIIM 0, если N « 0 и М - 0 1 в противном случае 11 Кроме арифметических, логических операций и операции отношения в выражение могут входить операции-функции: выделение младшего байта слова LOW ($ABCD) = $CD; выделение старшего байта слова HIGH ($ABCD) = $АВ; возведение в степень числа 2 EXP2(N) = 2х; выделение целой части двоичного логарифма числа LOG2(A) = log2A^ (целая часть). Пример 11. По директиве .DB в сегменте CSEG записаны четыре константы, начиная с адреса NUM (пример 1). Фрагмент программы для чтения четвертой константы имеет вид: LDI ZH, HIGH (2*(NUM+1)) LDI ZL, LOW (2*(NUM+1)) ADIW ZL, 1 LPM Четвертая константа ($78) считана из FlashROM и находится в регистре общего назначения R0. /79. Аппаратно-программные средства поддержки разработок на основе микроконтроллеров AVR фирмы Atmel (Р. Н. Золотухо) Профессиональную разработку современных микроконтролерных устройств невозможно представить без использования средств поддержки. 1 16 Приложения Фирма Atmel уделяет большое внимание вопросам технической поддержки, предлагая разработчикам как программные, так и различные аппаратные средства. Данный раздел представляет собой обзор программных и аппаратных средств проддержки разработок для микроконтроллеров AVR, предлагаемых Atmel Corp, (аппаратно-программные средства поддержки микроконтроллеров AVR описаны также в [7]). Программные средства поддержки разработок Популярность микроконтроллеров AVR способствовала тому, что многие фирмы-производители программных средств поддержки микроконтроллеров (ассемблеров, компиляторов, отладчиков) создали программные пакеты поддержки AVR. Данный раздел содержит обзор программных средств, предлагаемых самой фирмой Atmel, и начинается со знакомства с основным программным пакетом — AVR Studio. AVR Studio — это интегрированная отладочная среда разработки приложений (IDE) для микроконтроллеров семейства AVR (AT90S, ATmega, ATtiny) фирмы Atmel. IDE AVR Studio содержит: транслятор языка ассемблера (Atmel AVR macroassembler)-, отладчик(£)е/>м££ег); программное обеспечение верхнего уровня для поддержки внутрисхемного программирования (In-System Programming, ISP). Отладчик AVR Studio поддерживает все типы микроконтроллеров AVR и имеет два режима работы: режим программной симуляции и режим управления различными типами внутрисхемных эмуляторов (In-Circuit Emulators) производства фирмы Atmel. Важно отметить, что интерфейс пользователя не изменяется в зависимости от выбранного режима отладки. Отладочная среда поддерживает выполнение программ как в виде ассемблерного текста, так и в виде исходного текста языка С. Отладчик AVR Studio по формату обьектного файла совместим с ассемблерами фирм Atmel (AVR Assembler) и IAR Systems (EWA90-Assembler — ftp://www.atmel.com/pub/atmel/ewa90-a.zip). По формату объектного файла ubrof AVR Studio совместим с компилятором С фирмы IAR Systems (ICCA90 С Compiler — wwrwiar.com). по формату coff — с компиляторами С фирм Imagecraft (ICCAVR и ICCtiny — http://www.imagecraft.com/software/index.html) и HP Infotech (CodeVisionAVR — http://infotech.ir.ro). AVR Studio распространяется свободно, его последняя версия всегда доступна на сайте фирмы Atmel (http://wwwatmel.com/atmel/products/ prod203.htm). Аппаратно-программные средства поддержки разработок 117 Создание и трансляция проекта После запуска AVR Studio для создания нового проекта необходимо в меню Project выбрать команду New. В результате на экране появляется диалоговое окно (рис. П9.1), в котором необходимо ввести название проекта (Project name) и его расположение (Location). Новый проект удобнее создавать в отдельной папке. Рис. П9.1. Окно создания нового проекта Далее выбирается тип проекта: AVR Assembler. Использует встроенный макроассемблер A VR Studio. Generic 3D party С compiler. Использует внешний компилятор С, имеющий интерфейс командной строки. При выборе пункта AVR Assembler после нажатия кнопки ОК на экране появляется окно организации проекта (рис. П9.2), показывающее все связанные с проектом файлы. Рис. П9.2. Окно организации проекта Далее к проекту должен быть добавлен файл программы на языке ассемблера. Это можно сделать разными способами: или в проект добавляется уже существующий файл с расширением .asm, или создается новый. Для создания нового файла необходимо в этом окне выбрать группу Assembler Files и в меню Project выбрать пункт Add File. В открывшемся окне следует ввести название файла с расширением .asm. Если 118 Приложение файл был создан ранее, то его необходимо найти на диске и двойныу щелчком мыши занести в строку "Имя файла". Созданный (или найденный) таким образом файл будет помещен в группу Assembler Files в окне организации проекта. Подобным же образом можно подключить к проекту и другие ассемблерные файлы но группа Assembler Files может содержать только один файл, с которогс в дальнейшем будет начинатся трансляция проекта. Назовем этот фай/: входным ассемблерным файлом проекта. Значок этого файла в окне организатора проекта отмечен красной стрелкой, направленной вправо все другие файлы проекта будут отмечены синими стрелками, направленными вниз (рис. П9.3). Все файлы проекта должны быть включены во входной файл проекта с помощью ассемблерной директивы .include Для смены входного файла проекта на другой надо установить курсор мыши на нужный файл в окне организации проекта и щелкнуть правой кнопкой мыши. В открывшемся всплывающем окне надо указать этот файл как Assembler entry file. Для того, чтобы в тексте ассемблерных файлов вместо адресов внутренних регистров микроконтроллера использовать их символические имена, нужно подключить к проекту файл, содержащий назначения символических имен всех регистров выбранного микроконтроллера (обычно его называют включаемым файлом), например m103def.inc. Включаемые файлы входят в прикладное программное обеспечение A VR Studio и при инсталляции помещаются в папку Appnotes в директории, где установлен AVR Studio. Рис. П9.3. Окно организации проекта с подключенными файлами проекта Для редактирования исходного текста программы необходимо в папке Assembler Files в окне организации проекта открыть нужный файл с расширением .asm. В открывшееся окно для редактирования файла можно с клавиатуры или через буфер компьютера ввести текст программы на языке ассемблера (рис. П9.4). Перед трансляцией нужно задать установки проекта. В пункте меню Project выбирается Project Settings, и в открывшемся окне установок проекта указывается необходимый формат выходного файла. A VR Studio поддерживает следующие выходные форматы: Аппаратно-программные средства поддержки разработок 119 Object; Generic; Intel Intellec 8/MDS (Intel Hex); Motorola S-Record. Рис. П9.4. Окно редактирования программы на языке ассемблера Для отладки в AVR Studio необходим файл в формате Object (объектный файл). Однако большинство программаторов в качестве входных используют файлы в формате Intel Hex. Далее осуществляется трансляция программы и проверка правильности ее написания. Выбирается пункт Assemble в меню Project. Открывшееся окно Project Output содержит сообщения ассемблера. В это окно выводится информация о количестве слов кода и данных, о наличии ошибок, и другая информация (рис. П9.5). Рис. П9.5. Окно сообщений ассемблера Для локализации ошибок трансляции в случае их наличия можно в окне сообщений ассемблера установить курсор мыши на сообщение об ошибке и два раза щелкнуть левой кнопкой мыши. При этом в окне 120 Приложения редактирования исходного текста программы курсор будет установлен на строку, вызвавшую сообщение об ошибке, и эта строка будет выделена цветом. В результате трансляции создается выходной файл в указанном формате. Если исходный ассемблерный текст содержал сегмент энергонезависимых данных (объявленный директивой .eseg), то при трансляции будет создан также файл с расширением .еер. Этот файл содержит данные для внутренней EEPROM микроконтроллера и имеет тот же формат, что и выходной файл. Если в результате трансляции не выдается сообщений об ошибках, можно приступать к отладке проекта. Режимы работы отладчика Как уже говорилось, AVR Studio позволяет производить отладку приложений с использованием встроенного программного симулятора или внешнего внутрисхемного эмулятора. Когда пользователь запускает AVR Studio, программа проверяет наличие эмулятора на одном из последовательных портов компьютера. Если эмулятор найден, то он выбирается как базовая система отладки. Если эмулятор не найден, то отладка будет выполняться на встроенном программном симуляторе AVR. Внутрисхемный эмулятор позволяет производить отладку приложения на реальной целевой плате. Следует помнить, что в режиме реального времени эмулятор работает существенно быстрее, чем программный симулятор. Отметим еще раз, что независимо от режима работы отладчика, интерфейс A VR Studio не меняется. При переключении между различными режимами отладки все параметры среды сохраняются. Информация о текущем режиме отладчика выводится в строке состояния AVR Studio. Отладка проекта при помощи программного симулятора Для запуска отладчика необходимо выполнить процедуру Build and run, которая вызывается при нажатии на соответствующую кнопку на панели управления. Процедура Build and run выполняется в два этапа. Сперва происходит трансляция входного ассемблерного файла, при которой независимо от установок проекта, кроме выходного файла заданного формата генерируется и объектный файл. Затем этот объектный файл загружается в отладчик. Для совместимости с прежними версиями в AVR Studio предусмотрен еще один вариант запуска отладчика — загрузка полученного в результате трансляции объектного файла (File -> Open). Но при этом пользователь не имеет возможности редактировать исходный текст программы непосредственно в отладчике. Кроме того, следует помнить, что для Аппаратно-программные средства поддержки разработок 121 того, чтобы транслятор сгенерировал необходимый для запуска отладчика объектный файл, нужно в окне установок проекта указать в качестве формата выходного файла транслятора Object. При первом для проекта запуске отладчика вызывается окно выбора целевого микроконтроллера (рис. П9.6). Рис. П9.6. Окно выбора целевого микроконтроллера В этом окне из списка выбирается нужный микроконтроллер (Device), например ATmegalO3, и тактовая частота процессорного ядра (Frequency). Опции Memory и Architecture при выборе стандартного устройства в окне не используются. Это же окно может быть вызвано в процессе работы отладчика (Options -> Simulator Options). Экран AVR Studio в режиме отладки представлен на рис. П9.7. г*! £« Эдо £abuc Jjptana Sfw 1мг 'el О 3 Л 1 J W Mil 'll' 1Г. ПС on IM> fi» no on no no ю no on nc no ОС ово «jess's» едмздмо&оазд'здсо J090 Об X»Oa'OOOdOOt»0&OOG«»<J ОСАО бС СЮ...OSлОДЖЖгШ ЛС ОС ОС ОС QC ЭС 00 00 00 Г||) ЛО 00 Об ОС 00 FVSDeto » EEFRDM Pmi A -imxi P-.rtC Port D Port F ‘ PortF к» fM&wre ' раме Cyde-Cauntw ЙЕВбОВБЗ Z>as рМЙ ’ — RS— A<Mr»VH !UC) k2b шг *• - EK9G R1S • 0x00 £tzd * 0x0$ и R9 -та * ат Ш « &Ф8 R42 *8x66 RX3 » ОквЬ' ЙЛ4 - ОжОО RZ? -OXOO К2< MC * ОхЗД Ml - MO $Ыи» * ~ ‘ Яммв ‘ &вШГ > ’ мл' Рис. П9.7. Экран A VR Studio в режиме отладки 122 Приложение При выполнении процедуры Build and run (или при загрузке объектного файла) автоматически открывается окно исходного текста исполняемой микроконтроллером программы. В окне отображается код, который выполняется в отладочном окружении (эмуляторе или программном симуляторе). После выбора опций симулятора в левом поле окна ассемблерной программы появляется желтая стрелка, указывающая позицию программного счетчика микроконтроллера (рис. П9.8). Этот указатель всегдг находится на строке, которая будет выполнена в следующем цикле. Рис. П9.8. Окно исходного текста программы в режиме отладки Пользователь может выполнять программу полностью в пошаговом режиме, трассируя блоки функций или выполняя программу до того места, где стоит курсор. В дополнение можно определять неограниченное число точек останова, каждая из которых может быть включена или выключена. Точки останова сохраняются между сессиями работы. В AVR Studio для отладки программы предусмотрены две команды пошагового режима: Step Over и Trace into. Разница между ними в том. что команда Step Over не работает в подпрограммах. С помощью команд пошагового режима можно проследить изменения значений в регистрах устройств ввода/вывода, памяти и регистрового файла. К командам шагового режима относятся также Auto Step и Multi Step. Выбрав в меню Debug пункт Debug Options, можно установить в открывшемся окне параметры режимов Auto Step и Multi Step, а также некоторые другие опции симулятора, речь о которых пойдет ниже. Помимо пошагового режима, возможна отладка программы с использованием точек останова (Breakpoints). Командой Go запускается ис Аппаратно-программные средства поддержки разработок 123 полнение программы. Программа будет выполняться до остановки пользователем или до обнаружения точки останова. Для установки точки останова в AVR Studio служит пункт меню Breakpoints -> Toggle Breakpoint. Точка останова ставится в строке, отмеченной курсором (рис. П9.9). Рис. П9.9. Точка останова в окне исходного текста программы в режиме отладки Красная отметка в левом поле окна исходного текста программы показывает установленную точку останова. В процессе отладки также можно выбрать пункт меню Debug -> Run То Cursor. При выборе этого пункта исполняемый код будет выполняется до достижения команды, обозначенной курсором. При этом, если отладчик обнаруживает точку останова, установленную ранее положения курсора, то останов будет выполнен только в случае его разрешения в окне Debug Option, в противном случае выполнение не приостанавливается. Если команда, обозначенная курсором, не достигается, отладчик продолжает исполнять код программы до тех пор, пока исполнение не будет прервано пользователем. Поскольку режим Run То Cursor зависит от позиции курсора, он доступен только при активном окне исходного текста. Для остановки исполнения программы пользователем служит команда Break. В состоянии останова эта команда недоступна. При отладке с использованием точек останова или если адрес останова указан курсором в окне исходного текста, модификация информации во всех окнах происходит только при достижении останова (или при прекращении исполнения программы пользователем). 124 Приложения Пункт меняю Debug -> Reset выполняет сброс микроконтроллера Если программа при этом выполняется, то ее исполнение будет остановлено. После сброса информация во всех окнах модифицируется. Для наблюдения за работой программы можно открыть несколькс окон, отображающих состояние различных узлов микроконтроллера Окна открываются нажатием соответствующих кнопок на панели инструментов или при выборе соответствующего пункта меню View. Регистровый файл микроконтроллера AVR отображается в окне Registers (рис. П9.10). Если в процессе выполнения программы в очередном цикле значение какого-либо регистра изменится, то этот регистр будет выделен красным цветом. При этом, если в следующем цикле значение регистра останется прежним, то цветовое выделение будет снято. Такое же цветовое выделение реализовано в окнах устройств ввода/вывода, памяти и переменных. НО Ж М R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 - 0x01 - охот « 0x01 » 0x00 = 0х4А . 0x00 » 0x40 = 0x00 » 0x02 » 0x00 ’ 0x00 - 0x01 < 0x 0 0 о 0x00 « 0x00 « 0x00 - 0x00 R30 = 0x01 R31 = 0x00 Рис. П9.10. Окно состояния регистрового файла. Состояние встроенных периферийных устройств микроконтроллера отображено в окне I/O Window (рис. П9.11). яю- £:••• Наше ГValue yg CPU • External Intenu. . f.-0 Timer/CounterfJ t “0 Г ивег/Counter 1 | Looabor> WtRWRRiy » EEPROM S Port А £ Port В =£ Port С t ^PortE A £ Port F +SM Interface UART Interface 7 О АпЫодСояфш... Рис. П9.11. Окно состояния устройств ввода вывода Аппаратно-программные средства поддержки разработок 125 В этом окне отражаются все функциональные блоки микроконтроллера. Любой блок может быть раскрыт нажатием на его значок. При раскрытии блока в окне отражаются адреса и состояния всех его регистров и отдельных, доступных для модификации битов (рис. П9.12). Каждый доступный для модификации бит может быть установлен или сброшен как программой по ходу ее исполнения, так и пользователем вручную (указав курсором мыши нужный бит и щелкнув левой кнопкой мыши, пользователь может изменить значение бита на обратное) — в режиме программной симуляции это является способом имитации входного воздействия на микроконтроллер. Рис. П9.12. Развернутый порт PORTB в окне устройств ввода/вывода Другим способом задания входного воздействия на микроконтроллер в режиме симулятора является использование внешних файлов входных воздействий. Формат файла входного воздействия очень прост: 000000000:00 000000039:01 000000040:00 9999999999:FF Здесь значение, указанное после разделителя ":— это шестнадцатеричное представление сигналов, воздействующих на порт микроконтроллера. Значение, указанное до разделителя, — это десятичный номер цикла (с момента сброса микроконтроллера), в котором указанное воздействие поступает на выводы порта микроконтроллера. Файл входного воздействия должен заканчиваться строкой с заведомо большим номером цикла, в противном случае будет выдано сообщение об ошибке. Для подключения файла входного воздействия служит пункт меню Options -> Simulator Port Stimuli. В открывшемся окне нужно указать порт микроконтроллера, на который нужно подавать воздействие, и файл этого воздействия. Пользователь может создавать файлы воздействий, записывать изменения значений на выходах портов микроконтроллера в файл (формат этого файла тот же, что и у файла входных воздействий). Для записи служит пункт меню Options -> Simulator Port Logging. В открывшемся окне нужно указать порт микроконтрол 126 Приложения лера и имя файла для записи. Записываемый файл будет удаляться и создаваться вновь при каждом выполнении сброса микроконтроллера (Debug -> Reset). Подключать файл входного воздействия или задавать имя файла для записи пользователь должен сам при каждом запуске симулятора. Для наблюдения за изменениями переменных предназначено окно Watch. Переменные, определенные в программе, могут быть отображены в этом окне. Если в процессе выполнения программы значения этих переменных будут изменяться, то все изменения можно будет наблюдать в этом окне (рис. П9.13). Рис. П9.13. Окно просмотра переменных Для индикации состояния программного счетчика, указателя стека, содержимого регистра статуса SREG и индексных регистров X, Y и Z в процессе отладки программы предназначено окно Processor (рис. П9.14). Рис. П9.14. Окно состояния процессорного ядра В этом же окне отображается текущее время выполнения программы и тактовая частота ядра микроконтроллера. Просмотр ячеек памяти программ, памяти данных, EEPROM и регистров портов ввода/вывода в ходе исполнения программы возможно также с помощью диалогового окна Memory. Падающее меню диалогового окна позволяет выбрать один из четырех массивов ячеек памяти: Data, Ю, Eeprom, Program Memory. Для одновременного просмотра нескольких областей окно Memory может быть открыто несколько раз. Информация в диалоговом окне может быть представлена в виде байтов или в виде слов в шестнадцатеричной системе счисления, а также в виде ASCII-символов (рис. П9.15). В процессе отладки пользователь может инициализировать внутреннее ОЗУ или EEPROM микроконтроллера (например, данными, содержащимися в полученном при трансляции файле .еер), или сохранить содержимое ОЗУ и EEPROM в виде файлов в формате Intel Hex. Для этого служит пункт меню File -> Up/Download Memory. Аппаратно-программные средство поддержки разработок 12/ ОСС. Св 00 «А 4А 4А 4А 00 00 00 Q0 00 00 00 ОС 13 --3333 . Д ОС"1 JU ОС 00 СО 03 00 00 00 00 СО ОТ 00 00 00 00 СО ..... 3 ОСД - JG 3? СО СТ СО 00 00 00 00 00 00 00 ОС ОС СО...... ОС”! СО 30 СС 00 00 00 00 00 00 00 00 ОТ 00 ОС 00 00 .. □ОАО 00 00 00 00 00 ОТ ОТ О? ОТ вО ОТ 00 ОТ ЙО 00 00 -. ООВО 00 00 00 00 00 ОТ ОТ 00 00 ОТ 00 ОТ 00 00 00 00 .. ООСО 00 00 00 00 00 ОТ ОТ 00 00 ОТ 00 ОТ 00 00 00 00 .. □ ODO 00 00 00 ОТ 00 00 От ОТ ОТ ОТ ОТ ОТ ОТ 00 00 00 . - □ОЕО 00 00 00 00 00 00 ОТ ОТ 00 ОТ ОТ ОТ 00 00 00 00 ..... У1 Рис. П9.15. Окно просмотра содержимого памяти Для внесения изменений в программу в процессе отладки необходимо редактировать ее исходный текст. При попытке запуска симулятора на исполнение программы после редактирования на экране появляется окно, сообщающее об изменении программы и необходимости ее компиляции. Для сохранения проекта необходимо воспользоваться пунктом меню Project -> Close. При закрытии проекта сохраняются все его настройки. Во время следующей загрузки настройки будут автоматически восстановлены. Работая с программным симулятором пакета AVR Studio, следует помнить, что он пока не поддерживает некоторые режимы работы микроконтроллеров AVR и их периферийные узлы: аналого-цифровой преобразователь; аналоговый компаратор; режим часов реального времени; режим пониженного энергопотребления (инструкция "sleep" интерпретируется программным симулятором как "пор"); Возможно, в последующих версиях A VR Studio поддержка этих узлов и режимов будет реализована. Как уже говорилось, кроме программного симулятора IDE AVR Studio включает в себя программное обеспечение верхнего уровня для управления аппаратными средствами поддержки разработок. Меню Tools содержит команды запуска управляющих программ. Особенности интерфейса и работы этих программ будут рассмотрены ниже. Аппаратные средства поддержки разработок Для аппаратной поддержки разработок на основе микроконтроллеров AVR фирма Atmel предлагает широкий спектр средств, которые можно классифицировать как по назначению, так и по стоимости внутри каждого класса. Можно выделить следующие классы аппаратных средств по их назначению: стартовые наборы разработчика {Starter Kits)', внутрисхемные эмуляторы {In-Circuit Emulators)', внутрисхемные программаторы {In-System Programmers)', специализированные наборы разработчика. 128 Приложения Некоторые аппаратные средства являются универсальными и одновременно могут быть отнесены к нескольким классам, например к стартовым наборам разработчика и внутрисхемным программаторам. Остановимся подробнее на назначении каждого из перечисленных классов и подробнее рассмотрим их состав. Стартовые наборы разработчика Применение стартовых наборов позволяет разработчику быстро, минуя этап макетирования, приступить к практической разработке приложений. На платах, входящих в состав стартовых наборов, установлены необходимые для работы микроконтроллера элементы "обвязки" (стабилизатор напряжения питания, тактовый генератор или кварцевый резонатор, цепь сброса, средства для организации внутрисхемного программирования микроконтроллера), а также часто применяемые на практике узлы микроконтроллерных устройств (средства ввода и индикации, формирователи линии RS-232, интерфейс с внешним ОЗУ и пр.). Все порты микроконтроллеров выведены на разъемы и могут быть соединены с внешними устройствами. В некоторых случаях стартовые наборы разработчика могут использоваться как готовые блоки в составе проектируемой аппаратуры. MCU00100 Этот стартовый набор разработчика был первым аппаратным средством, выпущенным фирмой Atmel для поддержки тогда еще нового семейства микроконтроллеров — AVR. MCU00100 позволял программировать и отлаживать приложения для микроконтроллеров AT90S1200, AT90S2313, AT90S2323, AT90S4414 и AT90S8515 (кроме перечисленных микроконтроллеров AVR MCU00100 поддерживал кристаллы семейства AT89S с возможностью внутрисхемного программирования — AT89S8252 и AT89S53). Сейчас MCU00100 снят с производства. STK200 Следующей модификацией стартовых наборов разработчика для микроконтроллеров AVR явился STK200. Этот набор разработчика пользовался заслуженной популярностью и был широко распространен среди разработчиков. В настояцее время STK200 снят с производства и заменен более совершенными средствами. В отличие от MCU00100, у которого функция программатора реализована на самой плате, STK200 состоит из двух частей — отладочной платы п загрузочного кабеля. Причем загрузочный кабель может использоваться отдельно от STK200 в качестве внутрисхемного программатора. Загрузочный кабель подключается к LPT-порту персонального компьютера. Для подключения загрузочного кабеля па плате Аппаратно-программные средства поддержки разработок 129 STK200 предусмотрен 10-контактный разъем. Питание загрузочного кабеля осуществляется от целевой платы (в нашем случае от STK200). Встроенный стабилизированный источник питания позволяет специальным переключателем устанавливать напряжение питания целевого микроконтроллера 5 В или 3,3 В. Внутрисхемное программирование на STK200 осуществляется под управлением программы AVR ISP версий 2.4—2.65 (последующие версии AVR ISP не поддерживают STK200 и предназначены для работы со стартовым набором STK100). Под управлением AVR ISP v2.65 STK200 поддерживает следующие типы микроконтроллеров AVR (а также их модификации с напряжением питания 3,3 Вольта): AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATtiny22. STK200 комплектуется микроконтроллерами AT90S2323-10PC и AT90S8515-8PC. На плате STK200 предусмотрены панели для установки микроконтроллеров в корпусах DIP с числом выводов 8, 20, 28, 40. Для тактирования микроконтроллеров на плате установлен кварцевый резонатор на 4МГц. Кроме того, установленный на плате специальный переключатель позволяет разорвать цепь внешней синхронизации для случаев, когда микроконтроллер (например AT90S1200) тактируется от внутреннего RC-генератора. Некоторые микроконтроллеры AVR (например AT90S4414, AT90S8515) имеют внешнюю мультиплексированную шину адреса/данных для подключения внешнего ОЗУ. Для этого на плате STK200 предусмотрены панели для установки внешнего ОЗУ в корпусе DIP28 и регистра-защелки младшего байта адреса в корпусе DIP20. На адресное пространство внешнего ОЗУ могут быть отображены и другие устройства, например модуль жидкокристаллического индикатора с контроллером HD44780. Для подключения ЖКИ на плате STK200 предусмотрены соответствующий разъем и переменный резистор для регулировки контраста. Смонтированная на плате STK200 схема контроля понижения напряжения питания (BrownOut Protection Circuit) вырабатывает сигнал сброса (Reset) микроконтроллера при снижении напряжения питания до установленного порога. При медленном снижении напряжения питания (например при выключении питания) микроконтроллеры AVR могут самопроизвольно войти в режим записи EEPROM. При этом могут быть потеряны данные, сохраненные ранее в ячейке EEPROM с нулевым адресом. Чтобы этого не произошло, надо обеспечить переход микроконтроллера в состояние сброса при выключении питания. Поэтому применение BroicnOut Protection для микроконтроллеров AVR де-факто является обязательным. В зависимости от значения напряжения питания порог срабатывания BrownOut Protection может быть задан специальным переключателем. 130 Приложения Кроме рассмотренных выше, па плате STK200 установлены следующие типовые узлы микроконтроллерной системы: формирователь уровней сигналов интерфейса RS232; регулируемый источник опорного напряжения для встроенного АЦП; восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации. Порты и сигналы управления микроконтроллеров выведены на разъемы и могут быть подключены к внешним устройствам STK300 Этот набор по своему составу и возможностям идентичен рассмотренному выше STK200, но предназначен для макетирования и отладки устройств только на базе микроконтроллера ATmegalO3. STK300 комплектуется микроконтроллером AtmegalO3L-4AC, распаянным на специальном переходнике для удобства его замены. Для создания приложений на основе платы STK300 фирма Atmel предлагает утилиту Application Builder (http://www.atmel.com/atmel/ products/prod203.htm). Пользуясь Application Builder, разработчик может с помощью графического интерфейса сконфигурировать все узлы микроконтроллера ATmegalO3 и сохранить свои действия в виде процедур инициализации на языках Ассемблера или С. Загрузочный кабель STK300 может также использоваться отдельно в качестве внутрисхемного программатора. STK100 Набор предназначен для макетирования и отладки устройств на базе микроконтроллеров семейства ATtiny и АТ90. Поддерживаются следующие микроконтроллеры: ATtinylO, ATtinyl 1, ATtiny 12, ATtinyl5, ATtiny22, ATtiny28, AT90S2323, AT90S2333, AT90S2343, AT90S4433. В состав набора входят кристаллы ATtinyl 1-6РС и AT90S2343-10PC. STK100 работает под управлением программы AVR ISP v3.31, которая обеспечивает связь с персональным компьютером как через LPT-, так и через COM-порт. STK100 также может быть использован в качестве внешнего внутрисхемного программатора для разрабатываемых устройств. В настоящее время STK100 снят с производства. STK500/STK501 Из всех стартовых наборов разработчика, предлагаемых фирмой Atmel, наиболее универсальным устройством является STK500. Универсальность STK500 позволяет использовать его как отладочную плату, как параллельный программатор (для всех типов микроконтроллеров AVR) и как последовательный внутрисхемный программатор (для микроконтроллеров AVR, имеющих режим последовательного внутрисхемного программирования). 130 Приложения Кроме рассмотренных выше, па плате STK200 установлены следующие типовые узлы микроконтроллерной системы: формирователь уровней сигналов интерфейса RS232; регулируемый источник опорного напряжения для встроенного АЦП: восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации. Порты и сигналы управления микроконтроллеров выведены на разъемы и могут быть подключены к внешним устройствам STK300 Этот набор по своему составу и возможностям идентичен рассмотренному выше STK200, но предназначен для макетирования и отладки устройств только на базе микроконтроллера ATmegalO3. STK300 комплектуется микроконтроллером AtmegalO3L-4AC, распаянным на специальном переходнике для удобства его замены. Для создания приложений на основе платы STK300 фирма Atmel предлагает утилиту Application Builder (http://www.atmel.com/atmel/ products/prod203.htm). Пользуясь Application Builder, разработчик может с помощью графического интерфейса сконфигурировать все узлы микроконтроллера ATmegalO3 и сохранить свои действия в виде процедур инициализации на языках Ассемблера или С. Загрузочный кабель STK300 может также использоваться отдельно в качестве внутрисхемного программатора. STK100 Набор предназначен для макетирования и отладки устройств на базе микроконтроллеров семейства ATtiny и АТ90. Поддерживаются следующие микроконтроллеры: ATtinvlO, ATtinvll, ATtinyl2, ATtinyl5, ATtiny22, ATtiny28, AT90S2323, AT90S2333, AT90S2343/AT90S4433. В состав набора входят кристаллы ATtinyll-6PC и AT90S2343-10PC. STK100 работает под управлением программы AVR ISP v3.31, которая обеспечивает связь с персональным компьютером как через LPT-, так и через COM-порт. STK100 также может быть использован в качестве внешнего внутрисхемного программатора для разрабатываемых устройств. В настоящее время STK100 снят с производства. STK500/STK501 Из всех стартовых наборов разработчика, предлагаемых фирмой Atmel, наиболее универсальным устройством является STK500. Универсальность STK500 позволяет использовать его как отладочную плату, как параллельный программатор (для всех типов микроконтроллеров AVR) и как последовательный внутрисхемный программатор (для микроконтроллеров AVR, имеющих режим последовательного внутрисхемного программирования). Аппаратно-программные средства поддержки разработок 131 Это устройство поддерживает все выпускающиеся на сегодняшний день микроконтроллеры AVR (для поддержки микроконтроллеров, выпускаемых только в корпусах TQFP64, например ATmegalO3 или ATmega 128, нужна плата расширения STK501). Функции внутрисхемного программирования и управления STK500 реализованы на двух микроконтроллерах: AT90S1200-12SC и AT90S8535-8AC. Кроме них, на плате STK500 смонтированы следующие устройства: панели для установки микроконтроллеров в корпусах DIP8, DIP20, DIP28 и DIP40; стабилизированный источник питания с управляемым программно выходным напряжением; преобразователи уровней сигналов (для случая, когда напряжение питания целевого микроконтроллера отличается от напряжения питания управляющих микроконтроллеров); управляемый программно источник опорного напряжения для внутреннего АЦП микроконтроллера; микросхема DataFlash AT45D021; двухканальный формирователь уровней сигналов интерфейса RS232 (один канал используется для связи STK500 с управляющим персональным компьютером, другой может быть использован в разрабатываемом приложении); восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации; разъемы расширения для подключения внешних устройств. Для тактирования отлаживаемых микроконтроллеров на плате STK500 предусмотрены два источника тактовых сигналов. Один из них представляет собой генератор, построенный на инвертирующих вентилях с кварцевой стабилизацией частоты. Пользователь имеет возможность задавать частоту этого генератора, устанавливая кварцевый резонатор на необходимую частоту в специальную панель. Второй источник тактовых сигналов представляет собой выход установленного на плате STK500 управляющего микроконтроллера AT90S8535-8AC. Частота этого тактового сигнала может быть задана программно. Переключатель OSCSEL служит для выбора одного из источников тактового сигнала для микроконтроллера. Если же в качестве тактового необходимо использовать внутренний RC-генератор микроконтроллера, то внешний тактовый сигнал должен быть отключен джампером XTAL1. В отличие от STK200 и STK300, на плате STK500 не предусмотрено подключение к целевому микроконтроллеру внешнего ОЗУ. Управление STK500 происходит через COM-порт персонального компьютера. Управляющая программа является составной частью AVR Studio и запускается из меню Tools -> STK500/AVRISP/JTAGICE. Кро- Аппаратно-программные средства поддержки разработок 133 Кроме того, в AVR Studio предусмотрена возможность обновления прошивки (firmware} памяти программ управляющих микроконтроллеров (Revision Upgrade). Обновленные версии firmware включаются в состав AVR Studio как прикладное программное обеспечение. При запуске управляющая программа проверяет связь COM-порта персонального компьютера с STK500 и в случае его присутствия запрашивает версию firmware. Если в AVR Studio содержится более новая версия прошивки, управляющая программа предлагает обновить firmware путем перепрограммирования управляющих микроконтроллеров. Для входа в режим перепрограммирования надо, чтобы в момент включения питания на плате STK500 была нажата кнопка Program. Для поддержки микроконтроллеров типа ATmegalO3 и ATmegal28 фирма Atmel предлагает устройство STK501, которое устанавливается в разъемы расширения STK500 как мезонинная плата. На плате STK501 размещены: панель с нулевым усилием (ZIF socket) для подключения микроконтроллеров ATmegalO3 и ATmegal28 в корпусах типа TQFP64; дополнительный порт RS232 с поддержкой линий RTS/CTS; кварцевый резонатор на 32 кГц для реализации часов реального времени {Real-Time Clock, RTC); посадочное место под корпус типа TQFP64 для припайки адаптера внутрисхемного эмулятора megalCE пли ICE30; разъем JTAG-интерфейса для подключения внутрисхемного эмулятора JTAGICE (только для микроконтроллера ATmegal28). Кристаллы ATmegalO3 и ATmegal28 имеют больше портов ввода-вывода, чем все остальные микроконтроллеры AVR, и, соответственно, больше, чем поддерживает STK500. Поэтому порты Е, F, G, а также некоторые управляющие сигналы, которые есть только у ATmegalO3 и ATmegal28, выведены на разъемы на плате STK501. Комбинация STK500 и STK501 поддерживает для ATmegalO3 и ATmegal28 как режим внутрисхемного последовательного программирования, так и режим параллельного программирования с использованием повышенного программирующего напряжения. Как уже говорилось, стартовый набор разработчика STK500 не поддерживает работу микроконтроллера с внешним ОЗУ. Разработчики STK501 исправили этот недостаток, предусмотрев на плате STK501 посадочное место под микросхему ОЗУ объемом 128 кх8 в корпусах TSOP32 пли SOJ32 и регистр-защелку младшего байта адреса. При этом STK501 без установленного микроконтроллера может служить платой расширения для STK500, позволяющей создавать и отлаживать проекты для микроконтроллеров AT90S8515 пли ATmegal61 с использованием внешней памяти данных. 134 Приложения Внутрисхемные эмуляторы Принцип внутрисхемной эмуляции состоит в замене целевого микроконтроллера неким устройством, поведение которого с точки зрения отлаживаемой системы соответствует поведению целевого микроконтроллера. Это устройство, называемое внутрисхемным эмулятором, должно не только адекватно отражать поведение целевого микроконтроллера, но и предоставлять разработчику возможность управления процессом отладки и контроля за состоянием реальной отлаживаемой микропроцессорной системы. Для управления процессом отладки при использовании современных внутрисхемных эмуляторов, как правило, используется персональный компьютер с соответствующим программным обеспечением. Фирма Atmel предлагает разработчикам довольно широкий выбор средств внутрисхемной эмуляции, различных как по возможностям, так и по стоимости. Все предлагаемые внутрисхемные эмуляторы работают под управлением пакета AVR Studio. При этом интерфейс пользователя остается неизменным вне зависимости от того, какой тип внутрисхемного эмулятора используется. Использование внутрисхемных эмуляторов позволяет отлаживать приложения, в которых задействованы периферийные узлы и режимы микроконтроллеров, поддержка которых отсутствует в программном симуляторе. ICEPRO/ICE10 ICEPRO представляет собой классический внутрисхемный эмулятор. Он поддерживает следующие типы микроконтроллеров: ATtinylO, АТ-tinyll, ATtinyl2, ATtiny22, ATtiny28, AT90S1200, AT90S2313, AT90S2323, AT90S2343, AT90S4414, AT90S8515, AT90S4434, AT90S8535, AT90S2333, AT90S4433. Управление ICEPRO осуществляется через COM-порт персонального компьютера. ICEPRO содержит внутренний стабилизатор питающего напряжения, поэтому питание внутрисхемного эмулятора может осуществляться от источника нестабилпзированного напряжения 9—15 вольт. Подключение ICEPRO к отлаживаемому устройству осуществляется при помощи выносной платы ATADCPOD, которая, в свою очередь, соединяется с отлаживаемыми устройствами при помощи плоских кабелей (все поддерживаемые микроконтроллеры разделены на группы, и каждой группе соответствует свой разъем на выносной плате и свой плоский кабель). На выносной плате установлены несколько переключателей и перемычек, с помощью которых производится конфигурирование ICEPRO. Аппаратно-программные средства поддержки разработок 135 Состояние этих переключателей и перемычек определяет: наличие или отсутствие у целевого микроконтроллера аналого-цифрового преобразователя; наличие или отсутствие в отлаживаемой системе внешнего ОЗУ даных; источник питания для отлаживаемого устройства; источник тактового сигнала для отлаживаемой системы. В качестве тактового может быть выбран либо генератор, расположенный на плате отлаживаемого устройства, либо сам внутрисхемный эмулятор. В последнем случае предусмотрена возможность программного управления частотой тактового сигнала из AVR Studio. Если отлаживаемое устройство нс имеет своего собственного источника питания, то в процессе отладки питание его может осуществляться от внутрисхемного эмулятора (однако при этом следует помнить об ограничении по потребляемому отлаживаемым устройством току). ICEPRO поддерживает неограниченное число программных точек останова (то есть точек останова, заданных в AVR Studio). Помимо этого ICEPRO имеет пять входов аппаратного останова (Trigger Inputs). Эти входы могут использоваться для прерывания исполнения программы по какому-либо внешнему событию. Для поддержки отладки сложных систем в ICEPRO предусмотрены пять спнхровыходов (Trigger Outputs). Подобно программной точке останова, пользователь может в AVR Studio задать точку генерации синхрособытия. При выполнении внутрисхемным эмулятором команды, соответствующей этой точке, на выбранном синхровыходе будет сформирован импульс. Этот импульс может быть использован для синхронизации каких-либо внешних устройств. Еще одной из удобных функций, реализованных в ICEPRO, является возможность записи трассы, то есть сохранение последовательности исполнения инструкций микроконтроллером. Анализ записанной трассы позволяет выявить участки кода, исполнение которых по тем или иным причинам не происходит (Code Coverage Analysis). Такой анализ очень полезен при отладке программ, содержащих несколько процедур обработки прерываний, особенно если вложенность прерываний не разрешена. При необходимости использования комплексной отладки в ICEPRO предусмотрен разъем для подключения логического анализатора. С ростом номенклатуры микроконтроллеров AVR внутрисхемный эмулятор ICEPRO был заменен на более новую модель ICE 10. Возможности ICE 10 расширены за счет поддержки еще одного микроконтроллера — ATtiny 15. Для этого микроконтроллера разработана специальная выносная плата — ATtiny 15POD. Эта выносная плата содержит четырехканальный десятиразрядный аналого-цифровой преобразователь (один из каналов которого может быть сконфигурирован как дифференциальный) и отключаемый предусилитель. Конфигурация 136 Приложения ATtinyl5POD осуществляется только под управлением пакета AVR Studio, переключатели для ручной конфигурации на этой выносной плате отсутствуют. megaICE/ICE30/ICE50 Внутрисхемный эмулятор megalCE и внешне и функционально очень похож на рассмотренный выше ICEPRO. Отличие заключается только в том, что megalCE был предназначен только для внутрисхемной эмуляции одного типа микроконтроллера — ATmegalO3 и, соответственно, имел другую выносную плату (ATmegaPOD). С ростом номенклатуры семейства ATmega внутрисхемный эмулятор megalCE был заменен на более новую модель ICE30. Внутрисхемный эмулятор ICE30 поддерживает следующие микроконтроллеры семейства ATmega: ATmegalO3, ATmegal61, ATmegal63, ATmega83 и ATmega32. Расширилось и количество используемых с ICE30 выносных плат. Для поддержки мпкрокоптролеров ATmegalO3 используется выносная плата ATmegaPOD (то есть та же, что и в эмуляторе megalCE). Поддержка микроконтролеров ATmegal61 осуществляется с использованием уже знакомой выносной платы ATADCPOD. А для оставшихся микроконтроллеров — ATmega 163, ATmega83 и ATmega32 — разработана новая выносная плата ATmegal63POD. В настоящее время планируется замена ICE30 на усовершенствованный внутрисхемный эмулятор ICE50. ICE200 Другим вариантом построения внутрисхемных эмуляторов является использование так называемых отладочных кристаллов. Отладочный кристалл представляет собой микросхему, содержащую то же процессорное ядро и набор периферийных устройств, и выполненную по той же технологии, что и целевой микроконтроллер. Но, в отличие от последнего, отладочный кристалл содержит узлы, позволяющие осуществлять доступ к его внутренним ресурсам извне, и, таким образом, управлять процессом отладки. ICE200 представляет собой внутрисхемный эмулятор, построенный на основе отладочного кристалла. Преимущества построения внутрисхемного эмулятора на основе отладочного кристалла заключается в более точном соответствии поведения эмулятора и целевого микроконтроллера, а также в удешевлении такого внутрисхемного эмулятора по сравнению с классическим (поскольку отладочные кристаллы могут считаться стандартой продукцией микроэлектроники). Память программ отладочного кристалла ICE200 реализована на внешнем статическом ОЗУ. Исполняемый код загружается в ОЗУ памяти программ при запуске отладчика AVR Studio в режиме поддержки внутрисхемного эмулятора ICE200. Аппаратно-программные средства поддержки разработок 13/ ICE200 поддержитвает следующие микроконтроллеры AVR: АТ-tinylO, ATtinyl 1, ATtinvl2, AT90S1200, AT90S2313, AT90S4414, AT90S8515, AT90S4434, AT90S8535, AT90S2333, AT90S4433. Причем поддерживаются как микроконтроллеры с напряжением питания 5 В, так и микроконтроллеры с напряжением питания 2,7 В — 3,6 В. При разработке ICE200 специалисты фирмы Atmel стремились создать внутрисхемный эмулятор, доступный самому широкому кругу разработчиков. Для оптимального соотношения цена — функциональность решено отказаться от некоторых функций, реализованных в ранних моделях внутрисхемных эмуляторов Atmel (например ICEPRO). В ICE200 отсутствуют входы аппаратного останова и выходы синхронизации, а также не поддерживается режим записи трассы при выполнении отлаживаемой программы. На сегодняшний день ICE200 является самым популярным внутрисхемным эмулятором, предлагаемым Atmel Corp. Внутрисхемный эмулятор ICE200 представляет собой модульную конструкцию и состоит из: выносной платы с установленным на ней отладочным кристаллом; в тестовой панели; платы управления; набора адаптеров. Отладочный кристалл является универсальным, то есть поддерживает эмуляцию всех перечисленных микроконтроллеров. Для каждого конкретного типа микроконтроллеров существует свой адаптер, служащий для подключения выносной платы (с установленным на ней отладочным кристаллом) к целевому устройству. По типу подключенного адаптера ICE200 автоматически определяет, какой микроконтроллер будет эмулироваться. Связь выносной платы с платой управления осуществляется двумя плоскими кабелями. На плате управления смонтрованы следующие узлы: блок управления процессом отладки, реализованный на микроконтроллере AT90S8515-8AC и программируемой логической интегральной схеме (ПЛИС) ATF1504- 10JC44; статическое ОЗУ (внешняя память программ отладочного кристалла); стабилизированный источник напряжения питания; формирователь уровней сигналов интерфейса RS232 для связи с персональным компьютером. Плата управления ICE200 связывается с персональным компьютером через СОМ-порт. В ICE200 реализован режим диагностики узлов внутрисхемного эмулятора. Для осуществления диагностики надо установить тестовую панель на плату отладочного кристалла и в AVR Studio выбрать пункт 138 Приложения меню Tools -> ICE200 Diagnostic. В результате этого откроется окно, в котором отображены все этапы диагностики (рис. П9.17). Diagnostic OiagnMbc Twt RoufoM ЯгШййг '' • ' г?? ; I* АТ9068515 ------yj Р ATX6BS35 Г Log»* Р АТ9СМ433 Р AT90S2313 Р ATtayli Р ДОС Р РгодатСал* Р 1/0 . Р EuteinflftMtf F Disconnect Рис. П9.17. Окно диагностики узлов и режимов внутрисхемного эмулятора ICE200 После запуска процесса диагностирования (кнопка Run) последовательно проверяются все узлы и режимы внутрисхемного эмулятора. Если при этом определяется, что микроконтроллер и ПЛИС на плате управления содержат устаревшие варианты прошивки, то программа диагностики предложит автоматически обновить конфигурацию ПЛИС и памяти программ микроконтроллера. Для отладки с помощью ICE200 устройств, содержащих микроконтроллеры AVR, выполненные в корпусах для поверхностного монтажа, фирма Atmel предлагает дополнительный набор адаптеров ATAVRSMD. Этот набор содержит адаптеры двух типов: целевые и специализированные. Целевой адаптер припаивается на плату отлаживаемого устройства вместо микроконтроллера, а специализированный адаптер служит переходником между целевым адаптером и платой, на которой установлен отладочный кристалл. ATAVRSMD содержит по два целевых адаптера для корпусов типа SOIC8, PLCC44 и TQFP44. JTAGICE Альтернативой внутрисхемной эмуляции является режим фоновой отладки. В англоязычной литературе этот режим обозначается термином "On-Chip Debugging', или OCD. Разница между внутрисхемной эмуляцией и фоновой отладкой заключается в следующем. Внутрисхемный эмулятор с той или иной степенью достоверности имитирует поведение целевого микроконтроллера в отлаживаемой системе, в то время как в режиме фоновой отладки программный код исполняется самим целевым микроконтроллером и, таким образом, достигается полное совпадение временных и электрических параметров системы в отладочном и штатном режимах. Для поддержки режима "On-Chip Debugging' блок управления отладкой должен быть частью самого отлаживаемого микроконтроллера. В новые микроконтроллеры семейства ATmega (например ATmegal28, Аппаратно-программные средства поддержки разработок I jy ATmega323, ATmega 16) встроен блок OCD. Исполнение программного кода и доступ ко всем регистрами микроконтроллера в режиме фоновой отладки осуществляется под управлением этого блока. Управление фоновой отладкой в микроконтроллерах AVR осуществляется по JTAG-иптерфейсу, совместимому со стандартом IEEE1149.1. Устройством, реализующим протокол управления, является JTAGICE. Так же, как и рассмотренные выше внутрисхемные эмуляторы, JTAGICE подключается к COM-порту персонального компьютера. Управляющая программа является составной частью AYR Studio, и запускается соответствующей командой из меню Tools. Кроме обеспечения режима фоновой отладки, JTAGICE может быть использован в качестве внутрисхемного программатора для микроконтроллеров AVR, имеющих JTAG-интерфейс. Более подробное описание JTAGICE доступно на сайте Atmel по ссылке http://vvww.atmel.com/atmel/acrobat/doc2475.pdf. Внутрисхемные программаторы Как уже говорилось, микроконтроллеры AVR имеют несколько режимов программирования: параллельный режим с использованием повышенного программирующего напряжения, последовательный режим с использованием повышенного программирующего напряжения и режим внутрисхемного последовательного программирования. Возможность внутрисхемного программирования микроконтроллеров AVR по последовательному синхронному интерфейсу SPI позволяет создавать простые и недорогие программаторы. Такие программаторы называют внутрисхемными {In-System Programmer, ISP). AT90ISP AT90ISP — простой внутрисхемный программатор, реализованный на микроконтроллере AT90S1200-12SC. AT90ISP был первым внутрисхемным программатором, предложенным Atmel Corp. Первая версия прошивки (firmware) для микроконтроллера AT90S1200 позволяла осуществлять внутрисхемное программирование всего нескольких типов микроконтроллеров AVR (AT90S1200, AT90S2313, AT90S4414, AT90S8515) и одного микроконтроллера семейства AT89S — AT89S8252. С появлением новых типов микроконтроллеров AVR появилась необходимость усовершенствования firmware, и последняя версия прошивки (v2.2) поддерживает гораздо более широкую номенклатуру микроконтроллеров AVR (ATtiny 12, АТ-tinyl5, AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega83, ATmegalO3, ATmegal61, ATmegal63). Поддержка микроконтроллеров семейства АТ89 из последней версии firmware исключена. 140 Приложен»; AT90ISP подключается к COM-порту персонального компьютер^. Питание AT90ISP осуществляется от целевого устройства. Схем. AT90ISP представлена на рис. П9.18. TRANSMIT RECEIVE 1.0uF 20V BC857C Q100 20 2 RxO 3 TXD D100 R105 BAS 16 ClOO BC647C ОКИ CKM и 100N AT90S120G /4 vcc RESET PDO PD1 PD2ANT0 PD3 РОД PDS PD6 XTAL1 10 12 13 GND AINO/PBO A1N1/PB1 PB2 PB3 PB4 PBS PB6 РЙ7 XTAL2 Ни 6 U100 R106 4 MHZ XCtOO 15 16 1? 18 19 4 CONNECTOR AS SEEN FROM BELOW J101 vcc 02 MOSI -04 GNO 06 MISO sck RESET GND Рис. П9.18. Схема AT90ISP Описание AT90ISP можно найти на сайте Atmel по ссылке http:/ www.atmel.com/atmel/acrobat/doc0943.pdf. По адресу ftp://www.atmel.com pub/atmel/avr910.asm можно найти исходный ассемблерный текст одной из первых версий прошивки микроконтроллера AT90S1200. Как и стартовый набор MCU00100, AT90ISP работает под управлением прграммы AVRProg (последняя версия — vl.33). Как уже говорилось, AVRProg является составной частью пакета AVR Studio. Для запуска этой программы нужно выполнить команду AVR Prog из меню Tools. Однако AVRProg может быть установлен и как автономная программа. Дистрибутив AVRProg доступен на сайте Atmek. ftp://www.at-mel.com/pub/atmel/aprogwin.exe. Рабочее окно программы AVRProg представлено на рис. П9.19. Рис. П9.19. Рабочее окно программы AVRProg Аппаратно-программные средства поддержки разработок 141 Установив тип целевого микроконтроллера, пользователь может производить стирание, чтение и запись как памяти программ (Flash), так и энергонезависимой памяти данных (EEPROM). Установив курсор на кнопку Advanced и щелкнув левой кнопкой мыши, пользователь может войти (рис. П9.20) в режим установки битов защиты от несанкционированного считывания содержимого памяти программ микроконтроллера (Lock bits) и управляющих битов (Fuse bits). Рис. П9.20. Программа AVRProg — режим установки управляющих битов и битов защиты В настоящее время AT90ISP снят с производства и заменен на более современное средство — ATAVRISP. ATAVRISP ATAVRISP является самым новым внутрисхемным программатором, предлагаемым фирмой Atmel. ATAVRISP поддерживает все выпускаемые на сегодняшний день микроконтроллеры AVR, имеющие функцию внутрисхемного программирования. Управление этим внутрисхемным программатором осуществляется через COM-порт персонального компьютера. Питание на ATAVRISP подается от целевого устройства. Подобно стартовому набору разработчика STK500, внутрисхемный программатор ATAVRISP реализован на двух микроконтроллерах — AT90S1200-12SC и AT90S8535-8AC, и работает под управлением той же, входящей в состав AVR Studio, программы. Выбрав одну из закладок в окне управляющей программы, пользователь получает доступ к различным функциям программирования: 142 Приложения Program. Окно управляющей программы в этом режиме представлено на рис. П9.21. Здесь пользователь указывает тип целевого микроконтроллера (Device), режим программирования (в нашем случае ISP), а также файлы, содержащие данные для программирования Flash-ПЗУ и EEPROM микроконтроллера. Здесь же пользователь может указать управляющей программе автоматически производить стирание памяти программ микроконтроллера перед очередным программированием и верификацию — после. Fuses. Позоляет считать состояние управляющих битов микроконтроллера, и, при необходимости, запрограммировать их. LockBits. Предоставляет доступ к битам защиты памяти программ микроконтроллера от несанкционированного считывания или модификации. Advanced. Позволяет считать сигнатуру целевого микроконтроллера. Здесь же может быть задано значение калибровочного байта для внутреннего RC-генератора микроконтроллера. Board. Эта закладка предназначена, в основном, для управления STK500. В последующих версиях AVR Studio будет предусмотрена возможность обновления прошивки (firmware} памяти программ микроконтроллеров, на которых построен ATAVRISP. Auto. Позволяет выбрать несколько функций программирования и верификации и запускать их в пакетном режиме. Рис. П9.21. Окно управляющей программы внутрисхемного программатора ATAVRISP При каждом переключении с одной закладки на другую управляющая программа проверяет связь компьютера с внутрисхемным программа Аппаратно-программные средства поддержки разработок 143 тором. Если внутрисхемный программатор не отвечает на запрос компьютера, в поле сообщений окна управляющей программы выдается соответствующее предупреждение. Отличительной чертой ATAVRISP является то, что этот внутрисхемный программатор совместим с обоими стандартными разъемами для подключения к целевому устройству — с шестпконтактным (как у AT90ISP) и с десятиконтактным (как у загрузочного кабеля из набора STK200 или STK300). Прочие средства внутрисхемного программирования микроконтроллеров AVR Используемый для внутрисхемного программирования микроконтроллеров AVR последовательный интерфейс SPI может быть довольно просто эмулирован несколькими разрядами стандартного LPT-порта персонального компьютера. Выше уже говорилось, что в качестве внутрисхемного программатора для микроконтроллеров AVR может быть использован загрузочный кабель из стартового набора разработчика STK200/STK300, подключаемый к LPT-порту персонального компьютера и работающий под управлением программы AVR 1SP версии 2.65 (по ссылке http://www.avr-forum.com/ avr2 65.zip эта программа доступна в Интернете). К числу наиболее популярных программ, реализующих протокол внутрисхемного программирования через LPT-порт персонального компьютера, можно также отнести АVReal (автор Александр Редчук, http://ln.com.ua/~real/avreal). или PonyProg (автор Клаудио Ланконелли, http://w\vwlancos.com/ ppwin95.html). Нельзя не упомянуть и о существующих разработках внутрисхемных программаторов, управляемых, подобно AT90ISP или ATAVRISP, через COM-порт персонального компьютера — например, о внутрисхемном программаторе "Жгучий кабель" (автор Станислав Лещинский, http:// www.atmel.ru/Hardware/Harciware5.htm). Специализированные наборы разработчика Кроме рассмотренных выше аппаратных средств фирма Atmel предлагает также специализированные наборы разработчика, предназначенные для реализации конкретных целевых приложений. Без упоминания об этих специализированных наборах обзор аппаратно-программных средств подержки разработок, предлагаемых фирмой Atmel, не был бы полным. В настоящее время Atmel предлагает два таких специализированных набора: AT90EIT1 — этот набор предназначен для разработки и макетирования встраиваемых web-серверов на основе микроконтроллера ATmega 103. Физический уровень Ethernet реализован на микро 144 Приложения схеме CS8900 фирмы CimisLogic. Прикладное программное обеспечение полностью поддерживает протокол TCP/IP. Подробное описание, а также статьи о применении AT90EIT1 можно найти на сайте Atmel Corp, по ссылке: http:/Avww.atmel.com/atmel/acrobat/ doc2396.pdf; AT90BCKIT — предназначен для разработки зарядных устройств для различных типов аккумуляторных батарей. Зарядное устройства может быть реализовано на основе одного из трех микроконтроллеров AVR: AT90S2333, AT90S4433 или ATtinyl5. Входящее в состав специализированного набора прикладное программное обеспечение реализует алгоритмы зарядки различных типов аккумуляторов — никель-кадмиевых (NiCd), никель-металл-гидрпдных (NiMH) и литий-ионных (Li-Ion). Детальное описание специализированных наборов разработчика невозможно без глубокого понимания всех аспектов тех целевых приложений, для реализации которых предназначен тот или иной набор. Поэтому в рамках настоящего раздела даные средства подробно не рассматриваются. П10. Примеры программ для микроконтроллеров семейства AVR (Т. И. Кривченко) Предлагаемые ниже тексты учебных программ являются примерами выполнения типовых операций на AVR и позволяют быстро познакомиться с аппаратными ресурсами отладочного комплекта STK500. Программы построены таким образом, что каждый новый проект является развитием предыдущего. Подпрограммы, повторяющиеся от примера к примеру, приводятся только в первый раз. П10.1. Led.asm — простейшая программа, знакомит с общей структурой построения проекта на ассемблере, обращает внимание на обязательность инициализации указателя стека в начале программы, демонстрирует способы организации циклов и вызова подпрограмм. Присоедините блок из 8 светодиодов на STK500 плоским кабелем к разъему порта В. Логический "О" па выводах AVR будет соответствовать включенному состоянию светодиодов. Программа LED.ASM генерирует на выводах порта В двоичную счетную последовательность. Для того, чтобы при помощи светодиодов наблюдать эту последовательность визуально, в программе вводится задержка. СОВЕТ. При отладке программы в симуляторе AVRSTUDIO закомментируйте вызов подпрограммы задержки. Примеры программ для микроконтроллеров семейства AVR 145 ПРОГРАММА LED.ASM .include "8515def.inc" Подключить файл описаний имен ;регистров ввода/вывода :Инициализация Idi г31,LOW(RAMEND) out spl, г31 Idi г31,HIGH(RAMEND) out sph, r31 Инициализация указателя стека для AVR, имеющих программный стек,обязательно выполняется ;в начале программы Idi r31,$ff out ddrb, r31 Программирование порта В на вывод бесконечный цикл Loop: inc г16 out portb,г16 rcall wait rjmp Loop ;Регистр г16 используется как двоичный ;счетчик. ;Вывести содержимое г16 в порт В ;Вызов подпрограммы задержки ;Возврат на метку Loop Подпрограмма задержки wait: m: Idi г17,100 Idi г18,255 ;Внешний цикл m выполняется 100 раз ml: dec r18 ;Внутренний цикл ml выполняется 255 раз, brne ml dec r17 brne m ;пока не обнулится г18 ;Возврат, если еще не выполнили 100x255 вычитаний ret ;Возврат из подпрограммы П10.2. Kbd.asm позволяет освоить работу с портами, с таймером, познакомиться с системой прерываний, научиться работать с простейшей клавиатурой. Присоедините блок из 8 кнопок на STK500 плоским кабелем к разъему порта А. Нажатая кнопка будет соответствовать логическому "О" на входе AVR. Программа KBD.ASM периодически по прерыванию от таймера О приблизительно 1 раз в 70 мс (при Рс1к=3,68МГц) опрашивает клавиатуру. При однократном нажатии кнопки в каком-либо разряде порта А программа инвертирует состояние соответствующего разряда порта В (зажигает или гасит светодиод). Однократным нажатием считается нажатие и последующее отпускание кнопки. 146 Приложения СОВЕТ. Дребезг контактов клавиатуры при нажатии и отпускании кнопки длится не более 20 мкс. Поэтому, если опрашивать клавиатуру не чаще, чем через 100 мкс (с запасом), то можно не предпринимать никаких дополнительных программных действий для подавления дребезга. ПРОГРАММА KBD.ASM . include ”8515def.inc" .def temp=r16 .def last_state=r18 .def present_state=r19 ;Подключить файл описаний имен регистров ввода/вывода :Задание символических имен регистрам Состояние клавиатуры при прошлом опросе Состояние клавиатуры при текущем опросе Остановка вектора прерывания таймера 0 .огд 0 ;В эту точку процессор попадает после сброса rjmp start .org OVFOaddr ;Адрес вектора прерывания по переполнению rjmp timO :таймера 0 (имя "OVFOaddr" определено в :файле ”8515def.inc") ;Инициализация start:Idi temp,LOW(RAMEND) ;Инициализация указателя стека для AVR. имеющих out spl.temp программный стек, обязательно выполняется Idi temp.HIGH(RAMEND):в начале программы out sph.temp rcall port_init rcall timO_init :Инициализация портов Инициализация таймера 0 sei Остановка глобального бита разрешения :прерывания должна быть самой последней командой инициализирующей части программы. бесконечный цикл: Loop: :Основная программа в этом примере rjmp Loop :ничего не делает. Подпрограмма обработки прерывания от таймера 0. timO: push temp Сохранение регистров в стеке (станет необходимым, in temp,sreg : когда основная программа будет выполнять push temp :какие-либо действия) com last_state :Если прошлый раз кнопка была нажата ("0") in present_state,pina and last_state.present_state:И в этот раз отпущена("1"). то in temp,portb Примеры программ для микроконтроллеров семейства AVR 147 еог temp.last_state инвертировать состояние бита порта В out portb.temp mov last_state,present_state Сохранить текущее состояние клавиатуры ; для следующего входа в подпрограмму. pop temp :Восстановление регистров из стека out sreg.temp pop temp reti ;Подпрограмма инициализации портов роrt_init Idi temp,$ff ;Программирование порта В на вывод out ddrb,temp idi temp,$00 :Зажечь все светодиоды out portb.temp out ddra,temp ;Программирование порта А на вввод Idi last_state,$ff ;Считаем, что сначала ни одна кнопка ret ;не была нажата ;Подпрограмма инициализации таймера О timO_init: Idi temp,$5 out tccrO,temp коэффициент деления предделителя - 1024 Idi temp, (1«toie0) ;Разрешение прерывания от таймера 0: out timsk,temp : (1«toie0) -число 1, сдвинутое влево на toieO ;позиций. Это выражение вычислит ассемблер. ret ; Используя такие выражения, можно не запоминать :реальный номер разряда управляющего бита П10.3. Uart.asm знакомит co способом организации работы последовательного асинхронного адаптера UART при помощи опроса флагов готовности. Эта простая программа позволяет тестировать в обоих направлениях целостность аппаратных узлов последовательного интерфейса, связывающего AVR, например, с компьютером. На стороне компьютера необходимо использовать какую-либо терминальную программу, например стандартную программу HyperTerminal, которая выводит на экран компьютера символы, ASCII-коды которых поступают на вход последовательного канала компьютера, и посылает в последовательный канал ASCII-коды, соответствующие нажатым на клавиатуре компьютера клавишам. Соедините выводы TXD и RXD при помощи гибких кабелей с узлом RS-232 на STK500 (см. описание STK500). Соедините (при выключенном питании) при помощи стандартного кабеля RS232 плату STK500 с компьютером. 148 Приложения Программа UART.ASM дополнительно к отображению состояния клавиатуры (PORTA) на блоке светодиодов (PORTB) выводит состояние каждого разряда порта В в последовательный канал в ASCII-кодах и наоборот коды принятых из последовательного канала байтов выводит в порт В для отображения на блоке светодиодов. Параметры асинхронной передачи данных: скорость — 9600 бит/с; количество бит данных — 8; контроль четности — отсутствует; количество стоп бит — 1. СОВЕТ. Создавая новый проект, всегда удобно сначала настроить работу устройств вывода, таких как последовательный канал и индикатор. ПРОГРАММА UART.ASM . include "8515def.inc" ;Подключить файл описаний имен регистров ввода/вывода .def temp=r16 .def last_state=r18 .def present_state=r19 .def count=r20 .def serial=r21 :Задание символических имен регистрам Состояние клавиатуры при прошлом опросе Состояние клавиатуры при текущем опросе ;Счетчик цикла :Данные для передачи в последовательный канал Остановка векторов прерывания . огд 0 rjmp start .огд OVFOaddr rjmp timO ;B эту точку процессор попадает после сброса :Адрес вектора прерывания по переполнению ;таймера 0 (имя "OVFOaddr" определено в :файле "85l5def.inc") ;Инициализация start:Idi temp.LOW(RAMEND) Инициализация указателя стека для AVR, имеющих out spl,temp программный стек, обязательно выполняется idi temp,HIGH(RAMEND);в начале программы out sph,temp rcall port_init rcall timO_init rcall uart_init ;Инициализация портов ;Инициализация таймера 0 :Инициализация UART sei Остановка глобального бита разрешения прерывания должна быть самой последней командой инициализирующей части программы. Примеры программ для микроконтроллеров семейства AVR 149 бесконечный цикл: Loop: ;Основная программа в этом примере rjmp Loop ;ничего не делает. ;Подпрограмма обработки прерывания от таймера О ;вызывается ~ 1 раз в 70 мс. timO: push temp ;Сохранение регистров в стеке (станет необходимым, in temp,sreg :когда основная программа будет выполнять push temp ;какие-либо действия) com last_state ;Если прошлый раз кнопка была нажата ("0") in present_state,pina and last_state,present_state ;И в этот раз отпущена("1"), то in temp,portb еог temp,last_state инвертировать состояние бита порта В out portb,temp mov last_state,present_state ;Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму. ;Для каждого разряда порта В посылаем в последовательный канал ASCII-код "О"($30) ; или ”1"($31) в зависимости от состояния разряда. Idi count, 8 Инициализировать счетчик разрядов next_bit: rol temp ;Сдвинуть в бит С старший бит регистра temp clr serial ;Очистить регистр rol serial ;Поместить в него бит С subi serial,-$30 ;Получить ASCII-код rcall Trans Передать его в буфер последовательного канал dec count ;Уменьшить на 1 счетчик числа бит brne next_bit ;Если биты еще не кончились, вернуться назад Idi serial,$0a ;Послать в последовательный канал управляющий rcall trans ;ASCII-код "перевод строки" ; Idi serial,$0d ;Послать в последовательный канал управляющий ; rcall trans ;ASCII-код "возврат каретки" rcall receive pop temp ;Восстановление регистров из стека out sreg.temp pop temp reti ; Подпрограмма передачи байта в последовательный канал trans:sbis USR, UDRE ;Если передатчик еще не передал предыдущий байт, rjmp trans ;то вернуться к trans и ждать. 150 Приложения out UDR.serial ;B противном случае вывести содержимое serial в ret ; UART :Выйти из подпрограммы ;Подпрограмма опроса приемника последовательного канала receive: sbic USR.RXC :Если флаг RXC в USR сброшен, т.е. в приемнике :нет новых байт, то пропустить следующую команду. :В противном случае перейти к считыванию байта :из приемника :Выйти из подпрограммы. rjmp input ret input:in temp,UDR :Считать байт из приемника out portb,temp ret :и вывести его в порт В Подпрограмма инициализации UART uart init: Idi temp.0600011000 out UCR,temp [Инициализация UART: :TXEN=1.RXEN=1 Idi temp,23 out UBRR.temp ret :9600 бит/с при 1с1к=3,68МГц Подпрограмма "роrt_iпit" приведена в примере П10.2 Подпрограмма "timO_init" приведена в примере П10.2 П10.4. FIFO.asm показывает, как при передаче данных в последовательный канал освободить процессор от необходимости опроса флага готовности, используя прерывание по готовности передатчика и промежуточный кольцевой буфер FIFO (First In — First Out). Драйвер последовательного канала на передачу теперь содержит две подпрограммы: "MovsBuf" и "Translnt" (рис. П10.1.). Рис. Ш0.1. Организация программ для передачи данных в последовательный капал с использованием кольцевого буфера Кольцевой буфер UART_OUT организуется во внутренней оперативной памяти AVR (рис. П10.2.). В памяти также отводится место Примеры программ для микроконтроллеров семейства AVR 13 I для двух переменных — указателен на голову очереди (Head) и ее хвост (Tail). Если буфер пуст, оба указателя равны. Подпрограмма "MovsBuf" вызывается из головной программы. Она, не дожидаясь готовности передатчика, записывает в буфер UARTOut (ставит в очередь на передачу) требуемое количество байт. Подпрограмма "Translnt" вызывается по прерыванию при установке флага UDRE, что происходит, когда передатчик UART готов принять в UDR новый байт. Подпрограмма Translnt переписывает один байт из очереди UART_Out в регистр данных передатчика UART (UDR). Обе описанные подпрограммы требуют от процессора минимальных затрат времени. Подпрограмма "MovsBuf' записывает очередной байт в буфер по адресу, на который указывает указатель хвоста очереди, и увеличивает значение этого указателя. Чем больше байт в буфере, тем больше разрыв между указателями. Программа чтения из буфера "ТгапзЬЕ’считывает байт из ячейки, на которую указывает указатель головы очереди, и увеличивает значение этого указателя. Таким образом, указатели, двигаясь по кольцу, все время стремятся догнать друг друга. Когда буфер пустеет, указатель головы догоняет указатель хвоста и, наоборот, когда буфхеу, канодняетея,, указатель хвоста догоняет указатель головы. Конец буфера Хбост очереди Начало буфера Рис. П10.2. Организация буфера FIFO в памяти Г олоба очереди Подпрограмма "Transint" после передачи из очереди в UART очередного байта проверяет, не опустел ли буфер. Если все данные уже переданы, то она сбрасывает бит UDRIE, запрещая дальнейшие запросы 152 Приложения на прерывание. Восстановление передачи данных (установку бита UD-RIE) осуществит затем программа "MovsBuf" после того, как она выполнит новую запись в буфер. Наоборот, за переполнением буфера следит подпрограмма "MovsBuf. Она игнорирует очередной байт, который головная программа пытается поставить в очередь, если буфер полон. СОВЕТ. Сравните длительность исполнения программы timO в этом примере и в предыдущем. ПРОГРАММА FIFO.ASM .include "8515def.inc" ;Подключить файл описаний имен [регистров ввода/вывода [Задание символических .def temp=r16 .def last_state=r18 .def present_state=r19 .def count=r20 .def serial=r21 имен регистрам [Состояние клавиатуры при прошлом опросе [Состояние клавиатуры при текущем опросе [Счетчик цикла [Данные для передачи в последовательный канал [Определение символических имен для констант .equ UART_OUT=$cO .equ UART_OUT_T=$be .equ UART_OUT_H=$bf ;Адрес буфера UART_OUT в RAM [Адрес указателя на хвост очереди UART_OUT [Адрес указателя на голову очереди UART_OUT [Установка векторов прерывания . org 0 rjmp .org OVFOaddr rjmp timO ;B эту точку процессор попадает после сброса start [Адрес вектора прерывания по переполнению [таймера 0 (имя "OVFOaddr" определено в ;файле "8515def.inc") .org UDREaddr rjmp Translnt [Адрес вектора прерывания по флагу UDRE ;готовности передатчика UART ; Инициализация start:idi temp.LOW(RAMEND) [Инициализация указателя стека для AVR, имеющих out spl.temp [программный стек, обязательно выполняется Idi temp,HIGH(RAMEND); в начале программы out sph,temp rcall port_init rcall timO_init rcall uart_init ;Инициализация портов [Инициализация таймера 0 ;Инициализация UART sei [Установка глобального бита разрешения ;прерывания должна быть самой последней командой Примеры программ для микроконтроллеров семейства AVR 153 инициализирующей части программы. бесконечный цикл: Loop: :Основная программа в этом примере rjmp Loop ;ничего не делает. Подпрограмма обработки прерывания от таймера О вызывается ~ 1 раз в 70 мс. timO: push temp ;Сохранение регистров в стеке (станет необходимым, in temp,sreg :когда основная программа будет выполнять push temp ;какие-либо действия) com last_state ;Если прошлый раз кнопка была нажата ("О") in present-State,pina and last_state,present_state ;И в этот раз отпущена('Т'). то in temp,portb еог temp.last_state инвертировать состояние бита порта В out portb.temp mov last_state,present_state ;Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму. ;Для каждого разряда порта В посылаем в последовательный канал ASCII-код "0"($30) ; или "1" ($31) в зависимости от состояния разряда. Idi count, 8 Инициализировать счетчика разрядов next_bit: rol temp ;Сдвинуть в бит С старший бит регистра temp clr serial rol serial subi serial,-$30 rcall MovsBuf ;Очистить регистр Поместить в него бит С ;Получить ASCII-код Передать его в буфер последовательного канала dec count brne next_bit Уменьшить на 1 счетчик числа бит ;Если биты еще не кончились, вернуться назад Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall trans Послать в последовательный канал управляющий ASCII-код "перевод строки" Послать в последовательный канал управляющий ASCII-код "возврат каретки rcall receive pop temp out sreg,temp pop temp :Восстановление регистров из стека ret i Подпрограмма передачи байта в буфер UART_0UT из регистра serial MovsBuf: push zl ;Сохранение содержимого регистров в стеке 154 Приложения push zh push temp Ids zl,UART_0UT_T Ids temp,UART_0UT. cp zl,temp brne ml sbic ucr,udrie rjmp endm ;Считать указатель хвоста очереди _Н ;Считать указатель головы очереди ;Сравнить адреса головы и хвоста очереди : Если указатель на голову и хвост равны :и UDRIE="1”, ;то буфер переполнен, следовательно ;выходим из подпрограммы ml: clr zh subi zl.-UART.OUT st z,serial :Добавить к указателю хвоста очереди ;адрес начала буфера, т.е вычислить фактический адрес :и записать в него данные из регистра serial Ids zl.UART_0UT_T :Считать указатель хвоста очереди inc zl :Увеличить его на 1 andi zl.$3f ;Если величина указателя больше 15, то : вернуться к началу буфера (в нашем ; буфере 16 байт) sts UART_OUT_T,zl Сохранить новое значение указателя sbi ucr,udrie :Разрешить прерывание UDRE endm: pop temp :Восстановить из стека значения регистров pop zh pop zl ret ;Подпрограмма обработки прерывания от UDRE Т ranslnt: push zl push zh push temp in temp,sreg push temp Сохранить содержимое регистров в стеке Ids zl,UART_OUT_H ;Считать указатель головы очереди clr zh вычислить абсолютный адрес первого subi zl,-UART_OUT ; в очереди байта Id temp.z :Считать из буфера этот байт out UDR,temp ;Вывести его в UART Ids zl,UART_OUT_H inc zl andi zl,$3f Ids zh.UART OUT T :Проверка: не стал ли буфер теперь пустым7 Примеры программ для микроконтроллеров семейства AVR 155 ср zl,zh brne t1 ;Если еще нет. перейти на t1 cbi UCR,UDRIE ;Если буфер пуст, запретить дальнейшие : прерывания по флагу UDRE (передатчик пуст) t1: sts UART_OUT_H,zl Сохранить в памяти новое значение •.указателя головы очереди. pop temp out sreg.temp pop temp восстановить из стека значения регистров pop zh pop zl reti Подпрограмма ''receive'' приведена в примере П10.3. Подпрограмма "port_init" приведена в П10.2 Подпрограмма "timO_init" приведена в П10.2 Подпрограмма "uart_init" приведена в П10.3 П10.5. Led.asm позволяет выводить данные на стандартный символьный жидкокристаллический индикатор (ЖКИ), построенный на базе контроллера HD44780. Такой ЖКИ не входит в комплект STK500, но может быть подключен к нему при помощи имеющихся на отладочной плате разъемов, на которые выведены порты ввода/вывода AVR. Присоедините символьный ЖКИ к отладочной плате согласно таблице П10.1. В данном примере используется способ подключения индикатора при помощи 4-разрядной шины данных и предполагается, что данные будут передаваться только в одном направлении — от микроконтроллера к ЖКИ. При этом каждый байт данных передается по линиям DB4—DB7 последовательно двумя тетрадами, начиная со старшей. AVR-микроконтроллер посылает в ЖКИ команды (табл. П10.2), управляющие режимами его работы, и ASCII-коды выводимых символов. Контроллер ЖКИ после приема байта команды или байта данных требует некоторого времени (табл. П10.2) для обработки полученной информации, в течение которого AVR-микроконтроллер не должен выполнять новых передач. Если во время цикла записи микроконтроллер передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если контроллер ЖКИ передаются данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек (рис. П10.3). 156 Приложения При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор. Таб ли ца П 1 0. 1 Цепь N контакта на разъеме ЖКИ Название контакта на плате STK500 Описание сигнала Vss 1 GND (-) Питание. 0 V. Vdd 2 Vcc (+) Питание.+5V. Vo 3 GND Напряжение смещения, управляющее контрастностью RS 4 PD2 Вход. Высокий уровень — Данные; Низкий — Команды R/W 5 GND Вход, Высокий — Чтение, Низкий — Запись E 6 PD3 Вход. Строб, сопровождающий сигналы на шине "команды/данные" DB0 7 DB, 8 db2 9 DB3 10 db4 11 PD4 db5 12 PD5 DB6 13 PD6 db7 14 PD7 Шина "команды/данные" Буфер данных имеет больше ячеек, чем число знакомест дисплея. Смещая окно индикатора относительно буфера данных (см. систему команд), можно отображать на дисплее различные области буфера. У двустрочных индикаторов первые 40 ячеек буфера данных обычно отображаются на верхней строке дисплея, а вторые 40 ячеек — на нижней строке. Сдвиг окна дисплея относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда отображать курсор). б) а) Рис. П10.3 Отображение на дисплее символов, ASCII-коды которых записаны в DDRAM: а — однострочный ЖКИ, б — двухстрочный ЖКИ Таб ли ца П 1 0.2 Система команд контроллера HD44780 Код Описание команды Время исполнения команды RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 0 0 1 Очистить дисплей и установить курсор в нулевую позицию (адрес 0) От 82мкс до 1.64мс 0 0 0 0 0 0 0 0 1 * Установить курсор в нулевую позицию(адрес 0). Установить дисплей относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется. От 40мкс до 1,6мс 0 0 0 0 0 0 0 1 I/D S Установить направление сдвига курсора вправо(1/0 = 1) или влево (I/D = 0) при записи/чтении очередного кода в DDRAM. Разрешить (S = 1) сдвиг дисплея вместе со сдвигом курсора. 40мкс 0 0 0 0 0 0 1 D С в Включить(О = 1)/выключить (D = 0) дисплей. Зажечь (С = 1) или погасить(С = 0) курсор. Изображение курсора сделать мигающим (В = 1). 40мкс 0 0 0 0 0 1 S/C R/L * 4г Переместить курсор (S/C = 0) или сдвинуть дисплей (S/C = 1) вправо (R/L = 1) или влево(В/1_ = 0). 40мкс 0 0 0 0 1 DL N F * * Установить разрядность шины данных 4 бита (DL = 0) или 8 бит (DL = 1), количество строк дисплея — одна (N = 0) или две (N = 1), шрифт — 5x7 точек (F = 0) или 5x10 точек (F = 1) 40мкс 0 0 0 1 Acg Установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM 40м кс 0 0 1 Add Установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM 40мкс 0 1 BF АС Чтение состояния busy-флага (BF) и счетчика адреса 1мкс 1 0 Данные Запись данных в DDRAM или CGRAM 40мкс 1 1 Данные Чтение данных из DDRAM или CGRAM 40мкс Примечание: DDRAM — Display data RAM — ОЗУ ASCII-кодов, отображаемых символов; CGRAM — Character generator RAM — ОЗУ знакогенератора. Примеры программ для микроконтроллеров семейства AVR 158 Приложения Программа "LCD.ASM" дополняет предыдущий пример выводом двоичного кода, соответствующего состоянию порта В (т.е. состоянию блока светодиодов STK500), на ЖКИ. При этом используется 1-строчный режим работы, окно дисплея все время находится в крайнем левом положении относительно буфера DDRAM, курсор погашен. Для передачи на ЖКИ команд п данных используются базовы подпрограммы "Icdcom" и "Icddat". Для задержки вывода данных на индикатор используются две простые подпрограммы задержки, представляющие собой многократное исполнение процессором холостых циклов и отличающиеся величиной задержки. В это время процессор нс выполняет никакой полезно!: работы. В системах с более плотной загрузкой процессора необходимо использовать для отсчета задержек таймер, а подпрограмму вывода данных на ЖКИ выполнять по запросу прерывания от этого таймера. Подпрограмма инициализации контроллера ЖКИ "initlcd", посылая в индикатор последовательность команд при помощи подпрограммы "Icdcom", задаст режим его работы. Эта подпрограмма также выполняет вывод постоянного (не изменяемого за все время работы программы) текста на дисплей. ПРОГРАММА LCD.ASM .include ”8515def.inc” :Подключить файл описаний имен регистров ввода/вывода ;Задание символических имен регистрам .def temp=r16 .def temp1=r17 ; .def last_state=r18 Состояние клавиатуры при прошлом опросе .def present_state=r19 Состояние клавиатуры при текущем опросе .def count=r20 -.Счетчик цикла .def serial=r21 ;Данные для передачи в последовательный канал .def lcd=r22 Определение символических имен для констант equ UART.OUT =$60 :Адрес буфера UART_OUT в RAM equ UART_0UT_T =$70 ;Адрес указателя на хвост очереди UART_OUT equ UART_OUT_H =$71 ;Адрес указателя на голову очереди UART_OUT equ RS =2 :Номер разряда порта D, к которому подключен сигнал RS equ E =3 ;Номер разряда порта D, к которому подключен сигнал Е Остановка векторов прерывания org 0 ;B эту точку процессор попадает после сброса rjmp start org OVFOaddr :Адрес вектора прерывания по переполнению rjmp timO ;таймера 0 Примеры программ для микроконтроллеров семейства AVR 159 .org UDREaddr ;Адрес вектора прерывания по флагу UDRE rjmp Translnt готовности передатчика UART. :Инициализация start:Idi temp.L0W(RAMEND) Инициализация указателя стека для AVR, ;имеющих программный стек, обязательно выполняется в начале программы :Инициализация портов Инициализация таймера 0 ;Инициализация UART Инициализация led out spl.temp Idi temp,HIGH(RAMEND) out sph,temp rcall port_init rcall timO_init rcall uart_init rcall lcd_init sei Остановка глобального бита разрешения ;прерывания должна быть самой последней ;командой инициализирующей части программы 1 бесконечный цикл: Loop: ;Основная программа в этом примере rjmp Loop :ничего не делает. Подпрограмма обработки прерывание । от таймера 0 вызывается ~ 1 раз в 70 мс. timO: push temp ;Сохранение регистров в стеке (станет in temp,sreg ;необходимым.когда основная программа будет push temp выполнять какие-либо действия) com last_state ;Если прошлый раз кнопка была нажата ("0") in present_state,pina and last_state,present_state:И в этот раз отпущена("Г), то in temp.portb еог temp.last_state ;инвертировать состояние бита порта В out portb,temp mov last_state,present_state:Сохранить текущее состояние клавиатуры :для следующего входа в подпрограмму. :Для каждого разряда порта В посылаем в последовательный канал :и на led ASCII-код "0"($30)или "1" ($31) в зависимости от ;состояния разряда. Idi count. 8 next_bit: rol temp clr serial rol serial subi serial,-$30 Инициализировать счетчик разрядов :Сдвинуть в бит С старший бит регистра temp :Очистить регистр .Поместить бит С в регистр serial :Вычислить ASCII-код ($30 или $31) 160 Приложения rcall MovsBuf mov led,serial rcall leddat rcall del dec count brne next_bit Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf Idi count,8 shift:Idi led, $10 rcall ledcom rcall del dec count brne shift t rcall receive pop temp out sreg,temp pop temp reti Подпрограмма вывода на ledcom: push temp mov temp ,led andi temp,~(1<<RS) ori temp, (1«E) out portd,temp cbi portd,E mov temp.led swap temp andi temp,~(1«RS) ori temp, (1«E) out portd,temp cbi portd,E :Послать его в буфер последовательного ;канала :а также на led ;Уменьшить на 1 счетчик числа бит ;Если биты еще не кончились, вернуться назад :Послать в последовательный канал .управляющий ASCII-код "перевод строки" ;Послать в последовательный канал .управляющий ASCII-код "возврат каретки” ;Сдвинуть курсор на ЖКИ влево 8 раз ;Если на вход приемника последовательного :канала поступил какой-нибудь байт, то :считать его и вывести его в порт В. :Восстановление регистров из стека индикатор байта-команды из регистра led ;Сохранить регистр в стеке :В (см. П10,1)регистре temp собираем ;данные и значения управляющих сигналов :для вывода в порт 0 (на индикатор) ;RS=O - сообщаем ЖКИ, что передаем команду ;Е=1 ;Вывод на шину данных индикатора старшей тетрады ;Е=0 - записывающий фронт :Теперь посылаем на индикатор младшую тетраду ;из регистра led ;RS=O - сообщаем ЖКИ, что передаем команду : Е=1 :Вывод на шину данных индикатора ;Е=0 - записывающий фронт pop temp восстановить регистр из стека Примеры программ для микроконтроллеров семейства AVK 10 1 ret ! Подпрограмма вывода на индикатор байта данных из регистра led leddat: push temp :Сохранить регистр в стеке mov temp,led ; В (см. П10.1)регистре temp собираем •.данные и значения управляющих сигналов ori temp, (1«RS)+( out portd.temp cbi portd,E '1<<Е) ;E=1,RS=1 - сообщаем ЖКИ, что передаем данные ;Вывод на шину данных индикатора старшей тетрады :Е=0 - записывающий фронт mov temp,led swap temp ori temp,(1<<RS)+( out portd,temp cbi portd,E ;Теперь посылаем на индикатор младшую тетраду ;из регистра led ’1«Е) ; Е=1, RS=1 - сообщаем ЖКИ, что передаем данные Вывод на шину данных индикатора ’;Е=0 - записывающий фронт pop temp ret ;Восстановить регистр из стека Подпрограмма инициализации ЖКИ lcd_init: rcall delay Idi led,$20 :4-битный интерфейс, 1-строка, шрифт-5х7 точек rcall Icdcom rcall del Idi lcd,$OC ;включить дисплей, выключить курсор rcall Icdcom rcall del Idi led,$20 ;4'битный интерфейс, 1-строка, шрифт-5х7 точек rcall Icdcom rcall del Idi lcd,$1 ; очистить дисплей и установить курсор в rcall Icdcom ;начальнук ) позицию rcall delay ;Вывод постоянного текста на дисплей: Idi zl, low(text*2) Нагрузить адрес буфера, содержащего Idi zh,high(text*2) ;текст, в регистр косвенной адресации Idi count,7 инициализировать счетчик числа :выводимых символов lcd_text: 1pm ;считать байт данных из внутренней FLASH-памяти ;в регистр rO mov led,rO 1 rcall leddat ;вывести его на индикатор rcall del 162 Приложения adiw zl, 1 .’инкрементировать указатель адреса dec count ; brne lcd_text продолжать до конца текста ret Подпрограмма задержки del: push temp Idi temp,45 ;задержка -40 мкс при кварце 3,68 МГц m4: dec temp ; brne т4 pop temp ret Подпрограмма задержки delay:push temp push tempi Idi temp,9 ; задержка - 1,8 ms при кварце 3,68 МГц m: Idi tempi,255 ml: dec tempi brne ml dec temp brne m pop tempi pop temp ret Постоянный текст для вывода на led записываем во FLASH-память: text: ,db ’Р’.'o','г','f,'В',':',' ';PORT В Подпрограмма "MovsBuf" приведена в примере П10.4 Подпрограмма "Translnt" приведена в примере П10.4 Подпрограмма "receive" приведена в примере П10.3 Подпрограмма "port_init" приведена в примере П10.2 Подпрограмма "timO_init" приведена в примере П10.2 Подпрограмма "uart_init" приведена в примере П10.3 П10.6. В cd. asm демонстрирует способ преобразования целых двоичных чисел в двоично-десятичные, содержит пример использования макроопределения. Программа BCD.ASM модифицирует учебный проект так, чтобы теперь данные выводились в последовательный канал и на ЖКИ в десятичном формате. Двоично-десятичное преобразование 8-разрядного целого двоичного числа в 3-разрядное десятичное неупакованное число (в последовательность ASCII-кодов десятичных цифр) выполняет подпрограмма "Bin8ascii3:" Примеры программ для микроконтроллеров семейства AVR 163 Способ преобразования заключается в том, чтобы вычитать из исходного двоичного числа сначала число 100 и, подсчитывая количество вычитаний, определить десятичную цифру сотен. Затем вычисляется цифра десятков последовательным вычитанием числа 10. После этого в регистре исходного числа остается десятичная цифра единиц. Вычитание каждый раз производится до получения отрицательной разности. При переходе к определению каждого следующего десятичного разряда в регистре исходного числа восстанавливается последняя положительная разность. СОВЕТ. На сайтах www.atmel.com и www.atmel.ru имеются примеры программ двоично-десятичного преобразования для чисел с большей разрядностью, для дробных чисел, а также для чисел с плавающей точкой. ПРОГРАММА BCD.ASM .include ”8515def.inc" Подключить файл описаний имен ;регистров ввода/вывода ;Задание символических имен регистрам .def temp=r16 .def tempi=г17 ; .def last_state=r18 ;Состояние клавиатуры при прошлом опросе .def present_state=r19 ;Состояние клавиатуры при текущем опросе .def count=r20 ;Счетчик цикла .def serial=r21 ;Данные для передачи в последовательный канал .def lcd=r22 .def tascii0=r23 ;Регистры для хранения ASCII-кодов десятичного .def tascii1=r24 ;числа .def tascii2=r25 ;Определение символических имен для констант как в примере П10.5 Остановка векторов прерывания как в примере П10.5 ;Инициализация как в примере П10.5 бесконечный цикл как в примере П10.5 Подпрограмма обработки прерывания от таймера 0 вызывается ~ 1 раз в 70 мс. timO: push temp ;Сохранение регистров в стеке (станет необходимым, in temp,sreg ;когда основная программа будет выполнять push temp ;какие-либо действия) com last_state ;Если прошлый раз кнопка была нажата ("О”) in present_state,pina and last_state,present_state ;И в этот раз отпущена("1"), то in temp,portb eor temp,iast_state ;инвертировать состояние бита порта В out portb,temp 164 Приложение mov last_state,present_state ;Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму. Преобразование двоичного числа, отображающего состояние блока светодиодов, ;в двоично-десятичное. rcall bin8ascii3 ;Вывод в последовательный канал и на ЖКИ ASCII-кодов двоично-десятичного числа. mov serial,tascii2 ;Цифру сотен послать в последовательный канал rcall MovsBuf mov led,tascii2 ; и на ЖКИ rcall leddat rcall del mov serial,tasciil ;Цифру десятков послать в последовательный канал rcall Movsbuf mov led,tasciil rcall leddat ;и на ЖКИ rcall del mov serial,tasciiO ; Цифру единиц послать в последовательный канал rcall Movsbuf mov led,tasciiO rcall leddat ;и на ЖКИ rcall del Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf Idi count,3 shift:ldi led,$10 rcall ledcom rcall del dec count brne shift Послать в последовательный канал управляющий ASCII-код "перевод строки" Послать в последовательный канал управляющий ASCII-код "возврат каретки" ;Сдвинуть курсор на ЖКИ влево 3 раза rcall receive ;Если на вход приемника последовательного ;канала поступил какой-нибудь байт, то ;считать его и вывести его в порт В. ;Восстановление регистров из стека pop temp out sreg,temp pop temp Примеры программ для микроконтроллеров семейства AVR 165 reti ;Макроопределение для вычисления одного десятичного разряда .MACRO DIGIT ;Макропределение в тексте программы должно всегда располагаться до его вызова. Idi @1,-1 ;в регистр десятичной цифры исходно записываем -1 dgt_l:inc @1 ;подсчет числа вычитаний subi temp,@0 ;вычитание из двоичного числа веса десятичного ;разряда. brsh dgt_l ;если остаток еще положительный, то продолжаем :вычитать. subi temp,-@0 восстановление последнего положительного остатка. subi @1,-($30) •.Вычисление ASCII-кода десятичной цифры .ENDMACRO Подпрограмма двоично-десятичного преобразования Bin8ascii3: DIGIT 100,tascii2 вычисление десятичной цифры сотен DIGIT 10,tasciil вычисление десятичной цифры десятков DIGIT 1,tasciiO вычисление десятичной цифры единиц ret Подпрограмма "Icdcom" приведена в примере П10.5 Подпрограмма "Icddat" приведена в примере П10.5 Подпрограмма ’’lcd_init" приведена в примере П10.5 Подпрограмма "del” приведена в примере П10.5 Подпрограмма "delay” приведена в примере П10.5 Подпрограмма "MovsBuf" приведена в примере П10.4 Подпрограмма "Translnt" приведена в примере П10.4 Подпрограмма "receive" приведена в примере П10.3 Подпрограмма "port_init" приведена в примере П10.2 Подпрограмма "timO_init" приведена в примере П10.2 Подпрограмма "uart_init" приведена в примере П10.3 Постоянный текст для вывода на led как в примере П10.5 Ш0.7. Adc.asm позволяет познакомиться с работой встроенного аналого-цифрового преобразователя AVR-микроконтроллеров, содержит подпрограмму двоично-десятичного преобразования 16-разрядных двоичных чисел. Установите процессор AT90S8535 в панельку SCKT3100?3 на STK500. При установленной на STK500 перемычке "AREF" ош рное напряжение для АЦП можно регулировать из AVRSTUDIO. Э~о напряжение также выведено на разъем порта Е. Удалите гибкий кабель, который ранее соединял порт А микроконтроллера с блоком клавиатуры. Теперь этот порт будем использовать 166 Приложения для ввода аналоговых сигналов. Подайте на вход РАО напряжение (например, при помощи потенциометра), которое лежит в диапазоне от AGND до AREF. Программа ADC.ASM инициализирует АЦП на работу с временем преобразования 130 мкс. При завершении преобразования вызывается подпрограмма "adc" обработки прерывания, которая считывает результат из регистров АЦП, помещает его в буфер АЦП в памяти SRAM и инициирует преобразование по следующему каналу. После того, как цикл преобразований по всем восьми каналам завершится, дальнейшая работа АЦП запрещается до тех пор, пока буфер АЦП не будет считан из памяти. Подпрограмма обработки прерывания от таймера 0 вызывается с интервалом 70 мс, считывает двоичные данные из буфера АЦП, выполняет двоично-десятичное преобразование, посылает в последовательный канал результаты преобразования АЦП по восьми аналоговым каналам, выводит на ЖКИ результат преобразования по нулевому каналу. Если подать на вход АЦП стабильное напряжение, можно визуально оценить разброс показаний АЦП. ПРОГРАММА ADC.ASM .include "8535def.inc" Подключить файл описаний имен ;регистров ввода/вывода Падание символических имен регистрам .def temp=r16 .def tempi = r17 . def channel=r18 :Номер канала АЦП . def count=r20 ;Счетчик цикла . def serial=r21 ;Данные для передачи в последовательный канал . def lcd=r22 ;Данные для вывода на ЖКИ . def tascii0=r19 ;ASCII-коды десятичных цифр результата . def . def . def . def . def tascii1=r23 tascii2=r24 tascii3=r25 tascii4=r26 bcdcnt=r23 ;bcdcnt=tascii1 . def binl=г 19 ;Двоичное число преобразуемое в десятичное . def binh=r27 ;binl=tasciiO Определение символических имен для констант . equ UART_OUT =$c0 ;Адрес буфера UART_OUT в RAM . equ UART_OUT_T =$be ;Адрес указателя на хвост очереди UART_OUT . equ UART_OUT_H =$bf ;Адрес указателя на голову очереди UART_OUT . equ RS =2 ;Сигнал выбора команда/данные для ЖКИ . equ E =3 ;Строб записи данных в ЖКИ . equ ADC_BUF =$72 ;Адрес буфера АЦП Примеры программ для микроконтроллеров семейства AVR 167 Остановка векторов прерывания org 0 rjmp ;B эту точку процессор попадает после сброса start org OVFOaddr :Адрес вектора прерывания по переполнению rjmp timO ;таймера 0 org UDREaddr ;Адрес вектора прерывания по флагу UDRE rjmp Translnt ;готовности передатчика UART. org ADCCaddr ;Адрес вектора прерывания по завершению rjmp Adc ;аналого-цифрового преобразования. ;Вывод одного десятичного разряда в последовательный канал и на ЖКИ .MACRO DIGIT_out ;Макро определения всегда должны располагаться subi @0,-0x30 ;в тексте программы раньше, чем их вызовы, mov serial,@0 rcall MovsBuf cpi count,8 ;На ЖКИ выводится результат преобразования только brne skip ;по нулевому (count=8) каналу, mov lcd,@0 rcall leddat rcall del skip: .ENDMACRO ;Инициализация start:Idi temp,LOW(RAMEND) Инициализация указателя стека для AVR, имеющих out spl,temp программный стек, обязательно выполняется Idi temp,HIGH(RAMENO);в начале программы out sph,temp rcall port_init ;Инициализация портов rcall timO_init Инициализация таймера 0 rcall uart_init .Инициализация UART rcall lcd_init ;Инициализация ЖКИ rcall adc_init Инициализация АЦП sei Остановка глобального бита разрешения Прерывания должна быть самрй последней командой ;инициализирующей части программы. ;Бесконечный цикл: Loop: rjmp Loop ;Основная программа в этом примере ;ничего не делает. Подпрограмма обработки прерывания от таймера 0 вызывается ~ 1 раз в 70 мс, ;считывает двоичные данные из буфера АЦП, выполняет двоично-десятичное преобразование, 168 Приложения ;посылает в последовательный канал результаты преобразования АЦП по восьми [аналоговым каналам,начиная со старшего, ;выводит на ЖКИ результат преобразования по седьмому каналу. timO: push temp in temp,sreg push temp [Сохранение регистров в стеке (станет необходимым, ;когда основная программа будет выполнять [какие-либо действия) Idi zh,high(adc_buf) ;Поместить в регистр косвенной адресации Idi zl,low(adc_buf) Idi count,8 tr_l: Id binl,z+ Id binh,z+ rcall bin16ascii5 DIGIT_out tascii4 DIGIT_out tascii3 DIGIT_out tascii2 ;адрес буфера АЦП [Инициализировать счетчик числа каналов [Считать из буфера АЦП двоичный код ;результата преобразования [Выполнить двоично-десятичное преобразование :Вывести 5 десятичных цифр в буфер [последовательного канала и на ЖКИ DIGIT_out tasciil DIGIT_out tasciiO Idi serial, ' ' rcall MovsBuf [Вывести в последовательный канал ASCII-код [символа "пробел". J dec count brne tr_l :Если еще не по всем каналам данные переданы, [то вернуться назад Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf [Послать в последовательныйй канал [управляющий ASCII-код "перевод строки" [Послать в последовательный канал [управляющий ASCII-код "возврат каретки" Idi count,5 [Сдвинуть курсор на ЖКИ влево 5 раз shift:Idi led,$10 rcall ledcom rcall del dec count brne shift sbi adcsr,adie sbi adcsr,adsc [Запуск нового цикла преобразования pop temp out sreg,temp pop temp [Восстановление регистров из стека reti Примеры программ для микроконтроллеров семейства AVR 169 Подпрограмма инициализации АЦП adc_init: Idi temp,$8D ;ADEN=1- Enable ADC;ADIE=1-Enable Interrupt out adcsr, temp ;Fadc=Fclk/32(115 кГц при кварце 3,68МГц) Idi channel,7 ;Выбор седьмого канала АЦП out admux,channel sbi adcsr,adsc ;Запуск преобразования ret Подпрограмма обработки прерывания по завершению преобразования АЦП adc: push zl ;Сохранить содержимое регистров в стеке push zh ; push temp in temp,sreg push temp Idi zh,high(adc_buf) Поместить в регистр косвенной адресации Idi zl,low(adc_buf) ;адрес буфера АЦП Isl channel add zl,channel Isr channel in temp, add st z+,temp in temp,adch st z,temp dec channel brpl adc_start Idi channel,? out admux.channel cbi adcsr,adie rjmp adc_end adc_start: out admux,channel sbi adcsr.adsc adc_end: pop zl pop zh pop temp out sreg,temp pop temp ;Увеличить вдвое номер текущего канала ;Вычислить адрес хранения результата по текущему ;каналу ;Восстановить номер текущего канала ;считать результат преобразования ;из регистров АЦП и поместить его в буфер АЦП ;Уменьшить на 1 номер канала ; Если еще не все каналы в этом цикле :кончились. инициировать новое преобразование :Если цикл завершился, то подготовиться к новому циклу, ;но пока результаты не будут считаны из буфера, запретить прерывания от АЦП ;и выйти из подпрограммы. ;запуск преобразования АЦП :по следующему каналу. ;Восстановление регистров из стека. 170 Приложения ;Подпрограмма bin16asci15: двоично-десятичного преобразования Idi temp, low(10000) Idi tempi, high(IOOOO) rcall digit mov tASCII4. bedent Idi temp, low(1000) Idi tempi, high(1000) rcall digit mov tASCII3, bedent Idi temp, low(IOO) Idi tempi, high(100) rcall digit mov tASCII2, bedent Idi temp, low(10) Idi tempi, high(10) digit: [подпрограмма вычисления одной десятичной цифры Idi bedent, -1 [инициализировать счетчик числа вычитаний digit_l: inc bedent [инкрементировать счетчик числа вычитаний sub binl, temp [Вычесть из двоичного числа вес десятичного sbe binh, tempi;разряда brsh digit_l [Если остаток еще положительный, вернуться add binl, temp [Восстановить последний положительный остаток adc binh. tempi ret [Подпрограмма инициализации ЖКИ lcd_init: rcall delay Idi led, $20 ;4-битный интерфейс, 1-строка, шрифт-5х7 точек rcall Icdcom rcall del Idi led,$0C [Включить дисплей, выключить курсор rcall Icdcom rcall del Idi led,$20 ;4-битный интерфейс, 1-строка, шрифт-5х7 точек rcall Icdcom rcall del Idi led,$1 [очистить дисплей и установить курсор в rcall Icdcom ; начальную позицию rcall delay [Вывод постоянного текста на дисплей: Idi zl,low(text*2) [Загрузить адрес буфера, содержащего Idi zh,high(text*2) [текст в регистр косвенной адресации Примеры программ для микроконтроллеров семейства AVR 171 Idi count.11 инициализировать счетчик числа :выводимых символов lcd_text: 1pm ;Считать байт данных из FLASH-памяти в гО. mov led. гО ; rcall leddat ;вывести его на индикатор, rcall del ; adiw zl.1 ;инкрементировать указатель адреса, dec count : brne lcd_text продолжать до конца текста. ret Подпрограмма инициализации портов port_init: Idi temp,$Off Программирование порта D на вывод out ddrd,temp ret Постоянный текст для вывода на ЖКИ записываем во FLASH-память: .org 400 text: .db С’. Н, A1, ’N', N. А . L' ' '. 'О'.':',' CHANNEL 0 Подпрограмма "ledcom" приведена в т/меое П10.5 Подпрограмма "leddat" приведена в пр/меое П10.5 ;Подпрограмма "del" приведена в примере П10.5 Подпрограмма "Ье1ау"приведена в примере П10.5 Подпрограмма "MovsBuf" приведена в примеое П10.4 Подпрограмма "Translnt" приведена в примере П10.4 ; Подпрсгоамма "tim0_init” приведена в примере П10.2 ; Подпрстамма "uart_init" приведена в примере П10.3 172 Литература Литература 1. Atmel Corporation 8-bit RISC Microcontrollers Data Book. May 1997. 2. Atmel Corporation 8-bit RISC Microcontrollers Data Book. August 1999. 3. AVR Assembler User Guide. 4. ATtiny 15L. Preliminary. Data Sheet. 5. ATtiny 28L, ATtiny 28V. Data Sheet. 6. ATmega 163, ATmega 163L. Advance Information. Data Sheet. 7. Водовозов A. M. Микроконтроллеры для систем автоматики: Учебное пособие. — Вологда: ВоГТУ, 2002. — 123 с.