Текст
                    М. Предко
Руководство по микроконтроллерам. Том II. Москва: Постмаркет, 2001.
- 488 с.
Описаны архитектура и функционирование микроконтроллеров се-
мейств Intel MCS51, Motorola68HC05, Microchip PIC, Atmel AVR, Basic
Stamp, система команд и способы адресации, реализация прерываний,
тестирования и отладки, примеры использования для выполнения типо-
вых функций.
На лазерном диске размещены справочные данные и прикладное про-
граммное обеспечение
Для пользователей и разработчиков современных цифровых систем
© 1999, McGraw-Hill
All rights reserved
© 2000, перевод на русский язык,
ЗАО «Предприятие Постмаркет»
ISBN 5-901095-07-3

Оглавление Часть 4. Микроконтроллеры PICMICRO 7 Глава 23. Микроконтроллеры PICMICRO 8 Младшие модели семейства PICMicro 9 Средние модели семейства PICMicro 9 Старшие модели семейства PICMicro 10 Глава 24. Архитектура микроконтроллеров PICMICRO 11 Центральный процессор (CPU) 11 Регистр состояния 13 Адресация регистров 17 Программный счетчик 21 Периферийные устройства 24 Прерывания 24 Стек программного счетчика 27 Режим ожидания SLEEP 27 Архитектура PICMicro 17С4Х 29 Регистры 31 Глава 25. Аппаратные средства PICMICRO 33 Различные типы PICMicro 34 Микроконтроллеры PICMicro в 8-выводном корпусе 34 Младшие модели PICMicro 34 Модели PICMicro среднего уровня 35 Старшие модели PICMicro 36 Корпуса контроллеров 36 Виды памяти программ 38 Запуск (Reset) 39 Системный тактовый генератор 40 Аппаратные регистры и файл регистров 44 Стек программного счетчика процессора 47 Прерывания 47 Таймеры 50 Таймер TMR0 50 Таймер TMR1 52 Таймер TMR2 54 Сторожевой таймер 55 Внутренняя память EEPROM 57 Ввод —вывод данных 58 Параллельный ведомый порт 58 Последовательный цифровой ввод-вывод 59 Синхронный последовательный обмен 60 Асинхронный последовательный обмен 61 Аналоговый ввод-вывод 63 Семейство 16С62х — сравнение напряжений 63 Семейство 16С7х — аналоговый ввод 65 Биты конфигурации и идентификации 67 Программирование 69 Маркировка микроконтроллеров 73
4 Руководство по микроконтроллерам Глава 26. Разработка приложений на базе PICMicro 74 Подключение литания 74 Системный тактовый генератор 75 Запуск 79 Подключение внешних устройств 80 ТТЛ/КМОП 80 Выходные драйверы 82 Прерывания 83 Глава 27. Средства разработки для PICMICRO 85 Ассемблер MPASM 86 Языки высокого уровня 93 Средства разработки приложений фирмы Microchip 98 Симулятор MPSIM 100 Среда MPLAB 106 Система KEELOQ Н4 Набор FUZZY TECH 115 Глава 28. Система команд микроконтроллеров PICMicro 116 Команды арифметических операций с регистровой адресацией 117 Команды арифметических операций с непосредственной адресацией 132 Команды управления программой 138 Команды управления микроконтроллером 141 Команды битовых операций 146 Команды старших моделей PICMicro (серия 17С4х) 150 Расширения MPASM 152 Набор команд Parallax PICMicro 153 Глава 29. Примеры применения PICMicro 162 Первое приложение PICMicro 162 Цифровые часы / Термометр 169 Язык PICLite и приложение «Цифровые часы/Термометр» 173 Определение языка PICLITE 175 Глава 30. Заключение по семейству PICMicro 190 Информационная поддержка PICMicro 191 Web-сайты 191 Информационные серверы 193 Часть 5. Микроконтроллеры семейства AVR 195 Глава 31. Микроконтроллер AVR 196 Глава 32. Архитектура процессора AVR 198 Регистры общего назначения и АЛУ 200 Регистр состояния 202 Адресация устройств ввода-вывода и памяти SRAM 205 Программный счетчик и стек 209 Прерывания 211 Способы адресации данных 212 Глава 33. Аппаратные средства AVR 216 Типы корпусов 217 Системный тактовый генератор 217
Оглавление 5 Таймеры 219 Сторожевой таймер 223 Параллельный ввод-вывод 224 Последовательный ввод-вывод 226 UART 226 SPI 228 Аналоговый ввод-вывод 229 Конфигурирование микроконтроллера 230 Память данных EEPROM 231 Программирование 232 Программирование по параллельному интерфейсу 232 Программирование по последовательному интерфейсу 235 Маркировка микроконтроллеров AVR 237 Глава 34. Разработка систем на базе AVR 238 Подключение питания 238 Запуск 239 Прерывания 240 Операционные системы реального времени (ОСРВ) 242 Программирование в системе 245 Глава 35. Средства разработки для AVR 246 Ассемблеры 246 Языки высокого уровня 248 Средства разработки 252 Глава 36. Система команд микроконтроллеров AVR 257 Команды пересылки данных AVR 258 Команды арифметических и логических операций AVR 269 Команды ветвления AVR 286 Битовые команды и команды тестирования битов 298 Глава 37. Примеры применения AYR 310 Первое приложение 311 Часы реального времени и термометр 313 Вывод изображения с возможностью его позиционирования 316 Глава 38. Заключение по семейству AYR 323 Информационная поддержка AVR 324 WEB сайты 324 Информационный сервер 324 Компании-производители 325 Часть 6. Контроллер Basic Stamp фирмы Parallax 327 Глава 39. Контроллер Basic Stamp фирмы Parallax 328 Аппаратные средства Stamp 330 Процессор STAMP 334 Программные «лексемы» 335 Линии ввода-выводы 335 Память EEPROM с последовательной выборкой 336 Интерфейсы программирования 338 Глава 40. Программирование на PBASIC для STAMP 342 Интерфейс 342
6 Руководство по микроконтроллерам Язык PBASIC для Stamp 344 Типы данных ввода-вывода для BS2 344 Переменные и «символы» в контроллере BS1 346 Переменные в контроллере BS2 348 Операторные выражения 350 Подпрограммы 352 Форматирование исходного текста в PBASIC 353 Отладка 354 Глава 41. Разработка приложений на базе Stamp 356 Конструктивная реализация 356 Подключение питания 357 Запуск 358 Глава 42. Функции языка PBASIC для Stamp 359 Математические операторы для BS1 360 Математические операторы для BS2 364 Команды ветвления/циклов 370 Условные ветвления 374 Цифровой ввод-вывод 379 Последовательный ввод-вывод 389 Аналоговый ввод-вывод 402 Звук 407 Таблицы данных 410 Обращение к EEPROM 414 Реализация задержки 419 Управление питанием/функционированием 421 Отладка 423 Глава 43. Примеры применения Stamp 427 Первое приложение для Stamp 427 Приложение часы/термометр 430 Эмулятор BS1 433 Глава 44. Заключение по контроллерам STAMP 438 Информационная поддержка контроллеров BASIC Stamp 439 WEB-сайты 439 Информационные серверы 440 Компания - производитель 440 Часть 7. Заключение 441 Глава 45. Послесловие 442 Приложение А. Сравнительная таблица характеристик микроконтроллеров 445 Приложение В. Источники информации 447 Приложение С. Общие команды ассемблера 460 Приложение D. Универсальный симулятор UMPS 466 Приложение Е. Комплект плат SimmStick 470 Приложение F. Информационные серверы (листы рассылки) 476 Приложение G. Содержание CD-ROM 481 Список сокращений 486
Часть 4 МИКРОКОНТРОЛЛЕРЫ PICMICRO
Глава 23 МИКРОКОНТРОЛЛЕРЫ PICMICRO Краткое содержание Младшие модели PICMicro Средние модели PICMicro Старшие модели PICMicro Микроконтроллеры семейства PICMicro фирмы Microchip относятся к чис- лу восходящих звезд в мире микрокопiроллеров. По такому параметру как рабочая скорость, которая определяется количеством команд, выполняемых за один такт, PICMicro относятся к числу наиболее эффективных микрокон- троллеров из описанных в этой книге. Особенностью данного семейства яв- ляется большое количество новых моделей выпускаемых выпускаемых фир- мой Microchip — свыше 40 за 1997 год. Эти микроконтроллеры широко известны под именем PIC, но в соответствии с названием фирмы-произво- дителя Microchip более правильно называть их PICMicro. Когда говорится о PICMicro, как о «восходящей звезде», имеется в виду, что они были созданы совсем недавно. Однако их архитектура была ра цыбота- на достаточно давно — раньше, чем все другие микроконтроллеры, описанные в этой книге, исключая выпускаемые компанией Motorola. Первоначально эта архитектура была предложена отделением компании General Instrument, кото- рое занималось производством микросхем. Позже это отделение выделилось в качестве самостоятельной фирмы Microchip, которая начала проводить агрес- сивную компанию по продвижению на рынок микроконтроллеров PICMicro и серии микросхем Памяти EEPROM с последовательным доступом. Агрессивный маркетинг и широкая поддержка привлекли мое внимание к PICMicro. В течение пары лет я работал с этими микроконтроллерами как
Глава 23. Микроконтроллеры PICMICRO 9 радиолюбитель, после чего написал свою первую книгу «Программирование и применение микроконтроллеров Р1С». Большая номенклатура семейства PICMicro, включающая микроконтроллеры со всевозможными комбинация- ми и сочетаниями характеристик, позволяет выбрать прибор с необходимым набором свойств для разрабатываемого приложения. Младшие модели семейства PICMicro Младшие модели серии 16С5х реализуют нижний уровень возможностей мик- роконтроллеров семейства PICMicro. Они выполняют подмножество команд, реализуемых старшими моделями, и программно совместимы с ними. Не рекомендуется использовать эти устройства для разработки новых приложе- ний для PICMicro. Недостаток прерываний, малый объем доступной памяти программ и RAM, отсутствие внутрисистемного программирования и портов ввода/вывода с расширенными функциями являются причинами трудностей, которые возникают при реализации приложений на различных моделях мик- роконтроллеров этого семейства. Решающим фактором перехода от младших моделей к моделям среднего уровня послужило то обстоятельство, что пос- ледние продаются по аналогичной и даже меньшей цене и в таких же корпу- сах, как и первые. Теперь рассмотрим младшие модели 8-выводпых микроконтроллеров PICMicro серии 12С5хх. Обладая 6-ю линиями ввода/вывода и объемом па- мяти программ 512 или 1024 команд, эти устройства используются для созда- ния небольших и простых приложений. Микроконтроллеры этой серии, воз- можно, являются наилучшими простыми интерфейсными устройствами. Существуют приложения, использующие данную серию для ишерфейса бо- лее сложных процессоров с электромоторами (с помощью ШИМ-выходов), ЖК-индикаторами и оборудованием для звуковой локации. Средние модели семейства PICMicro Модели среднего уровня являются настоящими «рабочими лошадками» се- мейства PICMicro. Эти модели образуют законченную линию микрокошрол- леров со множеством различных функций. Они имеют такую же базовую ар- хитектуру, как микроконтроллеры младших моделей, но существенно отличаются возможностями обработки прерываний. В моделях средне го'уровня реализован следующий набор «стандартных» свойств. Количество уровней прерываний (подпрограмм) Объем памяти программ Регистровый файл (RAM) Число источников прерываний Возможность внутрисхемного программирования Число таймеров 8 512-8К команд 36-192 байт 4-12 1-3
10 Часть 4. Микроконтроллеры PICMICRO Данные микроконтроллеры имеют следующие технические характеристики. Напряжение питания Тип корпуса 2,0 - 5,0 В Пластиковый ОТР, керамический с окном, SOIC, OFP Тактовая частота От 0 до 4 МГц или до 20 МГц Число линий ввода/вывода Тип памяти программ 13-33 Масочно-программируемая, EPROM, EEPROM/Flash Возможности АЦП Компараторы напряжения, ЦАП с резистив- ным делителем, АЦП интегрирующего типа, ШИМ-выхолы Последовательные порты Другие порты SPI, I2C, асинхронный Пор1 прямого подключения ЖКИ, Парал- лельный ведомый порт Широкий диапазон возможностей, включая внутрисистемное програм- мирование, даст этим микроконтроллером значительные преимущества, позволяя использовать один и тот же программный код при реализации раз- нообразных приложений. В данной части книги я буду рассматривать микро- контроллеры этого класса. Старшие модели семейства PICMicro Старшие модели микроконтроллеров PICMicro используют 16-битные ко- манды и могут адресовать 64К слов памяти. Так как каждое слово содержит 16 бит, го старшие модели серии 17Схх могут фактически адресовать по 128 Кбайт памяти программ и памяти данных. Для обеспечения чгсния/записи памяти программ в серии 17Схх исполь- зуется модифицированное ядро центрального процессора. Это ядро позволя- ет различным командам обращаться ко всем регистрам процессора (в млад- ших и средних моделях нельзя использовать любой регистр в качестве аккумулятора, что возможно в серии 17Схх). Это повышает гибкость микро- контроллера и позволяет использовать команды в широком спектре прило- жений. В то время как в микроконтроллерах среднего уровня используется только один вектор прерывания, в старших моделях PICMicro имеется не- сколько векторов прерываний. Старшие модели PICMicro разрабатывались, в основном, для взаимодей- ствия с другими цифровыми устройствами. По этой причине в микроконт- роллерах серии 17Схх нет АЦП и устройств, обеспечивающих непосредствен- ное подключение датчиков, которые имеются в моделях среднего уровня.
Глава 24 АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ PICMICRO Краткое содержание Архитектура процессора PICMicro Центральный процессор Регистр состояния Регистр адресации Программный счетчик Периферийные устройства Прерывания Стек программного счелчика процессора Режим ожидания (SLEEP) Архитектура микроконтроллеров PICMicro 17С4х Регистры В данной главе описана архитектура микроконтроллеров PICMicro, относя- щихся к моделям среднего уровня, но она имеет aiuuioiичный вид и для младших моделей семейства. Основное различие моделей младшего и средне- го уровней заключается в том, что младшие модели не поддерживают обра- ботку прерываний. Отличия между средними и старшими моделями семей- ства PICMicro описаны в конце этой главы. Центральный процессор (CPU) Процессор PICMicro имеет Гарвардскую архитектуру, поэтому его можно рассматривать как арифметико-логическое устройство с регистрами. Процес- сор содержит ряд регистров специального назначения, которые управляют работой CPU, а также регистры управления вводом-выводом и регистры RAM, которые могут быть использованы программой пользователя для хранения
12 Часть 4. Микроконтроллеры PICMICRO переменных и организации интерфейса с периферийными устройствами, расположенными на кристалле. Все адреса явно определяются в командах. В командах с регистровой ад- ресацией для задания адреса выделяется 7 бит. Таким образом процессор PIC может обращаться к I28 адресам (рис. 24.1). Рис. 24.1. Базовая архитектура PICMicro. При предыдущем рассмотрении процессора PICMicro не обсуждался один его элемент — регистр W, который можно рассматривать, как аккумулятор или регистр временного хранения. Все арифметические команды процессора PIC используют регистр W. Если требуется сложить содержимое двух регист- ров, то сначала надо перенести содержимое первого регистра в регистр W, а затем добавить к нему содержимое второго регистра. Архитектура PICMicro очень эффективна, так как позволяет сохранить результат выполнения операции как в регистре W, так и записать его в ре- гистр, являющимся источником второю операнда. Возможность записи ре- зультата обратно в регистр-источник исключает необходимость использова- ния дополнительной команды для сохранения результата операции. Таким образом обеспечивается простое и эффективное перемещение результатов. На рис. 24.2 показана схема процессора, представляющая на простейшем уровне архитектуру PICMicro. Более половины команд могут быть выполне- ны при использовании только тех блоков, которые приведены на схеме. Один из параметров арифметической команды используется для указания размещения результата. Если этот параметр имеет значение «I», то результат записывается обратно в регистр-источник. В ассемблере MPASM фирмы Microchip для указания размещения результата в регистре-источнике ис- пользуется символ f. Для записи результата в регистр W параметр, определя- ющий место размещения, должен иметь значение «О» или в команде ассемб- лера должен быть указан символ w. Для указания размещения результата используется последний параметр в ассемблерной записи команды:
Глааа 24. Архитектура микроконтроллеров PICMICRO 13 addwf FSR, w ; Сложение содержимого регистров W и FSR, ; размещение результата в W iorwf TMRO, f ; Операция эквивалентности над содержимым ; регистров W и TMRO, размещение результата в TMRO Рис. 24.2. Архитектура PICMicro с регистром W Запись результата в регистр W необходима при выполнении команд, ко- торые производят сравнение операндов без изменения содержимою источ- ника. Такая запись используется также в случаях, когда результат является промежуточной величиной, или если он должен быть сохранен в другом ре- гистре. Место назначения результата может быть не указано в команде в явном виде: addwf Reg ; Прибавить содержимое Reg к содержимому регистра W При такой записи Ассемблер MPASM фирмы Microchip и большинство других ассемблеров запишут результат вычисления в регистр-источник (ана- логично указанию параметра «f» или «I»), Регистр состояния Регистр состояния STATUS является основным регистром процессора, кото- рый осуществляет контроль выполнения программы. Содержимое этого реги- стра делится на три части. Бит Имя Описание 0 С Флаг переноса I DC Флаг промежуточного переноса 2 Z Флаг нуля
14 Часть 4. Микроконтроллеры PICMICRO Бит Имя Описание 3 PD Отключение питания 4 ТО Переполнение таймера 5 RP0 Выбор четного/нечетного банка регистров 6 RP1 Выбор старшего/младшего банка регистров 7 IRP Выбор регистров старшего/младшего банка при косвенной адресации В первой части регистра STATUS содержатся флаги Z, DC, С, которые ис- пользуются для управления ходом выполнения протраммы. Флат нуля Z устанав- ливается в I, если результат операции равен пулю (например, при выполнении команд сложения, вычитания, сброса, битовых операций). Флаг переноса С уста- навливается в I, если результат сложения превышает число 255 (ОхОГГ), или результат вычитания меньше нуля Установка флага переноса показывает, что для получения правильного результата необходимо изменить значение старшсто бай- та. Флат промежуточного переноса (полупереиоса) DC устанавливается в I, если в результате выполнения арифметических команд (сложение или вычитание) младшая тетрада (четыре бита) превышает число 15. Данные флаги могут быть считаны и записаны, а также изменяют свое значение в соответствии с результа- том выполнения арифметических и лотичсских команд. Следует отметить, что регистр состояния STATUS не может быть приемником в арифметических и ло- гических командах. В книге «Programming and Customizmngthe РК » («Программиро- вание и применение микроконтроллеров Р1С») приведен макрос для сброса в 0 всех битов регистра состояния перед выполнением арифметической команды: ClearFlags Macro movlw 0x0F8 andwf STATUS endm ; Сбросить флаги состояния Однако, с учетом вышесказанного данный макрос должен выглядеть сле- дующим образом: ClearFlags movlw andwf movwf endm Macro 0x0F8 STATUS, STATUS ; Сбросить флаги состояния w ; Запись результата в регистр STATUS С учетом регистра состояния схема процессора PICMicro будет выглядеть так, как показано на рис.24.3. Следующие два бита регистра STATUS определяют режим работы микро- контроллера при включении и при выходе из режима ожидания SLEEP. При- веденная ниже таблица показывает значения этих битов в различных ситуа- циях. Данные биты предназначены для того, чтобы прикладная программа могла определить, в каком состоянии находится процессор в момент перво- начальной загрузки.
Глава 24. Архитектура микроконтроллеров PICMICRO 15 Рис.24.3. Архитектура PICMicro с регистром состояния _ТО PD Состояние I I Запуск при включении питания или подаче сигна- ла на вход _MCLR О I Сброс сторожевого таймера в ходе выполнения про- граммы О 0 Выход из режима ржидания по сигналу сторожево- го таймера I 0 Выход из режима ожидания по сигналу _MCLR или прерыванию Последняя группа битов зависит от типа используемого процессора. В млад- ших моделях PICMicro (серия 16С5х) эти биты используются аналогично регистру PC LATH в PICMicro средних и старших моделей, как описано ниже в разделе «Программный счетчик». В PICMicro среднего уровня, где исполь- зуется 7-битная адресация, в любой команде можно прямо адресовать 128 регистров. Возможность обращения только к 128 регистрам является суще- ственным ограничением. Поэтому разработчики PICMicro разбили память данных на банки размеров 128 регистров. В PICMicro среднего уровня могут использоваться четыре банка (512 регистров), хотя обычно применяются толь- ко два. Выбор банка осуществляется битами RP в регистре состояния. С уче- том этого архитектура будет иметь вид, показанный на рис. 24.4. В некоторых моделях PICMicro регистровые файлы распределены между банками данных, но имеется ряд контроллеров этого семейства, которые имеют отдельные регистровые файлы в каждом из банков. Это обстоятель- ство следует учитывать при выборе типа контроллера PICMicro и вида про- граммного обеспечения, который предполагается использовать для разработ- ки приложения. Чтобы избежать возможных проблем, рекомендуется по
16 Часть 4. Микроконтроллеры PICMICRO умолчанию всегда использовать банк 0. Обращение к банку I следует выпол- нять только при выборке аппаратных регистров или области переменных, расположенных в данном банке После завершения обращения к этому банку следует произвести обратное переключение к банку 0. Рис. 24.4. Архитектура PICMicro с выбором банка регистров Возможно, вы будете удивлены тем, что в серии PIC16C5X нет второю банка. Вместо выбора регистровых банков биты RP в этих микроконтролле- рах используются для выбора различных страниц памяти программ. Наличие в процессоре только одною банка означает, что в младших моделях микро- контроллеров PICMicro нельзя прямо обратиться к регистрам OPTION и TRIS, которые в моделях среднею уровня располагаются в банке I. Для доступа к этим регистрам введены специальные команды «option» и «tris», с помощью которых можно содержимое ретистрз W переписать в ли регистры. Для начинающих пользователей PICMicro смена регистровых файлов при переключении банков может показаться неприятной особенностью архитек- туры этого семейства. Сложности возникают из-за припя!ых компанией Microchip правил адресации Регистры банка I имеют адреса от 0x0X0 и бо- лее (установка 7-го бита в адресе указывает на использование страницы I), а регистры банка 0 — адреса от 0x07F и менее. Однако реально это лишь способ записи адреса. При данной форме записи бит PRO можно рассматривать как бит 7 адреса. Если в заданном адресе бит 7 установлен в I, то перед обраще- нием к регистру должен быть установлен в I бит PRO в регистре состояния. Для PICMicro среднего уровня, использующих четыре банка, диапазон адре- сов регистров составляет от 0 до 0x01 FF, а выбор 128-адресного банка осу- ществляется с помощью битов PR1 и PRO. Основные регистры - STATUS, INDF, FSR, PCL, PCLATH и INTCON имеют одни и те же адреса в разных типах микроконтроллеров и размешают- ся с одинаковым адресом на каждой странице памяы. Это сделано для про-
Глава 24. Архитектура микроконтроллеров PICMICRO 17 i рам мной cobmcci и mol i и ра з шчных моделей микрокод гро i icpon Ра i меше- ние pel нефов в двух основных банках пока зано на рис 24 5 Адрес Банк 0 Банк1 Адрес 0x000 INDF INDF 0x080 * - PORTC/TRISC 0x001 TMR0 OPTION 0x081 Для варианта с портом С ” - Регистры ввода/вывода PCON'" - Регистр управ- лением включением 0x002 PCL PCL 0x082 0x003 STATUS STATUS 0x083 0x004 FSR FSR 0x084 питания 0x005 РОНТА TRISA 0x085 - Пространство файловых регистров 0x006 PORTB TRISB 0x086 0x007 * * 0x087 0x008 * * 0x088 - - Конец пространства файловых регистров 0x009 *» * * 0x089 ОхООА PCLATH PCLATH 0x08 A 0x00В INICON INTCON OxO8B ОхООС 0x08C PCON*" 0x020 OxOAO 0x07F OxOFF Рис.24.5. Регистры PICMicro среднего уровня Адресация регистров В процессорах РК. cmhclibxci i рп раз шчных сносооа a ipecamin тонных uei юс реле i вей пая адресация, прямая рс1Ш1ровая адресация и кос венная at ресация Каж пял из лих способов имеет свои особенное,и Их функции во мнем их с ,учаях перекрыванием, нои каждый и с них разразтоын ня реатза- ции опредс icimoio 1 ина операции Ilenocpe.iL।венная адресация означает. что операнд, нспо 1ьлемыи при операции, являйся часп.ю команды Испошзхя неиосре ндвеннхю а ipeca- цию, можно за,ру инь в peincip W необходимое чпе ю п ш измениц. содер- жимое немо pei недра с помощью некоюрои команды с определенным опе- рандом (рис 24 6) Ч io можно сделать е помощью непосредственной адресации ’ )ioi способ адресации иепо 1ъзуе,ся в lex случаях, ксида заранее извеспю значение пере
18 Часть 4 Микроконтроллеры PICMICRO меннои для загрузки в регистр ити выпо тения операции Например запись содержимого в регистр направтения ввота/вывода реализуется с тедующим образом bsf STATUS, RPO Пересылка в банк 1 movlw 06011011101 Запрограммировать разряды 1 и 5 на вывод данных movwf TRISB Л 0x080 Установить в регистре TRISB бит 7 в , состояние 1 bcf STATUS RPO Возвращение к банку 0 Рис 24 6. Архитектура PICMicro с непосредственной передачей данных из команды Не следует удивтяться выпотнению тогичезкои операции XOR (Исклю чающее ИЛИ) над FRISB и чис том OxOSO Эю дс тается потому что адрес TRISB ранен 0x0S6, что указытзает на выбор регистра с номером 0x006 в бан- ке I Гсти осгацить 7 ои би i в TR1SB уставов тонным в I то MPASM сформи руст предупреждающее сообщение <Ч)2> об обращении к pcimipv находя- щемуся вне банка 0 Эю дает возможность проверить не происходит ти обращение к ттенравитьному регистру Чтобы избежать этою можно изме нить значение старшего бита который указывает на нетто тьзуемую страницу регистров Значение этого бига можно сбрасывать и с помощью операции «& 0x07 F» Доступ к регистру означает что вы можете обработать его содержимое в АЛУ и поместить результат в регистре W и ти в выбранном регистре Вычис- тение происходит в процессоре и резутьтаты помещаются в W регистр ити обратно в регистр-источник Обычно для зат р\ зки в регистр W сотержимого другого регистра используется команда <niovf» Эта команда выпотняется ана- тогично другим арифметическим командам исттотьзующим регистр W ко- торые описаны в паве «Команды PICMicro» Стедхюшии программный код загружает содержимое и з одною регистра и сохраняет сто в трутом регистре
Глава 24 Архитектура микроконтроллеров PICMICRO 19 movf Reg1 w Загрузить содержимое регистра Reg1 в регистр W movwf Reg2 Сохранить содержимое W в регистре Reg2 Во тможнос I ь явиот о т 1 тания <i треса pci ис i ра яв imc те я очень важной Но бывают стучал koi та пеобхо тимоегь испо тьювать косвенней нресапию тан пых и модифицирован, адрес с помощью арифметических операции Регист ры 1NDF и I SR испотыхкяся ня индексной и косвенной т трссапии сан- ных ч го посвотяет собирать тайные в массив и обращаться к ним как к массиве Рстистр INDF яв1ястся леев юры иыром > с тдресом 0 который в тел cTBHie ibHocni не СХПЦС1ВМ г При обращении к ному р< т тк тру на самом itic происходит обращение к peincipc a tpcc которою содержится в I SR Схема процессора PICMicioc ука таппыми добавтениями итображена н i рис 24 7 Шина адреса Рис 24 7 Архитектура PICMicro с косвенной адресацией Например естивыхонш с.шисать с троку симвотов пос i \iiaioiniix в про цсссор PIC то по может быть сдетапо при помощи н тбор i перс мепных но такой процесс i ру pin opi аилтовать Вместо tioio можс i бьпь испотьтован проеюи массив б.титов который попсовтет пролягодиц, тоступ к танным Oi те пятые байты в массиве мотут быть выбраны явным обратом по обрате ние к цстои строке может бьпь осушсствтепо тотько посте товатетьно ис- потьтуя простои аноритм программирования На я тыке С формирование массива и тоступ к нему осхществ тяется с те дующим обратом char Array [ 10 ] Array [ i ] - a j = Array [ i ] Сформировать массив размером в 10 цифр Модифицировать элемент массива Считать элемент массива
20 Часть 4. Микроконтроллеры PICMICRO Испольгуя ассемблер PICMicro эти процедуры можно представить в с ге- дующем виде Array equ Array Start , Определить адрес начала массива Array [ i ] = ‘a movlw Array Модифицировать элемент массива addwf 1, w , Получить смещение для i-ro элемента массива movwf FSR Сохранение в FSR movlw a’ , Получение символа для записи в массив movwf INDF Сохранить в массиве j = Array [ i ] movlw Array , Считать элемент массива addwf 1, w movwf FSR movf rnovwf INDF, w 1 , Получить символ и сохранить его Рассма।ривая данный пример, можно ни геть, чго о томсрные массивы могут бьпь сформированы дово п>но тегко. глкже как и многомерные масси вы Многомерные массивы похожи на о гномерные, но индекс арифме i плес- ки вычис гяется д гя каждено параметра Например, ин гекс дня j lexienra 3.5 в массиве рагмерноегыо <8x8, где нумерация моментов в строках и стотбцах начинается с I, будет нмечь ветчину 2*8 + 4 Как говорилось выше, в м гадшпх моде гях микроконiроттеров PICMicro дос।уп к регистрам осушсовтяется гогько при обращении к первой страни- це Эю 0Л1ачае1. что би, PRO в pei m. iре сое гоянггя не иснотьзуегея. и. что более важно, пет прямою доыупа к рсчистрам TRIS n OPTION, которые обычно находятся на странице I регги гровою пространства микрокопгрол- lepoii PIC Micio среднего уровня Имеется еще одно обстоите iьс т во, которое необхо ггтмо отме i in ь при рас смо1 рении peiHcipa I SR и косвенной адресации Хотя регистр FSR обеспе- чиваем доступ к 256 различным адресам per метров в гвух банках он не может иснотьювагься для обращения к 256 непрерывно распо гожеттым ([тайловым регисгр.гм, то ecib к единому массиву, состоящему иг 12Ь и ти больше смеж- ных адресов Причина состоит в юч, чю в первых нескольких адресах каждо- го байка содержатся регистры управтсния При попытке выти за пределы 128 байтов банка изменяется содержимое pci негров управления микрокопт- ро пером, чю приводит к губите тьным резу ниагауг Другой способ демонстрации работы регистров INDF и FSR зактючается в рассмотрении «стандартного» процессора и его индексной команды На- пример, затру гка индекса в аккуму штор может выполняться командой move a, (Index) Скобки указывают, что содержимое регистра Index является адресом того perncipa, содержимое которого надо гаписагь в аккуму штор «а»
Глава 24 Архитектура микроконтроллеров PICMICRO 21 Может покататься, что в процессорах PIC можно нетто тьзовать сдедую щую эквивалентную команду movf (FSR) w Однако вместо (FSR) в лои команде необхотимо ука гать IND1 при лом будет выполняться точно такая же операция (согержимое TSR испотыуегся как адрес pei истра который является источником опсран та) Программный счётчик Понимание того как игменять программный счетчик явтяыся отпои и, наибо тсе сложных гадач при и (учении процессора РК При рассмотрении раиичных семейств микрокон тро i icpou выио тспие команд <goto> и «call» может покататься противоречивым и с южным гтя понимания На самом ie те эти команды выполняются аналогичным обратом и ес ти вы однажды поня- 1и как они реали (уклея то в дальнейшем они не бу ту , ка гаться вам такими страшными Во всех микрокоптроттерах РК Micro команды со иржат о нто командное слово и ти адргс Это особх нность архитектуры RISC пспо тыг'ваннои при их разработке В командах «goto» иди < call > недостаточно мест i тля ска тания hot- hoi о тначт пня повою е одержимо, о программного счетчик т В РК Ми то сред- него уровня использующих 14 битные команды циько I I биг команды с iy жат для ука гания новою адреса Эти II бит атрссуют 2К памяти микрокошро 1 тера которые обра гуют страницу» Обычно н команде указываются все м та иттие биты нового агрега Стар- шие биты гатружаются из другою регистра который патываегся Р( LATH каждый par при вынотении команд «goto» <г all > пит коман г «вычиедяе мых переходов» (рис 24 8) Рис 24.8. Диагоамма блока счетчика команд PICMicro Хотя эта форма хка гания адреса испотыуегся тля всех коман т <goio> и call > ко нк ре т пыи вариан г их реюг т т г г пи и сх икс т ценно р т гдттч те гея с т я г рех
22 Часть 4. Микроконтроллеры PICMICRO раздичных семейств PICMicro Ниже б\ к i рассмотрено как реадизхются ь каж юм семеисизе коман гы <goto> и call Но преж ю чем обсх штъ эго кратко опишем дрхг он меч од изменения сок ржи moi о ripen раммно! о счегчи- ка М тадшие S биг программною счсччик i нспосрс тсгвенно достхпны про- । рамме и могу 1 быть исподьзованы ня ре i in заиии прос iыx табдиц иди пере xo юв с «вычис гяемыми» адресами При иыио тении них операции тонко м ia 1шие 8 биг мотет бьиь прямо модифицированы с помощью npoipaxiMHo- । о обеспечения а ос ia тьные Сипы пос 1\ паю г из р< i и< i р т PC 1 \ТН Младшие модели семейства 16С5\ Серия 16С 5х отдичаегся oi описанных выше микроконiро i к ров PICMicro тем чю в ней оicvтствхе! pci m tр PC I XI Н Вмсс ю агою с таршис биiы ад реса сохраняются в pei негре SI XI US i im же i к биты RP в микроконтро! юрах PIC среднего уровня Эти биты комбипирхкнея с битами заданными в команю. ття сказания a треса при вычищении коман гы бе тсс ювного пере- хо та <goto Addiess> М laaiu ие мо ie ти PIC Mu io in no i ь tx ioi c ip шины co кржашис 'Pa ipe con Команты «goto» и <calb hmcioi hi \к нация j трест соотеитвеиио io ii>ko 9 и 8 битов )io означаем чю ком in ia goio> можс 1 iiciiocpc тственно обращаться к 512 адресам намят а коман и <cill> юи>ко к 256 1лк как микроконтро 1 юры серии I6C57 имеют пресное ирос т р тис i во ооьемом 2К io iipoCiexia a ipecauiiii решимся с помощью onion Р XI) и Р\1 в решегре SIAIUS Эти оиты Ю1ЖНЫ быть \с i шов к цы таким образом чюбы пра- ии пято \ ка зывать с 1 ранних i те рас по тат пои я 1 2 л тресов с ко юры ми пре д- поьиаеия работать Lc ш ио с те юно ю коман ты <goto> «call > и «goto» с вычис июмым a тросом перехо 11 upon изо bl г иерехо i к ожи таехтоп 5 1 2-а ipcc пои ci ранние koi ia изменяются м ia тише он т ы счетчик т коман i Перехо 1 «goto» с < вычис шемым > i трех ом вы по иию и я i ik же. как в тру- I их микроконтро 1 юр lx PIC Мк io с о шим важным от тичш м I аб iица а гре- хов и все ее з деме и I ы то 1жны нахо ти 1 вс я в пре ie lax первых 256 а тросов 5 12- а тресиои cipaiiniii.i как и метки вызова по inpoi paxixi )то означаем чю в микрокои । роя дерах 16С 56 имеющих himhii. npoipaxixi емксюыо Ik можно исиояь зова I в юн.ко 2 габпнты cei xichiob перс хо юн (Всею т I 2 э lexieii юв) Д 1я средних и с lapiinix мо те юи PIC \1 Icio тайное oi раничс иие отсхтствхег Модели 16Схх среднего уровня Так как в микроконтро 1 торах сре шею уровня пою пыхнися коман ты ни нои 14 61Н, ю а тресхемыи с их помощью объем и imhiti емкостью то S Конн шин. иемисп им бо папе чем в м i i пинх хю те тях сехтеис i ва При этом некою рые би 1 ы pei их ipa сое юяиия S I X I L।S in по и, зхкися ня вы ио nieinni трх i их функции чем а на ioi ичпые би i ы в м и ни их мо те 1ях Д 1Я a ipec Hinn памяти upoi рамм в в мо те 1ях сре iiiei о у ровня вне ин peincip PCI \ГН При 14 битной тише ком ш т т тя сказания а треха в коман tax <goic>« и «call > испо 1ьзхе1ся 11 би i 4io о зпач ic i чю ра змер с |ранииы в этом семей с изе сошав тясч 2К
Глава 24. Архитектура микроконтроллеров PICMICRO 23 Если посмотреть на номенклатуру микроконтроллеров PICMicro, го мож- но заметить, что лишь в немногих моделях размер памяти иро1рамм памяти превышает 2К. Это значит, что регистр PCLATH требуется только для обра- щения к таблицам памяти, расположенным не на нулевой странице. С помощью команды «addwf PCL|,f]» микроконтроллеры PICMicro могут непосредственно обращаться лишь к 256 адресам таблицы. Однако is отличие от младших моделей выбираемые данные могут имеш любую разрядность и располагайся в любом месте памяти. Приведем пример размещения в PIC 700-элементной тблицы, начиная с произвольного адреса (то-есть за пределами 256-адресного пространства). В этом примере «Table» является подпрограммой, которая выбираем в регистр W требуемый элемент таблицы. Table ; Возвращает элемент EntryHigh/Entry movlw HIGH TableStart ; Вычисление значения PCLATH addwf EntryHigh, w ; Прибавление к старшему байту ; номера элемента movwf PCLATH ; Сохранение в регистре PCLATH movlw TableStart & OxOFF addwf Entry, w ; Вычисление смещения в ; 256-байтной странице btfsc STATUS, C ; Если установлен флаг переноса, то ; инкремент 256-байтной страницы incf PCLATH movwf PCL ; ; Переход к элементу таблицы TableStart ; Начало таблицы retlw Element 1 ; Получение элемента для Entry = 0 retlw Element 2 ; Получение элемента для Entry = 1 retlw Element 700 Получение элемента для Entry = 699 Эюг iipoi раммный код является эффективным для межстраиичных пере- ходов «goto*. Сначала PCLATH задает значения старших бигов адреса входа в таблицу, затем рассчитывается правильное смещение, определяющее восемь младших битов адреса входа в таблицу. Если при расчете младших восьми бит сумма превысит OxOFF, то содержимое регистра PCLATH увеличивается на I, так как адрес находится на следующей 256-байтной странице. Старшие модели семейства 16Схх Старшие модели PICMicro работают аналогично моделям среднего уровня с одним важным отличием — биты регистра PCLATH изменяются при выпол- нении команд goto/call. В микрокон 1 роллерах среднею уровня содержимое PCLATCH при выполнении этих команд никогда не меняется.
24 Часть 4. Микроконтроллеры PICMICRO Периферийные устройства В приведенном выше описании архитек|уры процессоров PIC не показано, как производится подключение рстииров периферийных устройств В струк- type процессора весь набор pel поров может быть пре1сгав1СН иким же об- разом. как в архитектуре обычною компьютера Можно провести ана toittroc тем, как периферииные устроиспза соединяются с персона пятым компьютс- ром через с тоты и шину вво та/вывода На приведенных выше рисунках пред- ставляющих архтнектуру процессора шина адреса пре тстав теиа в виде ко- ротких линии связи Каждое периферийное хсгроисто явдяекя б током который подключен к адресному тешифратору шине данных и управ тяется устройством дешифрации коман т Таким образом, чюбы создать микроконт- ро 1 iep с новыми характерце гиками ратработчик микросхемы полк тючает новое устройство к шине данных и прово тит к нему тинии от дешифратора адреса Прерывания Во всех микроконтроллерах PIC Micio pea тизуютпих прерывания, основным регистром для управления прерываниями яв тяется pet не i р INTCON, разме- щенный в памяти по адресе ОхОВ Pei Петр INTCON содержит следующие биты Бит Обозначение Описание 0 RB1Г Флаг прерывания при изменении содержимою Port В 1 INTT Флаг прерывания при поступлении вывода PB0/INT 2 TOIF Ф 1.11 прерывания при перепотнении таймера TMR0 3 RBIE Разрешение прерывания при изменении PortB 4 INTE Разрешение прерывание вывода RB0/INT 5 TOJE Разрешение прерывания при переполнении таймера TMR0 6 Бит разрешения прерывания для иериферииных устроиств 7 GIE Общее разрешение прерывании (Устанавливается, чюбы разрешить выло тение подпрограммы обработки прерывания) Старший значащий бит GIE (global interrupt enable) в этом pet истре раз- решает обработку запроса прерывания Перед входом в обработчик прерыва- нии бит GIE аппарате сбрасывается в 0 прежде, чем начнется выполнение обработки прерывания После окончания обработки прерывания бит GIE ус- танавливается в I командой возврата из прерывания «тетГте» Не рекомендует- ся устанавливать бит GIE в I в процессе обработки прерывания. >ак как это может привести к непредвиденному обе туживанпю друтото прерывания в с тучае вложенных прерывании С те тукипие би t ы я в иттотся би та ми ра зреше-
Глава 24. Архитектура микроконтроллеров PICMICRO 25 ния, при установке которых is 1 разрешается выполнение соответствующих прерываний. В документации на микроконтроллеры PICMicro нетрудно най- ти биты разрешения прерываний, ик как их обозначения заканчиваются на «1Е» («interrupt enable» — разрешение прерываний). Наряду с битами разре- шения прерывании is регистре INTCON содержатся флаги запросов прерыва- ний, которые устанавливаются в 1. когда выполняются соопзетствуюшие условия прерываний. Необходимо отметить, что ши флаги могут быть уста- новлены в 1 даже в тех случаях, кота сброшены в 0 бш GIE и другие биты разрешения, ю-есть запрещено обслуживание прерывании. Важно заменив. чю флаг запроса должен быть сброшен в 0 перед возвра- том из прерывания (перед выполнением команды «retfie» возврата из преры- вания). Если нот флаг не будет сброшен, ю после выполнения команды «retfie» последует возврат к той же программе обработки прерывания. Вее обозначения флагов запроса прерываний заканчиваются на «IF» («interrupt flag» — флаг прерывания), аналогично тому, как обозначения битов разреше- ния прерывания заканчиваются на «1Е» Дополнительные биты разрешения прерывании и флаги запросов преры- ваний могут располагаться и в других регистрах процессора PIC. Это означа- ет. что перед установкой в 1 бита G1E необходимо убедиться, что все биты разрешения находятся в нужном состоянии. Эю легко выводишь, если учесы,, что после включения питания все биты разрешения находятся в сброшенном СОС1ОЯНИИ. и для ра1решения прерываний они должны бьпь уставлены в 1. Чтобы пояснить последовательное 1Ь выполнения атапов при про!рамми- ровании и обработке прерываний, представим их в виде следующего потока собы гий: 1. Инициализация источника аппаратною прерывания. 2. Разрешение прерывания. Установка в 1 бита GIE и соответствующею бита разрешения IE в регишре INTCON 3. Ожидание возникновения прерывания. Прерывание может ожидаться как в цикле, так и в ходе обычного вы- полнения программы. 4. Запрос прерывания. Ожидание завершения выполнения команды. 5. Вызов обработчика прерывания. Если флаг «1Е» для данного прерывания не установлен в 1, то переход к эгапу 8. 6. Выполнение обработчика прерывания. Начало выполнения с адреса 4. 7. Сброс конгроллера прерывания и возвращение из прерывания. Сброс в 0 флага запроса прерывания. Установка в 1 биг разрешения IE для следующего ожидаемого флага. Выполнение команды «retfie». 8. Возвращение к выполнению команды, следующей за прерванной.
26 Часть 4. Микроконтропперы PICMICRO С 1едует заметить, что одновременно МО1УТ возникать запросы прерыва- ния от нескотько источников Раздичные прерывания могм обрабатываться пос ie проверки значения соответствующего фтага запроса «1Г> Все прерывания в семействе PICMicro среднего уровня начинаются с ад- реса 0x004 Как бьио отмечено в старших мо тетях семейства PICMicro име- ется несколько векторов прерывании, чго позво 1яет каждому источнику пре- рывании иметь свои вектор Адрес Приоритет Источник прерывания 0x0008 Наивысшии Внешнее прерывания на выводе RA0/INT 0x0010 Перепотнение таймера 1 MR0 0x0018 Внешнее прерывание на выводе ТОСК1 0x0020 Наименьший Периферийное устройство^ правтяется регистром PEIF) Oimcihm, что для обработки каждого прерывания отводится восемь ко ман т Это означает, что в старших модетях PICMicro 1ак же как микроконт- ролтерах Intel 8051, обработчики прерывания кнжны содержать не бозее 8 команд Если в обработчике иснотьзуются не тотько команты модификации битов, то весьма важным явдястся сохранение содержимого ретистров W и STATUS В атом случае для обе тужитзания прерывании остается всего три ко- манды. с учетом того что пос н шеи ютжна быть коман та возврата «rettie> Время «скрытого состояния прерывания> это время необходимое штя определения запроса прерывания, а < время обработки» - это чисто команд ных циклов, необходимых ття обработки прерывания Время обработки пре- рывания можно определить с помощью таймера работу которого может ими тировать симулятор (обычно это время рассчитывается эмпирически) Можно также определить ею путем подсчета котичества команд в обработчике пре- рывания, но все же методе испотьзованием сихьтятора явтястся ботее про- сгым и точным Время скрытого состояния прерывания нетьзя потечтагь арифметически Обычно это время принимается равным трем и ш четырем командным цик там ес 1и предварите шно биты GIE и IE установлены в 1 В это время про- цессор не выиошяет никаких команд Стедует отметить что время обрабожи прерывания учшывает также время пя сохранения и восстановтения состояния процессора при выпошении основной программы Необходимо убедиться что регистры содержтщие это состояние восстановтены перед возвратом из прерывания Особенно важно, чюбы состояние обработчика прерывания быто корректно установтено (то ешь на нужной странице) перед его выпотнением В г шве < Разработка при тожепии» описано как это слетать
Глава 24. Архитектура микроконтроллеров PICMICRO 27 Стек программного счетчика Эго| сиг с 1\жи। .ня сохранения адреса гою месча npoi раммы, лкхда бы ia вызвана подпрей рамма или прерывание Koi да ирсирамма переходи! на по- выв адрес в pen iвiа 1 е вы юна подпрей раммы и m прерывания, ю запомина- лся адрес, с ie i\Юити за гем. который в данный момент находи 1ся в счсч- чике команд Значение лою адреса воссчанавливался в npoi рам миом счеччике нос ie выио шеипя иодиро!раммы Рабо 1.1 счека в 1’1 С Micro с\ щественно oi inn.ieiui oi леков др\ I их микро процессорных и микроконгро 1 юрных apxinekixp Обычно в стеке может со- храни i вся как со 1ержи мое i ipoi рам mi ioi о сче phi ка. тк и содержимое дрх i их penicipoB и прочие цишые 13 микроконтроперах PICMicio в стеке можсч сохрани i вся ioibko содержимое npoi раммнсио ечсччика Размер лою лека весьма о, раничен S позиции .ня средних мо ie ien PICMicio. всею 2 пози- ции для младших моде ien и 16 позиции .ня счарших мо.ыеи Эю означал, чю при p.iipaooike при южении с 1ед\сч обеспечи 1 в. чюбы в PIC iiocixn.i.io не бозее S вы швов иодиро! рамм Геш прог рамма не реку рсивная. ло ian- ное oiраничение обычно не явшлея ехтесч венным При нашчии опыт рабоия с дрстми микроконiро i icpaxni. можл по казагвея. чю РК. не можл соперничаю с ними в и lane сохранения гапных в счеке 13 деис i ви ie паюс г и л о не мк 13 PIC в ро т лека можно зффек i ивно испо.1 ь юва 1 в рсч ис । ры «FSR» и <• 1N О Г-* Например, ее ш необхо тмо и.ши са। в ио uipoi рамму. обесценивающе ю опреле leiniy ю задержку. ю на язвгкеС нобх 1сч ввп 1Я leu, с ie ie ютим образом push dlay call dlay routine pop nothing 13 пронес copax PIC л о може i бы 11, pea m iob.ihh при помоши c ie n lomei о npoi рам much о ко ia movf dlay, w movwf INDF met FSR call dlay routine deef FSR I ак как .ши формирования лека в процессорах РК. ipeoveicii всею тип, одна или две юно ти пивные команды по сравнению с ipyiiivm koiiipoiie- рами, 1 о pel ис 1 р Г S R може 1 >ффек i и ин о не по I ня и> ро п> \ ка ia ie ,я с 1 ека Режим ожидания SLEEP I с in ожидался, то PICMicio не бхдл исио п> юв.ивея в 1ечение какою ю периода времени, ю потикал необходимое!в в редпнации jiiepiocoepcia lonieio режима, коюрыи шыывался <ж1еер" Эки режим iiciio п> 1\счся. koi ui н icHeinie опреле lemioiо времени не |ребусчея работ микрокошро i iep.1. и кота lapaiiee п шел но время выхош и s нот режима
28 Часть 4. Микроконтроллеры PICMICRO Режим ожидания используется для уменьшения потребления энергии при сохранении логического состояния линии ввола/вывода Вход в этот режим осуществляется при выполнении команды «sleep» В режиме ожидания синх- роимпульсы на выходе микроконтроллера прекращаются Текущее состояние всех регистров сохраняется. Если периферийные устройства не имеют своего генератора синхросигналов, то их работа прекращается Однако сторожевой таймер продолжает работать и при его переполнении микроконтротлер вы- ходит из режима ожидания. Название «sleep» («снятии режим») является весьма ггодходящим, так как микроконтроллер действительно не работает до тех пор, пока не будет каким-либо способом выведен из этою режима Выход из режима ожидания возможен несколькими способами, включая подачу сит нала на вывод RESET, внешнее прерывание и сторожевой таймер Таймер TMR1. если он синхронизируется внешним тенератором. также мо- жет быть использован для выхода из режима ожидания, но другие внутрен- ние таймеры не могут испотьзоваться пя этой цели, так как они отключа- ются. В зависимости от способа пробуждения программа стартует с различных позиции памяти программ. Важно знать, сколько требуется времени для выхода из этого режима В данном режиме все основные функции микрокон г роллера, кроме стороже- вого таймера, выключены. Это касается и генератора тактовых импульсов. Для того, чтобы убедиться, что генератор тактовых импульсов начал рабо- тать стабильно, необходимо выждать 1024 так га перед началом использова- ния микроконтроллера. Это время должно учитываться при разработке при ложепий Цикл «ожилаиие/пробуждение» для микроконтроллеров PICMicro показан на рисунке 24.9 Выполнение ' Режим ожидания ' Перезапуск генера- Возобновление команды (не в масштабе) тора (1024 цикла) выполнения «Sleep» Рис. 24.9. Выполнение команды «sleep» микроконтроллером PICMicro.
Глава 24. Архитектура микроконтроллеров PICMICRO 29 Подача сигнала MCLR или переполнение сторожевого таймера сбрасы- вает PICMicro в начальное состояние. и начинается выполнение программы с адреса 0 Так как программа начинает работать с адреса 0 и is случае вклю- чения питания, то необходимо проверни, значение битотз ТО и PD в реги- стре STATUS, чтобы понять, почему программа находится па адресе переза- пуска. Использовать для этих целей регистры не рекомендуется, так как во время инициализации при включении питания они находятся в одном из неопределенных состоянии, что может помешать проверке их значении. В некоторых новых моделях PICMicro можно использовать регистр PCON для определения причины перезапуска - при включении питания и или по- ступлении сигнала сброса MCLR. Это исключает необходимость записи в некоторые файловые регистры определенных переменных, значения кото- рых проверяются после перезапуска, чтобы определить, был ли процессор PIC в режиме ожидания или нет. Для выхода из режима ожидания может также использоваться внешний сигнал прерывания. При этом необходимо обратить особое внимание на сле- дующее. Если бит GIE установлен в I. го управление передается обработчику прерываний, размещенному по адресу 0x004 Если лог бит не установлен, то выполнение программы будет продолжено с команды, при которой микро- контроллер вошел в режим ожидания. В действительности, выход из режима ожидания происходит несколько иначе. При поступлении сигнала внешнею прерывания процессор PIC вы- полняет следующую за «sleep» команду Выход из режима ожидания ио пре- рыванию производится аналогично тому, как показано на рисунке 24.9. но после первой команды, следу тощей та выполнением «sleep», управление не реходит к обработчику прерывания Так как команда, следующая за «sleep», всегда выполняется, то рекомендуется тзсетда встатзлягь в качестве этой ко- манды «пор». Сделав это можно уже не задумываться о том. как будет рабо- тать контроллер после выхода из режима ожидания. Архитектура PICMicro 17С4Х Старшие модели PICMicro отличаются от младших и средних двумя основ- ными особенгзостями. Первая особенность - это возможность использовать для Интерфейса внешнюю шину, как это реализуют микропроцессоры. Вто- рая и наиболее важная особенность — включение регистра W в банк рет нег- ров. Оба этих отличия делают микроконтроллеры серии 17С4х непохожими на другие PICMicro Внешняя адресация Старшие модели PICMicio могут использовать три различных режима вклю- чения памяти (рис. 24 Ю). Выбор режима производится при помощи конфи- гурационных битов, состояние которых может быть определено командой ассемблера « CONTIG». Эти три режима обеспечивают дополнительную т иб- кость при практическом применении серии 17С4х. Не зависимо от тзыбранпо- то режима памяти расположение регистров в PICMicro lie и зменяется.
30 Часть 4. Микроконтроллеры PICMICRO Микроконтроллерный Расширенный Микропроцессорный режим микроконтроллерный режим режим Рис. 24.10. Режимы включения памяти в старших моделях микроконтроппе ров PICMicro В микроконтрот терном режиме контроллер работает так же. как и лруше мо ie in PICMicio Памян-. iipoipaxiM paciio.iai ас гея внутри микроконтролле- ра. и ц । я инiерфеиса с ней не i ребхе к я внешних вы во io в (. х птес 1 все I lainii- шениыи режим, коюрыи реа шпеня ioibko в микроконтрот lepnoxi режиме (режимы с испо ть зованиехт внешней памяти не обеспечивают защиту) Расширенный микроконтротлерныи и микропроцессорный режимы испо тьзуюл шипи ввода, вывода портов С. D и Е Эт и тинии вместе с сигна- 1.1МИ у прав теиия обра зуюг хту тыип юксированиу ю шину адреса/ тайных Обыч- но шш полк печения внешних хстроиств испо тьзуется адресный регистр за- iiie 1ка, кик по пока заио на рис 24 I I Несколько важных замечании по повоту этих режимов Во-первых, внеш- нее адресное пространсiво тибо меньше 64К с юн в расширенном микрокоп- । ро т терном режиме, тибо ровно 64К с юн в микропроцессорном режиме Это означает. что микроконтроллеры PICMicio хтотут выбирать до 12S Кбайт па мяти Каждый байт может быть записан и считан при помощи *габ точных» коман i Так как эти команды обеспечиваю! возможность записи, то допол- нительное адресное пространство .тля PIC может быть реализовано путем подключения памяти RAM Вместе с памятью к внешней шипе можно подключить и другие устрой- ства Это означает, чго устройства со стандартным микропроцессорным ин- терфейсом могхт нетто тьзотзагься вместе с PICMicro в качестве устройств ввода/ вывода, адресуемых как ячейки памяти К ним так же можно обращаться с использованием таб точных коман т чгения/записи
Глава 24 Архитектура микроконтроллеров PICMICRO 31 Рис 24 11 Запись во внешнюю память в старших моделях PICMicro Регистры Как уже нс раз упоминалось старшие мо те ти устройств PIC имеют друтуто регистровую структуру (рис 24 12) Рис 24 12 Структура регистрового блока в старших моделях PICMicro Данная структура позво тяет передавать тарные в регистры быстрее и бо тес эффективно чем в средних и мтатших мо те тях PIC Micro При попытке при менения программ приведенных в этой книге ьтя микроконтроттеров се рии !7С4х ассембтер выдаст множество сообщении об ошибках связан ных тз основном с испотьзованием команды inovi когортя отсутствует в
32 Часть 4. Микроконтроллеры PICMICRO мои серии Данной команды пег в старших модетчх ттотому. что имеется возможность передачи тайных меж т\ основным «р» (ртпттагх) и фантовым И» (file) наборами peincipoB Следует также иметь в виду, что набор команд старших модетеи не под- терживает команду mo\f Reg. f . которая проверяет содержимою регистра «Reg» и устанавливает в соответствии с этим итачение ф тата ну тя Эю не может быть осущесгв тено в стартпих моде тях микроконтро I теров. ее ти про- веряемый ретисгр не находится в основном наборе Сохранение переменной в регистре W и проверка содержимого другою рет Петра может оказаться не вотможнои в старших моде тях семейств.! конечно, но не явтяегся серьет- ным препятствием тля реа нт тапни ботьшинства прнтоженип. но програм- мисту следует помнить об згом
Глава 25 АППАРАТНЫЕ СРЕДСТВА PICMICRO Краткое содержание Различные типы PICMicro PICMicio в 8-выводном корпусе Младшие модели PICMicro Модели PICMicro среднею уровня Старшие модели PICMicio Типы корпусов Виды памяти программ Запуск (начальная установка) Системный тактовый генератор Аппаратные регистры и файл регистров Стек программного счетчика Прерывания Таймеры TMR0 TMRI TMR2 Сторожевой таймер Внутренняя память EEPROM Реализация ввода/вывода Парад тельный ведомый порт Послеловате тьныи цифровой ввод/вывол Последовательный синхронный интерфейс Последовательный асинхронный интерфейс Аналоговый ввол/вывод Ввод аналоговых данных в 16С7х 3 Зак 2025
34 Часть 4. Микроконтроллеры PICMICRO Конфигурация и ID Fuses Программирование Маркировка микроконтроллеров Различные типы PICMicro В семействе PICMicro, как и во всех лрмих семействах, постоянно появля- ются новые типы микроконтроллеров, коюрые обладают дополнительными возможное i ями Попытаемся описать основные типы этих микроконтролле- ров и их характеристики Микроконтроллеры PICMicro в 8-выводном корпусе Недавно появившиеся 8-выводные микрокод [роллеры PICMicro быспро за- воевали широкую популярность Эти микроконтроллеры имею! шесть тинии ввода/вывода и обеспечивают множество дополните пятых возможностей, таких как таймер TMR0. сторожевой таймер, ЛИП и средства внутрисистемного npoiраммирования ISP Младшие моле ш микроконтроллеров серии Р1С12С5хх обеспечивают воз- можность внутрисистемною про, раммирования, имеют внутренний RC-re- нсраюр тактовых импульсов (го есi ь не требуют дополнительных выводов для получения синхросит на юн) и вну греннюю схему запуска Эт и особенно- сти позволяют микроконтроллеру обходиться всего восемью внешними вы- водами для подключения напряжения питания Vdd. <• земли» и 6 линии вво- да/вывода Микроконгроллеры лои серии могут выполнять 512 или 1024 команд, записанных во внутреннюю память гтротрамм EEPROM с помощью протокола ISP, принятою для моделей PICMicro среднею уровня Серия PIC 12С67х, появившаяся в начале 1998 года, использует процессор с архи- тектурой. аналогичном моделям среднего уровня, имеет встроенное АЦП и обеспечивает реализацию прерывании Младшие модели PICMicro Базовое процессорное ядро в младших мотелях PICMicro не тто.ыерживаег обработку прерывании и имеет очень маленьким стек программною счетчи- ка Эги модели не содержа г дополнительных периферийные устройств, кото- рые есть и PICMicro среднего уровня (таких, как встроенным АЦП. последо- вательные порты, микропроцессорный шинныи интерфейс и трутне) Их основным достоинством является низкая стоимость, хотя это преимущество со временем становится все менее значимым, так как пены на микроконт- роллеры среднего уровня падают до значения пен на младшие модели мик- роконтроллеров Младшие модели PICMicro входят в состав серии 16С5х. Из-за отсутствия прерывании, маленького стека, ограниченною размера памяти программ (всею 2К) и отсутствия периферийных устройств (таких, как АЦП, последовательный интерфейс и другие) микроконтроллеры лою типа используются крайне редко
Глава 25. Аппаратные средства PICMICRO 35 Модели PICMicro среднего уровня Данным класс представлен широком номенклатурой микроконтроллеров с различными свойствами и характеристиками, что дает пользователю возмож- ность выбора оптимальною варианта. К тому же один и тот же программный код может быть с небольшими изменениями использован для различных моделей микроконгрейдеров. Эти микроконтроллеры могут иметь от 13 до 33 линии ввода/вывода, раз- личные таймеры. ввод/вывод ШИМ-сигналов. последовательный асинхрон- ный интерфейс, встроенный контроллер ЖКИ. программируемую память БЕРНОМ. Этот список можно еще долю продолжать. Базовый микроконт- роллеров среднего уровня выполняет набор из 35 команд, реализует обработ- ку прерываний и имеет стек программного счетчика на 8 позиции. Причина- ми прерываний могут быть сигналы на внешних выводах, переполнение таймера, прием данных последовательным портом, завершение ЛЦП и дру- гие события. Максимальный размер программ составляет 8К, что позволяет создавать довольно сложные приложения. Одна из наиболее интересных мо- делей PICMicro разработана для использования совместно с ЖКИ. При ис- пользовании микроконIроллера PIC14C00 можно непосредственно подклю- чать к нему ЖКИ без промежуточных аппаратных средств. Микроконтроллеры PICMicro среднего у ровня имеют обозначения 16Cmx. где «ш» определяет серию, а «х» указывает на определенную модель из дан- ной серии. За исключением некоторых моделей, зти микроконтроллеры ра- ботают на час юте до 20 М Гц при напряжении ни танин от 2.5 до 6.0 В. Суще- ствуют следующие модели микроконтроллеров данною класса. Модель Память Файл Функции/Примечания программ регистров 16С55х 512 - 2К EPROM 80 - 128 13 линий ввода/вывода TMRO 16С62х 512 - 2К EPROM 80 - 128 13 линий ввода/вывода TMR0, аналоговые компараторы 16С64х 2К - 4К EPROM 128 - - 176 22 линии ввода/вывода TMR0, аналоговые компараторы 16С66х 2К - 4К EPROM 128 - - 176 33 линии ввода/вывода TMR0, аналоговые компараторы 16С6х 1К - 8К EPROM/ROM 36 - 192 1 3-33 линии ввода/ вывода. TMRO, TMRI. TMR2, SPI, SCI
36 Часть 4. Микроконтроллеры PICMICRO Модель Память программ Файл peiпетров Функции/Примечания 16С7х 512 - 8К EPROM/ROM 36 ~ 192 13-33 линии ввода/ вывода, TMRO, TMRI, TMR2, SPI, SCI, ADC 16С84 1 К EEPROM/ROM 36 13 линии ввода/вывода, TMRO, EEPROM, часзоз;з до 10 МГц l6CF8x 512 - 1 К EEPROM/ROM 68 13 линии ввода/вывода, TMRO, EEPROM, час го га до 10 МГц 16С9хх 4К EPROM 176 драйвер ЖКИ, 25 линии ввода/вывода, TMRO, TMRI, TMR2, SPI, частота до 8 М Гц, питание 3.0 В Min Старшие модели PICMicro В микроконтроллерах серии 17С\х иснодз,зуется улучшенная ба юная архитек- Iурн по сравнению с моделями младшею и среднею уровня. Обеспечивая адресацию до б4Кслов памяти (слова но 16 Снн), микроконтроллеры данною шла могут обеспечить создание значительно более мощных систем, чем тс, которые были построены на базе традиционных средств управления, вклю- чая микроконтроллеры PICMicro друз их моделей Микроконтроллеры серии 17Схх имеют 33 линии ввода/вывода, работают на частоте 33 МГц и обеспе- чивают многие функции шинного интерфейса, которые реализованы в мо- делях среднею уровня, но они не содержа) А11П Процессорное ядро позволят более зибко осуществлять внутренние пе- ресылки данных и обеспечивае) использование разных векторов прерывания для различных программ их обрабозки. Блаюдаря этим свойствам можно со- здавать более эффективные прозраммные коды для приложения. В серии 17Схх используются 55 команд, которые являются расширением набора команд микроконтроллеров среднею уровня, чго обеспечивает более широкие фун- кпиошзльные возможности процессорного ядрзз Корпуса контроллеров Микроконтроллеры PICMicro посзавляются в различных типах корпусов. Наи- более известным является 1 8-выводнои DlP-корпус. имеющий с каждозз сто- роны по 9 выводов шириной 3,72 мм с расстоянием между ними 2,54 мм. Эго корпус типа 16F84. и многие модели микроконтроллеров младшего и сред- него уровня поставляются в лих корпусах
Глава 25. Аппаратные средства PICMICRO 37 Типы корпусов для монтажа микроконтроллеров PICMicro 40-выводов CERDIP “JW” 68-выводов SERQUAD “CL" 28-выводов CERDIP 18-выводов CERDIP “JW “J" 40-выводов PDIP “Р" JL 44-вывода PLCC 64-вывода TQFP 28-выводов Side Braze “PT” (300") “SP" 18-выводов SOIC “SO" О 44-вывода MQFP “PQ” 8-выводов Side Braze “JW" 28-выводов PDP ( 300") ‘SP © 18-выводов SSOP “SS” О Q 44-вывода TQFP “РТ” 8-выводов PDIP “P" 28-выводов SOIC 20-выводов ‘SO’ TSSOP (4 4mm) “ST" Ю О 24-вывода PDIP 8-выводов SOIC (EIAJ) 28-выводов SSOP 14-выводов “Р" ( 208”) ‘SS" SOIC ( 150") “SM" “SL" а 32-вывода PLCC 8-выводов SOIC 28-выводов TSOP 8-выводов “L” (150") ‘TS" TSSOP (4 4mm) “SN” “ST" в О И 20-выводов PLCC 14-выводов TSSOP 28-выводов VSOP 5-выводов “L" (4 4mm) “ST" “TS” SOT-23 “ОТ’ Рис. 25.1. Типы корпусов для монтажа микроконтроллеров PICMicro
38 Часть 4. Микроконтроллеры PICMICRO Имеется ряллрхзих типол корпусов. нетто тьзчемы\ пи размещения мик- роконтро з.теров PIC Мтсзо Микрокошро i теры с о inop.noni.iM програмхзиро ванием (OTP ~ One-Гипс I’logiainming) за. I и в.но i ся черным апоксидным компаундом Для размещения микроконтроллеров, содержащих память EPROM с ультрафиолезовыхт сзирапием. нетто тьзуются корпуса с кварцевым окном ( зтот тип корпусов обозначен симвоюм J на рис 25 1) Недостатком таких корпусов являемся высокая пена, кроме тою существует вероятность случай- ного стирания EPROM Пос тс прозраммирования ато окно должно быть зак- рыто нейро зрачнои для у т1> 1 рафио ie юного и заучен и я нак тонкой. ч годы убе- речь ог ноже пне нагого сзирания и показать, что тайный микроконтроллер запрей рам мн рован Гии выбранного корпус, бсзустовно. nipaci не последнее место в разра- ботке при 1ОЖСПИЯ При макетированпи рекомендуется нечто зьзовазъ микро- контро меры в корпусах типа .1XX. имеющих память ELPROM. что позволяет неренрот раммировап, микрокошроз тер Виды памяти программ Сущее т вуе т три ра з тичных вида памяти npoi рамм. нетто ть зу ем он .тля м и кро- коит рол герои PICMicio Эго стираемая прот раммирхемая намять EPROM (erasable progi а и т mablc iiieinoiy). > тек трическтт стираемая нрот раммиру ем.тя память ELPROM (electrically eiasable piogi a in inable нтетшчу) и протраммиру i-мая в процессе upon зво.те т на намять ROM. тону ска тот пая то ц.ко ч тение (ic.nl only memory) Каж того и з них гит юн памяти имеет г вой пре имущества в он реле зенных енту.тциях EPROM явтясзся основным типом памяти программ в микрокошро i то- рах PICMicio Mo зе in PICMicio срешето уровня с EPROM (и EEPROM) имеют важное преимущество отит моту) быть занрот раммнрованы посте монтажа на нтату с нетто и,зоваттиех! ерезств вну зриспстехтозо нротрамхти- роваиия ISP Эю нрот рам ми рован не может бы т ь ре а зи зовано в процессе вне т - риехемното (ЮГ) и пт функцнона плзою теезирования. тттбо вытто тнено с помощью с ценна, пятых и рот рам миру ютцпх уст роист в В настоящее время микрокошро i тсры PIC Microc пахзязыо программ типа EEPROM имеются то н.ко в составе серии l6 ’<Sy Эти микрокоигро т теры со держат процессор срешето уровня с расширенныхзи возможностями пара i дельною ввода-вывода, а также ре.т нт зуюг прерывание при неретто тненин таймер.т и прерывание по внешнему событию По своим функциоиа тьныхт возможностям. >гн микрокон।ро 1 теры находятся между мгадитими и стар- шими моделями PIC’M io о Сейчас фирма Microchip обозначает микрокош роллеры с памяп.ю EEPROM симвотом Г («П.тЧт») Первым из хзикрокош- ро.тлеров с памязью EEPROM бы i 16CS4. на козорыи можно наши мною ссылок Однако в справочных данных и каза.цмах на моден, указана как «.снятая с производства» Использование ROM в качестве памяти нрот рамм означает, что нрот рам ма записывается на крнстал т тт.т заводе-проп звзтдше зе Хотя фирма Мтстос1нр обеспечивает нрои звочетво микрокошро т зеров с памязью ROM. основное
Глава 25. Аппаратные средства PICMICRO 39 внимание она уделяет выпуску микроконтроллеров с однократно протрам- мируемой памятью EPROM, которая обеспечивает пользователям большую гибкость при разработке приложении. Запуск (Reset) Микроконтроллеры PICMicro сбрасываются в начальное состояние с помо- щью сигнала, поступающего на вывод MCLR. Когда на этот вывод подается низкий уровень потенциала (лотическии 0). микроконтроллер переходит в начальное состояние. Эго означает, что отключаются все выходные драйверы и прекращается подача на выход PICMicro синхросигналов. Вектор начальною запуска является адресом, который загружается в про- граммный счетчик, задавая начало выполняемой ттротраммы. Значение этого вектора равно нулю для средних и старших моделей PICMicro и последнему адресу для младших моделей. Например, 0x01 ЕГ является адресом запуска ;ьтя модели I6C54, использующей до 512 команд. 8-выводные микроконтроллеры PICMicro реально стартуют с последнего адреса, но выглядит это как старт с нулевою адреса Эю происходит потому, что калибровочное число внутреннего тактовою RC-тенерагора сохраняется в регистре W с помощью последней команды в памяти ттротрамм. Котла про- граммный счетчик возвращается в начальное состояние, то при использова- нии внутреннею RC-iсттераюра первая команда должна сохранить содержи- мое регистра W в регистре OSCCAL, Загрузка калибровочною числа производится с помощью команд: org ConrolStoreSize - 1 , Переход к поспеднему , адресу памяти программ movlw Calibrate ; Сохранение калибровочного ; значения в регистре W Необходимо отличать перезапуск от начальною запуска при включении питания. В этом случае многие биты аппаратных регистров принимают задан- ные значения Остальные биты, а так же содержимое файла регистров (RAM) устанавливаются в произвольное состояние. После никла запуска эти биты и регистры файла принимают значения, которые они имели перед выполне- нием перезапуска. Путем установки некоторых регистров файла в известное, но не повторяющееся состояние программа может проверить, произошел ли запуск вследствие включения питания или поступления внешнего сит нала запуска. В большинстве новых моделей PICMicro ретнегр PCON выполняет те же функции, что и установка регистров файла в определенное состояние. Повторный запуск работающего микроконтроллера может потребовать- ся, если питающее напряжение снизилось ниже заданною уровня. Многие современные модели PICMicro содержат встроенные устройства контроля питания и схемы перезапуска. Для других моделей требуется использовать внешние детекторы падения напряжения питания. Обычно в микроконтроллерах PICMicro не требуется использование схем для задержки запуска. Это связано с тем, чю длительность времени запуска
40 Часть 4. Микроконтроллеры PICMICRO PICMicro при включении питания может программироваться с помощью конфигурационного бита PWRTE Как укатано далее, оптимальная схема за- пуска микроконтролллера представляет собой просто резистор, «подтягива- ющий» потенциал на входе MCLR к напряжению питания Vcc (рис. 25 2). Vcc о PIC MCLR Vcc Рис. 25.2. Простая схема запуска PICMicro Системный тактовый генератор Микроконтроллеры PICMicro моту т использовать широкий набор различных тактовых генераторов. Это обеспечивает большую тпбкосгь при разработке приложений на базе этих микроконтроллеров Существуют четыре типа таких тенераторов: внешние резистор и конденсатор (RC-цепь). внутренний RC- тенератор. кристалл и внешний генератор импульсов. У каждого из них есть свои преимущества, которые могут использоваться для создания различных приложений. Резистивно-емкостной (RC) генератор использует постоянную времени простои RC-цепидля задания частоты тактовых сигналов (рис. 25.3). При этом точность частоты обычно составляет 20Ф. Следует заметить, что на вывод OSC2 микроконтроллера выдаются синхросит налы с частотой, равной 1/4 от тактовой частоты, что соответствует частоте следования командных циклов. Эти сигналы могут использоваться для синхронизации внешних устройств. Задание тактовой частоты с точностью 20Ф означает, что RC-тенератор может использоваться только в приложениях, не требующих точною соблю- дения временных соотношении. Полому данный тин тенератора не может применяться в приложениях, тде производится последовательный вывод дан- ных, формируются звуковые сигналы или обеспечивается взаимодействие с другими устройствами в точно заданные моменты времени . Но имеется мно- жество приложений, не требующих точной синхронизации, где может ис- ттользоватвся RC-генератор.
Глава 25. Аппаратные средства PICMICRO 41 Рис. 25.3. Подключение RC-цепи для генерации тактовых импульсов В ситх не тиценности характеристик вы во та OSC I не схитес гвхет простои форме ты тля вычистения значении емкое ти и соттрогив тения нетто тьзхемых в качес i не час гогно- задающей КС -цепи Д тя каж тою типа микрокон три т то- ра имеются с пенна тьные табтицы с рекомспасомыми значениями емкостей и сопротивлении обеспечивающих затаннхю час готе тактовых сит налов Внхтреннии RC-ieiicpaiop нетто тюхет ття формирования тактовых нм- ттх тисов тзстроеннхю в микроконтро т тер RC -цепь Дтя но течения ттсобхо зи- мой тактовой частоты ттсио тьз^сче я ка тибровочное чис то которое затрхжа- егся в процессор при выполнении первоп коман ты программы Обычно значение этого чиста программирхется в заво тскттх хстовиях и сохраняется как первая команта приложения org 0 , Начало программы movwf OSCCAL Сохранение калибровочного числа внутреннего RC- генератора Перст нетто тьзованием RC- генератора необхотимо хстаиовить соогтзет- ствхютиим образом опрелеленныи бит конфтнхранни микроконтротлера Осгатытые варианты синхронизации вктючают режим синхронизании с пониженным .энергопотреблением (режим «Ll’>) использование стандарт- ного криста т та мегагерповото тиапазона (<ХТ>) тт высокоскоростнхю синх- ронизанию («HS») Эти три режима возможны при по тклточении кварцевого криста т та и ти керамическою резонатора и ти при нетто тьзованпи внешнего исIочинка тактовых импхльсов Типичная схема синхрони татнти с нетто што- панием кварцевого кристалла показана на рисхнке 2т 4 Емкосыт внешних кон тенсаторотз С 1 и С 2 опре те тяются но таб типе дан- ной в с правочных тисгах лтя микрокоп । ро т тера анатотттчно выборе значе шит R и С т тя RC генератора Значение соиротив тения Rs яв тяется нескотько нсонреде тенным — обычно оно опрететяется эмпирическом их тем тт его ве- нтчитта составите! нескотько сотен Ом
42 Часть 4. Микроконтроллеры PICMICRO Рис. 25.4. Тактовый генератор, испопьзующий кварцевый резонатор Керамическим резонатор может испольюваться в тех же случаях, как и кварцевый. При использовании резонатора со встроенными конденсаторами необходимо быть особенно внимательным — можем оказаться. что емкость лих конденсаторов больше тою значения, при котором микроконтроллер сите может работать. Использование резонатора со встроенными конденсато- рами может существенно упростить схему и сделать ее более дешевой, так как такой резонатор стоит столько же, сколько кварцевый кристалл. но не требует дополни тельных тлеметнов (конденсаторов). Ките одно ттрсимушсство керамическою резонатор;! заключается всюбо.ть шеи физической прочности но сравнеттитос кварцевым Кристал том. Единствен нтам недостатком керамического резонатора является малая точность задания тактовой частоты Обычно такой резонатор обеспечивает точность частоты 0.5%. когда как точность кварцевого кристалла составляет 0 02%. Для большинства приложении не требуется такой точности, но для разработки часов реального времени и им подобных приложении использование кварцевою резонатора будет, безусловно, наилучшим решением. Установка необходимых значении битов конфитуранин при использова- нии определенных типов тактовых генераторов производится в соответствии со следующей таблицей. Тип Диапазон частот RC 0 - 4 МГц LP 5 КГц - 200 КГц XT 100 КГц - 4 МГн HS (-04) 4 М Гц HS (-10) 4 МГц - 10 МГц HS (-20) 4 М Гц - 20 М Гц
Глава 25 Аппаратные средства PICMICRO 43 Нача ю । е не рани и с инхроим 11\ i ыов при в к иочепии ни гания пока iaно на рис 25 5 Тактовые импупьсы Внутренний сигнал запуска Команды -( Адрес = оУ Адрес = 1 Включение питания (не в реальном масш- табе времени) Рис. 25.5. Последовательность включения питания для PICMicro Г с in 11 я формирован ия i а к i о вы \ i im н\ i ьшв Ис но п> <\ е и я внешний i ci ic- р. нор io ioiaui oi.iii, ныор in о ши и; режимов IP \Т и in HS Выхо i внеiniici о I ciiepji opa io i жен oi.i 11, i oe nun 11 i ui.iboiom OS( I микрокодipoi lepj a bi,iboi()S( 1 oi мен я испо IK поченпым (> iuii ячнм ) 1 la ni.nio ic ()S(. 2 формируемся с и i на i i окон же час i о i ы как и на OS С 1 но не и фа ic с ним Cimiai с выво in OSC 2 не Ю1жсн in I io 11, юна I l.i я l 1Я \ прав leiniii ipyiilMii Ус ipoiic i вами Гс in iак (oiii.i11 i иula i 11.1 вы no ic OSC 1 необуо him i bi p.iool ы ip\ i их \ c i - poiic i в cue iexii.1 io e-ienci вк почин, буферные каск.иы как иока>ано на рис 25 6 К выводу 0SC1 микроконтроллера PIC К выводам 0SC1 других микроконтроллеров PIC Рис. 25.6. Подключение тактовых импульсов к нескольким микроконтролле рам PICMicro
44 Часть 4. Микроконтроллеры PICMICRO Аппаратные регистры и файл регистров Как и is других процессорах с Гарвардской архитектурой, в PICMicro имеют- ся отдельные адресные пространства для регистров и памяти программ Реги- стровое пространство используется для хранения операндов, используемых в программе, которые называются также «переменными», и для размещения аппаратных рщистров управления Вместе с памятью RAM и регистрами в PICMicro имеется регистр W, которым используется как аккумулятор для временного хранения ре зультагов операции Регистры распола1аю!ся в 128-адресных банках (в старших моделях банки имеют по 256 адресов) Каждый peincip содержит 8 бит Ко всем pei негром может быть осу ществлен npoi раммныи лосгуп различными способами Обыч- но регистры, управляющие аппаратными средствами, доступ к которым про- изводится только при инициализации при южения, распоъпаются в банке I Это очень важная особенность, так как она позволяет реализовать процедуру инициализации таким образом, чтобы выбор или сброс банка производился только один раз в течение выпо шения программы (рис 25 7/ Адрес Банк 0 Банк1 Адрес 0x000 INDF INDF 0x080 * - PORTC/TRISC Для варианта с портом С “ - Регистры ввода/вывода PCON*" - Регистр управ пением включением 0x001 TMRO OPTION 0x081 0x002 PCL PCL 0x082 0x003 STATUS STATUS 0x083 0x004 FSR FSR 0x084 питания 0x005 PORTA TRISA 0x085 - Область файла регистров 0x006 PORTB TRISB 0x086 0x007 * * 0x087 0x008 ** « A 0x088 - - - Конец области фаи- 0x009 ** A* 0x089 ла регистров ОхООА PCLATH PCLATH 0x08A 0x00В INTCON INTCON 0x08B 0x000 0x080 PCON*** 0x020 OxOAO 0x07F OxOFF Рис. 25.7. Регистры в средних моделях PICMicro
Глава 25. Аппаратные средства PICMICRO 45 Как отмечалось в главе «Архтектура PICMicro». я предпочитаю записы- вать массив переменных в банк I. а переменные общего назначения в банк 0. При соблюдении этою соглашения банк I используется для инициализации аппаратных регистров, а загем работа ведется только с банком 0 потому, что массив переменных, к которому обрашаегся регисгр FSR. не требует уста- новки в I бита PRO в регистре состояния STATUS. Все аппаратные регистры PICMicro paciio.iarакпея под одинаковыми ад- ресами во всех семействах микроконiроллеров и имеют одинаковые назва- ния. Это позволяет легко настраивагь программный код на работу с различ- ными типами микроконтрейдеров PICMicro Все per негры процессора’ STATUS, INTCON, FSR, INDF. OPTION. PCL, PCLATH - размешаются в каждом регистровом банке PICMicro под одинаковыми адресами Эю позво- ляет осуществлять доступ к различным регистрам независимо от того, в ка- ком состоянии находшея бит выбора банка Аппарашые per истры располага- ются в каждом банке, начиная с нулевою адреса, а регистры RAM следуют непосредственно за ними. Младшие модели PICMicro располагаю) только одним банком. Для досчу- па к регистрам, коюрые размещаются в банке 1 (в основном, это регисгры TRIS и OPTION) используется специальные команды, которые пересылают содержимое регистра W непосредсгвенно в ли регисгры. Так как не суще- ствует способа прочитать содержимое них регистров, то рекомендуется иметь отдельную копию их содержимого, если предполагается ею дальнейшее ис- пользование. Как видно из рис. 25.8, реттльпо м гадшие модели микроконтроллеротз имею! различные банки, выбираемыми битами 6 и 5 адреса, по pei моры TRIS и OPTION, которые находятся в банке I микрокон г роллеров среднего уровня, недоступны в регистровой карте памяти. В них можно только записать содер- жимое регистра W, используя команды «TRIS» и «OPTION». Следует также отметить, что в младших моделях микроконтроллеров ре- гистры, для которых бит 4 адреса равен 0. являются общими для всех четы- рех банков, но файловые регистры, для которых значение бига 4 адреса рав- но I, являются уникальными для каждою банка (рис 25.8). Это означает, что еще 64 различных файловых регистра могут присутствовать в младших моде- лях PICMicro Регистр W является промежуточным pei негром и обычно используется в качестве аккумулятора для временного хранения результатов операции. Пря- мая адресация к этому регистру реализуется юлько в старших моделях PICMicro, ноон используется при выполнении многих команд. Регистр W может служить местом размещения результата для всех арифметических операции. Старшие модели PICMicro функционируют аналогичным образом, но несколько сложнее. Эта сложность обусловлена двумя причинами Во-пер- вых, эти микрокон троллеры используют набор основных регистров («primary»), который является подмножеством полною набора регистров Основным в этом наборе я вл яс гея регистр WREG, который в старших моделях выполняет фун- кции регистра W. Этотретистр используется совместно е другими регистрами и доступен для записи и считывания. Размещение операнда в данном peiне-
46 Часть 4. Микроконтроллеры PICMICRO Iре позволяет производить тестирование. установке и сброс битов, как это реализуется вдру|их моделях PIC Micro Таким образом, резистры в старших моделях имеют ботее «ортогональную» (фхнкпиона и>по однородную) струк- туру. чем в других семействах микроконтро! lepois PICMicro PORTCCTRISC варианта с портом С - Область файла регистров Неадресуемые регистры OPTION TRISA ' TRISB Рис. 25.8. Регистры в младших моделях PICMicro Рис. 25.9. Регистры в старших моделях PICMicro Базовая архитекзура старших модезеи PICMicro показана на рис 25 9 В банках 0-3 содержания как резисзры, управляющие аппаратными средства- ми. так и файлы pei ист ров
Глава 25 Аппаратные средства PICMICRO 47 Стек программного счетчика процессора Стек программною счетчика в мнкроконгроттерах PICMicro имеет очень простую структуру Он пре (став тяет собой память с пара i ie тытои таписью- считыванием тина LIFO (<Laxt In - Fust Out > - <Постетнии принте i — пер- вый ушеч») которая имеет такое же чис то битов как и ттрот раммныи счет- чик (рис 25 10) Рис. 25 10. Программный счетчик и его стек в PICMicro Запись данных в < и к иево тможиа Как от мечено в стоп книге ноотната ст что на ба тс микроконтро i теров PIC М тс то не пня рс а ти тона т ь опс рацион иые системы реа тьпото времсни (ОС РВ) и мони юры-от та тчикп В настоя- щее время evince т в\ тот прея рам мы которые тму тир\ тот т ipoi рам м ы мот нт т ор т и ОСРВ по на практикс они не выпотияют всех требовнтитт к протраммам кого типа Фу и кии и мони тор т от т тдчика мот \ г рсыти тованы с помощью схем- но| о эму тя тора О и та ко лево тможнос ть со т тан ня по т нот тс иной ОС РВ я в тяет ся по моему млению серьетным нс достатком микроконтроттеров PICMicro Прерывания Осу шее гви гь прерывания в микроконтро т серах PIC Мтсто весьма т т рос тс септ стетопать некоторым основным правтт там На практике ли микроконтро । ie ры выполняют обработку прерывании обычным обр ном На рис 2s II пока таи процесс обработки прерывания Первое что ттеобхотимо с те тать при сот тапни обработчика прерывании — это сохранить сотержимое контекстных регистров Кот та нос те подтвержде- ния прерывания выпотнение программы нерехотит к адресу 4 (в сре тнттх и старших моде тях нетто тьтхемыи а трее тависит от типа прерывания) в стеке сохраняется тодько содержимое программного счетчика Это означает что содержимое осдадьных регистров необходимое для выпотненич основной программы, то тжно быть сохранено программно Примером выподнения этого может с тужить с те тутошни программный код
48 Часть 4 Микроконтроллеры PICMICRO orq 4 Адрес начала обработчика прерывания IntHndlr movwf w Сохранить содержимое W movf STATUS, w Сохранить содержимое регистра STATUS bef STATUS PRO movwf status movf FSR w movwf fsr Перейти к банку 0 Вариант - сохранить содержимое FSR если основная программа и ооработчик прерывании изменяют7 испопьтуют FSR movf PCLATH w movwf pclath movlw HIGH $ movwf PCLATH Вариант реализовать если основная программа или обработчик прерывания используют более 2К памяти Вариант сброс регистра PCLATH (реализовать если содержимое регистра PCLATH ранее быпо сохранено) Рис. 25.11. Реализация прерывании Метки, которые начиняются ником но тчеркинания (> >) н нзтзния рет нс т рои. ынные с т роч ттымп 6\ квями ис т то т ь т\ тот с я т тя ооо тначення кон текс т но сохраняемых рет нс трон фан та Как ни ню m коммент тариен. со тер ж н мое pel 11 с । р.т I S R с ох ран яс 1 с я се нт оно отменяется н нс но т т. т\ е г с я как в основной нротр.тмме. мк и в оГ'раоотчнке прерывании («1 тИНnd 1т•>) С и т с а пня с ре т нс । ром PC I \ 1 С II нем hoi о с южнее ) i о i ре т и с i р нс но и, цсчея при выно шепни коман т • goto > и calk выхо тяитих та тряпице 2 Кп юбаниюи с ।paihi 1 ты. и in при работе с тао типами выхо тятпнмн та пре te ня первых 2% >1 tpecoiT Поломе с те t\ci сохранить текетпее тначение ею со тер- жимото, а татем \cianoBiiii. в нем тначение которое о\ те т Ис ио I в товано обрабо!чиком прерывания
Глава 25 Аппаратные средства PICMICRO 49 Другая проб тема с ретистром PCLATCH поникает всдучтс сети вы хо тите чтобы начальный адрес обработчика прерывания имет какое тибо зна чение, не равное 4 Я не рекомендую такой втрианг т тк как в атом стучае при работе с PICMicro имеющим объем п тмяти программ ботее 2 Кбайт вы обнаружите что прерывание при выпоптснии протрамм размещенных на старшей странице памяти вызовет перехот к прои тво тьнои позиции па- мяти, а не к обработчику прерывания Ес ти перс т выподнением перехода изменить содержимое регистра PCLATCH то ло весьма вероятно окажет втияние на регистры W и STATUS Позтому перс пем как выполнить пере ход к обработчику с тедует тавершить сохранение контекстных регнтров На мною проще обеспечить обработку прерывании запуская обработчик с ад- реса 4 Предотавтенныи выше ко i яв тяется наибо iee общим отучаем Поско 1ьку неизвестно какой регистровый банк 6\ici активным при вызове обработчи ка прерывании я детаю фантовый регистр W юсixиным тля обращения по одному и тому же адресу но всех банках Пос к сохршения содержимою регистра W и пересылки в него со тержимою регистра STATUS я абсотютно уверен при дальнейшем выпотнении ттротртммт.! бу 1е г выбран банк О Посте сохранения содержимою контекстных регистров вы до гжтты опретс- шть причину прерывания В PICMicio >то вытто птястся ну тем ана птза тначттщи битов разрешающих прерывания Обычно ли биты p.iciio тататотся в реитстрах 1NTCON иди PIR но в некоторых сдуч.тях они моту г ратмсшаться и других местах Ести вы имеете опыт работы с нс рсон.стьными кохтиыотерахти и их про цессорами которые обеспечивают от тс пятый вектор для каждого вида прерт.т вания то тадача онредсдения причины прерывания в PICMicio покажется вам весьма трудной В обработчике прерывания вы тотжны сбросить в 0 соответ ствующии бит 1Г Некоторые периферийные устройства PICMicro требуют вы тютнения допотните тьных команд чтобы ли устройства быти готовы выдать с тедующии запрос прерывания Я распотагаю кот проищо рицин сброс бигов IE в обработчике прерыва нии как можно раньше сети при обработке текущего прерывания могут поступить лрутие тапросы Котта прихощт новый таттрос прерывания он сохраняется аппаратными средствами Пос те оконч тттия обработки текущего прерывания и установки в 1 бита GIE (общее разрешение прерывании) нач нется обсдуживаиие нового прерывания Кот да обработка завершается содержимое контекстных ретпетров вое станав тиваегся и выпотнение нротраммы возвр ттнастся к месту где бы i потучен запрос прерывания Код тзытто дняющитт возврат представтяет со- бой, в основном, инверсию кота обеспечивающею вызов обработчика пре рывании с одним важным изменением IntHndlrEnd movf pclatch w movwf PCLATCH Возврат из прерывания Возможный вариант - восстановление PCLATCH если его содержимое было сохранено или изменено в IntHndlr 4 Зак 2025
50 Часть 4. Микроконтроллеры PICMICRO movf _fsr, w ; Возможный вариант - восстановление movwf FSR ; FSR, если его содержимое быпо ; сохранено или изменено в IntHndlr movf status, w ; Восстановление регистра STATUS movwf STATUS swapf _ w ; Восстановление W без изменения swapf w, w ; содержимого регистра STATUS retfie ; Возврат из прерывания Таким игмснением является введение двух команд «swapl'>. paooi aiouuix с (|)11111опым регистром _w. Проблемой являемся mi py ша в peiucip U ранее сохраненною шачения бег пгмененпя содержимою per ucip.i STATUS. в коюром флш нуля игмепяегся при выполнении команды ••movU. Чюбы ре- тин. лу проблему, пспо.ть густея команда «swap!-, коюрая иерееiавляеi пар mini и младший полубайты (нибблы), не и (меняя каких-либо бшов в peine гре ST/XTUS. Первая команда <-s\\apT> иерее швляег полубаи i ы в peiiicipe . а вюрая команда снова иерее i а в. 1яе г iionyGaiiii.i, гагружая ре (улыаг в ре- гией р W. Таймеры Таймеры, и.меюшпеся в PICMicro. ио своим boimoahocihm ciiiiiMaioi сред- нее положение по сравнению с таймерами н других микрокон1 роллерах. но они обладаю! нскоюрымп споил вами, которые иоиюлякн в ряде случаев согдавать более upociwe и гффектшшые приложения. Таймер TMR0 Основных! про! раммно-лоегу иным ншмером во всех микроконiроллерах PICMicro являемся 8-ра (рядиын шимер TMRO с предвари ie.ii>in>iM деятелем часюгы. Этот дели гель вместе со схемой деления часмоты iukioboio сигнала па 2 можем обеспечи । ь уменьшение uacioii.i пос гушиопшх iukioui.ix импуль- сов в 2 - 256 ра 1. Эго ногволясм шимеру oopaoaiыкаiь более длинные uiiiep- в;г1ы времени или большее число событии га данный период. В схеме на рис. 25.12 покатано, чю предварительный лелшель частоты ирелшесмвусч таймеру TMR0. Как будет оюечепо ниже в ра стеле <'С’|ороже- вои таймер» >го сделано не случайно. Fosc/4 ТОСКО Рис. 25.12. Структура таймера TMR0 в микроконтроллерах PICMicro
Глава 25. Аппаратные средства PICMICRO 51 Следует заметить, что даже без использования предварительного делите- ля частота входных сигналов делится на два. Например, если частота импуль- сов, поступающих на внешний вход ТОСКО. составляет I МГц, то схема деления на два выдает на вход TMRO сигнал прямоугольной формы с часто- той 500 КГц. Бит TOIF является флагом запроса прерывания в регистре INTCON и устанавливается в I при изменении содержимого таймера TMR0 с числа OxOFF на 0x000. Бит TOIF может использоваться только в тех микроконтроллерах, которые поддерживают обработку прерываний, то-есть в средних и старших моделях. Конечно, было бы хорошо иметь такую возможность и в младших моделях микроконтроллеров. Я обычно использую сигналы командных циклов, имеющие частоту Fosc/ 4. когда требуется обеспечить определенную задержку. Если для формирова- ния тактовых импульсов используется кварцевый или керамический резона- тор с частотой Fosc, то с помощью таймера TMR0 может получить достаточ- но точные значения временных задержек. Для вычисления этой задержки прежде всего следует выяснить, надо ли использовать предварительный делитель частоты. Это можно определить про- стым вычислением по формуле. TMRO Count = Period / (2* ( 4 / Fosc)), i.'ie Period — зребусмое значение задержки. Если полученное значение пере- менной TMRO Count превысит 256, го необходимо делить ее на 2 до тех пор. пока она не сгинет меньше 256. Например, если необходимо получить задер- жку в 0.I секунды, используя микроконтроллер. рабошюшни на частоте Еохс=1МГц, то с помощью данной формулы получим: TMRO Count = Period / (2* ( 4 / Fosc)) = 0,1 сек/ ( 2* 4/1 000 000 / сек ) =12 500 Эю значение больше чем 256, следовагельно, необходимо использовать предвари тельный делитель частоты. Делением I2 500 на 64 мы. в конечном счете, получим значение I95. 3I25. Это значение следует записать в таймер TMRO, который должен переключаться сигналом с частотой, деленной на 64, чтобы обеспечить задержку 0.I с при тактовой частоте I МГц. В действи- тельности же коэффициент предварительного деления PrescaIer_VaIне будет равен 128. учитывая деление частоты сигнала на два на входе таймера TMR0. Остаток 0,3125 будет округлен, если же необходимо обеспечить более высо- кую точность, то его можно учесть с помощью введения дополнительных команд. Теперь мы можем записать общую формулу вычисления задержки для тай- мера TMR0 с использованием предвари тельного делителя частоты: Delay = TMR0_Count * Prescaler_ Value* 4 I Fosc. Обычно после получения заданной задержки необходимо прервать ход вы- полнения программы. Это можно осу ществггть предвари тельной записью в TMRO такого числа, которое в сумме со значением «ТМRO Colint» вызвало бы усга-
52 Часть 4. Микроконтроллеры PICMICRO новку в 1 бита запроса прерывания TOIF. Это легко сделать следующим обра- зом. В TMR0 предварительно записывается число, которое равно значени1о переполнения 256 минус значение PrescalerValue. Таким образом, чтобы по- лучить значение величины TMROCount, можно использовать формулу: TMRO_Count = 256 - Delay * Fosc / (Prescaler_Value* 4 ). Возвращаясь к примеру реализации задержки в 0,1с с помощью микро- контроллера PICMicro с тактовой частотой I МГц, можно расчитать значе- ние TMRO Count следующим образом: TMRO Count = 256 - 0,1сек * 1 000 000 / сек / (128 * 4) = = 256 - 100 000 / 512 = 256 - 195 = 61. Таймер TMR1 Дополнительные таймеры TMR1 и ТМR2 могут использоваться, чтобы обес- печить микроконтроллерам PICMicro дополнительные возможности при ма- лой нагрузке па процессор. Таймер ТМ RI предназначен для генерации ткто- вых сигналов реального времени, которые продолжают поступать и в режиме ожидания, поэтому он может служшьдля контроля текущего состояния вне- шних устройств. Сигнал включения- отключения таймера Рис. 25.13. Структура таймера TMR1 в микроконтроллерах PICMicro Таймер TMR1 отличается от TMR0 и TMR2 своей структурой и возмож- ностями синхронизации (рис. 25.13). Это 16-разрядный таймер, который мо- жет переключаться внешними тактовыми сигналами. Имея 16 разрядов, тай- мер TMR1 не требует значительного предварительного деления частоты, как другие таймеры, так как переполнение 16-разрядного таймера происходит
Глава 25. Аппаратные средства PICMICRO 53 тогда же, когда и переполнение 8-разрядного таймера с предварительным делителем частоты на 256. Когда разрешена работа TMR1. выводы TIOSO и T1OSI служат для реа- лизации переключающих импульсов, которые формируются при подключе- нии к ним кварцевого кристалла с с резонансной частотой до 200 кГц. Чтобы обеспечить реализацию функций реального времени часто используется ча- совой кварц на 32,768 кГц. Эти синхросигналы обеспечивают переключение таймера при работе микроконтроллера в режиме ожидания, за исключением случая, когда входными сигналами таймера TMRI являются сигналы коман- дных циклов микроконтроллера с частотой Fosc/4. Блок синхронизации обеспечивает синхронизацию внешних синхросиг- налов с внутренними тактовыми сигналами процессора. Для синхрониза- ции, значения внешнею синхросигнала проверякнся в каждом втором или четвертом такте командного никла. Такая синхронизация не производится, если микроконтроллер находится в режиме ожидания, а таймер TMRI про- должает переключаться. TMRI может использоваться аналогично гаймеру в микроконтроллерах семейства 68НС05. реализуя прерывание при переполнении таймера (уста- новка в I бита TMRI IF) или при достижении определенною момента вре- мени. Такая работ шймера называется режимом сравнения («compare mode»). В этом режиме реализуе1ся прерывание процессора PICMicro, когда содер- жимоеТМИ! rioeimaei определенно!о значения (рис. 25.14). CCPIF Разрешение выхода Рис. 25.14. Структура таймера TMR1 при работе в режиме сравнения Другие дополни тельные возможности TMRI рештп зуются в режиме захва- та («capture mode»), коша сохраняется содержимое таймера TMRI при по- ступлении внешнего сигнала (рис. 25.15). Предварщельный дел щель на входе позволяет обеспечить прерывание процессора при различных событиях.
54 Часть 4. Микроконтроллеры PICMICRO CCPIF Рис. 25.15. Структура таймера TMR1 при работе в режиме захвата Таймер TMR2 Другим дополнительным таймером, входящим в состав некоторых моделей PICMicro, является 8-разрядный таймер TMR2, который сбрасывается в на- чальное состояние, когда значение его содержимого достигает предваритель- но заданного значения. Основное назначение этого таймера - обеспечить формирование на выходе микроконтроллера ШИМ-сигналов, которые могут быть преобразованы в аналоговый сигнал или использоваться для управле- ния скоростью вращения электродвигателя постоянною гока (рис. 25.16.) Fosc/4 Выход Установка Рис. 25.16. Структура таймера TMR2 в микроконтроллерах PICMicro Таймер TMR2 работает в режиме постоянного переключения. Когда его содержимое становится равным числу, записанному в регистр PR2, компа- ратор производит сброс таймера в нулевое значение, а затем счет таймера повторяется. При использовании некоторых дополнительных внешних схем ТМ R2 может обеспечивать на выходе Ш ИМ-сигналы, которые формируются независимо от процессора (рис. 25.17). Первоначальные функции TMR2 не изменились — он продолжает считать до значения, заданного содержимым регистра PR2 и затем запускается снова. До тех пор, пока его содержимое меньше, чем величина, записанная в ре-
Г*лава 25. Аппаратные с:ре?хдст Еза PICMICRO 55 гистр CCPRIH. сигнал на ШИМ- выходе будет иметь высокое гначение. Если содержимое регистра CCPIH меньше, чем содержимое в регистре PR2. вы получите на выходе ШИМ-сигнал, который имеет высокий уровень, когда содержимое TMR2 меньше, чем CCPRIH, и низкий уровень, когда содер- жимое TMR2 больше, чем CCPRIH. Рис. 25.17. Структура таймера TMR2 при работе в режиме ШИМ-генератора ШИМ-си! н;ь'1ы имеют 8-битное разрешение для задания периода и скваж- ности формируемых сигналов. Это означает, чю регулировка выходных сиг- налов реализуется достаточно грубо, го есть не гак точно, как при других методах формирования ШИМ-сигналов. Хотя гакая точность является доста- точной для выдачи постоянного напряжения или управления электромотора- ми постоянного тока, она явлется слишком малой для таких устройств, как радиоуправляемые серводвигатели, которые требуют очень точного форми- рования импульсов, составляющих малую часть от периода ШИ М-сигнала. Сторожевой таймер Как и в большинстве других микроконтроллеров, сторожевой таймер WDT в PICMicro служит для перезапуска контроллера при нарушении порядка вы- полнения программы, если этот таймер не будет сброшен в начальное состо- яние в течение определенного момента времени. В PICMicro частота пере- ключения WDT задается RC-генератором, и контролируемое время составляет около 18 мс. Работа WDT управляется битом в регистре конфигурации, кото- рый разрешает его функционирование, когда при программировании мик- роконтроллера этот бит устанавливается в 1. Содержимое WDT является программно недоступным, возможен только его сброс в начальное состояние с помощью команды «CLRWDT». Я считаю, что WDT работает аналогично 8-разрядному таймеру, только его переполне- ние вызывает не прерывание, а перезапуск микроконтроллера. Это означает, что сигналы внутреннего RC-генератора, вызывают переключение стороже-
56 Часть 4. Микроконтроллеры PICMICRO лого шимера с периодом около 70 мкс (то есть с частотой 14.2 КГц), учиты- вая. что WDT является 8- разрядным счетчиком. Вотможно. некоторые пользователи могут подумать, что 18 мс не слиш- ком большой интервал времени для выполнения программы между команда- ми сброса сторожевого таймера «CLRWDT». Тог же самый предварительный делитель, который используется в таймере TMR0. гюиюляет увеличить пе- риод работы WDT до 2.3 с. если установить коэффициент деления, равный 128. Сгруктра TMR0 с добавлением WDT покатана на рис. 25.18. Рис. 25.18. Структура блока TMR0/WDT в микроконтроллерах PICMicro Выбор источника сигналов дзя предварительно!о делителя, коэффициента деления и сигнала переключения таймера TMR0 обеспечиваются с помощью регистра OPTION. По умолчанию задается прохождение сигнала переключе- ния WDT через предделитель частоты с коэффициентом EI28. Это означает, что если по невнимательности работа WDT окажется разрешенной, то ваше приложение будет перезапускаться через каждые две с половиной секунды. Если предварительный делитель будет установлен на обслуживание TMR0. и работа WDT окажется разрешенной, то микроконтроллер никогда не загру- зится. потому что WDT будет производить его riepesanycK каждые I8 мс. Если вы не очень хорошо знакомы с PICMicro. то можете подумать, что вероятность возникновения таких проблем невелика. Однако при использо- вании многих самодельных программаторов, где биты конфигурации уста- навливаются вручную, такие случаи возникают достаючно часто. Так же как установка битов зашиты программного кода, которые запрещают репрограм- мирование многих микроконтролллеров. непредусмотренное разрешение функционирования WDT сделает отладку вашего устройства весьма затруд- нительной. По этой причине я рекомендую использовать программатор и программное обеспечение, в которых информация о конфигурации микро- конгролллера вводится в виде «.11е.х»-файла. а не устанавливается пользова- телям вручную.
Глава 25. Аппаратные средства PICMICRO 57 После чтения разделов, посвященных режиму ожидания и сторожевому таймеру, вы еще не очень ясно представляете, как они работают совместно. Я рекомендую вам прочитать про «задержки» и «управление мощностью/вы- иолнением программ» в главе, где описываются функции PBASIC для кон- тролллера BASIC Stamp. Все эти функции используют WDT и режим ожида- ния, чтобы обеспечить определенные задержки при функционировании контроллера в энергосберегающем режиме. Понимание того, как выполня- ются данные функции, позволит вам лучше представить, как реализуются такие же функции в PICMicro. Внутренняя память EEPROM Интересной особенностью микроконтроллеров PICMicro с EEPROM является наличие банка EEPROM памяти для сохранения данных. Эта память обеспечи- вает быстрое считывание данных, но обычно требуется около 10 мс, чтобы за- писать в эту память один байт. Эта память может выполнять функции RAM, но более важным является ее использование для хранения последовательности чи- сел, калибровочных данных, данных для начальной загрузки и другой информа- ции, коюрая должна сохраняться при отключении напряжения питания. Так как памят ь данных EEPROM не располагается неиосрелсгвенно в об- ласти адресуемых регистров, то для выборки байта в эюй памяти должны быть предварительно устиовлсны адреса и данные. Эю можно показа и, на примере следующего фрагмент программы, который используется для те- ния EEPROM. bet STATUS, RPO ; Данные/адреса регистров в банке 0 movlw EEPROMAddr ; Загрузка адреса EEPROM movwf EEADR bsf STATUS, RPO ; Регистры управления EEPROM в банке 1 bsf EECON1, RD ; Инициализация чтения bet STATUS, RPO movf EEDATA, W ; Чтение байта в EEADR = EEPROM Addr Запись в EEPROM реализуется аналогичным образом, но с одной суще- ственной разницей — должна быть выполнена специальная последователь- ность операций для записи в псевдорегистр EECON2. чтобы начать процеду- ру записи. Эта последовательность операции используется дтя того, чтобы быть уверенным, что в EEPROM не была произведена случайная запись. По этой причине в приведенной ниже программе ревизовано запрещение пре- рываний, чтобы последовательность операций, отмеченная символом *. не была прервана. Программный код, реализующий запись байта в EEPROM. имеет следующий вид. bef STATUS, RPO ; Данные/адрес для банка 0 movf Data, W ; Загрузка данных для записи movwf EEDATA movf Addr, W ; Загрузка адреса записи movwf EEADR
58 Часть 4. Микроконтроллеры PICMICRO bsf STATUS, RPO ; Регистры управления EEPROM в банке 1 bef 4NTCON, GIE ; Запрещение прерываний для критичной части программы bsf EECON1, WREN ; Разрешение записи movlw 0x055 ; * - Требуемая последовательность записи movwf EECON2 ; * - Требуемая последовательность записи movlw OxOAA ; * - Требуемая последовательность записи movwf EECON2 ; * - Требуемая последовательность записи bsf EECON1, WR ; * - Требуемая последовательность записи bsf INTCON, GIE ; Разрешение прерываний btfsc EECON, WR ; Опрос значения WR в ожидании окончания записи goto $ - 1 bef EECON1, WREN ; Завершение записи в EEPROM По окончании этой последовательности в память EEPROM будет записан один байт. Вместо процедуры опроса можно разрешить прерывания записи в EEPROM, которое обеспечит прерывание программы при завершении записи. При подготовке этой книги я нашел указание, что в случае, если память EEPROM не используется в данном приложении, то можно применять реги- стры EEADR и EEDATA как регистры файлов. Хотя это действительно так. я не советую примсня1ь данные регисгры указанным способом потому, что при этом можно инициировать нежелательную работу аппаратных средеiв. Я нас гоя । е.т ьно не рекомендую использовать какие-либо регисзры дзя целей, не cool вс зствуюших их основному назначению. Ввод -вывод данных При использовании линий цифрового ввода-вывода микроконтроллеры PICMicro реализуют ряд внутренних функций, которые существенно упро- итаюг создание протраммного обеспечения для интерфейса с другими уст- ройствами. Эти функции реализуются не во всех микроконтроллерах, однако существует достаточно много различных моделей PICMicro. чтобы найти наиболее соответствующую требованиям конкретного приложения. Параллельный ведомый порт Наличие в некоторых моделях PICMicro параллельного ведомого порта по- зволяет лет ко обеспечить их интерфейс с микропроцессором. Эта возмож- ность особенно полезна при проектировании систем, тле требуется подклю- чение периферийных устройств к обшей шине, но нет достаточно времени, средств и специалистов зля разработки специальных заказных БИС. Котла разрешена работа партылельного ведомого порта. PORTD исполь- зуется как S-разрядный регистр чтения-записи, куда PICMicro записывает данные, которые должны быть прочитаны микропропессорм. и откуда он читаег данные, записываемые в него микропроцессором. Функционирование PORTO управляется гремя уиразезяюшими выводами порта PORTE (рис.25.1 б).
Глава 25. Аппаратные средства PICMICRO 59 Рис. 25.19. Реализация параллельного ведомого порта Если PICMicro должен прерывать работу ведущего микропроцессора, ю необходимо использовать линии ввода-вывода портов PORTA, PORTB или PORTC, чтобы подать сигнал запроса прерывания непосредсiвенно на мик- ропроцессор. Единственным недостатком такого интерфейса является отсутствие до- полнительных регистров для упрощения чтения и записи нескольких байт или создания нескольких блоков данных PICMicro. Если это реализуется в режиме параллельного порта, тогда должны быть разработаны коммуника- ционные протоколы для 8-разрядных портов или использованы внешние линии ввода-вывода для этой цели (при этом ведущий микроконтроллер загружает параллельный порт вывода перед записью-считыванием из PICmicro). Последовательный цифровой ввод-вывод В некоторых моделях PicMicro имеются аппаратные средства, которые позво- ляют обеспечивать последовательную связь с другими устройствами. В то же время последовательный интерфейс, описанный ниже, может быть программ- но эмулирован в тех моделях PICMicro, которые не имеют таких средств. Материал этого раздела даст вам представление о том. как работают внут- ренние аппаратные средства, реализующие последовательную связь.
60 Часть 4. Микроконтроллеры PICMICRO Синхронный последовательный обмен Синхронный последовательный порт SSP. имеющийся в средних и старших моделях PICMicro, позволяет передавать данные с частоюй. которая требу- ется для реализации различных протоколов обмена. SSP имеет достаточно сложную структру (рис. 25.20). Рис. 25.20. Структура модуля SSP в режиме обмена SPI Цель реализации SSP — обеспечить микроконтроллерам PICMicro воз- можность реализовать функции интерфейса SPI в режиме «ведущий-ведо- мый», функции интерфейса 12С в режиме «ведомый» или интерфейс с вне- шним синхронным регистром последовательного ввода-вывода, как это сделано в некоторых примерах применения с вводом данных в ЖКИ с помо- щью последовательно загружаемого регистра. В отличие от других микроконтроллеров, где контролллер последователь- ного обмена обычно функционирует как «ведущий» на шине I2C, порт SSP не содержит схем, обеспечивающих генерацию синхросигналов, необходи- мых, чтобы управлять шиной. Если требуется реализовать шину 12С, то это
Глава 25. Аппаратные средства PICMICRO 61 может быть обеспечено путем программирования бит вручную, или с помо- щью использования выходных сигналов таймера TMR2 в качестве синхро- сигналов шины I2C и использования порта SSP в режиме «'ведомого», когда фактически он используется для генерации синхросигналов «'Ведущего» кон- троллера. Компания Microchip недавно объявила о выпуске микроконтроллеров семейства 17С5.Х. которые полностью реализуют функции «'Ведущего» шины I2C, но эти функции не реализуются микроконтроллерами PICMicro средне- го уровня. Поэтому, если вы хотите реализовать максимум возможностей пос- ледовательного синхронного обмена, го следует использовать протокол SPI вместо 12С. Асинхронный последовательный обмен Для реализации синхронного последовательного обмена в микрокошролле- рах PICMicro используется модуль последовательного коммуникационного интерфейса SCI («'Serial communication interface»), который называемся также универсальным синхронно-асинхронным приемопередатчиком USART («universal synclironotis/asynclironous receiver/transmittcr»). Этот модуль состо- ит из двух отдельных блоков приемника и передатчика, коюрые использу- ют общий ictiepaiop синхросигналов BRG («band rate generator»). В соответствии е на званием USART (синхронно-асинхронный) модуль SCI обеспечивает синхронную передачу и прием данных. Я обычно избетаю нрименяп. SCI в заком режиме, и предпочитаю испо.тыовзыь ;ыя синхронно- го обмена SSP. Структуры асинхронного передатчика и приемника модуля SCI приведе- ны на рис. 25.21 и 25.22. Для большинства применений модуль SCI функцио- нирует ожидаемым образом, и ею работа достаточно понятна. Передача дан- ных производится сразу после того, как они записаны в регистр TXREG. и когда они загружаются в сдвиговый регистр TSR может производиться пре- рывание процессора PICMicro. что позволяет обеспечить максимальную ско- рость передачи потока данных. Принятые данные помещаются в регистр RCR. и формируется запрос прерывания, который сообщает процессору PICMicro. «1го принят байт данных. Некоторые особенности имеются в работе генератора BRG. Частота гене- рируемых синхросигналов Data Rate определяется содержимым 8-разрядного регистра х и значением дополнительного бига BRGH. который используется для выбора частоты обмена. Для расчета этой частоты используются следую- щие формулы; Data Rate = Fosc х = Fosc / (Data Data Rate = Fosc x = Fosc / (Data / (64 * (x + 1)), Rate * 64) - 1 / (16 * (x + 1)), Rate * 16) - 1 если BRGH = 0 если BRGH = 0 если BRGH = 1 если BRGH = 1 В ранних реализациях SCI модуля возникали некоторые проблемы в слу- чаях. когда было установлено значение бига BRGH=I. Чтобы обеспечить на-
62 Часть 4. Микроконтроллеры PICMICRO дежное функционирование, надо было поддерживать значение BRGH=0. Это не вызывает значительных затруднений. При тактовой частоте Fosc = 10 МГц и значении BRGH=0 микроконтроллеры PICMicro способны принимать и передавать данные со скоростью от I 200 до 76 800 бит/с. Рис. 25.21. Структура последовательного асинхронного передатчика модуля SCI Рис. 25.22. Структура последовательного асинхронного приемника модуля SCI Модуль SCI может принимать и передавать данные только в положитель- ной логике. Если вы получаете данные по интерфейсу RS-232 и испотьзуете токоограничивающий транзистор, который позволяет выводам PICMicro оперировать с данными, то обнаружите, что модуль SCI не .может принять данные, так как уровни напряжения оказываются инвертированными отно- сительно ожидаемых значений. В микроконтроллерах PICMicro отсутствуют внутренние схемы дзя инвертирования данных.
Глава 25. Аппаратные средства PICMICRO 63 Аналоговый ввод-вывод Семейства 16С62х и!6С7х микроконтроллеров PICMicro moix > обеспечить ввод и вывод аналоговых сигналов. Для реализации этого в каждом семействе ис- полыуются рахтичные методы. В семействе 16С62х производится сравнение с опорным напряжением, а в семействе 16С7х значение iiocryniiBiiiei о напря- жения считывается с {{пользованием алгоритма последовательных прибли- жении. Найти наилучшее общее решение проблемы aua.ioi oboiо ввода-вывода весьма трудно, так как в различных применениях пренья ваяются разшяе тре- бования. Характеристики аналогового ввода-вывода. реализуемые в микро- контроллерах PICMicro. обеспечивают работу в ра шообра шых ситуациях, включая мно| ие применения в аудиоаппара iy ре. но они не пригодны хая использования в высокочастотных приложениях. Семейство 16С62х - сравнение напряжений Микроконтроллеры семейсгва 16С62х содержа г .ih.i.ioi оный компаратор вход- ных напряжении, который может быть исподьюнан с различными комбина- циями входов, а также как цифро-аналоговый преобр.) зона!ель напряжения, реализованный на ба ie ре nic i iibhoiо дели 1еля. Испо и, юнаине компараюра в основном oi раничннас1ся >акими приложениями, в коюрых прои звод1нся переключение выходного сигнала при опрелеленных шипениях входнои вс личины (например, в термос rai ах. ротирующих на icMiiepaiypy. преобразо- ванною в напряжение, Koiopoe имет значение выше или ниже ус iаиовлен- >101 о уровня). В микрокон।роллерах семейс। ва 16С62х имелся два компараюра. коюрыс моюгбыгь иеполь зовагься ра {личными способами. Схема включения одною компаратора представлена на рис. 25.23. На эюи схеме имеются два ус i рои- ста. на которые следует обратить внимание. Первое ycipoiicmo - ио вход- ной мулыиплсксор 1/Р Мих. который выбирает входные сигналы для ком- паратора. Имеется 8 различных режимов рабопя входных мулыиплексоров. реали зуемые при соответствующих комбинациях управляющих бигов СМ' 2:0х. коюрыс обеспечивают ра {личные варианты выбора входных cin- налов компаратора (рие.25.24). Второе ycipoiicmo - лоде пне и, напряжения и ana.ioiовый мультиплексор 16:1. Диалогично входному му.iыт11i.icкеору они предс1авлеиы на рис. 25.23 в упрощенном виде. Де.ппе.ть напряжения может обеспечивать два лиана {она значений выходною напряжения. В зависимосгн от значения бига Vrr в регистре управления VRCON. лиана юн выходных напряжений Vout может быть определен в долях Vdd следующим образом: если Vrr = 1, то 2/3 Vdd >= Vout >= О, если Vrr = 0, то 3/4 Vdd >= Vout >= 1/4 Vdd. Как и следовало ожидать, компаратор обеспечивает малое время oi клика (десятки наносекунд), ч го позволяет опрашивать ею для получения О1клика в реальном масштабе времени или {|сиолюовагь ею выходной einiia.i дтя запроса аппаратною прерывания.
64 Часть 4. Микроконтроллеры PICMICRO Рис. 25.23. Рабочие режимы компаратора напряжений в семействе 16С62х Большим полос i а i ком ком пара трон являтся ю. чю они не moivt нс нользоваiвся для определения уровня входною напряжения. В лом случае нрп\о;1И1ся иенолюонаи. процедуру двоичною поиска (дихотомии) и срав пения со П|ачением aiia.ioioBoro опорного напряжения. Например, если вы хотите определи!!. нензвес1ное значение напряжения в диапазоне oi Одо 1.5 В, а напряжение питания составляв! Veld 5.0 В. ю можно использован, следующий про!раммнып код. Compare movlw 2 Компаратор С1 имеет вход RA0/AN0 movwf CMON movlw 0x09F Использовать FSR для выборки VRCON, movwf FSR чтобы не переключать RPO clrf INDF Vref, если результат равен 0, и начать с низкого напряжения CompareLoop Начало цикла до тех пор, пока VrebVin (вход RA0) btfsc CMON, C1OUT Если выход 01 = 1, то Vin = 0 goto CompareEnd Конец сравнения inef goto INDF CompareLoop Прибавить 0,2В к напряжению Vref CompareEnd настоящее время имеются более эффективные методы определения на- пряжения, но данный метод приведен, чтобы показать, как можно выпол- нить эту процедуру нулем простою последоваюльно!о увеличения напряже- ния шагами ио 0.2 В = Vdd/24 до тех пор. пока опорное напряжение Vref не станет больше входною напряжения Vin на выводе RA0/AN0. Очевидное улуч-
Глава 25. Аппаратные средства PICMICRO 65 шение этого алгоритма состоит в использовании дихотомии вместо простого инкрементирования значения Vref с помощью переключения аналогового мультиплексора. RA1/AN1 RA0/AN0 RA3/AN3 Vin- Д Vm+ A- Vin- С1 Отключено (читается как RA2/AN2 Л---- С2 — Отключено (читается как О о: D RAO/ANO D RA3/AN3 Vin- Vin 4 D Vm- RA1/AN1 D RA2/AN2 Vin- С1 Отключено (читается как 0) Запуск компараторов СМ<2:0>=000 С2^> Отключено (читается как 0) СМ<2.0>=111 Отключение компараторов - A Vm-r 1 A Vin- „..A— Vm+ С2 cf>— сюит C2OUT СМ<2:0>=100 A RAO/ANO 0 ClS=0 vm-i RA3/AN3~^ °CIS=1v,n+ RA1/AN1— oCIS=C v,n. —сюит RA2/AN2~a—°CIS=1 y,n4. С/Г> C2OUT CM<2:0>=010 Два независимых компаратора ---From VREF Module Четыре мультиплексируемых входа для двух компараторов 2/ш RAO/ANO— RA3/AN3-^- RA1/AN1-A RA2/AN2— Vm Vin Viri C2OUT сюит RAO/ANO-^— RA3/AN3-^— RA1/AN1 —— RA2/AN2 — RA4 “Открытый сток. Vin Vin Уш C2OUT сюит СМ<2:0>=011 Два компаратора с общим опорным напряжением CM<2:0>=110 Два компаратора с общим опорным напря- жением и выходами с «открытым стоком» RA1/AN1 — RA2/AN2— RA0/AN0—-- RA3/AN3—-- Vm- Vm, — Отключено (читается как C2 C2OUT CM<2:0>=101 Один независимый компаратор о: RAO/ANO — RA3/AN3 - CIS-0 Vin-O IS=1 C1 сюит RA1/AN1 RA2/AN2 A Minx Vm- A Vin-» C2 C2OUT СМ<2:0>=001 Три мультиплексируемых входа для двух компараторов А - Аналоговой вход, из порта считываются все 0 CIS = CMON<3>, Переключение входа компаратора D = Цифровой вход Рис. 25.24. Рабочие режимы компаратора напряжений в семействе 16С62х Семейство 16С7х - аналоговый ввод Микроконтроллеры семейства !6С7х позволяют считывать аналоговое напря- жение, с помощью внутреннего АЦП интегрирующего типа. Этот АЦП мо- жет использовать внутреннее опорное напряжение или опорное напряжение от внешнего источника, что обеспечивает выбор диапазона измеряемых на- 5 Зак. 2025.
66 Часть 4. Микроконтроллеры PICMICRO пряжений. Внутренний источник опорного напряжения позволяет измерять входные напряжения в диапазоне от О В до значения Vdd. АЦП в микроконтроллерах семейства 16С7х работают в автоматическом режиме, но при их использовании следует учесть ряд обстоятельств. Первое и, возможно, наиболее важное, состоит в том. что при включении питания линии ввода-вывода, предназначенные для аналоговых измерений, в микро- контроллерах PICMicro устанавливаются в состояние ввода аналоговых сиг- налов. При разработке программного обеспечения необходимо обеспечить установку соответствующих выводов в режим аналогового ввода. Это обеспе- чивается путем записи в регистр ADCON1. имеющий адрес 0x09F. Переключатель - - ’ RAx Rs i Vt=0.6V Cpm -- 5 pF л Vt=0.6V ±500nA выборки Ric--.1k :A'sr'ss: —Wr 51.2 pF Принятые обозначения Cpin - Входная емкость Vt Пороговое напряжение l[ - Ток ушчки данного вывода при реали- зации различных переключении Ric - Сопротивление соединении SS Переключатель выборки Chold - Емкость выборки-хранения в ЦАП Переключатель выборки (k£2l Рис. 25.25. Электрическая модель аналогового входа PICMicro Второе обстоятельство касается времени выборки аналогового сигнала для АЦП. Для приема этого сигнала в АЦП используется конденсатор, который обозначен Chold на рис. 25.25. При этом требуется определенное время для заряда-разряда этого конденсатора до напряжения Vin. Заряд обеспечивается при замыкании пере ключа) ел я SS. Промежуток времени Tacq, необходимый, чтобы напряжение на конденсаторе достигло необходимого уровня, опреде- ляется следующей формулой: Tacq = (Время установки усилителя) + (Время установки напряже- ния на Chold) + (Поправка на температуру) = = 5 мкс + Тс + (Тетр - 25) * 0,05 мкс/ град, где Тс = - Chold (Ric + Rss + Rs) * /п (1/512). Эти расчеты кажутся довольно сложными, и я стараюсь, по возможнос- ти, их избегать. Если сопротивление вашего источника сигнала менее Ю КОм. и вы работаете при комнатной температуре 25 градусов, то можно без опасе- ния принять значение времени выборки 15 мкс. В действительности, расчеты дают значение несколько меньше 12 мкс. поэтому обеспечивается достаточ- ный запас, чтобы быть уверенным, что конденсатор Chold зарядится до не- обходимого напряжения.
Глава 25. Аппаратные средства PICMICRO 67 Когда на конденсаторе установилось требуемое напряжение, можно ини- циировать работу АЦП. При этом должен быть выбран источник сигналов, определяющих частоту выборки аналогового напряжения. Эта частота может составлять 1/2, 1/8 или 1/32 от частоты командных циклов или задаваться внутренним RC-генератором. Для определения правильного значения часто- ты преобразования необходимо использовать таблицы, приведенные в спра- вочных данных для используемого микроконтроллера, так как эти значения для различных моделей могут отличаться. Обычно для завершения аналогового сравнения требуется от 1,6 до 2,0 мкс. Это означает, что полное время выполнения аналого-цифрового преоб- разования составляет менее 20 мкс, то-есть максимальная частота выборки несколько больше 50 КГц. Преимущество измерения аналоговых входных сигналов в микроконтрол- лерах 16С7х состоит в том, что эти измерения выполняются внутренними аппаратными средствами независимо от программного обеспечения. Если вы пытаетесь измерить аналоговое напряжение с использованием микроконт- роллеров семейства 16С62х, то необходимо программным способом изме- нять значение опорного напряжения Vref, чтобы получить правильные зна- чения входного напряжения Vin. Преимуществом АЦП семейства 16С7х является также возможность измерения напряжений больших, чем Vdd. Не- достаток этою метода измерения напряжения состоит в том, что требуется дополнительное время для выборки и сохранения входного напряжения. Биты конфигурации и идентификации Особенностью, которая отличает PICMicro от других микроконтроллеров, является использование регистра конфигурации. Этот регистр служит дтя определения типа используемого тактового генератора, вариантов реализа- ции запуска и включения питания, конфигурации внешней памяти и устан- вки зашиты памяти программ. Биты идентификации ID позволяют пользова- телю определить конфигурацию и серийный номер микроконтроллера. Биты конфигурации расположены в памяти программ в тех местах, к ко- торым при нормальной работе процессор не обращается: для младших моде- лей для этого выделен адрес OxOFFF, для средних моделей - адрес 0x02007, для старших моделей - адреса от OxOFEOO OxOFEOF. Эю означает, что в млад- ших и средних моделях микроконтроллеров данные биты не могут быть счи- таны в процессе выполнения программы. В действительности то, что здесь написано, может показаться несколько странным. Выше я пытался объяснить, какие характеристики микроконтрол- леров определяются с помощью битов конфигурации. Для каждой модели PICMicro, включая модели, входящие в состав одного семейства, эти биты имеют различное назначение. Поэтому если вы не используете предваритель- но установленные условия функционирования осциллятора и другие вариан- ты конфигурации, то необходимо ознакомиться со справочными данными для данного типа микроконтроллера.
68 Часть 4. Микроконтроллеры PICMICRO Конфигурационный бит R.C используется для выбора схемы RC-осцилля- тора. Частотно-задающая RC-цепь подключается к выводу OSCI. а вывод OSC2 служит выходом синхросигналов командного никла, которые имеют в четы- ре раза меньшую частоту, чем тактовые сигналы RC-генератора. Бит LP зада- ет режим работы с пониженной мощностью и обеспечивает функционирова- ние микроконтроллера на частоте до 100 КГц (обычно используют часовой кварц с резонансной частотой 32.67S КГц) Биг XT обеспечивает работу так- тового генератора общего назначения, которым использует кристаллы с час- тотой до 10 МГц. Бит HS предназначен для реализации быстродействующих приложений, которые требуют тактовых сигналов с частотой более 10 МГц. Здесь приведены приблизительные значения частот, и ия получения их точ- ных значений следует обрати гься к справочным данным на соотвегству тощую модель Pl С Micro. Что касается запуска, то многие современные модели PICMicro обеспе- чивают возможность управления реализацией этого режима. Для этой цели служит бит конфигурации MCLRE, который запрещает функционирование входа X1CLR и позволяют использовать его для ввода данных. Обеспечивает- ся также функционирование таймера, задающею значение задержки при включении питания. Биг копфшу рации PWRTL обеспечивает задержку дли- тельностью 72 медля стабилизации работы тактового генератора, а бит OST вводит дополнительные 1024 такта ожидания, чтобы стабилизировать такто- вую частоту прежде, чем процессор начнет выполнение программы. В каче- стве дополнительных вариантов конфитурации некоторые модели PICMicro имеют средства контроля напряжения питания, которые включаются с по- мощью бита BODEN и переводят микроконтроллер в режим повторною за- пуска. если напряжение на входе MCLR становится ниже 4 В. Память программ, которая размешена на кристалле PICMicro. может быть защищена с помощью бита конфитурации СР. Козла защита включена, вы можете считать содержимое памяти программ микроконтроллера PICMicro. но считываемые значения будут представлять результат операции Исключа- ющее ИЛИ со смежными значениями. Это позволяет программатору срав- нить содержимое памяти с известной правильной программой, но делает невозможным восстановить ее текст кому-либо постороннему. Дополнительное замечание по поводу бига СР. В последних моделях памя- ти EPROM этот биг защищен слоем металла, расположенным на кристалле нал соответствующей ячейкой намят. Эго делает невозможным стирание его значения при облучении ульграфполегом. Эго также означает, что при ис- пользовании микроконтроллера в корпусе типа JW с окошком для стирания вы не сможете репрограммировагь память программ, если бит СР был слу- чайно установлен в 1. По этой причине я рекомендую использовать только программаторы, которые усганавливают биты конфигурации в соответствии с объектным hex-файлом и не позволяют пользователям устанавливать или сбрасывать эти биты вручную. Конфигурация памяти программ в старших моделях PICMicro также оп- ределяется соответствующими бигами. Конфигурационные биты позволяют выбирать между микроконтроллерным режимом (исподьзование только
Глава 25. Аппаратные средства PICMICRO 69 внутренней памяти), расширенным микроконтроллерным режимом (совме- стное использование внутренней и внешней памяти) и микропропесорным режимом (использование только внешней памяти). Хотя это уже было отмечено в разделе, описывающем бит зашиты про- граммы, я хочу снова повторить, что настоятельно рекомендую использовать программаторы, которые устанавливают значения битов конфигурации, ис- ходя из содержания объектных файлов и не производят программирование вручную. В наихудшем случае такое программирование может не позволить повторное использование микроконтроллера путем ею репрограммирования, но кроме того возможны значительные огорчения из-за того, что микрокон- троллер с неправильно запрограммированными битами конфигурации будет неправильно функционировать. Это является проблемой номер 1, с которой вы встречаетесь, когда начинаете работать с PICMicro. Часто случается, что после отладки вы пытаетесь ввести новую версию программы, но вдруг рабо- та микроконтроллера останавливается. В этом случае первое, что следует сде- лать. это проверить значения битов конфигурации — есть вероятность, что они запрограммированы неправильно. Биты идентификации ID, размещенные но адресам с 0x0200 до 0x0203 для младших моделей и адресам от 0x02000 до 0x2003 в средних моделях, используются. чтобы хранить серийный номер или код, содержащий инфор- мацию о его версии (обычно в форме контрольной суммы). Я вообще не имею дело с этими параметрами, так как они не могул быть подготовлены процессором (обычно они загружаются программатором после подсчета кон- трольной суммы). Биты 1D записываются в память и виде 12 или 14 битов, однако по соглашению используются только нижние 4 бита. Это означает, чю четыре адреса размещения бигов ID могу) быть использованы для хране- ния 16 бит информации. Вы можете отметить два обстоятельства — я ничего не сказал по поводу адресного пространства с 0x02004 по 0x02006 в средних моделях PICMicro и не указал размещение битов идентификации в старших моделях. Адреса с 0x02004 по 0x02006 в средних моделях могут служить для размещения допол- нительных битов идентификации (при этом используются первые 4 бита для совместимости с младшими моделями) или для тестирования программато- ра (проверки, что микроконтроллер соответствующим образом вставлен в разъем) перед программированием каких-либо критических адресов. Причи- на, по которой я не упоминал ID биты для старших моделей, состоит в том, что они не определены. Необходимые значения этих битов могут быть просто введены в память программ как данные и прочитаны процесором с помощью команды «TABLRD». Программирование На базе проектирования и продажи программаторов для средних моделей PICMicro сложилась целая отрасль производства. Это объясняется легкостью программирования этих микроконтроллеров, минимальными требованиями к схемотехнике и точности обеспечения временных параметров. При подго-
70 Часть 4. Микроконтроллеры PICMICRO гонке моей первой книги «Про! раммирование и применение микроконтрол- леров Р1С» я также принял участие н мои лея (ельности и разработал свой собственный программатор. Средние модели PICMicro используют простой синхронный последовательный протокол, юна как для младших и старших моделей применяется параллельный проюкол. коюрый требует более слож- ного оборудования для программирования микроконтроллера. Синхронный последовательныи проюкол используется для программи- рования как моделей среднего уровня, гак и микроконтроллеров семейства 12Схх, выпускаемых в 8-выволном корпусе. Он iребует всего пять линий, соединяющих программатор и PICMicro (рис. 25.26). Рис. 25.26. Последовательный интерфейс программирования средних моде- лей PICMicro Все си, налы имеют типовые TTL/CMOS жаления логических уровней от 0 до 5 В, исключая сигнал на выводе MCI.К. на который подается напряже- ние от 0 до 12 В или более, задающее режим программирования PICMicro. Это простое соединение позволяет легко осуществить внутрисистемное про- граммирование 1SP. Данные, которые должны быть записаны в память про- грамм, вводятся последовательно, начиная с младшего бита, причем первой поступает соответствующая команда. Поток данных при программировании микроконтроллеров I6F84 имеет вид показанный на рис. 25.27, 25.28 и 25.29. Адрес данных не посылается с помощью команды, так как используется внутренний программный счетчик PICMicro. который обеспечивает при про- граммировании обращение к следующему адресу. Если адрес или блок адре- сов не должен программироваться, то производится просто инкремент про- граммного счетчика. Когда вводятся биты конфигурации, то посылается специальная коман- да, устанавливающая значение адреса 0x02000. начиная с которого размеща- ются биты конфигурации. Младшие и старшие модели микроконтроллеров используют параллельный протокол программирования, при котором целое слово команды (12 или 16 бит) перелается за один никл.
Глава 25. Аппаратные средства PICMICRO 71 Запуск min Режим программирования-верификации Рис. 25.27. Команда загрузки данных при последовательном программирова- нии средних моделей PICMicro Рис. 25.28. Команда чтения данных при последовательном программирова- нии средних моделей PICMicro Рис. 25.29. Команда инкремента адреса при последовательном программиро- вании средних моделей PICMicro Аналогично средним моделям в старших моделях PICMicro используется внутренний программный счетчик, чтобы обеспечить обращение к текущему адресу, по которому производится запись. На рис. 25.30 можно видеть импульс па входе RA0, который производит инкремент программного счетчика. Слово конфигурации в младших моделях располагается при программировании в пер- вой позиции, тогда как в старших моделях слово конфигурации занимает индивидуальные позиции в конце памяти программ, начиная с адреса OxFEOO.
Рис. 25.30. Вид сигналов при параллельном программировании старших мо- делей PICMicro Vpp/MCLR RA1 RAO J_3V_ _.5У.. Т2 Р4 Инкремент адреса Р9 i Р18 Р8 Р7 E1H X AfrPR Hl> * Переход к вводу адреса : rc<7.)> маижму RB<7:): Вход в режим программирова- ния Примечание' RA2=0 RA3=0 RA4=1 { DATA HI OAJT>7 {DATA LO ОЦтУ < DATA HI ОРГ < DATA LO OUT {DATA HI IN } DATA LO IN} ( DATA HI OUT ) -( DATA LO OUT ) Часть 4. Микроконтроллеры PICMICRO Загрузка адреса X Верификация содержи- Верификация мого ячейки X. инкре- содержимого ячейки мент адреса до значения Х+1 Х+1 импупьсом RA1 ADDR HI - Старшие биты адреса ADDR LO - Мпадшие биты адреса DATA И.’ OUT - Вывод старших битов данных DATA LO OUT - Вывод младших битов данных DATA HI IN - Ввод старших битов данных DATA LO IN - Ввод младших битов данных Программирование ячейки Х+1, запрет инкремента PC путем подачи положительного перепада RA1 перед отрицатель- ным перепадом RA0. Верификация содержимого ячейки Х+1
Глава 25. Аппаратные средства PICMICRO 73 Я хочу в конце еще раз повторить указание ио программированию слова конфигурации. При разработке программ :гтя PICMicro. особенно для новых моделей, необходимо быть уверенным в правильном значении слова конфи- гурации. Если вы случайно запрограммируете бит зашиты программы СР. го может оказаться, что вы не сможете стереть его значение. Маркировка микроконтроллеров Маркировка моделей, которая указывается при заказе микроконтроллеров для конкретного применения или серийного производства, сохраняется по- стоянной для всех семейств PICMicro. Следует отметить, что не все варианты представленные на рис. 25.31. являются доступными для каждой модели мик- роконтроллеров. Только для мо- делей, поставпя- Температурный диапазон ОС to 70С (Коммерческий) “Г -ДОС to 70С (Промышленный) “Е" -ДОС to 125С (Автомобильный) Тип С - емых на ленте или катушке Р1Сххххххх(Т)-хх х /хх (ххх) Вариант QTP P/N Номер модели PIC (например, 16С8Д) памяти программ EPROM Диапазон частот модели (# - Максимальная частота в МГц RC/LP/XT./HS - Тип осциллятора) F - FLASH LC - Расширенный диапазон напряжений питания RC - Масочно-програм- мируемая ROM Тип корпуса JW - CERDIP с окошком Р - 300/600 mil CERDIP SO, SM - 200 mil SOIC SS - 209 mil SOIC L - PLCC PQ - MQFQ (Metric PQFP) S - Die in Waffle Pack CL - CERQUAD с окошком SP - 300 mil PDIP (“SkinnyDIP”) Рис. 25.31. Маркировка микроконтроллеров PICMicro
глава 26 РАЗРАБОТКА ПРИЛОЖЕНИЙ НА БАЗЕ PICMICRO Краткое содержание Подключение питания Системный тактовый генератор Схема запуска Интерфейс с внешними устройствами ТТЛ/КМОП Выходные буферы Прерывания Создание различных приложений на базе PICMicro существенно упрощается благодаря тому, что при разработке микроконтроллеров была обеспечена ус- тойчивость к ошибкам и учитывались реальные условия их функционирова- ния. Поэтому разработка устройств на PICMicro выполняется достаточно про- сто и с минимальными затратами. Однако имеется ряд правил, которым необходимо следовать, чтобы гарантировать успешное применение и надеж- ное функционирование приложений. Подключение питания При проведении экспериментов с микроконтроллерами PICMicro выясни- лось, что они могут работать в значительно более широком диапазоне напря- жений питания, чем указано в документации. Например, микроконтроллеры PICI6C84, для которых заданный диапазон напряжений питания составляет от 4,0 В до 6,0 В, нормально работают при напряжении 2,5 В. Однако не рекомендуется проектировать устройства, в которых микроконтроллер с за- данным напряжением питания 5 В работал бы напряжении ниже 5 В.
Глава 26. Разработка приложений на базе PICMICRO 75 При разработке устройств, которые питаются от батарейки напряжением от 2.5 до 3 В, можно использовать модели PICMicro, специально спроекти- рованные для работы с таким напряжением питания, либо включить повы- шающий преобразователь напряжения, обеспечивающий 5В для питания микроконтроллера. Но этого недостаточно. В цепь питания PICMicro необхо- димо включить конденсатор развязки емкостью 0.1 мкФ между шинами пи- тания Vdd и земли GND, так как при переключении больших выходных то- ков в схеме могут возникать значительные импульсные помехи. Системный тактовый генератор Кроме разных вариантов выбора напряжения питания микроконтроллеры PICMicro могут также использовать различные схемы генераторов тактовых импульсов. Это обеспечивает значительную гибкость при разработке устройств и позволяет разрабатывать приложения, удовлетворяющие любым заданным требованиям. Имеется четыре различных режима генерации тактовых импульсов. Первый режим использует для задания тактовой частоты цикл заряда/разря- да RC-цепи (рис. 26.1). Этот тип генератора оптимален для недорогих приме- нений, где нс требуется большой точности при задании шкювой частоты, (’сально такой генератор обеспечиваем nacioiy 'актовых сигналов с точнос- тью около 20%. Необходимая тактовая частота задается выбором значений сопротивления и емкости RC-цепи в соответствии с справочными данными, приведенными в документации для PICMicro Рис. 26.1. Подключение RC-цепи к PICMicro Необходимо отметить, что для стабильной работы RC-генератора, сопро- тивление резистора R должна быть в пределах от ЗК до I00K. Здесь не дана формула для вычисления значений сопротивления резистора и емкости кон-
76 Часть 4. Микроконтроллеры PICMICRO денсатора для получения заданной тактовой частоты. Это связано с тем, что общая формула типа f = 2,2 / RC не применима для PICMicro. так как цепь заряда/разряда содержит не только линейные компоненты. Для определения необходимых значений R и С, включение которых обеспечивает заданную частоту тактовых сигналов, следует использовать таблицы, приведенные в справочных данных для соответствующих микроконтроллеров. Ниже даётся пример такой таблицы для микроконтроллеров PICI6C84. Из приведенных данных следует, что зависимость тактовой частоты от значений ёмкости и сопротивления имеет нелинейный характер. С R Частота 20 пФ 3.3 К 4,68 МГц 5.1 К 3.94 МГц 10 К 2.34 МГц 100 К 250,16 КГц 100 пФ 3.3 К 1.49 МГц 5,1 К 1.12 МГц 10 К 620,3 кГц 100 К 90,25 кГц 300 пФ 3.3 к 524.24 кГц 5,1 К 415.52 кГц 10 К . 270J3 кГц 100 К 25.37 кГц Применение RC- генератора является оптимальным решением для при- ложений, где низкая стоимость является более важным фактором, чем ста- бильность тактовой частоты. При использовании RC-генератора можно, при необходимости, обеспечить точное значение требуемой тактовой частоты путем настройки генератора. Процедура такой настройки не описывается в данном разделе, так как при этом не обеспечивается высокая воспроизводимость результата. Если ваша разработка предназначена для серийного производства и требует достаточно высокой точности поддержания тактовой частоты, го можно рекомендовать другие решения, которые описаны ниже. Микроконтроллеры серии I2CXX семейства PICMicro. имеющие все- го 8 внешних выводов, содержат внутренний RC-генератор, который может использоваться в различных приложениях. Обычно этот генератор обеспечи- вает поддержание тактовой частоты с точностью 1-2сс. Он использует внут- ренний регистр OSCCAL, в который загружается калибровочная константа. Ее значение устанавливается при тестировании кристалла в процессе его производства. Этот метод обеспечения необходимой тактовой частоты имеет два преимущества по сравнению с традиционными методами. Первое пре- имущество состоит в том, что освобождаются выводы, которые могут ис-
Глава 26. Разработка приложений на базе PICMICRO 77 пользоваться для ввода-вывода данных. Второе преимущество связано с тем, что меньшее количество используемых внешних элементов снижает слож- ность устройства и его стоимость. По сообщениям компании MICROCHIP эти особенности будут в дальнейшем реализованы для других моделей этого семейства. Следующий тип генераторов использует для задания частоты керами- ческие резонаторы. Эти простые устройства дают намного лучшие результа- ты, чем RC-генераторы, обеспечивая в типовых случаях точность поддержа- ния тактовой частоты в пределах 0,5% от заданного значения. Такая точность является достаточной для большинства решаемых задач, включая реализа- цию последовательного интерфейса. Керамические резонаторы имеют высо- кую механическую прочность, которая позволяет применять их в устрой- ствах, функционирующих в экстремальных внешних условиях. Единственная область, где керамические резонаторы не соответствуют предъявляемым тре- бованиям, являются применения, где требуется очень высокая точность под- держания тактовой частоты, например, часы или какая-либо музыкальная аппаратура. Тип используемого тактового генератора должен быть выбран перед тем, как производится программирование PICMicro путем установки соответству- ющих битов конфигурации. При использовании RC-гснсратора устанавлива- ется специфическая конфигурация микроконтроллера, а другие типы гене- раторов используют один из трех вариантов настройки, задающих различные значения тактовой частоты. Керамический резонатор отличается простотой подключения при малом количестве внешних элементов (рис.26.2). PIC OSC1 керамический резонатор OSC2 Рис. 26.2. Подключение к PICMicro керамического резонатора Кварцевый генератор является наилучшим с точки зрения точности задания тактовой частоты. Эти кристаллы достаточно дешевы и обеспечивают высокую точность. Однако они требуют несколько более сложной схемы под- ключения (рис.26.3). Особое внимание следует обратить на правильное опре-
78 Часть 4. Микроконтроллеры PICMICRO деление емкости нагрузки цели. По сравнению с другими микроконтролле- рами, представленными в этой книге, которые требуют подключения к вы- водам кристалла двух емкостей по 30 пФ. микроконтроллеры PICMicro до- пускают более значительный разброс значений емкостей. Ниже представлена таблица, взятая из технической документации для PICMicro. которая дает представление о том. какие значения емкостей должны быть использованы для получения заданной тактовой частоты. PIC OSC1 OSC2 Кристалл кварца Внешние конден- саторы Рис. 26.3. Подключение к PICMicro кварцевого резонатора Режим Частота COSC1 COSC2 LP 32 КГц 33 - 68 пФ 33 - 68 пФ 100 КГц 15 - 47 пФ 15-47 пФ XT 100 КГц 47 - 100 пФ 20 - 68 пФ 500 КГц 15 - 68 пФ 15 - 47 пФ 1 МГн 15 - 33 нФ 47 - 100 пФ 2 МГц 20 - 68 пФ 15 - 68 пФ 4 МГц 15-47 пФ 15 - 33 пФ HS 8 МГц 15 - 47 нФ 15-47 пФ 10 МГц 15-47 пФ 15 - 47 пФ Если генератор не запускается, го можно попробовать изменить сопро- тивление резистора Rs в диапазоне от IОС) до 2000м. но в большинстве случа- ев этого не требуется. Необходимо огмеги гь. что контроль тактовых сигналов для микроконтроллеров PICMicro следует производить на выводе OSC2. а не на OSCI. Последний тип тактового генератора, используемый PICMicro - это вне- шний генератор на элементах ТТЛ. Здесь можно воспользоваться любой под- ходящей схемой генератора. В любом случае для подютючения генератора ие- полыуется вывод OSCI. а вывод OSC2 остается веполютючеипым.
Глава 26. Разработка приложений на базе PICMICRO 79 Запуск Запуск микроконтроллера реализуется так же просто, как подключение пи- тания и генерация тактовых импульсов, однако при этом надо следовать оп- ределенным правилам. На входе MCLR следует поддерживать низкий уро- вень сигнала до тех пор, пока напряжение питание не достигнет нормального уровня. Имеется ряд схем, подходящих для этой цели. Используя встроенный таймер включения питания можно вообще обой- тись без внешних цепей (рис.26.4). Этот гаймер, который включается с помо- щью битов конфигурации, задерживает запуск микроконтроллера на 72 мс, давая возможность напряжению питания достичь стабил ьного уровня. Если в реализуемом устройстве используется очень стабильный источник питания, например батарея, то можно не использовать никаких схем запуска, а только подключить вход сигнала запуска MCLR к напряжению питания Vdd. В этом случае микроконтроллер будет ждать, пока напряжение не стабилизируется. Vdd о PIC MCLR Vdd Рис. 26.4. Простейшая схема запуска PICMicro Даже если вход запуска можно непосредственно подключить к напряже- нию Vdd, рекомендуется включить резистор между MCLR и Vdd (рис. 26.5). Это позволит запускать контроллер при наладке схемы, закорачивая вход MCLR на землю, например, с помощью маленькой отвёртки Vdd <’ PIC MCLR Vdd Рис.26.5. Типовая схема запуска PICMicro
80 Часть 4. Микроконтроллеры PICMICRO Временные диаграммы сигналов при включении питания показаны на рис.26.6. Если вы используете таймер сброса, который вызывает задержку 72 мс. между включением питания и пуском контроллера, то при его програм- мировании бит конфигурации PWRTE должен быть установлен в 1. Тактовые импупьсы Внутренний запуск Команда Включение питания Рис. 26.6. Временные диаграммы сигналов при включении питания Вывод MCLR может управляться стандартными ТТЛ- и КМОП-сигна- лами от внешних источников сигналов запуска. В некоторых более новых мо- делях PICMicro вывод MCLR соединен с внутренним монитором питания, чтобы упростить работу при использовании батарейного питания. Подключение внешних устройств В этом разделе рассматриваются некоторые типовые варианты интерфейса и правила, которых надо придерживаться при подключении внешних устройств. Данный материал имеет очень общий характер и может быть использован применительно к другим микроконтроллерам, описанным в этой книге. ттл/кмоп Очевидно, что соединение с цифровыми устройствами является наиболее простым вариантом интерфейса внешних устройств с микроконтроллерами PICMicro. Типичным случаем является передача данных в параллельном или последовательном виде с помощью аппаратных средств, предоставляемых PICMicro. В случае необходимости можно организовать непосредственное со- единение с несколькими периферийными устройствами. Для реализации та- кого соединения необходимо выполнять несколько правил. В первую очередь необходимо определить тип используемой шины. От- дельные шины для ввода или вывода данных могут быть реализованы доста-
Глава 26. Разработка припожений на базе PICMICRO 81 точно просто. Реализация двунаправленной шины требует выполнения неко- торых арбитражных правил для устройств ввода и вывода. Шина параллель- ного вывода наиболее просто реализуется с помощью сигналов разрешения выборки кристалла, позволяющих адресовать устройство, которому вы хоти- те передать информацию. Аналогичным образом в типовых микропроцессор- ных системах производится обращение к памяти с помощью дешифрации адреса. Параллельный ввод данных от внешних устройств можно выполнить дву- мя способами. Первый способ — использовать выходные буферные каскады с «открытым коллектором» или ключи, которые соединяют с «землей» вне- шние выводы, подключенные к высокому потенциалу («подтянутые» к I). Такую схему включения называют «монтажное И» потому, что если хотя бы одно из внешних устройств устанавливают на этой линии активный уровень (низкий), то линия переходит в состояние с низким уровнем потенциала независимо от состояния других подключенных к ней устройств. Использова- ние шины с таким способом подключения дает одно существенное преиму- щество ~~ различные устройства, подключенные к общей шине, могут одно- временно устанавливать данные для PICMicro. что делает этот тип шины особенно привлекательным для организации внешних прерываний. Второй способ реализации шины ввода данных — использование устройств с выходами, имеющими высокоимпедансное состояние. Это значит, что ког- да PICMicro готов произвести чтение с определённого устройства, он выдает сигнал чтения RD, чтобы это устройство выдало данные на шину. Перифе- рийные устройства принимают этот сигнал на вход разрешения вывода _ОЕ. .тля которого активным обычно является уровень 0. Этот способ ввода данных является фактически реализацией простой процессорной шины, как показа- но на рис. 26.7, где PICMicro функционирует как интеллектуальное перифе- рийное устройство. Рис.26.7. Параллельное подключение внешних устройств к PICMicro При использовании этого типа шины ввода следует обратить внимание на несколько обстоятельств. Первое — необходимо быть увереным. что все уст- ройства на шине могут переходить в высокоимпедансное Z—состояние. Лю- 6 Зак - 2 0 25-
82 Часть 4. Микроконтроллеры PICMICRO бое устройство, которое не переходит в ого состояние, может вызвать конф- ликт на шине. Другое важное обстоятельство, которое необходимо обеспе- чить — чтобы все устройства поддерживали значения передаваемых данных в течение времени, достаточною для их приема PICMicro с помощью исполь- зуемого программного обеспечения. Это важно, так как некоторые устрой- ства могут выдавать данные только в течение одной или двух микросекунд. Рис.26.8. Подключение внешних ус/ройств как микросхем памяти к старшим моделям PICMicro Для чтения данных с устройств. подключенных к шине, можно использо- вать следующий программный кол: bet CTL PORT, RD1 movf DEV_PORT, w bsf CTL-PORT, RD1 установка в О бита чтения чтение порта устройства выключение устройства Выходные драйверы Двунаправленная шина ввода-вывода реализуется с помощью команд чтения и записи данных с использованием выходных драйверов с высокоимпеданс- ным состоянием. Однако при лом возникают некоторые проблемы. При ис- пользовании двух однонаправленных шин для ввода и вывода сигнал выбор- ки кристалла используется совместно с сигналами «ч 1ение-запись» на периферийных устройствах. Для двунаправленных шин сш налы выборки кри- сталла, имеющие обычно низкий активный уровень, должны контролиро- ваться независимо от бит данных и сигналов управления чтением-записью. Целесообразно после окончания записи устанавливать выходной порт PICMicro в режим чтения, когда все биты установлены в высокоимпеданс- ное состояние. Это позволит предотвратить любые конфликты на шине, ко- торые могут возникнуть, если PICMicro будет пытаться выдать данные на шину одновременно с другим периферийным устройством. Вы можете избежать всех этих трудностей, если будете использовать стар- шие модели PICMicro, входящие в семейство I7C4X. Эти микроконтроллеры имеют «расширенный микроконтроллерный режим» и «микропроцессорный
Глава 26. Разработка приложений на базе PICMICRO 83 режим», при которых периферийные ус гроисч на moi у г непосредственно под- ключаться к внешней шине PICMicro. Эти режимы исполыуют мультиплек- сированную шину адреса-данных, чю несколько усложняет разработку (рис.26.8). Это применение несколько отличаегея or ог тех. которые приведе- ны в руководствах по использованию. Подключение к процессорной шине периферийных устройств как устройств памяти, наливается «отображением внешних устройств на адресное пространен во памяти». Необходимо отметить, что в приведенной схеме 16-разрядная шина содержит по 8 бит данных, по- лучаемых от каждого внешнего устройства. Прерывания В предыдущей главе в общих чертах объяснялось, как реализуются прерыва- ния в PICMicro. В этой главе остановимся на некоторых особенностях, кото- рые возникают при использовании прерываний в PICMicro. Эти микроконт- роллеры имеют наиболее сложную подсистему прерываний и г всех устройств, представленных в этой книге. Это не отначаеч, чю реали гания прерываний слишком сложна или трудно выполнима. Просто для их использования требу- ется хорошее понимание того, каким обратом архитектура процессора обес- печивает обслуживание прерываний. Выгода от применения прерываний, однако, стоит усилий по изучению их реалитанин. Несколько слов относительно вложения прерываний. Когда происходит прерывание, бит разрешения прерываний (НЕ сбрасывается в 0. Этот бит снова устанавливается в I. разрешая прерывания, после того, как выполня- ется команда возврат;! из прерывания RETFIE . Можно установить бит GIE в I во время выполнения программы обслуживания прерывания. Особое вни- мание необходимо уделить тому, чтобы не была потеряна информация о со- стоянии текущего прерывания. Фрагмент кода, приведённого в главе «Аппа- ратные особенности микроконтроллеров PICMicro» для входа в прерывание и выхода из него, не выполняет эту задачу. Рекомендуется в этом случае использовать индексный регистр FSR как указатель стека, и сохранять в сте- ке содержимое наиболее важных регистров, используя различные разделы стека для каждого входа в прерывание. Это позволит прерыванию использо- вать многократные обращения к подпрограмме обслуживания. Вообще говоря, лучше разрабатывать такие приложения, которые не тре- буют вложения прерываний. Архитектура PICMicro не является идеальной для выполнения вложенных прерываний, и если вам необходимо их исполь- зовать, то можно выбрать другой тип микроконтроллера из числа представ- ленных в этой книге. Прерывания, являясь очень полезной програмной конструкцией, мо- гут сильно усложнить жизнь, если программа содержит фрагменты, критич- ные ко времени выполнения, особенно, если используется переполнение таймера для обеспечения функций реального времени. В этом случае необхо- димо запретить прерывания перед началом критичного ко времени фрагмен- та программы, и затем снова разрешить их после выполнения этого фрагмен- та.
84 Часть 4. Микроконтроллеры PICMICRO bet INTCON, GIE ; Запретить прерывания во время критичного ко ; времени участка программы bsf INTCON GIE ; Разрешить прерывания После того, как прерывания будут опять разрешены, вы не должны удивляться тому, нто следующей после команды «bef INTCON. GIE» будет команда подпрограммы обработки прерывания. Отложенные прерывания выполнятся, как только бит GIE установится в I. В ряде приложений, опи- санных в этой книге, часто требуется запрещение прерываний, чтобы быть уверенным и том. что основная программа выполняется нормально. Необходимо отметить, что приведенный фрагмент программы не должен размещаться внутри подпрограммы обработки прерываний. Если бит GIE будет установлен в I внутри подпрограммы обработки прерываний, ю может быть реализовано вложенное прерывание, го есть прерывание в процессе обслуживания другого прерывания, которое вы ювет потерю содержимого регистров контекста. Чтобы этого не происходило, обработчик прерываний должен содержать только одну команду, устанавливающую в I биг GIE — команду возврата из прерывания RETFIE.
глава 27 СРЕДСТВА РАЗРАБОТКИ ДЛЯ PICMICRO Краткое содержание Ассемблер MPASM Языки высокого уровня Средства разработки приложений фирмы Microchip MPSIM MPLAB KEELOQ FUZZY TECH Как и для других микроконтроллеров, представленных в этой книге, для PICMicro имеются различные средства разработки, предлагаемые множеством поставщиков. Я не хочу давать обзор всех этих средств в данной книге, но это не значит, что не существует хороших средств разработки, поставляемых третьими фирмами — на самом деле многие из них очень хорошие. Просто невозможно, учитывая сроки издания книги, адекватно оценить эти продук- ты и сравнить их достоинства и недостатки на момент публикации. В данной главе будет рассказано о средствах, предоставляемых фирмой Microchip, так как они включают полный набор необходимых средств разра- ботки для PICMicro, которые весьма эффективны и содержат ряд стандар- тов, определяющих, как программировать микроконтроллеры этого семей- ства на языке ассемблера и загружать командные коды в память микроконтроллера. Описание этих средств поможет вам понять, как работа- ют различные средства разработки с микроконтроллерами PICMicro, и на какие особенности следует обратить особое внимание.
86 Часть 4. Микроконтроллеры PICMICRO Ассемблер MPASM Ассемблер MPASM фирмы Microchip — это ассемблер с полным набором функций, который можно бесплатно получить по Интернет-адресу фирмы Microchip.Он также содержится на CD-ROM. прилагаемом к данной книге. MPASM генерирует объектные коды для всех микроконтроллеров семейства PICMicro, включая специальную информацию для конфигурирования памя- ти. Он поддерживает также макросы, условное ассемблирование и возмож- ность сопряжения выходных данных с пакетом MPLAB. Недавно в ассемблер и компилятор языка С фирмы Microchip была также введена возможность сборки объектных файлов. Если вы распечатаете pdf.-файл с документацией на ассемблер MPASM, то обнаружите, что он содержит около 100 страниц. В данном разделе при описании характеристик ассемблера будут определяться наиболее важные положения и опции, которые помогут пользователю в написании эффектив- ного исходного программного кода. Я хочу отметить, что ассемблер MPASM существует в версиях, работаю- щих с командной строкой MS-DOS или в среде Windows, которая обеспечи- вает пользователю дополнительные удобства . Это позволяет вам разрабаты- вать программы на любой платформе, поддерживающей эти операционные системы. Как и большинство ассемблеров, MPASM может использовать различные форматы данных. Первое, и, возможно, наиболее важное условие - опреде- ление системы счисления, которая исполыуегся по умолчанию. В пакете MPLAB, если специально не оговорено, но умолчанию используется шест- надцатиричный формат чисел от 0 до F. Лично мне это не нравится, и я во всех моих программах вручную изменяю формат, используемый по умолча- нию, на десятичный (числа от 0 до 9) с помощью опции Т' в выражении 'list'. Например, при работе с микроконтроллером PICI6F84 можно исполь- зовать следующее выражение: LIST P=16F84, R=DEC ; Определяет тип процессора и десятичный ; формат чисел. Возможными системами счисления являются шестнадцатиричная «hex», десятичная «dec» и восьмеричная «oct». Использование констант в различных системах счисления может быть сделано следующим образом: Система счисления Синтаксис Комментарии Десятичная Значащие десятичные цифры 0 9 .#### Шестнадцатиричная Н'##' Значащие шестнадцатиричные цифры 0 - F 0x0## Восьмеричная О'####’ Значащие восьмеричные цифры 0 - 7
Глава 27. Средства разработки для PICMICRO 87 Система счисления Синтаксис Комментарии Двоичная В’########’ Значащие двоичные цифры 0 - 1 Символы Любые ASCII символы за исключением специальных (перечислены ниже) Специальными являются те же символы, которые отмечаются в стандарте языка С обратным слешем. Символ Шестнадцатиричный код Комментарии \а 0x007 Звонок \ь 0x008 Забой \f ОхООС Переход на новую страницу \п ОхООА Новая строка \г 0x00 D Возврат каретки \t 0x009 Горизонтальная табуляция \v 0x00 В Вертикальная табуляции \\ 0х05С Обратный слеш \9 0x03 F Вопрос тельный знак V 0x027 Одиночные кавычки V 0x022 Двойные кавычки \о## Не определены Восьмеричное число \х## Не определены Шестнадцатиричное число Строки символов могут определяться путем помещения их и двойные ка- вычки. Более подробно это рассмотрено ниже при обсуждении директивы Другим вариантом использования строк является определение строк в памяти программ. Основное назначение этих строк состоит в создании мно- жества символов, которые будут использованы в таблице. Это будет описано позже в данном разделе. Строки могут также использоваться для определения данных, которые должны быть загружены в память программ. Но на практике это полезно применять только для старших моделей микроконтроллеров (се- рия 17Схх). у которых каждое слово в памяти программ состоит из двух байт, и может быть считано с помошью команд табличного считывания и записи. При написании с помощью ассемблера MPASM новых программ для микроконтроллеров PICMicro я использую следующий шаблон. title “Имя программы - краткое описание”
88 Часть 4. Микроконтроллеры PICMICRO ; Вводные комментарии/ Информация о версии ; myke predko - Дата написания ; Внешние соединения микроконтроллера LIST P=DEVICE, R=DEC INCLUDE DEVICE.inc’ ; Включить файл стандартных определений ; используемого микроконтроллера ERRORLEVEL 0, -305 ; Не печатать предупреждения о ; пропущенных адресах назначения ; Variables - Описание переменных CBLOCK MemStart ; Определение используемых переменных ENDC ; Основная программа org 0 ; Если используются прерывания, то поставьте метку “INT’ по адресу 0x04 end Этт шаблон еодержиг основные детали, требуемые и любой програм- ме для микроконтроллеров PICMicro. Следует отметить. что комментарии и заголовки даны в формате, который используется мной при программирова- нии, а не в формате ассемблера PICMicro. Директива ассемблера ««title» в первой строке программы служи, ;г,я иден- тификации программы в файле листинга. В файле листинга строчка в кавыч- ках помешается в начало каждой строки в файле. Для разделения различных сегментов кода может быть использована директива «subtitle». В случае ис- пользования MPLAB в создании файла листинга нет необходимости. «Page» — еще одна директива ассемблера, которую я регулярно использую. Данная директива вызывает введение в листинг файла символа «начало новой страницы» н распечатку новой страницы. Это очень полезно для выделения подпрограмм и программных блоков в легко распознаваемые фрагменты про- граммы. Существует ряд других директив, управляющих печатью файла лис- тинга, например «NOLIST» и «LIST», которые, соответственно, выключают и включают запись фрагмента программы в файл листинга, но я обычно не использую их, гак как они делают форматирование файла листинга более слож- ным, а это очень нежелательно при разработке программного обеспечения. Директива «LIST» используется, чтобы указать ассемблеру, что для файла листинга задаются специфические параметры и варианты форматирования. В вышеприведенном шаблоне был определен тип микроконтроллера и задан формат чисел но умолчанию. Другие параметры листинга включают дайну страницы, табуляцию, тип выходного liex-файла, количество строк в стра- нице, совместимость с предыдущими (обычно несовмесгпмымн) версиями ассемблера, управление уровнем сообщений. В большинстве случаев можно обойтись заданием этих параметров но умолчанию.
Глава 27. Средства разработки для PICMICRO 89 Достаточно много опций листинга, определяемых директивой «LIST», можно задать с помощью командной строки MS-DOS или параметров среды Windows. Однако я не рекомендую использовать эти способы. Вместо этого все требуемые параметры листинга следует специфицировать с помощью директивы «LIST» в исходном тексте программы. В этом случае они будут повторяться каждый раз при ассемблировании исходного текста. Директива «ErrorLevel» служит для указания тех ошибок, предупрежде- ний и сообщений, которые должны быть игнорированы. Данная директива ассемблера должна использоваться с особой осторожностью, чтобы случай- но не замаскировать ошибки и предупреждения, которые могут нарушить нормальную работу программы. Обычно я использую только указание «ErrorLevel 0,-305». которое запрещает сообщения при отсутствии указания адреса назначения в команде. В этом случае по умолчанию применяется оп- ция «,Г», которая помешает результат выполнения команды обратно назад в регистр-источник данных. В случае необходимости помещения результата в регистр W, это указывается явно с помощью добавления «.W» в конце каж- дой команды. Переменные в MPASM легко определить одним или двумя способами. Переменные в микроконтроллерах PICMicro имеют действительные адреса в регистровом файле. Это означает, что их можно определить как константы с помощью директивы «equ». i equ ОхОС ; Определение счетчика Для определения переменных я предпочитаю использовать директиву «С В LOCK». CBLOCK fileRegStart ; Определяет начало регистрового файла : ; определение счетчика END Использование директивы «CBLOCK» намного проще, чем определение переменных с помощью директивы «equ», особенно когда требуется опреде- лять, удалять и добавлять переменные. Однако при этом имеется одна про- блема — с помощью директивы «CBLOCK» можно определить лишь байто- вые переменные. Это значит, что для задания 16-битной переменной необходимо определить две переменные. Для предыдущего примера опреде- ление 16-битной переменной i производится следующим образом. CBLOCK fileRegStart ; Определение переменных в начале файла ; регистров ilo.iHI Определение 16 -битного счетчика ENDC Так как эта процедура не очень сложная, я рекомендую определять!6- битные переменные с помощью директивы «CBLOCK». Если вы определяете массив переменных, то следует задать его начальный адрес и затем после директивы CBLOCK указать адрес, следующий за окончанием массива.
90 Часть 4. Микроконтроллеры PICMICRO Метки комментария («;») могут быть установлены в любом месте про траммного кода. При этом все, что находится справа от символа <•;•>. будет игнорироваться при компиляции. В конце программы директива «end» указывает ассемблеру, что остальную часть исходного текста следует игнорировать. Эта директива является обяза- тельной и должна присутствовать во всех программах. Для упрощения разработки кода, особенно при наличии повторяющихся фрагментов, полезно использовать макросы. Общий формат макросов следу- ющий: MacroName Macro Parameter [,...] ; Определение макроса Local Labels ; Определение меток ; внутри макроса ; Команды внутри ; макроса endm ; Окончание макроса Однажды определенный макрос используется для замены команд и ди- ректив внутри макроса на его название с соответствующими параметрами. Все метки, используемые в макросе, необходимо сначала определить с по- мощью директивы «local». Эти метки будут доступными только в теле макро- са, и не будут использоваться где-либо еще в программе, лаже если они уже были определены в основной программе. Для упрощения задания меток перехода по команде «goto» можно исполь- зовать оператор «$». Хотя я очень часто применяю лог способ при програм- мировании па ассемблере микроконтроллеров PICMicro, я не советую его использовать для других микроконтроллеров, у которых разные команды мо- гут иметь различную длину. Dlay Macro Count movlw Count ; Запись значения счетчика для обратного счета movwf i deefsz i goto $-1 ; Если “I” не равно 0, то продолжать уменьшать I endm Обычно я стараюсь избегать применения многих достаточно сложных рас- ширений и директив MPASM и пытаюсь ограничиться использованием толь- ко тех команд, которые приведены в руководстве. Однако в числе этих рас- ширений следует выделить директиву «dt», которую я часто использую. Эта директива преобразует множество постоянных параметров в последователь- ность команд «retlw», что облегчает создание таблиц. TableRead ; Чтение элементов таблицы в регистр W addwf PCL dt “Hello",0 В приведенном выше примере процедура «TableRead» будет преобразова- на ассемблером в следующие команды:
Глава 27. Средства разработки для PICMICRO 91 Tableread addwf PCL retlw ‘H’ retlw ‘e’ retlw T retlw T retlw ‘o’ retlw 0 Директива «dt>> позволяет пользователю легко выполнить вывод строки символов без затрат на трудоемкий ввод повторяющихся инструкций. Для других микроконтроллеров, представленных в данной книге, использования директивы «dt>> не требуется, так как байтовые таблицы могут быть реализо- ваны с помощью директивы <-db>>. Используя условное ассемблирование можно создавать код. удобный для отладки программ, например, исключая длинные задержки. ifndef Debug ; Если переменная -Debug’’ определена, ; не выполнять задержку 15мс call Dlay5ms ; Ждать 15мс для подачи питания на ЖК индикатор call Dlay5ms call else Dlay5ms nop ; Вставить три команды “nop” для сохранения nop nop ; адресации endif В приведенном примере, если символ «.Debug» определен, то вместо трех вызовов процедур задержки вставляются три команды «нор». Команды «пор» вводятся, чтобы все нижеследующие участки кода не изменяли своих адре- сов. При использовании программ, аналогичных данной, я определяю сим- вол с помощью командной строки или окна в среде Windows. Пожалуй, это единственный случай, когда я устанавливаю параметры внешним образом, а не в тексте программы. В версии MPASM, использующей командную строку, символ «Debug* можно определить следующим образом: MPASM /dDebug Filename В версии MPASM для Windows эти параметры можно определить в соот- ветствующем окне. На рис. 27.1 показано, как это выглядит при запуске MPASM из MPLAB. Необходимые параметры можно установить в строке «extra default options». Впервые запустив MPASM. вы, возможно, будете удивлены большим количеством создаваемых файлов. Вы. наверное, знаете, чго .зля получения конечного результата необходимы файл листинга и объектный файл, ис- пользуемый для программирования микроконтроллера. Кроме этих основных
92 Часть 4. Микроконтроллеры PICMICRO файлов есть еще файлы <-.егг» и «.cod». Файл «.егг» — это список всех ошибок ассемблирования. Файл «.cod» — это файл перекрестных ссылок для связи шестнадцатиричного объектного файла кода с исходным текстом, который обеспечивает символическую отладку с помощью MPLAB или другого сим- вольного отладчика. Add/Modify Compiler Command Line: Fie Generation: Мех"Ж: iMPASMWINeSl COD File INHX8M /arnhxSm Error Fie /e INHX8S /ainhx8s Сотрйег Маяе: List Fie /I INHX32 /ainhx32 MPASM for Window» Xref Fie A 4 Ах»егнЫег» Extra Default Options: > Compilers /q /dDebugs ОК Cancel Рис. .27.1. Окна для определения параметров в версии MPASM для Windows Недавно фирма Microchip анонсировала возможное г ь ассемблера MPASM создавать перемещаемые объектные файлы, которые можно связывать вмес- те («линковать»). Возможность создания перемещаемых объектов означает, что необходимые библиотеки могут создаваться и вызываться из основной прог раммы. Немного отклоняясьот обсуждения средств разработки фирмы Microchip, я хочу высказать несколько соображений об ассемблере Parallax для микро- контроллеров PICMicro. В главе «Набор команд PICMicro» приведены коман- ды PICMicro для ассемблера Parallax, которые похожи на набор команд для микроконтроллера i805l. Также как и MPASM, ассемблер Parallax свободно распространяется и используется многими разработчиками. Лично я считаю, что представление микроконтроллеров PICMicro как i8051 нежелательно. Для этого имеется основательная причина, которая состоит в том, что содержимое регистров, в том числе регистра STATUS, может изме- няться непредсказуемо. Такое мнение сложилось у меня на основании опыта работы со средствами разработки (Ьирмы IBM для микропроцессоров iS086, которые используют другие метки, чем определенные в стандартах фирмы Intel. В результате мне пришлось изучить два набора команд для одного про- цессора. Хотя я никогда не писал программы с использованием ассемблера Parallax, я счел целесообразным познакомить с ним читателей. Я думаю, чго изучение обоих средств — ассемблера Parallax и набора команд PICMicro в формате Microchip, позволит вам более ясно понимать, что происходит с вашим приложением.
Глава 27. Средства разработки для PICMICRO 93 Языки высокого уровня Из всех микроконтроллеров, предо пиленных в книге, разработка программ на я тыке высокого уровня ;пя PICMicro является наиболее сложной. Это со- всем нс означает, что не существует хороших компиляторов, но но сравне- нию с компиляторами, написанными для других микроконгроллеров. ком- пиляторы для PICMicro отличает относительно высокая стоимость. Высокая стоимость во многом сия тана с дополниIединой работой, которая требуется, чтобы написать эффективный исполняемый код для архитектуры PICMicro. В данном разделе будет Изложены некоторые соображения о разработке программ на языках высокою уровня, которые следует принимать во внима- ние при выборе, как компилятора, гак и типа используемою микроконтрол- лера. Многие из приведенных здесь соображений относятся не только к PICMicro. но и должны учитываться при выборе компилятора для любого микроконтроллера. Я считаю, что могу написать об этом достаточно компетентно, учитывая мой собственный опыт написания комтптляторов для PICMicro. На основа- нии этого опыта я моту указать ногентшалытые ловушки, которых следует и збегать при разработке ваших собственных компиляторов или при выборе одного н з имеющихся на рынке. Первый и з написанных мной компиляторов был С-подобным с реализацией функнтпт н формировал исходный код. со- вместимый с MPASM. Следуюпнтй компилятор использовал другой синтак- сис и формировал выходной код в формате 1NHX8M. Этот компилятор не обеспечивал явную реа.тпзаштю вложенных вы зовов полпротрамм. например для обработки выражений типа «{«and»)». Вместо этого нетто. н> зовдтось струк тур и рован пос написание исходного текста для определения текущего уровня вложений. При разработке последней версии компилятора, которая содер- жится на прилагаемом к книге CD-ROM. я приложил большие усн.тня. что- бы охватить тзсе микроконтроллеры PICMicro среднего уровня и обеспечить реализацию достаточного набора функций. Сравнивая эти компиляторы, мож- но отметить, что синтаксис языка становился проще, а возможности созда- ваемого кода становились более широкими. Я также собираюсь рассмотреть вопрос о том, как обеспечигь реализацию различных свойств, и обратить внимание на проблемы, наиболее важные для применения встраиваемых микрокон гроллеров. Первое соображение но поводу использования языков высокого уровня для PICMicro касается сохранения переменных. Большинство микроконтрол- леров среднего уровня семейства PICMicro имеют файлы ретистротз в банке О и банке I. Следует определить, какой банк используется но умолчанию, и какой банк преимущественно используется компилятором. Обычно я исполь- зую банк 0, так как в этом банке содержатся регистры данных для ввода- вывода портов и регистры периферийных устройств. При этом нет необходи- мости переключать банки для доступа к регистрам ввода-вывода и файлу ретистротз для выполнения чтения-записи внешних устройств. Далее следует определить банк, в котором размешаются массивы данных. Если микроконтриллер PICMicro имеет два банка файлов регистров, го мае-
94 Часть 4. Микроконтроллеры PICMICRO сивы данных я всегда располагаю в банке I. Обычно доступ к массивам осу- ществляется с помощью регистра FSR, который может содержать до 8 бит и позволяет обращаться к банку 1 или банку 0 без изменения управляющих бит. При размещении массивов в банке 1 банк 0 используется для хранения оди- ночных переменных, доступ к которым производится по умолчанию. Последнее соображение касается определения регистров для хранения локальных или временных переменных. В написанных мной компиляторах я размещено их в массив и выбираю с помощью явной адресации или псевдо- операциями «push» и «рор». Например, операция «push w» может быть реали- зована следующим образом. movwf INDF ; Сохранение содержимого регистра W decf FSR ; Указание следующего адреса в стеке Недостаток данного метода состоит в том, что регистр FSR должен ис- пользоваться только для операций «push» и «рор», и его содержимое должно сохраняться, если реализованы массивы данных или этот регистр использу- ется в программах пользователя. Поскольку из-за этого возникают дополни- тельные сложности в последней версии написанного мной компилятора, я вообще избежал использования стека. Следующее соображение по поводу компилятора касается назначения те- кущего банка. Например, на языке С назначение портов ввода-вывода для ЖК-инликатора может быть выполнено следующим образом. PORTA=PORTB=0; И Установка всех портов в О TRISA=TRISA&0x018; И PORTA.О = ‘Е’ //PORTA. 1 = ‘RS’ //PORTA.2 = ‘RW’ TRISB = 0; II PORTB служит для вывода данных Простой компилятор генерирует следующий программный код, который всегда использует банк 0 микроконтроллера PICMicro. clrf PORTA ; PORTA=PORTB=0 clrf PORTB ; bsf STATUS, RPO ; TRISA=TRlSA&0x018 movwf TRISA&0x07F, W bcf STATUS, RPO andlw 0x018 bsf STATUS, RPO movwf TRISA&0x07F bcf STATUS, RPO bsf STATUS, RPO clrf TRISB&0x07F bcf STATUS, RPO
Глава 27. Средства разработки для PICMICRO 95 Более эффективный компилятор реализует оптими зированный вариант кода. clrf PORTA ;PORTA=PORTB=0 clrf PORTB bcf STATUS, RPO movlw 0x018 ;TRISA=TRISA&0x018 andwf TRISA&0x07F clrf TRISB ;TRISB =0; Во втором случае код содержит в два раза меньше команд, чем в первом, поэтому он требует вдвое меньшей памяти и выполняется в два раза быстрее. Заметим также, что скомпилированный код обеспечивает работу процессора с банком I, а не возвращает его к банку 0 после каждого доступа к регистрам банка I. Если затем выполняется доступ к регистрам банка 0 или инструкции перехода «goto» или «call», то в скомпилированный код вставляется команда «bcf STATUS, RPO», которая возвращает процессор к работе с банком, оп- ределенным по умолчанию. Возврат к банку 0 перед выполнением команд перехода делается потому, что существует вероятность, что данная метка перехода может использовать- ся в других местах программного кода. Поэтому надо быть уверенным, что процессор будет во всех случаях обращаться к одному и тому же банку. Еще одна особенность архитектуры PICMicro осложняет разработку компи- лятора, Процессор не может прямо адресовать все пространство памяти и использует для этого регистр PCLATH. Это делает процесс компиляции бо- лее сложным в случае использования таких выражений, как, например, «if» в языке BASIC. If I = = 0 then Label В этом случае метод прямой компиляции дает следующий программный код : movf i ; Установить флаг нуля в зависимости от значения i btfsc STATUS,Z goto Label ; Переход к метке Label, если флаг нуля установлен в 1 Но метка «Label» может находиться на другой странице программного кода (каждая страница в микроконтроллерах среднего уровня содержит 2048 команд). Поэтому компилятор должен сформировать в данном случае следу- ющий код. movf i ; Установить флаг нуля в зависимости от значения i btfss STATUS,Z goto Skip ; Пропустить переход к метке Label goto Label ; Переход к метке Label, если флаг нуля установлен в 1 Skip
96 Часть 4. Микроконтроллеры PICMICRO Имея данный код, я могу легко ввести модификацию содержимого реги- стра PCLATH. Если этого не требуется, то код будет иметь сокращенный вид, приведенный выше. Дальнейшее усложнение данного примера происходит при битовых опе- рациях. Типичный вариант условного перехода в языке BASIC имеет вид: if (I & 0x80) = = 0 then Label В лучшем случае это будет скомпилировано так: btfss I, 7 goto Label ; Пропустить следующую команду, если бит 7 ; переменной I равен 1. Но что произойдет, если переменная i находится в банке I. выражение «if» находится на странице 0 (адреса 0-2047), а метка «label» — на странице I (адреса 2048 — 4095)? Вероятно, скомпилированный код будет выглядеть сле- дующим образом: bsf STATUS, RP0 btfsc goto i, 7 Skip ; Пропуск следующей команды, если бит 7 ; переменной i равен 0 bcf STATUS, RP0 ; Размещение кода в банке 1 bsf goto Skip PCLATH, Label 3 ; Переход на страницу 1 bcf STATUS, RP0 ; Возврат к банку 0 Более предпочтительный вариант: bsf STATUS, RP0 movf i, 0 ; Чтение i для сравнения andlw 0x080 bcf STATUS, RP0 btfss STATUS,Z ; Если i & 0x80 == 0, то переход на метку Skip goto Skip bsf PCLATH, 3 goto Label Skip Причина, по которой я предпочитаю второй вариант, состоит в том. что банк «по умолчанию» выбирается до команды перехода, что упрощает опера- ции, предшествующие этой команде, и обеспечивает обращение к известно- му банку после ее выполнения. Этот вариант кажется мне предпочтительнее, потому что он облегчает процесс разработки компилятора и делает его более ясным и понятным. Другая важная деталь в языках высокого уровня для PICMicro - это разрядность переменных. Большинство языков работает с 8- и 16-битными переменными. При увеличении разрядности числа типов переменных про-
Глава 27. Средства разработки для PICMICRO 97 грамма становится более сложной. Например, выражение а = b + с для 8- битных переменных может быть скомпилировано в следующим образом: movf b,0 addwf с,О movwf а Но если переменные 16-битные, то программный код будет иметь вид: movf b+1, 0 ; Сложить старшие байты addwf с+1, О movwf а+1 movf b, 0 ; Сложить младшие байты addwf с, О movwf а btfsc STATUS, С incf а+1 ; Добавить к старшим байтам перенос Все значительно усложняется, если используется 32-битная арифметика или смешанная 8- и 16-битная. Последняя особенность процессоров PICMicro связана с выполнением компилятором команды вычитания. Эта особенность может быть рассмотрена на примере операции: а = b - с. В большинстве компиляторов обработка пара- метров начинается слева направо. В атом случае .ня микроконтроллеров PICMicro будет сформирован следующий код: movf b, О movwf Temp[0] ; Сохранение значения b movf с,О subwf Temp[0],0 movwf а В написанных мной компиляторах при выполнении операции вычита- ния производится изменение порядка обработки операндов, в результате чего программный код имеет следующий вид. movf с, О subwf b, О movwf а Для эффективного выполнения программы важную роль играет определе- ние аппаратных регистров. В стандартном языке С нельзя определить пере- менную по талинному адресу. Вместо этого вы должны определить регистр как указатель на заданный адрес. При этом скомпилированный код оказыва- ется значительно более сложным, чем в случае явного указания адресов пе- ременных при их определении. Встроенные или связываемые функции также должны быть рассмотрены. Для таких языков как BASIC, существует большое количество встроенных функций. По этой причине код, скомпилированный с языка BASIC, может иметь существенно больший размер, чем вы ожидаете. Обычно я предчочи- 7 Зак. 2025-
98 Часть 4. Микроконтроллеры PICMICRO таю языки, которые содержат основные математические функции, включая умножение и деление, а затем связываю их с другими процедурами, как требуется в программе. Подключаемые функции надо использовать с осторожностью. Они зна- чительно упрощают разработку кода для рабочих станций или персональных компьютеров. Но во встраиваемых микроконтроллерах, где критичными явля- ются такие параметры как память программ и другие ресурсы, широкое при- менение подключаемых функций может чрезмерно ограничить возможности устройства. По этой причине следует использовать такие функции как можно меньше. Однако, если программа-«линковщик» подключает только необходи- мые функции, то вышеуказанное замечание, будет недействительным. Последнее соображение по выбору компилятора касается инструменталь- ных средств, вместе с которыми он может работать. Как будет показано ниже, среда MPLAB является прекрасным средством разработки. Поэтому я настоя- тельно рекомендую выбирать для использования те компиляторы, которые могут формировать на выходе файл «.cod». который позволяет осуществлять символьную отладку приложения. Существует большое число очень дешевых или бесплатных компилято- ров для PICMicro. Большинсню из них специально разработано для модели I6C84. Поскольку эта модель и следующая за ней модель I6F84 не содержат в банке I файловых регистров и имеют память программ объемом всего в поло- вину страницы, то разработка компиляторов для них позволяет избежать многих из проблем, описанных выше. Сейчас имсоея много компиляторов с языков высокою уровня, которые позволяют создавать программные коды для PlCMicro Что касается выбора языка, то в настоящее время целесообразно использовать язык С. Стоимость компиляторов щчя этого языка составляет oi нуля (для свободно распростра- няемых версий) до тысячи долларов. Дорогие компиляторы реализуют более эффективные языковые средства, поддерживают встроенные функции PICMicro. Компиляторе языка BASIC стоимостью 100 долларов может быть хорошим средством для начала работы с семейством PlCMicro и моделью I6F84. Но эго не самое хорошее средство разработки кодов дтя моделей 16C74s или l6C44s. Поэтому при рассмотрении многочисленных компиляторов и их текущих возможностей я рекомендую помнить старую пословицу: «Вы получаете то, за что заплатили, и оплачиваете го. что получили». Средства разработки приложений фирмы Microchip Как и другие производители. фирма Microchip предоставляет ряд ин- струментальных средств для разработки приложений на базе ее микроконт- роллеров. Инструментальные средства фирмы Microchip построены на осно- ве интегрированной программной оболочки MPLAB. раграбо ганной для таких ОС как Windows 3.11 и Windows 95 (рис. 27.2). Оболочка MPLAB, ассемблер и
Глава 27. Средства разработки для PICMICRO 99 симулятор свободно распространяются с WEB-caiiia фирмы Microchi р. Эти средства содержатся также на CD-ROM, прилагаемом к данной ките. UJsJxJ «ft 1 <? ?i □ .. ' .../ ' title "IhernoH the 1 enper^ture with 3 Clock." *j | . thr DS1R20 works COHPCtly at 1ИН/. How. let's Sturt tookioq at Developing a Clink. | ; r»ykc prt’dko I ; 9'». US. 10 | H,n йч.р p Hot r$ The PIC is t owning at 111Hz using a Crystal tin* V) pf tips Reset »s tied to Udrt via a 1 WK Resistor I SR is used to Point to TRISA to Speed Up Oat.» Г.ппинчтп. RRfl i*. the Single Bit 1820 Bus with ’*./ к pull up RAI is a Synth Pulse for Datchinq Cnnn.inrJ'. on a Scope «Elf! R87 is used as the Data Output to the I CD RAZ is an Output and is cuiinerted to LCD Pm и (R/S) RB3 is an Output and is ronnetted to i CD Pin й (L) l CD Pui S (R7U) is tied tn <д и unit ( IS I P’lACRl*, «-DI C <! 1 per Binary Char 0 oofltibopo ?u OOOttlitfO I 0 OnOSOQOQ U IWPOOOO > C»cte« , 0 4e»o (-- - ----j T ММ» ; Q 00 n« ТмдМ h«u«4 p oak>uu~ • M.HI KHz Hi Irpk,^ g Synbof HP* I w OP .maiit. IB 1THR0 00 ' INICOH 00 И Рис. 27.2. Вид экрана интегрированной среды разработки MPLAB. Оболочка MPLAB является средством разработки, которая может исполь- зоваться для следующих пелен: 1. Разработка и редактирование прикладного программного обеспечения. 2. Моделирование работы приложений при различных внешних воздействи- ях и модификации содержимого внутренних регистров. 3. Программирование микроконтроллера. 4. Обеспечение интерфейса с внутрисхемным эмулятором. М PLAB достаточно сложная программа, которая предназначена для того, чтобы облегчить разработку прикладных программ для PICMicro и сделать их значительно более эффективными. При использовании MPLAB фирма Microchip обеспечивает также безопасность программного кода с помощью программы KeeLoq, которая реализует соответствующий алгоритм и форми- рует для PICMicro программный код, позволяющий производить внешний контрольфункционирования микроконтроллера.Фирма Microchip предлага- ет также систему разработки «Fuzzy Tech», которая упрощает разработку для PICMicro прикладных программ, использующих нечеткую логику.
100 Часть 4. Микроконтроллеры PICMICRO Симулятор MPSIM MPSIM - это программный симулятор, запускаемый иг командной строки MS-DOS, который конфигурируется пользователем и непосредственно ис- пользует выходные данные ассемблера MPASM. Так как для работы MPSIM необходима лишь командная строка MS-DOS, то .может оказаться более пред- почтительным использование этой программы вместо MPLAB, особенно в тех случаях, если вы работаете на старых персональных компьютерах (386 и ниже) или эмулируете сессии MS-DOS. Лично я обычно предпочитаю ис- пользовать MPLAB для разработки и отладки прикладных программ, но си- мулятор MPSIM имеет в ряде случаев некоторые преимущества. Как сказано выше. MPSIM имеет возможность пользовательской настройки. Когда вы читаете документацию первый раз. го можше подумать, что это утверждение сильно преувеличено. Но ниже б> «ет показано несколько спосо- бов, коюрыс я использую, чтобы произвести отладку программ значительно легче и эффективнее, чем с помощью MPLAB. Вид экрана, получаемого при запуске MPSIM. показан па рис. 27.3. Экран разделен на три части или окна. Верхнее окно показывает текущее состояние моделирования приложения PICMicro, включая моделируемую программу, тип микроконтроллера, число выполненных командных циклов и затрачен- ное на них время. Окно «view window» используется для вывода содержимого регистров пользователя. Содержимое регистров и формат выводимых на эк- ран данных определяется в файле «MPSIM.INI», который будет более де- тально описан ниже. Нижнее окно содержит приглашение на ввод команд пользователя, а также показываем бо [ыпинство текущих операций и резуль- таты их выполнения. 8ЕШ MS-OUS Prompt MPS ИИМИШ| ..... АО АВ АВ: АВ АВ. АВ Т1МЕ=0.0011 о •; ?=Help ,'FZ: 000 FA: 000 Fl: 00 sc lo di !00:: IOA,X,2 Ивй| Д1рЯ Afl|| 0,0 ’ «Mi FCIATH Register TMRO Register ' Sort "A" Tris Register Fort "a",.Register -Fort .''B* Tris Register Fort ?8" Register Clear all the зв1Св7Да!Тог:гЯв; ' л*) tvQ J. Рис. 27.3. Вид рабочего экрана для симулятора MPSIM
Глава 27. Средства разработки для PICMICRO 101 При запуске симулятор MPSIM начинает искан, файл «MPSIM.INI». Этот гекстотзый файл создается пользотзателем. н я использую ею. чтобы задать все используемые в программе iiapaMeipw Ниже приведен пример созданно- го мной файла MPSIM.INI. ; MPSIM File for PROG2 - Включение светодиода Муке predko - 96.05.02 Р 84 Испопьзование микроконтроллера типа 16C84 SR X Представление данных 16-разрядном формате ZR Установка регистров в нуль RE Сброс времени выполнения программы и счетчика циклов DWD Запрет испопьзования сторожевого таймера wdt V W.X.2 Вывести регистр W AD F3.B.8 Вывести на экран содержимое регистра STATUS AD F4.X.2 Вывести на экран содержимое регистра FSR AD ОРТ,Х,2 Вывести на экран содержимое регистра Option AD FB,B,8 Вывести на экран содержимое регистра Intcon AD F2.X.3 Вывести на экран содержимое регистра PCL AD FA.X.3 Вывести на экран содержимое регистра PCLATH AD F1.X.2 Вывести на экран содержимое регистра TMR0 AD IOA.X.2 Вывести на экран содержимое регистра TrisA AD F5.X.2 Вывести на экран содержимое регистра Порта А AD IOB.X.2 Вывести на экран содержимое ротистра TrisB AD F6,X,2 rs Вывести на экран содержимое регистра Порта В sc 1 ; Установка тактовой частоты 1 Мтц Io prog2 di 0, 0 В представленном файле указаны: тип микроконтроллера, система счис- ления данных по умолчанию, регистры, содержимое которых выводится на экран, рабочие параметры. Любая команда, которая вводится is программу MPSIM, может быть задана is файле MPSIM.INI, который определяет на- чальное состояние иротраммы. При работе MPSIM создает файл MPSIM.JRN. в котором сохраняются все нажатия клавиш, введенные is процессе модели- рования. Это может быть полезно при анализе тою. что было сделано, и для устранения проблем. Более детально эти вопросы будут рассмотрены ниже. В программе поддерживаются комментарии, которые даются после знака <•;», но не допускается использование пустых строк Если is файл MPSIM вводится пустая строка, то повторяется выполнение предыдущей команды. Это происходит из-за специфики пользовательскою интерфейса is MPSIM. который повторяет последнюю команду при нажатии клавиши <>Enter», по- сылающей символ «возврат каретки». Эта особенность очень полезна при но-
102 Часть 4. Микроконтроллеры PICMICRO шаговой отладке программы, но она вызывает сложности, когда вы опреде- ляете регистры, содержимое которых должно быть выведено на экран. Еще несколько слов о настройке файла MPSIM.INI. Я стараюсь использо- вать один и тот же заголовок для всех файлов. Заголовок содержит специфи- кацию основных регистров, которые постоянно используются симулятором MPSIM. В их число входят регистры W, STATUS, OPTION, INTCON и TMRO. Я рассматриваю эти регистры как панель управления самолетом, на котором есть шесть основных приборов. При определении вида экрана для MPSIM я всегда вывожу одни и те же основные регистры в одном и том же формате. В MPSIM используются следующие команды. Команда Параметры Комментарии АВ Прерывание текущей сессии. Список файлов не изменяется AD Reg[, radix|, digits]] Выводит содержимое регистра is окне «View» в указанном формате и заданной системе счисления: (radix): X — Шестнадцатиричная В — Двоичная D - Десятичная В [ addrj Установка точки останова по текущему или указанному адресу. Reg Op Value Установка точки останова, когда условие вы- полняется. Операция Ор: = Равно > Больше чем < Меньше чем > = Больше или равно < = Меньше или равно ! = Не равно ВС [addr|Reg] Удаление всех или указанной точки останова. С [#break] Продолжение выполнения программы с пропуском указанного количества следующих точек останова. СК pin, (hi, low] |- Задание частоты сигналов на определенном выводе с указанием количества циклов для состояния I и 0 (hi, low). Параметр «-» задает момент прекращения импульсов. DB Вывод на экран всех активных точек останова. DE addrl ,addr2 Очистка фрагмента памяти программ
Глава 27. Средства разработки для PICMICRO 103 Команда Параметры Комментарии DI |addrI |.addr2| | Вывод на экран фрагмента памяти программ DK #,{Pin.State} |- Определение комбинации клавиш «Alt-F#» для подачи на соответствующий вывод состо- яния I («Н»), 0 <«L>>), перепада («Т>>) или импульса («Р»). Параметр <<-» —запрещает все функции <<Alt-F#». DL Symbol Удаление символа. DM |addr,addr2| Вывод фрагмента памяти программ в числен- ном виде (не в виде команд) DP Вывод всех исправлений программы DR Вывод содержимого всех регистров. DS Вывод таблицы символов DV Reg Удаление из окна просмотра соответствую- щего регистра DW |E|D| Разрешение /запрещение функционирования сторожевого таймера. DX Вывод на экран текущих параметров трасси- ровки. В режиме трассировки «Trace Mode» на экран выводится текущее состояние вы- полнения программы E | addr | Выполнение программы с текущего или ука- занного адреса. EE addr Модификация содержимого памяти EEPROM. Реализуется только для микроконтроллеров, содержащих память EEPROM EL 0|l|2 Определяет, какие сообщения/предупрежде- ния/ошибки будут выводится на экран при выполнении программы. F Reg Вывод на экран содержимого регистра и воз- можность его редактирования пользователем Fl fn.addr, Reg[,n| |- Ввод следующего или n-го значения величи- ны из файла в регистр FM addrl ,addr2,value Заполнение неиспользуемого фрагмента про- граммной памяти указанным значением. RV MC|EM|MP|RC256| Определение рабочего режима RC64|RC|OSC для микроконтроллеров семейства 17Схх. G E fn Получение и выполнение командного файла. Это способ загрузки командного файла .INI
104 Часть 4. Микроконтроллеры PICMICRO Команда Параметры Комментарии GO Запуск микроконтроллера и начало выпол- нения программы. GS Symbol, value, type Создание символа с соответствующим типом: «F» —файл, «В» — битовое поле, «L» — метка, «К» — литерал. Н Вывод окна помощи (Help). IA addr Вставка ассемблерного кода, начиная с адреса «addr» IN addr,instruction Вставка ассемблерной инструкции по указан- ному адресу. IP [time | step) Ввод входных воздействий в соответствии со значением параметра «step» в файле Stimulus. IR ALL| RAM | SFR Рандомизация содержимого всех регистров (ALL), файла регистров (RAM) или специ- альных регистров (SFR) U Загрузка и выполнение текущего файла «.JRN». Является способом повторения ко- манд, предварительно записанных в файл MPSIM.JRN LO fn Загрузка в MPSIM файлов «.НЕХ» и « COD» LR fn Загрузка содержимого регистра LS fn Загрузка внешнего символьного файла M addr Вывод на экран содержимого памяти про- грамм, начиная с адреса «addr», и возмож- ность его редактирования. Ввод «Q» заверша- ет команду, ввод «-» вызывает повторение предыдущей команды NV Окно просмотра очищается. 0 fn Вывод исправленного файла «.НЕХ» . (Хотя я указываю эту команду, но не рекомендую ее использовать. Я не советую создавать объек- тные файлы, которые не сопровождаются ис- ходным текстом). P device Выбор типа моделируемого микроконтроллера Q Выход из MPSIM и запись команд в файл «.JRN» RA Восстановление таблицы исправлений, таб- лицы символов и удаление точек останова. RE Сброс времени выполнения и счетчика цик- лов.
Глава 27. Средства разработки для PICMICRO 105 Команда Параметры Комментарии RP Восстановление первоначального содержимого памяти программ (до введения исправлений) RS Сброс типа моделируемою микроконтроллера SC length Определение времени цикла в микросекундах. SE pin | port Вывод на экран состояния указанного вывода или порта и возможност!> его изменения ноль зователем SF aiidrl. addr2. reg Поиск первого испольювания указанного регистра в заданном диапазоне памяти. S1 addr 1 .aikir2.ins Поиск первого нснольюванпя сказанной ко- манды в заданном лианаюне памяти. SM adilrl ,addr2.ins Поиск первого использования команды it за- данное! диапазоне памяти и вывод сообще- ния на дисплей бет символьной информации. Как показано и приведенном выше примере файла MPSIM.INI. после определения содержимою экрана и установки рабочих параметров я загру- жаю специальный hex-файл и вывожу на экран первую команду. Когда эти команды вводятся в сеансе работы с MPSIM. они заносятся в файл с именем MPSIM.JRN. который используется .пя создания расширен- ного файла MPSIM.INI. Данный файл можно испо.тьзовагь. чтобы помочь выявит определенные ошибки или обеспечить нормальное выполнение про- граммы после исправления кода. Например, если в процессе отладки програм- мы вы определили, что неправильный код начинается через пять команд пос- ле метки «SonieLabel». го файл MPSIM.INI может быгь скорректирован путем вырезания соответствующих строк из файла MPSIM.JRN и вставки их в конец файла MPSIM.INI. Данная процедур;! выполняется следующих! образом. В “Some Label" ; Установка точки останова. Е ; Выполнение программы до точки останова. SS ; Выполнение пяти команд до проблемного участка. SS SS SS SS Я пока не касался использования файлов внешних тестовых воздействий. Эти файлы используются MPSIM и симулятором, входящим is состав MPLAB, чтобы обеспечить подачу повторяющихся входных снтшов в процессе вы- полнения программы. При этом можно наблюдать, как микроконтроллер бу- дет реагировать па эти сигналы. В качестве примера рассмотрим файл для тестирования программы, выполняющий опрос состояния клавишн.
106 Часть 4. Микроконтроллеры PICMICRO Test3.STI - Моделирование двойного нажатия клавиши Этот файл служит для проверки правильности считывания состояния клавиши и подавления “звона” контактов Муке Predko 96. 09. 08 STEP RA3 1 1 ! Установка на входе RA3 значения 1 500 0 ! Нажатие клавиши (поступление 0) 1000 1 ! Дребезг, необходимо его исключить 2000 0 ! Повторное нажатие клавиши 10000 1 ! Не нажатое состояние клавиши Файл воздействий состоит из множества состояний, для которых задается параметр STEP, определяющий число циклов, в течение которых поддержи- вается указанное состояние. Для расчета числа циклов, соответствующего определенному промежутку времени, я использую формулу: Step (Количество циклов) = (Время Задержки) * (Тактовая Частота)/ 4. В файле воздействий можно указать любой вывод микроконтроллера PlCMicro, например, RA0 задает вывод 0 порта А. Для обозначения вывода запуска(сброса) микроконтроллера используется символ « MCLR». Для обо- значения комментариев используется символ «!» (восклицательный знак). В файле воздействий могут использоваться пустые строки. Хотя MPSIM является неплохим средством моделирования, он имеет, по моему мнению, один важный недостаток — отсутствие возможности пред- ставлять на экране все команды ассемблера в hex-файле. По этой причине я предпочитаю использовать симулятор, который содержится вереде MPLAB. Среда MPLAB MPLAB является одной из наилучших интегрированных сред разработки, имеющихся для любых микроконтроллеров. Эта среда, которая содержит ре- дактор, ассемблер и симулятор, может работать совместно с программато- ром PICStart Plus и схемным эмулятором PICMaster, поставляемыми фир- мой Microchi р. Для разработки прикладных программ данная среда может также использовать языки высокого уровня. Среда MPLAB способна выпол- нять разработку, симуляцию, эмуляцию приложений и программирование любых микроконтроллеров семейства PlCMicro, а это означает, что требует- ся только одна версия MPLAB для разработки всех приложений. Наиболее привлекательной особенностью среды MPLAB является то, что она свободно распространяется фирмой Microchiр на ее Web-сайте.Копия MPLAB, кото- рая была доступна на время написания книги, содержится на прилагаемом к ней CD-ROM.
Глава 27. Средства разработки для PICMICRO 107 Когда вы в первый раз увидите рабочий экран MPLAB (рис. 27.4). она. возможно, покажется вам слишком сложной. Однако после освоения работы со средой вы сможете задавать тот вид экрана, который вам нравится, и получите достаточный опыт для разработки приложений с ее помощью. ayke prfrdko 95.85.18 title "Thernok - Read the lenperXture with a Clock.'* The 051820 works correctly ay 1MHz. Now, Let's» start looking at Developin Hardware Notes: The PIT. Is running at 1IWz using a Crystal and Reset is tied to Udd uia a 10k Resistor is used to Point to TRISA to Speed dp Data Conversions is the Single flit 1828 Rus with b.f К pull is a Synch Pulse for Watching Commands on a Scope RRZ is used as the Data Output to the LCD is an Output and is connected to J CD Pin k (R/S) is an Output and is connected to LCD Pin 6 (f) Pin 5 (R/W) is tied to Ground two 33 pF caps FSR RA0 RAI RB0 RA2 «83 t CO up LISI P-ldCBk, R-DtC JU a Clock. & - Stopwatch Рис. 27.4. Функциональные области на рабочем экране среды MPLAB MPLAB предназначена для работы с операционными системами Windows 3.1 или Windows/95 фирмы Microsoft. Программное обеспечение — редактор, ассемблер, компилятор и симулятор, будут работать также с другими опера- ционными системами, эмулирующими Windows, например. Windows/NT или SoftWin для компьютеров Macintosh. Однако периферийные аппаратные сред- ства, например, программатор PICStart Plus и эмулятор PIC Master, не будут функционировать с этими системами. Экран среды MPLAB делится на четыре части. Верхняя строка (I на рис.27.4) содержит последовательность меню, используемых .тля задания ра- бочих параметров MPLAB. Область под этой строкой (2 на рис.27.4) — «па- нель инструментов», которая содержит кнопки, используемые для быстрого управления режимом работы MPLAB. Имеется три или четыре группы кно- пок, которые могут быть выбраны, чтобы реализовать различные функции. Я обычно произвожу установку MPLAB с кнопками симулятора, которые иден- тифицируются красным и зеленым фонариками в левом углу полосы выбора.
108 Часть 4. Микроконтроллеры PICMICRO Чтобы выбрать соответствующую группу кнопок, щелкайте самую левую кнопку на экране, пока не появится требуемый набор кнопок. Центральная часть экрана (3 на рис. 27.4) содержит область, в которой располагаются рабочие окна, например окно редактирования, окно содер- жимого памяти, окно контроля останова или окно просмотра. Эта область может быть конфигурирована таким обратом, чтобы обеспечить удобство ра- боты пользователя. Как можно видеть на рис. 27.4. я предпочитаю полностью выводить на экран различные окна. В нижней части экрана размешается строка (4 на рис. 27.4). которая пока- зывает текущее состояние MPLAB. Информация о состоянии содержит номе- ра строки и колонки, определяющие положение курсора в окне редактирова- ния, тип микроконтроллера PlCMicro, текущее содержимое (симулируемое или эмулируемое) программного счетчика, pei негров W и STATUS. Приложения, разрабатываемые с помощью MPLAB. напиваются «проек- тами». Для каждого проекта сохраняются исходные файлы, используемые при- ложением, и набор текущих состояний окон MPLAB. Создание проекта инициируется щелчком мыши на меню «Project» и последующим щелчком на команде «New Project» (эта последовательность действий обычно обозна- чается символической записью «Project» -> «New Project»). После этого по- явится окно ввода для задания имени проекта, с последующим указанием имен исходных файлов, связанных с данным проектом, которые должны быть ассемблированы или скомпилированы. Исходные файлы могут быть выведены в окно редактирования с помощью последовательных щелчков «File» -> «Source». После загрузки исходный файл может редактироваться с помощью стан- дартных операций Windows. Например, для вырезания выделенной части текста используется комбинация клавиш «Ctrl-Х». Можно использовать несколько окон редактирования одновременно. Редактор использует буфер обмена Windows и позволяет перемешать данные между файлами и приложениями. Когда исходные файлы приложения созданы и отредактированы, вы мо- жете произвести симуляцию (функциональное моделирование), после того как проведено их компилирование и ассемблирование. Процедуры компиля- ции и ассемблирования определены в меню «Project». Перед симуляцией сле- дует обязательно убедиться, что тип используемого микроконтроллера задан правильно. Для этого производится последовательность щелчков «Options» -> «Development Mode», после чего выбирается необходимый тип микроконт- роллера для режима «Simulator Mode». Вид окна для выбора режима симуля- ции «Simulator Mode» или режима редактирования «Editor Mode» показан на рис. 27.5. С помощью этого окна вы можете выбрать, оставить ли симулятор актив- ным или перейти в другой режим с помощью команды «Editor Mode». Я всегда оставляю симулятор активным за исключением случаев, когда требу- ется выполнить прямую модификацию содержимого памяти программ (это требуется при использовании микроконтроллеров семейства 12С5хх для вве- дения параметра калибровки) или произвести запись в память EEPROM для микроконтроллеров семейства F.
Глава 27. Средства разработки для PICMICRO 109 I <* MPLAB-SIM Simulator । | Procettor: 11 1Я^:1МИИИИ| || I PIC16F84 PIC MASTER Emulator I/O Pott: ___________________ P ' 2«0 208 2W 218 ; ♦ 301) 31)8 31D 318 i ; Editor Qnly Reret I Cancel Рис. 27.5. Выбор типа микроконтроллера для симуляции в среде MPLAB Хотя режим редактирования «Editor Mode» может быть использован пя корректировки содержимого памяти программ микроконтроллера, я не со- ветую делать это таким способом. Вместо этого для внесения исправлений в код программы я рекомендую создать копию текущего исходного файла, про- извести ею и вменение и затем выполнить репрограммирование микроконт- роллера. Я не люблю производить прямое исправление программного кода. Я встречался со многими случаями, кота пользователь производил корректи- ровку программ с целью наладить работу устройства и после этого не мог вспомнить п восстановить те изменения, которые он внес в исходную про- грамму для решения возникшей проблемы. Имеется два вида экранных окон, используемых при отладке с помощью симулятора и in эмулятора PICMaster. Первым является окно контроля оста- нова «Stopwatch». которое используется .тля индикации текущего количества выполненных командных циклов (рис. 27.6). Критичные ко времени фрагмен- ты прикладных программ могут контролироваться путем установки значения рабочей частоты «Target Frequency» и установки в нуль счетчика циклов в начале выполнения контролируемого программного кода. 1 Stopwatch Zero I Cycte> -------1 Тиае J 0.00 n* T arget Frequency 1000.000000 >MHz 4 KHz > Hz Рис. 27.6. Окно контроля останова в среде MPLAB. Другое окно, используемое при отладке приложений — это окно просмотра «Watch». Это специальный вид окна, в котором выводится текущее содержи- мое всех регистров, как аппаратных, так и файловых. Когда окно просмотра
110 Часть 4. Микроконтроллеры PICMICRO создается с помощью последовательности щелчков «Windows» -> «New Watch Windows», вы получаете подсказку для выбора метки файловых регистров или указания адресов, которые должны контролироваться при выполнении симу- ляции. Вид окна просмотра выделен в правом нижнем углу на рис. 27.7. MPLAB C'AWRiriftGUICOttVMtCROSKRaiTEM HERHO5 □I? И 3 P ЯГ- TIE *3 ; / 0/168 8/163 9/229 . 8//3? ; 8/28 Й/396 8/39/ ; 8/MU 8/4 as 8/48/ frac HU 38 dsign lljii 48 i FQli 41 8/188 8/19? 8/97 8/99 8/18/ 8/189 8/113 9/116 0/119 8/12 1 8/1?3 Й/1?1- 8/127 0/129 8/131 8/269 8/28? 8/28'- «/344 0/364 0/362 Рис. 27.7. Окно просмотра в среде MPLAB Добавление переменных в конец списка, данного в окне просмотра, про- изводится путем щелчка мыши на квадратике в верхнем левом углу окна или нажатием клавиши «Insert». Удаление переменных в окне просмотра осуще- ствляется помещением курсора на требуемой строке и нажатием клавиши «Delete». Если требуется вывести на экран 16-битную переменную, то следу- ет ввести символы «%%» после имени переменной. В противном случае, пере- менные или адреса представляются как 8-битные. Среда MPLAB использует такой же формат представления файла воздей- ствий, как и симулятор MPS1M. Этот файл определяет время подачи воздей- ствий по количеству выполненных команд, которое выводится на экран в окне «Stopwatch». Установка этого окна в нуль приведет к тому, что подача воздействий, определенных в данном файле, начнется сначала. При использовании симулятора или эмулятора PlCMaster и выполнении пошаговой отладки текущая строка программного кода будет выделена. Если вы используете скомпилированную программу, то с помощью последова- тельности щелчков «Windows» -> «Program Memory» можно вывести на экран содержимое памяти программ, чтобы посмотреть, какой код сформирован компилятором в различных позициях, или получить файл листинга. Подсве-
Глава 27. Средства разработки для PICMICRO 111 чснная полоса появится на экране и позволит вам проследить, что происхо- дит в программе. Когда программирование производится па ассемблере, я очень редко вы- вожу на экран листинг файла или содержимое памяти программ. Действи- тельно, нет каких-либо причин делать это, гак как в файл листинга добавля- ются номера строк, адреса и коды операций, занимающие на экране место, которое можно использовать для размещения команд или комментариев. Па- мять программ также содержит эту информацию, по она не выдает информа- цию в символической форме. Сказанное не значит, что не следует выводить эти файлы на экран при отладке прикладных программ, написанных на язы- ках высокого уровня. В этом случае вы можете использовать данные файлы, чтобы посмотреть результат работы компилятора. Точки останова и места прекращения выполнения программы («Run to Неге») могут быть легко введены с помощью мыши. Сначала передвиньте курсор на строку, где вы хотите остановить выполнение программы. Это про- изводится перемещением мыши на требуемую строку и нажатием па ее ле- вую клавишу. Затем нажмите правую клавишу мыши и выберите тип остано- ва. Варианты команд «Trigger» (Запуск) и «Trace» (Трассировка), которые вы увидите, используются при работе с эмулятором PICMaster, чтобы указать, какая операция будет производиться (например, трассировка исполняемого кола). Отрицательной чертой симулятора MPLAB является низкая скорость ра- боты. На моем компьютере с процессором Pentium - I33 МГц симулятор выполняет 300 команд в секунду. Это означает, что для моделирования задер- жки в 0,1 с па микроконтроллере PICMicro, работающем с тактовой часто- той 4 МГц, симулятору потребуется пять с половиной минут. Чтобы избежать нежелательных затрат времени при моделировании задержек, я написал ус- ловный программный код, который включается по присутствию-отсутствию псевдо-метки, в качестве которой обычно используется слово «Debug». На- пример, если реализуется задержка, задаваемая 16-битным счетчиком, то я записываю ее в следующем виде: Dlay ; Программа задержки, время ожидания для ; установки аппаратных средств ifdef Debug movlw 1 ; Короткая задержка movwf Count movwf Counthi else movlw 77 ; Требуемая длинная задержка movwf Count movlw 123 movwf Counthi endif deefsz Count Цикл задержки
112 Часть 4. Микроконтроллеры PICMICRO goto decfsz goto return $-1 Counthi $-3 Когда это код скомпилирован, и присутствует псевдо-метка «Debug», то в счетчик в качестве переменных «Count» и «Counthi» загружается 1, что по- зволяет выполнить программу очень быстро (короткая задержка). В против- ном случае в качестве этих переменных загружаются их значения, задающие требуемую длительность задержки. Рассматривая этот код, вы, возможно, удивитесь, почему я не исключаю фрагмент кода после директивы «if», а прогоняю программу с минимальным числом циклов задержки. Причина состоит в том, что я хочу иметь одинако- вое число команд в отлаживаемом коде и получаемой прикладной программе. Различие в размерах программ может вызвать проблемы, если я захочу изме- нить работу программы. Когда программа промоделирована симулятором и кажется работоспо- собной, я загружаю ее в микроконтроллер PICMicro с помощью программа- тора PICStart Plus (рис. 27.8). Этот прибор работает только под управлением среды MPLAB. Рис.27.8. Система разработки с программатором PICStart Plus Вид окна управления программатором PICStart Plus показан на рис. 27.9. Это окно используется для управления битами конфигурации в микроконт- роллере PICMicro. Как было сказано выше, я настоятельно рекомендую вы- полнять установку битов конфигурации в вашей программе, используя ди- рективу « CONFIG», а не производить их ручную установку с помощью этого окна.
Глава 27. Средства разработки для PICMICRO 113 Progiammci Status И®ЕЗ Device Oadlatrx Watch Dog Tiaet Processor Mode Brown Out Detect Code Protect Power Up Timer Marte dear Pant, ID's and Chedurai Set ID | Voltage» VDD Mn VDD Maa VPP Рис. 27.9. Окно управления программатором PICStart Plus Маленький совет: когда у вас все готово, чтобы запрограммировать PlCMicro, запустите PICStart Plus, а затем выполняйте ассемблирование или компиляцию вашей программы. Когда ассемблирование-компиляция будет закончена, вы увидите, что конфигурационные флаги в окне программиро- вания мерцают и принимают правильные значения. Таким образом, вы ис- ключите возможность ошибки при программировании вашего устройства. Основная ошибка при освоении работы с PlCMicro состоит в неправильной установке значений битов конфигурации. В этом случае микроконтроллер не выполняет прикладную программу, потому что сторожевой таймер постоян- но производит перезапуск программы или неправильно выбран способ гене- рации тактовых сигналов. Когда эмулятор PICMaster подключается к PlCMicro с помощью интер- фейсной платы, вставляемой в ISA-слот, он использует во многом такой же интерфейс, как симулятор MPLAB. Выбор эмулятора производится последо- вательностью щелчков мышью «Options» -> «Development Mode». Наряду со стандартными опциями эмулятор может быть использован для трассировки выполнения программы в соответствии с определенными условиями, кото- рые задаются выбором команд «Trigger» (Запуск) или «Trace» (Трассировка). Эмулятор PICMaster может использоваться для запуска внешних прибо- ров, например, осциллографов или логических анализаторов, или для трас- сировки процесса выполнения команд. Это производится путем установки указания «Trace» на соответствующей точке программы. После окончания ее выполнения можно просмотреть память трассы («Trace Memory»), чтобы про- анализировать ход реального выполнения программы. 8 Зак. 2025-
114 Часть 4. Микроконтроллеры PICMICRO В этом разделе я дал очень краткое объяснение основных возможностей MPLAB, а также PICStart Plus и PICMaster. Как и большинство хорошо напи- санных программ, MPLAB лучше изучать в процессе его практического осво- ения. При этом вы можете найти свои собственные приемы работы и наибо- лее удобные методы разработки и отладки программ. Используя данные здесь указания, вы сможете начать работу с MPLAB, с PICStart Plus и PICMaster. Я рекомендую вам распечатать pdf-файлы, которые содержат описание MPLAB и аппаратных средств разработки, и внимательно ознакомиться с ними пе- ред началом использования этих средств. Система KEELOQ Система разработки KeeLoq фирмы Mirochiр реализует алгоритм обеспече- ния безопасности, позволяющий аппаратно управлять микроконтроллером. Эта система служит надстройкой над остальными программными средства- ми, которые могут предоставляться другими фирмами. В системе защиты от угона моего автомобиля используются микроконтроллеры PICMicro с систе- мой KeeLoq в карманном пульте отпирания-запирания и самом автомобиле. Пульт передает расположенному в автомобиле приемнику число, которое кажется случайным, а затем переходит к следующему псевдослучайному чис- лу, которое будет послано в качестве сигнала отпирания-запирания в следу- ющий раз. Каждая комбинация пульт-приемник содержит уникальный кольцевой регистр сдвига, который формирует псевдослучайное число на основе спе- циально заданного начального значения. Мне кажется удобным представить генератор псевдослучайных чисел в виде колеса с большим количеством то- чек, расположенных по окружности (рис. 27. Ю). Когда вы находитесь в любой точке окружности, то можете определить, какое число будет следующем при повороте колеса. Когда передатчик пульта посылает сигнал, приемник прове- ряет его значение в соответствии с положением своего «колеса» и обеспечи- вает срабатывание замка, если полученное число равно значению, указанно- му в следующей позиции «колеса». Если числа не совпадают, то приемник отмечает это место и переходит к следующей точке на «колесе». Если в следу- ющий раз пульт пошлет число, которое совпадает со следующим числом на «колесе» приемника, то он выдаст сигнал срабатывания. Причина, по кото- рой приемник снова проверяет поступающий сигнал, состоит в том, что сиг- нал передатчика может быть потерян или искажен приемником. Данное описание системы KeeLoq является сильно упрощенным, и в нем, возможно, пропущены некоторые важные особенности ее работы. Но это не столь важно, потому что если вы хотите использовать технологию KeeLoq, то должны подписать соответствующее соглашение о конфиденциальности све- дений с фирмой Microchip. Система KeeLoq достаточно сложна и способна обеспечить реализацию ряда дополнительных возможностей, например, по- сылку приемнику различных команд, которые не рассмотрены в этом разделе.
Глава 27. Средства разработки для PICMICRO 115 Рис. 27.10. «Колесо» псевдослучайных чисел в системе KeeLoq Набор FUZZY TECH Чтобы помочь пользователям разрабатывать собственные прикладные про- граммы на базе нечеткой логики, фирма Microchip создала набор средств Fuzzy Tech. Эти средства позволяют легко создавать в графическом виде раз- личные приложения, использующие нечеткую логику. В набор входит про- стая демонстрационная плата, которая содержит резистивный нагреватель и датчик температуры (термистор). Эта плата может быть использована, чтобы разработать с применением нечеткой логики первую прикладную програм- му, обеспечивающую управление устройством, которое содержит потенцио- метр для установки требуемой температуры, датчик температуры и микро- контроллер, выдающий ШИМ-сигналы для нагревателя. Fuzzy Tech создает выходной файл, совместимый с ассемблером MPASM, который может быть интегрирован в код прикладной программы. Возмож- ность применения нечеткой логики ограничивается только доступными ре- сурсами микроконтроллера PICMicro. Если вы ознакомитесь с описанием Fuzzy Tech, то увидите, что форми- рование правил должно производиться вручную, хотя их ввод в систему осу- ществляется с помощью графического интерфейса Fuzzy Tech, после чего система создает выходной программный код. Разработчик прикладной про- граммы должен обеспечить интерфейс с внешними устройствами, а также выполнение любых других функций, которые должны быть реализованы мик- роконтроллером PICMicro. Fuzzy Tech не превращает микроконтроллер PICMicro в устройство с не- четкой логикой, предназначенное для специальных приложений. Вместо это- го данное средство обеспечивает создание программного кода, использую- щего принципы нечеткого логического управления для заданных входных воздействий, что расширяет возможности приложения.
глава 28 Система команд м и кроконтроллеров PICMicro Краткое содержание Команды арифметических операций с регистровой адресацией Команды арифметических операций с непосредственной адреса- цией Команды изменения последовательности выполнения программы Команды управления микроконтроллером Команды битовых операций Команды старших моделей PIC (17С4Х) Расширение набора команд в ассемблере MPASM Система команд ассемблера Parallax для PICMicro В данной главе представлена, главным образом, система команд микроконт- роллеров среднего уровня. Большинство из этих команд являются общими для различных семейств PICMicro, однако, существуют несколько команд, реализуемых только в архитектуре старших моделей серии 17С4Х. Описание этих команд, а также системы команд для ассемблера Parallax PICMicro, дано в конце главы. Приведенные здесь коды команд справедливы для микрокон- троллеров среднего уровня. Если вы используете микроконтроллеры младших или старших моделей, то следует уточнить битовое представление команд, используя справочные данные фирмы Microchip для соответствующего мик- роконтроллера, хотя формат команд остается одинаковым для различных се- рий.
Глава 28. Система команд микроконтроллеров PICMICRO 117 Команды арифметических операций с регистровой адресацией Команды арифметических операций с регистровой адресацией, которые на- зываются фирмой Microchip «байт-ориентированными операциями с регис- трами файлов», используются в PlCMicro для пересылки данных между ре- гистрами и выполнения математических операций над их содержимым. Иначе говоря, эти команды осуществляют как пересылку данных внутри PlCMicro, так и арифметические операции над ними. На первый взгляд набор команд PlCMicro может показаться ограничен- ным — для микроконтроллеров младших и средних моделей их число состав- ляет немного более 30. Однако, получив определенный опыт работы с ними, вы убедитесь, что он является достаточно мощным, и позволяет реализовать широкий набор операций. Частично такая гибкость достигается возможнос- тью указания адреса размещения результата операции. Многие операции, реализация которых в других процессорах требует двух или более команд, выполняются в PlCMicro одной командой. В качестве еще одного преимущества системы команд можно отметить существование различных способов обращения к регистрам. Команды, опи- санные в данной главе, обеспечивают запись и считывание содержимого любого из регистров PlCMicro. Адрес регистра указывается непосредственно в команде и содержит 7 битов. Поэтому доступ возможен только к данным, расположенным в пределах текущего банка, выбор которого осуществляется с помощью параметров RP0 и RPI. Адресация данных также может также осуществляться с помощью индексного регистра FSR, посредством обраще- ния к псевдорегистру INDF, расположенному по нулевому адресу. Особен- ностью микроконтроллеров PlCMicro является использование при индекс- ной адресации такого же формата, что и при прямой адресации. Команда «movf» используется для установки флага нуля в зависимости от содержимого определенного регистра и может быть использована для его заг- рузки в регистр W (команда 28.1). Данное описание команды может показать- ся несколько странным, однако в действительности оно точно соответствует выполняемой операции. Как и для других арифметических команд с регист- ровой адресацией, результат выполнения команды «movf» может сохранять- ся в регистре W. Возникает вопрос, каким будет результат выполнения команды «movf» при записи результата операции в регистр, являющийся источником дан- ных, то есть при выполнении команды «movf reg f». В данном случае произво- дится загрузка содержимого регистра в АЛУ и сравнение его с нулем, после чего это содержимое помещается обратно в регистр. Таким образом, основ- ной функцией команды «movf» является установка флага признака нуля. Вто- рой (дополнительной) функцией этой команды является загрузка содержи- мого регистра-источника в регистр W. Команда «movwf» используется для записи содержимого регистра W в ука- занный файловый регистр. Если в качестве этого регистра указывается INDF,
118 Часть 4. Микроконтроллеры PICMICRO то адрес регистра выбирается из регистра FSR. При выполнении данной ко- манды флаги состояния не изменяются (команда 28.2). Процессоры PICMicro имеют специальные команды для очистки регист- ров. Команда «clrf reg» записывает ноль в указанный регистр, a «clrw» - в регистр W. При выполнении команд очистки регистров и команды «movf» необходи- мо помнить, что они также устанавливают соответствующее значение флага нуля. Это обстоятельство может вызвать проблемы, если вы хотите сохранить текущее состояние процессора для последующего выполнения программы. Поэтому рекомендуется использовать только флаг переноса для сохранения состояния процессора при переходе к другим программам, так как его изме- нение производится меньшим числом команд, чем изменение флага нуля (команды 28.3 и 28.4). Наиболее часто используемой арифметической операцией является сло- жение. В микроконтроллерах PICMicro сложение производится обычным спо- собом (команда 28.5). Эта операция может изменять все биты состояния. Флаг нуля устанавливается в I. если при выполнении логической операции «И» над полученным результатом и числом OxOFF получается ноль. Флаг переноса устанавливается в I. если результат превышает число OxOFF (255). Флаг пере- носа из младшей тетрады («ниббла») устанавливается в I. если сумма четы- рех младших битов превышает OxOF (I5). Например, рассмотрим выполнение фрагмента кода: movlw 10 ; Сложить ОхООА и ОхООА movwf Reg addwfReg ; Поместить результат в регистр W В результате регистр W будет содержать число 20. в заданном регистре Reg сохранится число 10. флаги нуля и переноса будут сброшены в 0. а флаг межтетрадного переноса установится в I .. Вычитание в PICMicro является операцией, с которой необходимо более подробно ознакомиться, прежде чем ее использовать (команда 28.6). При зна- комстве с описанием команд вас. возможно, удивит операция «snbwf». Сле- дует отметить, что вместо вычитания PICMicro выполняет операцию сложе- ния с отрицательным числом. То есть вместо операции D = S - W в действительности выполняется: D = S + (- W). где D (Destination) и S (Source) - содержимое регистра-приемника и регистра-источника, соответ- ственно. Отрицательное значение содержимого W в приведенном примере вычис- ляется по следующей формуле: Negative = (Positive л OxOFF) + 1. Таким образом, вычитание е учетом вышесказанного, выполняется по формуле: D = S + (W Л OxOFF) + 1.
Глава 28. Система команд микроконтроллеров PICMICRO 119 Эта формула помогает понять, что происходит при выполнении команды «subwf». С ее помощью можно также объяснить, как устанавливаются флаги переноса. При этом флаги переноса и межтетрадного переноса цифры могут изменяться не так, как вы ожидаете. Рассмотрим, например, что произой- дет, если из I вычесть 2: Source = 1 W = 2 Команда = subwf Source, w Для объяснения этого примера используем приведенную выше формулу, в которую подставим заданные значения: w = 1 + ( 2 Л OxOFF) + 1 Произведя вычисления, получим: w = 1 + ( OxOFD ) + 1 w = 1 + OxOFE w = OxOFF Это результат, который ожидался. Однако отметим, что при этом флаг переноса не устанавливается в I, что можно было бы ожидать для обычных процессоров. При выполнении обычной команды вычитания флаг переноса для данного примера был бы установлен в I (обычно «перенос» в других процессорах является «заемом»). Теперь для того же примера положим, что: Source = 2 W = 1 Подставляя эти значения в формулу, получаем: w = 2 + ( 1 Л OxOFF ) + 1 w = 2 + ( OxOFE ) + 1 w = 2 + OxOFF w = 0x0101 В регистр W реально будет записано число 0x001 (OxOlOI&OxOFF). Но отме- тим, что в этом случае при вычитании меньшего числа из большего флаг пере- носа (а, возможно, и флаг межтетрадного переноса) действительно устанав- ливается в I! По этой причине после выполнения команд «subwf», «snblw» или прибавления отрицательного числа я рассматриваю флаг переноса как флаг положительного результата, а не флаг заема. Если вы просмотрите пояснения к командам, такое определение флага покажется вам более правильным. Команды логических операций «andvf», «iorwf» и «xorwf» позволяют вы- полнять основные логические операции над соответствующими битами со- держимого регистров (команды 28.7, 28.8, 28.9). Вероятно, с операциями «and» и «хог» читатель уже встречался, но фирма Microchip решила называть операцию «ог» как «Включающее ИЛИ» («inclusive ог>>), обозначая ее «ior».
120 Часть 4. Микроконтроллеры PICMICRO Эта команда выполняется как обычная команда «ог». Логическая операция производится над содержимым указанного регистра и регистра W. Флаг нуля в регистре STATUS устанавливается в I или сбрасывается в 0 в зависимости от значения полученного результата. Для проверки содержимого некоторого регистра можно загрузить задан- ное число в регистр W, а затем выполнить операцию XOR («Исключающее ИЛИ») над содержимым проверяемого регистра и W. Если содержимое реги- стра равно числу, записанному в регистр W, то результат операции будет равен нулю, и флаг нуля установится в I. Например, переход к определенной точке программы при равенстве содержимого регистра PORTB числу 0х0А5 будет происходить при выполнении следующего фрагмента: movlw 0х0А5 ; Получение проверяемого значения xorwf PORTB, w ; Операция XOR с ожидаемым значением btfsc STATUS, Z ; Получено совпадение? goto PORTB А5 ; Да, переход к выполнению определенного кода Команда «comf» используется для инвертирования значения всех битов в регистре источника (команда 28. Ю). Следует заметить, что это команда не делает число отрицательным, то есть, не переводит его в дополнительный код. Отрицательное число N может быть получено из положительного Р сле- дующим образом: N = ( Р л OxOFF ) + 1 Выполнение команды «comf» аналогично логической операции XOR с числом OxOFF. Таким образом, для получения отрицательного значения со- держимого регистра с помощью команды «comf», необходимо выполнить сле- дующие операции: comf Reg incf Reg Если результат должен быть сохранен в регистре W без изменения содер- жимого регистра-источника, то выполняется следующий код: comf Reg, w addlw 1 Эта последовательность команд может выполняться только микроконт- роллерами PlCMicro, реализующими команду «addlw», то есть средними и старшими моделями семейства. Команда «swapf» меняет местами тетрады в регистре (команда 28.11). Как и в остальных командах, описанных в этом разделе, результат выполнения этой команды может быть сохранен как в регистре W, так и в регистре- источнике. Данная команда не меняет значения какого либо из из флагов состояния (переноса, межтетрадного переноса или нуля). Это свойство быва- ет полезно во многих случаях. С точки зрения пересылки данных команда «swapf» может использоваться для достижения двух целей. Во-первых, она позволяет прикладной програм-
Глава 28. Система команд микроконтроллеров PICMICRO 121 ме хранить две цифры в одном регистре, переставляя их в зависимости от того, какую из них вы хотите использовать. Во-вторых, эта команда реализу- ет быстрый сдвиг содержимого регистра на четыре разряда. Сдвиг произво- дится вправо или влево в зависимости от того, над какой из тетрад результата будет выполнена последующая логическая операция AND с числом OxOF. Я часто использую команду «swapf», чтобы разделить байт на две тетрады для их последующего отображения на дисплее. Например, для вывода на пе- чать байта в шестнадцатиричном формате можно использовать следующий код: swapf Byte, w ; Получение старшей тетрады addlw OxOOF call PrintHex ; Печать старшей тетрады movf Byte, w andlw OxOOF call PrintHex ; Печать младшей тетрады Одной из наиболее полезных особенностей команды «swapf» является то, что содержимое регистра STATUS не изменяется при загрузке результата в регистр W. Это свойство обычно используется для восстановления содержи- мого контекстных регистров перед возвратом из прерывания. Команды циклического сдвига полезны по ряду причин. Основной функ- цией этих команд является сдвиг содержимого регистра влево или вправо на один бит с записью на место младшего значащего бита значения флага пере- носа или, соответственно, установлением флага переноса в соответствии со значением старшего значащего бита (команды 28.12 и 28.13). Команды циклического сдвига могут быть использованы для умножения и деления на число 2 в степени п. Это может быть проделано с 16-битными числами. Следующий пример демонстрирует, как умножить 16-битное число на 4. bcf STATUS, С ; Сброс флага переноса перед сдвигом rlf Reg, f ; Сдвиг переменной влево (умножение на 2) rlf Reg + 1, f bcf STATUS, С ; Повторение умножения на 2 rlf Reg, f rlf Reg, f Другие возможности использования этих команд — реализация последо- вательного ввода или вывода данных и позиционирование байта для того, чтобы можно было тестировать значение отдельных битов. Команды инкремента «inef» и декремента «deef» используются для изме- нения содержимого регистра на I (команды 28.14 и 28.15). После выполнения команд инкремента/декремента может измениться только флаг нуля. Вы мо- жете предположить, что будет изменяться также флаг переноса, если резуль- тат превысит значение OxOFF при инкременте или окажется меньше 0 при декременте, однако этого не происходит. Поэтому инкремент/декремент 16-
122 Часть 4. Микроконтроллеры PICMICRO битного числа не может быть выполнен обычным способом. Инкремент 16- битного числа может быть реализован следующим образом. incf Reg, f ; Инкремент младшего байта btfsc STATUS, z ; В результате получен 0? (Младший байт=256) incf Reg + 1, f ; Да, производим инкремент старшего байта Так как флаг нуля устанавливается, если младший байт равен 0 (или 256), то мы можем определить, когда надо выполнить инкремент старшего байта в 16-битном числе. Операция декремента несколько сложнее. Если вследствие декремента значение достигает нуля, то это не означает, что надо уменьшать старший байт. Следовательно, необходимо использовать команду, которая изменяла бы флаг переноса после декремента младшего байта, чтобы убедиться в не- обходимости декремента старшего байта. Поэтому лучше вычесть I из млад- шего байта, чем выполнять операцию декремента. movlw 1 subwf Reg, f btfss STATUS, C decf Reg + 1 , f Загрузить 1 в регистр W Вычесть 1 из младшего байта Флаг переноса установлен в 1? Нет - производим декремент старшего байта Наряду с командами тестирования битов, которые описаны ниже, име- ются две другие команды, осуществляющие переход к заданной команде. Это инкремент/декремент с пропуском команды при нулевом результате (коман- ды 28.16 и 28.17). Эти две команды работают аналогично командам «incf» и «decf» в смысле обработки данных. Единица вычитается из содержимого ре- гистра-источника или прибавляется к нему. Затем полученное значение мо- жет быть сохранено в регистре W или в регистре-источнике. Важное отличие от тех команд заключается в том, что при нулевом результате выполнения этих команд пропускается следующая за ней команда. Это означает, что ко- манды «decfsz» и «incfsz» могут использоваться :ия органидшии программ- ных циклов. Действительно, я могу сказать, что команда «decfsz» обычно слу- жит для управления циклами. Ниже приведен пример кода, который показывает, как можно осуществить цикл из 37 повторений с очень малым увеличением объема программы. movlw 37 ; Загрузить регистр-счетчик циклов movwf LoopCounter Loop ; Повторение каждой итерации в цикле decfsz LoopCounter, f ; Декремент счетчика циклов goto Loop ; Если результат не равен нулю, то повторить ; цикл ; Продолжение программы Этот программный код может использоваться в любом месте, где требу- ется реализация циклов, и как вы вилете, для этого используется всего четы-
Глава 28. Система команд микроконтроллеров PICMICRO 123 ре команды и три дополнительных командных цикла на выполнение каждой итерации. Хотя команда «incfsz» используется не так часто, как «decfsz». она может служить для создания очень компактных временных циклов, чтобы получить 16-битные значения задержки. Loop ; Возврат к временному циклу incfsz Count ; Инкремент младшего байта счетчика incf Countin' ; Инкремент старшего байта, если младший ; не равен О btfsc PORTn, Bitn ; Выход из цикла, если условие выполнено goto Loop movf Counthi, w ; Установка правильного значения старшего байта subwf Count, w movwf Counthi При реализации петли («loop») содержимое младшего байта в счетчике циклов инкрементируется при каждом ее прохождении. Содержимое старше- го байта инкрементируется, если результат инкремента младшего байта не равен нулю. Это означает, что содержимое старшего байта счетчика равно значению младшего байта минус значение старшего байта. Этот маленький отрезок кода использует всего лишь 5 командных циклов (или 20 тактов синхронизации) для каждого прохождения петли и является минимальным программным фрагментом для формирования 16-битных вре- менных задержек. Серьезным недостатком этого фрагмента является невоз- можность выхода из цикла при переполнении счетчика, то есть в случае, если условие выхода не выполняется в течение 64К х 5 командных циклов. Несмотря на это данный фрагмент остается очень эффективным методом таймирования 16-битны.х событий с помощью всего лишь пяти команд. Пара замечаний по поводу этих двух команд. Если вы используете при их выполнении регистры процессора, то предварительно следует убедиться, что их содержимое может принимать нулевое значение. В базовой серии Р1С16С5х регистр FSR содержит биты, которые никогда не обращаются в ноль (всегда равны I). Эти регистры никогда не примут нулевого значения, то есть никог- да не произойдет пропуск следующей команды. Кроме того, эти команды не влияют на значение флагов состояния (можно было бы ожидать изменения флага признака нуля). Это означает, что вы можете поставить команду «bsf STATUS, Z» после команды, следующей за incfsz/decfsz, как сделано в сле- дующем примере: deefz Count goto Loop bsf STATUS, ; Декремент содержимого счетчика ; Возвращение в цикл, если содержимое ; счетчика не равно О Z ; Установить флаг нуля для индикации конца цикла
124 Часть 4. Микроконтроллеры PICMICRO Команда: movf Register, [wlf] Код команды: 00 1000 dfff ffff Выполнение: «f» - Номер регистра «d>> - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Пример: Z <- [f]&OxOFF movf STATUS, w ; w=STATUS Число командных циклов: 1 Тип микроконтроллеров: средние модели Примечание: В зависимости от содержимого Register производится установ- ка флага нуля. Команда 28.1. Команда movwf register [,wlf ] в PICMicro. Команда: movwf Register Выполнение: Register <- w Код команды: 00 0000 1fff ffff «f» - Номер регистра Сохранение содержимого регистра W Число командных циклов: 1 Тип микроконтроллеров: Пример: средние модели movwf STATUS, ; Восстановить содержимое регистра STATUS Команда 28.2. Команда movwf register в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 125 Команда: clrw Код команды: Выполнение: w <- О Число командных циклов: 1 Пример: Тип микроконтроллеров: clrw ; w=0 средние модели Примечание: Выполнение команд «с1г» всегда приводит к установке флага нуля Команда 28.3. Команда clrw в PICMicro. Команда: clrf Register Код команды: 00 0001 1fff ffff «f» - Номер регистра Данные в регистр Выполнение: [Register] <- О Z <- 1 Пример: clrf Register ; Register=O Число командных циклов: 1 Тип микроконтроллеров: средние модели Примечание: Выполнение команд «clrf» всегда приводит к установке флага нуля Команда 28.4. Команда clrf register в PICMicro.
126 Часть 4. Микроконтроллеры PICMICRO Команда: addwf Register, [wlf] Выполнение: Z <- (w + [f]) & OxOFF Код команды: 00 0111 dfff ffff «f>> - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 ——)► Результат при d=1 Число командных циклов: 1 С <- (w + [f]) > OxOFF DC <- ((w & OxOF) + ([f] & OxOF))>OxOF Тип микроконтроллеров: movlw 7 addwf Reg, w addwf Reg, f addwf Reg, w=Reg+7 Reg=2*Reg+7 Reg=3*Reg+14 средние модели Команда 28.5. Команда addwf register [,wlf ] в PlCMicro. Команда: subwf Register, [wlf] Код команды: Выполнение: d <-w + (Reg'XIxOFFJ+l 00 0010 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Пример: Z <- w & OxOFF C <- w > OxOFF DC <— w > OxOF Число командных циклов: 1 Тип микроконтроллеров: средние модели movf Reg, w ; Reg2=Reg2-Reg subwf Reg2 Команда 28.6. Команда subwf register [,wlf ] в PlCMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 127 Команда: andwf Register, [wlf] Выполнение: Код команды: 00 0101 dfff ffff «f» - Номер регистра ><d” - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Пример: movlw 7 d <— w & [f] Z <- (w & [f]) & OxOFF andwf Reg, w ; w=Reg & 7 Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.7. Команда andwf register [,wlf ] в PICMicro. Команда: iorwf Register, [wlf] Выполнение: d <- w I [f] Z <-(w I [f]) & OxOFF Пример: movlw 7 iorwf Reg, w w=Reg & 7 Код команды: 00 0100 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.8. Команда iorwf register [,wlf ] в PICMicro.
128 Часть 4. Микроконтроллеры PICMICRO Команда: xorwf Register, [wlf] Выполнение: d <- w Л1 [f] Z «- (w л [ф & OxOFF Код команды: 00 0110 dtff ffff «f» - Номер регистра «d>> - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Пример: movlw 7 xorwf Reg, w w=Reg л 7 Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.9. Команда xorwf register [,wlf ] в PICMicro. Команда: comf Register, [wlf] Выполнение: d <- f Л OxOFF Z <- (f л OxOFF) Пример: comf, w ; w = -Register addlw 1 Код команды: 00 1001 dtff ffff «f>> - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.10. Команда comf register [.wlf ] в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 129 Команда: swapf Register, [wlf] Код команды: 00 1110 dfff ffff Выполнение: d <- <>Reg «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Число командных циклов: 1 Пример: swapf _w ; Восстановить содержимое Тип микроконтроллеров: средние модели swapf _w,w ; регистра W, не изменяя флаг нуля Примечание: команда «swapf» часто используется для вывода тетрад байта или для пересылки данных без изменения флага нуля Команда 28.11. Команда swapf register [,wlf ] в PlCMicro. Команда: rlf Register, [wlf] Код команды: 00 1101 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Число командных циклов: 1 Тип микроконтроллеров: средние модели rlf Register, w ; Выполнить переход, если бит 7 btfsc STATUS, С ; в регистре Register установлен в 1 goto Label ; Примечание: Приведенная схема выполнения команды справедлива для случая d=1 Команда 2В. 12. Команда rlf register [, wlf ] в PlCMicro. 9 Зак. 2025.
130 Часть 4. Микроконтроллеры PICMICRO Команда: rrf Register, [wlf] Код команды: 00 1100 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d-0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Число командных циклов: 1 Тип микроконтроллеров: средние модели rlf Register, w ; Разделить содержимое movwf Divisor ; Register на 2 Примечание: Приведенная схема выполнения команды справедлива для случая d=1 Команда 28.13. Команда rrf register [,wlf ] в PICMicro. Команда: incf Register, [wlf] Код команды: 00 1010 dfff ffff Выполнение: «f» - Номер регистра <‘d» - Размещение результата: регистр W при d-0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Пример: incf Counter d f + 1 Z <-(f + 1) & OxOFF Число командных циклов: 1 Тип микроконтроллеров: средние модели ; Counter++ Команда 28.14. Команда incf register [,wlf ] в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 131 Команда: decf Register, [wlf] Код команды: 00 0011 dfff ffff Выполнение: d < - f - 1 ><f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 Результат при d=1 Z (f - 1) & OxOFF Пример: decf Counter ; Counter-- Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.15. Команда decf register [.wlf ] в PICMicro. Команда: incfsz Register, [wlf] Выполнение: d f + 1 PC < - (PC + 1) & (d I 0) Пример: Loop incfsz Count incf Counthi btfsc Port, Bit goto Loop Код команды: 00 1111 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат при d=0 . > Результат при d-1 > PC Inc Число командных циклов: 1/2 Тип микроконтроллеров: средние модели Примечание: Как показано в приведенном примере, команда '-incfsz- может исполь- зоваться для определения времени событий Команда 28.16. Команда incfsz register [.wlf ] в PICMicro.
132 Часть 4. Микроконтроллеры PICMICRO Команда: decfsz Register, [wlf] Код команды: 00 1011 dfff ffff «f» - Номер регистра «d» - Размещение результата: регистр W при d=0 регистр f при d=1 Входные данные и результат лри d=0 Результат при d=1 Выполнение: d *— f - 1 PC <- (PC + 1) & (d I 0) Пример: movlw 37 movwf Counter PC Inc Число командных циклов: 1/2 Тип микроконтроллеров: средние модели Loop ; Loop 37х decfsz Counter goto Loop Примечание: Как показано в приведенном примере, команда «decfsz» является хоро- шим способом реализации циклов «for». Команда 28.17. Команда decfsz register [.wlf ] в PICMicro. Команды арифметических операций с непосредственной адресацией Арифметические команды с непосредственной адресацией используют при выполнении операции явно заданные операнды Эти операнды являются ча- стью команд. Команда «movlw» используется для записи константы в регистр W (ко- манда 28.18). При выполнении этой команды содержимое регистра STATUS не изменяется. Команда «addlw» прибавляет непосредственную заданную величине’ к со- держимому регистра W (команда 28.19). Эта команда изменяет значение фла- гов нуля, переноса и межтетрадного переноса таким же образом, как коман- да «addwf». Команда «sublw» вычитает содержимое peine гра W из заданного значения константы Literal (команда 28.20). Это выглядит несколько странно. По моему мнению, выполнение данной команды, похожей на команде «subwf». имело бы больший смысл, если бы значение консзанты Literal вычиталось из содер-
Глава 28. Система команд микроконтроллеров PICMICRO 133 жимого регистра W. Однако архитектура PlCMicro не поддерживает этого. Лучший способ пояснить эту команду — визуально представить ее выполне- ние. Выполняемая командой «sublw» операция имеет вид: W = Literal - W, вместо интуитивно более понятной операции W ~ W - Literal. В отличие от «subwf», результат выполнения команды «sublw» можно пред- ставить в следующем виде: W = Literal + (W л OxOFF) + 1. Данная команда изменяет значения тех же флагов, что и команда «subwf». Так как я считаю, что операция, выполняемая командой «sublw». не соот- ветствует интуитивным представлениям, то я пытаюсь избежать ее использо- вания. за исключением случаев, когда производится изменение знака содер- жимого регистра W с помощью команды «sublw О»: sublw 0 ; Изменить знак содержимого регистра W Существует один маленький трюк, который вы можете использовать, если вам необходимо вычесть явно заданное число. Он заключается в том. что производится сложение с числом, имеющим противоположный знак. На- пример, вы хотите написать код, реализующий следующую операцию: W = W - 47. Эго может быть сделано следующим образом: movf Temp movlw 47 subwf Temp, w Сохранить содержимое W в промежуточном регистре Temp Загрузить в регистр W вычитаемое Вычесть его из первоначального содержимого W Если вы используете микроконтроллеры серии Р1С16С5х, а не младшие модели PlCMicro, то данную операцию можно реализовать с помощью ко- манды «addlw»: addlw 0-47 ; Прибавить отрицательное число Если вы используете младшие модели микроконтроллеров из серии Р1С16С.ХХ, которые не выполняют эту команду, го изменить знак содержи- мого регистра W можно с помощью интересного небольшого отрезка кода, представленного недавно в информационных материалах PICLIST: addwf Reg, w subwf Reg, w W = W + Reg W = Reg - W W = Reg - (W + Reg) (результат команды «addwf Reg, w») W = Reg - W - Reg W = - W
134 Часть 4. Микроконтроллеры PICMICRO Результатом выполнения этого кода будет изменение знака содержимою регистра W. Содержимое регистра Reg останется без изменения. Команды addlw и sublw не реализуются в младших моделях микроконт- роллеров (серия 16С5х). Команды логических операций «andlw». «iorlw», «xorlw» выполняют по- битно соответствующие операции над содержимым регистра W и непосред- ственно заданной константой Literal (команды 28.21, 28.22 и 28.23). Эти опе- рации. как и логические операции с регистровой адресацией, устанавливают только флаг нуля it регистре STATUS в соответствии с результатом операции. Полученный результат сохраняется в регистре W. При выполнении этих ко- манд запись результата в другой регистр не реализуется. Выполнение коман- ды <>iorlw 0» является хорошим способом определения равенства нулю содер- жимого pei исгра W. ЕГ зависимости от результата этой операции <|>aat нуля будет установлен в 1 или сброшен в 0. Команда <.retlw>> используется для возврата из подпрограммы с установ- кой начальных условий в регистр W, а также для реализации таблиц, что описывается в другом месте. Перед возвращением из подпрограммы эта ко- манда осуществляет загрузку непосредственно заданной величины в регистр W (команда 28.24). Данная команда может заменить две команды: movlw Value ; Загрузить значение Value в регистр W return Команда «retlw» является единственным способом возврата из подпрог- раммы. возможным для младших моделей микроконтроллеров PICMicro (се- рия 16С5х). Код команды: 11 0000 LLLL LLLL «L» - Константа Команда: movlw Literal Выполнение: w <- Lit , Путь данных Пример: Число командных циклов: 1 Тип микроконтроллеров: средние модели movwf w, 77 ; w = 77 в десятичной системе Команда 28.18. Команда movlw literal в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 135 Команда: addlw Literal Выполнение: w < w + Lit Z (w + Lit) & OxOFF C <- (w + Lit) > OxOFF Пример: movf Reg, w addlw 7 addlw -13 Код команды: 11 111 X LLLL LLLL «L» - Константа Путь данных Число командных циклов: 1 Тип микроконтроллеров: средние модели DC <- ((w & OxOF) + (Lit & OxOF)) > OxOF ; w = Reg + 7 ; w = (Reg + 7) -13 Команда 28.19. Команда addlw literal в PICMicro. Команда: sublw Literal Выполнение: w <- w + (Lit Л OxOFF) + 1 Z <— w & OxOFF C <— w > OxOFF Пример: DC <— (w & OxOF) > OxOF movf Reg, w sublw 0 ; w = -Reg Код команды: 11 110x LLLL LLLL «L>> - Константа Путь данных Число командных циклов: 1 Тип микроконтроллеров: средние модели Примечание: Следует использовать команду «addlw -Lit» вместо «sublw» для вычита- ния отрицательной константы из содержимого регистра W Команда 28.20. Команда sublw literal в PICMicro.
г 136 Часть 4. Микроконтроллеры PICMICRO Команда: andlw Literal Выполнение: । Путь данных Код команды: 11 1001 LLLL LLLL «L» - Константа Пример: w <— w & Lit Z < (w & Lit) & OxOFF Число командных циклов: 1 Тип микроконтроллеров: средние модели movf Reg, w andlw 7 ; w = Reg & ObOOOOOOW Команда 28.21. Команда andlw literal в PlCMicro. Команда: iorlw Literal । Путь данных Выполнение: w <- w I Lit Z <-(w I Lit) & OxOFF Пример: movf Reg, w iorlw 7 ; w = Reg I ОЬООООООШ Код команды: 11 1000 LLLL LLLL «L>> - Константа Число командных циклов: 1 Тип микроконтроллеров: средние модели Команда 28.22. Команда iorlw literal в PlCMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 137 Команда: xorlw Literal Выполнение: w <- w Л Lit Z <- (w л Lit) & OxOFF Пример: Код команды: 11 1010 LLLL LLLL «L» - Константа Путь данных Число командных циклов: 1 Тип микроконтроллеров: средние модели movf Reg, w xorlw 7 ; w = Reg Л ObOOOOOOW Команда 28.23. Команда xorlw literal в PICMicro. Команда: retlw Constant Код команды: Выполнение: PC <- PCStack w <- Constant Пример: Label Число командных циклов: 2 Тип микроконтроллеров: средние модели retlw 1 ; Возврат с информацией о правильном выполнении Команда 28.24. Команда retlw constant в PICMicro.
138 Часть 4. Микроконтроллеры PICMICRO Команды управления программой Перед использованием таких команд, как «goto» или «call», очень важно по- нять, как они работают. Если вы еще не сделали этого, то я советую вам вернуться назад и прочитать раздел о программном счетике в главе «Архи- тектура процессора PlCMicro». Команды «goto» и «call» при некоторых обсто- ятельствах могут выполняться необычным образом, в результате чего про- граммный счетчик не будет давать правильное указание адреса. Причина необычных эффектов при выполнении команд «goto» и «call» состоит том. что все команды PlCMicro имеют одинаковую длину. а разрядность адреса может превышать число битов, которое выделено для нею в коде команды. Обе инструкции, «goto» и «call», могут явно задавать адрес перехода в пределах определенной страницы, размер которой зависит oi типа микро- контроллера: 256/512 адресов хтя младших моделей семейства. 2К адресов для микроконтроллеров среднего уровня п 8К адресов для старших моделей. Если адрес перехода выходит за Гранины страницы, то регистр PCL?\TH (или соответствующие биты регистра STATES для младших моделей) дол- жен содержать правильную информацию о новой с границе. Например, межстраничный переход в мнкрокотроллерах среднего уров- ня может быть выполнен следующим образом: movlw high Label ; Реализация межстраничного перехода movwf PCLATH goto Label В данном отрезке кода в регистр PCLATH таносится номер новой страни- цы перед выполнением команды goto. Это приводит к загрузке в программ- ный счетчик правильного полного значения адреса, когда выполняется ко- манда «goto» (команда 28.25). Команда «call» выполняется почти гак же. как и «goto», за исключением гою. что указатель па следующую команду сохранятся в сгеке программно- го счетчика (команда 28.26). В серии микроконтроллеров Р1С16С5х могут вызываться только подпрог- раммы, начало которых располагается в младших 256 адресах каждой 512- адресной страницы. Это является следствием того, что код команды не под- держивает полного ^-разрядного адреса страницы. Существуют три различных способа возврата из подпрограммы для сред- них и старших моделей микроконтроллеров (как отмечалось выше, младшие модели серии 16С5х имеют только одну инструкцию возврата retlw). При каж- дом из этих способов значение адреса извлекается из вершины стека и загру- жается в npoiраммный счетчик. Эти адреса используются хтя возврата из подпрограмм или прерываний. Следует отметить, что если в исходном тексте MPASM. написанном хтя младших моделей микроконтроллеров, присутствует команда «return», то ре- ально будет использоваться команда «retlw 0». которая осуществляет загрузку нуля в аккумулятор (регистр W). При этом не выдается ошибка о неправиль-
Глава 28. Система команд микроконтропперов PICMICRO 139 ном использовании команды «return», которая отсу гствует it архитектуре млад- ших моделей PICMicro. Обычное использование команды «return» приводит к восстановлению адреса команды, следующей за командой вы зова подпрограммы. При этом не изменяется содержимое каких-либо регистров или значения отдельных би- тов (команда 28.27). Команда «retfle» используется для возврата из прерывания (команда 28.28). Она реализуется аналогично команде «return» за исключением того, что при ее выполнении производится установка в I бита GIE в регистре управления прерываниями. Это позволяет после выполнения данной команды немедлен- но перейти к обработке прерываний, ожидающих своей очереди, что упро- щает реализацию последовательной обработки различных запросов прерыва- ния. В противном случае перед окончанием обработки потребовалась бы проверка наличия других запросов прерывания, и. в случае их поступления, переход к их обработке. Команда: goto Label Код команды: Выполнение: PC <- (Ins & 0x07FF) + ((PCLATH & 0x038) « 8) Пример: goto Label Число командных циклов: 2 Тип микроконтроллеров: средние модели Label Команда 28.25. Команда goto label в PICMicro.
140 Часть 4. Микроконтроллеры PICMICRO Команда: call Label Шина данных PCStack <- PC + 1 Выполнение: Пример: call Label Label return Код команды: 10 Okkk kkkk kkkk «к» - Метка (Label) Дешифратор команд Данные загружаются в программный счетчик Число командных циклов: 2 PC <- (Ins & 0x07FF)+ ((PCLATH & 0x038) « 8) Тип микроконтроллеров: средние модели Примечание: Применение команды «call» ограничено глубиной стека про- граммного счетчика (8 позиций в средних моделях PICMicro) Команда 28.26. Команда call label в PICMicro. Команда: return Шина данных Дешифратор команд Выполнение: PC <- PCStack Код команды: 00 0000 0000 1000 Данные загружаются в программный счетчик Пример: call Label Число командных циклов: 2 Тип микроконтроллеров: средние модели Label return Команда 28.27. Команда return в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 141 Команда: retfre Код команды: Выполнение: PC <- PCStack INTCON.GIE <- 1 циклов: 2 Пример: Org 4 I nt Тип микроконтроллеров: средние модели retfie ; Возврат из прерывания Примечание: После выполнения этой команды микроконтроллер способен снова реагировать на прерывания Команда 28.28. Команда retfie в PICMicro. Команды управления микроконтроллером Существуют всего две команды, используемые для явного контроля над фун- кционированием процессора. Первая из них — «clrwdt» используется дтя сброса сторожевого таймера. Вторая — «sleep» обеспечивает сохранение текущего со- стояния микроконтроллера в режиме ожидания, пока не произойдет какое- либо внешнее событие, которое позволит PICMicro продолжить выполнение программы. После выполнения этих команд регистры OPTION и TRIS исполь- зуются для копирования содержимого регистра W в регистровый банк I. Команда «clrwdt» сбрасывает в 0 содержимое сторожевого таймера WDT (а также предварительного делителя частоты TMR0/WDT, если он использу- ется для установки интервала времени срабатывания WDT), запуская отсчет времени его срабатывания сначала (команда 28.29). Целью введения команды «clrwdt» является не просто сброс WDT, а предотвращение перезапуска мик- роконтроллера при нормальном выполнении программы. Чтобы быть уверен- ным, что данная команда не будет выполняться в неподходящее время, сле- дует иметь в прикладной программе только одну команду «clrwdt», и она должна выбираться только один раз в течение одного прохода (то есть когда очередная программа завершена и запускается следующая из очереди, вы- полнение которой должно контролироваться с помощью WDT).
142 Часть 4. Микроконтроллеры PICMICRO Команда «sleep» служит для двух целей (команда 28.30), Первой из них является отключение микроконтроллера PICMicro после того, как он окон- чил выполнение иро1раммы. Микроконтроллер прекращает дальнейшую ра- боту и перестает управлять другими устройствами в дайной системе. Такое исиолыование микроконтроллера прсдполшает, что он необходим юлько для решения определенной задачи в приложении, например, инициализа- ция друтих устройств, а татем его работа в системе больше нс потребуется. Второй целью введения команды «sleep» является реализация в PICMicro режима ожидания какого-либо события. Известить микроконтроллер о таком собьнии можно одним in ।рех способов. Первым из них являемся подача сш- пала запуска на вход MCLR, что приведет к перезапуску процессора и на- чалу выполнения программы с нулевого адреса. Вторым способом являемся поступление сигнала «пробуждения» микроконтроллера от сторожевою тай- мера. Третьим способом «пробуждения» является реализация некоюрою внеш- нею собьпия, например, прерывания. При любом способе «пробуждения» исиолыование команды «sleep» для перевода микроконтроллера в режим ожидания позволяет избежать необходимости ортанизации циклов ожидания П может упрости п> разработку программною обеспечения. Выход микроконтроллера ит режима ожидания («пробуждение») занима- ет, по меньшей мере, I024 такта, прежде чем PICMicro возобиови1 выполне- ние про|раммы. Это означает. что команду «sleep» нельзя испольюваi ь в тех случаях, кота гребуется быстрая реакция микроконтроллера на внешнее собы i ие. Микроконтроллеры серии PICI6C5.X имеют только одну страницу в рет- cipoiioii памяти и полому не имеют возможности прямого дос тупа к рете- |рам, коюрые обычно расположены на странице I. например, к pei Петрам OPTION и TRIS. Чтобы обеспечить доступ к этим регистрам, в набор команд PICMicro включены команды «option» и «tris». Обе команды производзн пря- мую запись содержимою речисгра W в соответствующий регистр. Однако при этом вы не имеете во зможпость считыват ь обратно содержимое данных реги- с |ров. Команда «option» выполняется достаточно просто (команда 28.31), одна- ко команда «tris» требует некоторого обсуждения. Почти во всех микрокош- рол.терах PICMicro имеется более одною порта ввода-вывода, и вас. вероя|- по. интересует, как осуществляется доступ к их pet порам TRIS с помощью команды «tris» (команда 28.32). В команде «tris» используемый порт определя- ется путем указания численною значения oi 5 до 7 или имени порта, напри- мер. PORTA. Чтобы записать содержимое регистра W в регистр TRISB. сле- дует вставить в программу следующую команду: tris PORTB Последние две команды реализуются во всех микроконтроллерах PICMicro среднего уровня, хотя они необходимы только для младших моделей серии Р1С16С5х. Использование этих команд для микроконтроллеров среднею уров- ня. i.ie реализована многостраничная организация памяти данных, не реко- менлуС1СЯ фирмой Microchip, так как данные команды \ioiy i отсутствовать в будущих версиях микроконтроллеров PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 143 Команда «нор» означает oreyiei вис онерашш (команда 2S.33). Когда она выбирается процессором, он просто пропускает ее. не иропизоля каких-либо и зменений. Традиционно команда «пор» ncno.ii> зуегся лит двух целен. Первой является обеспечение сипхрони закии программною кода с временными ха- рактеристиками различных устройств системы. Второй целью является резервирование свободного пространства .тя даль- нейшей коррекции кода. Это обычно .locmiaeic» нулем замены команд «пор» необходимыми командами. Однако в микроконтроллерах PlCMicro исполь- зовать команду «пор» таким обра зом не.п> зя. Ото является следствием способа программирования намят в PlCMicro В технологии EPROM и EEPROM. коша память готова лтя программирования, го есть является чистой, все ее бип>1 установлены в I. В процессе программирования производится сброс определенных бигов в 0 для создания необходимо!о иротраммното кода. Про- блема использования команды «нор» в данном случае заключается в юм. что ее код состоит из одних нулей. )ю означает, чго ячейки намят, занятые командой «пор» нельзя неренро! раммцров.н ь. заменив ее друтой кохтаидотт. Однако существует способ резервирования намят е целью лобав. гения прог раммно!о кода. Ою означает, чго код. затруженнып в PlCMicro. может быть модифицирован без необходимости стирания ранее записанного кота, чю займет определенное время для микроконтроллеров е памятью EPROM, и последующей его перезаписи. Для лих нелеп применяется процедура, об- ращая получению необходимых команд из -пор». Например, вы можете по- местить следующий код в вашу программу лая микроконтроллера Hina I6CS4. чтобы обесиечтиь место лая вставки нужного кода: goto $ г 5 : Оставить место для введения четырех команд addlw OxOFF ; Команда, все биты равны 1 addlw OxOFF addlw OxOFF addlw OxOFF Чтобы ввести некоторый дополни тельный программный код. необходи- мо вес’ I в цервой команде' «goto» заменить на 0. преврати ее is команду «1Ю[)». Команда «addlw OxOFF» neiio.ii> зуегся потому. чю ее код состоит из одних единиц. Приведенная конструкция позволяет добавить в код четыре новых команды вместо «addlw OxOFF». не выполняя повторное асеемб.чттро- тзание вашей про, раммы. Как и в приведенном примере, все’ микроконтроллеры PlCMicro среднею уровня используют команду «addlw OxOFF» для тою. чтобы ославин, биты по соответствующему адресу памяти нротрамм установленными в I. В младших моделях PlCMicro лая достижения такою л|х|>екга иепо.тьзуегся команда «xoi lxv OxOFF». а в старших моделях - команда «call Oxi FFF». Вследствие тот о, чю код команды «пор» в PlCMicro состоит и з одних нулей, ее лет ко ввести в память ттрог рамм вместо гк>б>ой другой команды. )ю позволяет удалятьогдельттые чисти программного кода, не прибегая к страшно тт реттрот- раммировашно всей памяти про, рамм. чю невозможно реа. ти зовагь в случае иснользовагтия однократно программируемых мпкроконiроллеров.
144 Часть 4. Микроконтроллеры PICMICRO Код команды: 00 0000 0110 0100 Команда: clrwdt Выполнение: WDT <— О ТО <- 1 PD <- 1 Оказывается влияние на флаги: ТО, PD Число командных циклов: 1 Тип микроконтроллеров: средние модели Пример: clrwdt ; WDT = О/Reset Комментарий: В программе может присутствовать только одна команда «clrwdt» Команда 28.29. Команда clrwdt в PICMicro Код команды: Команда: sleep N/A циклов: Выполнение: ТО <- 1 Пример: PD <- О Oscillator Off Тип микроконтроллеров: средние модели sleep ; Перейти в режим ожидания, выход из которого лор ; происходит в случае прерывания Примечание: За командой «sleep» ВСЕГДА должна следовать команда «пор» Команда 28.30. Команда sleep в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 145 Команда: option Выполнение: Option <- w Пример: movlw option 0x0D7 Код команды: 00 0000 0110 0010 .. „аи, Сохранение содержимого регистра W Число командных циклов: 1 Тип микроконтроллеров: средние модели ; Установить TMRO на работу ; с предделителем Примечание: Команда «option» введена для обеспечения совместимости с младшими моделями PICMicro Команда 28.31. Команда option в PICMicro. Команда: tris PORTn Выполнение: TRISn <- w Код команды: 00 0000 0110 Offf “f” - порт Сохранение регистра W содержимого Пример: Число командных циклов: 1 Тип микроконтроллеров: средние модели movlw OxOFE ; Конфигурировать вывод PORTB.O PORTB ; как выход Примечание: Команда «tris» введена для обеспечения совместимости с млад- шими моделями PICMicro Команда 28.32. Команда tris PORTn в PICMicro. 10 Зак. 2025.
146 Часть 4. Микроконтроллеры PICMICRO Код команды: Команда: пор Выполнение: циклов: Тип микроконтроллеров: средние модели Пример: пор ; Пропустить один цикл Команда 28.33. Команда пор в PICMicro. Команды битовых операций Установки и сброс отдельных битов производится командами «bsf-> и «bcf». соответственно (команды 28.34 и 28.35). Их выполнение можно представить двумя способами. При традиционном программировании имеются примеры выполнения операций AND или OR над некоторой величиной и константой, при кото- рых изменяется значение только одного бита. Такие операции могут быть легко реализованы с помощью команд «bsf» и «bcf». Например, если вы хоти- те произвести операцию AND над некоторой величиной и константой 0x07F, то обычно это делается следующим способом: movlw 0x07F ; Загрузить значение константы для операции AND andwf Reg, f ; Выполнить AND Однако в PICMicro это можно реализовать с помощью одной команды: bcf Reg, 7 Реализация операции OR с помощью команды «bsf» («установить бит в I») происходит аналогично. Любой доступный для записи бит в регистровой памяти может быть модифицирован таким способом. Использование этих команд может дать большое преимущество в ситуациях, когда вы хотите из-
Глава 28. Система команд микроконтроллеров PICMICRO 147 менить только один бит в регистре, например, бит в регистре STATUS. Дан- ные команды позволяют не только выполнить операцию за один цикл вместо двух, но и гарантируют, что ни один из остальных битов регистра не будет изменен. Однако последнее утверждение не всегда справедливо. Как уже говорилось в главе «Архитектура процессора PICMicro», команды «bsf» или «bef» могут давать неправильный результат при работе с портами ввода-вывода. Это про- является в виде непредусмотренных изменений состояния выходных тригге- ров-зашелок в регистре порта, которые могут иметь место после выполнения команды. (Напомним, что значение числа, считываемого из регистра порта, зависит от конфигурации его выводов в качестве входов или выходов дан- ных). В архитектуре PICMicro не используются команды условного перехода. Вместо этого имеются команды, позволяющие пропустить выполнение сле- дующей команды программы (команды 28.36 и 28.37). Как было сказано выше, команды «decfsz» и «incfsz» moivt использоваться для организации циклов. Здесь я хочу рассказать, как осуществляется управление выполнением про- граммы. Такое управление реализуется с помощью команд «btfsc» и «btfss». позво- ляющих пропустить выполнение следующей команды программы в зависи- мости от состояния определенного бита в заданном регистре. В традиционной архитектуре условиями для выполнения переходов и ветвлений являются значения битов (флагов) в регистре состояния. Такая возможность существу- ет и в микроконтроллерах PICMicro. Для этого используются указанные выше команды пропуска по значению бита, которые выбирают соответствующий бит (флаг) из регистра STATUS. Например, если вы хотите выполнить пере- ход по условию установки флага нуля в I (в микропроцессорах семейства Intel 80x86 данной операции соответствует команда «jz»), то можно исполь- зовать следующий код: btfsc STATUS, z goto Label Пропустить следующую команду, еспи фпаг нуля равен 0 Флаг нуля установлен в 1 - перейти к заданному адресу Подобный код можно привести для различных условных переходов: JC - переход, если флаг переноса установлен в I. JNZ - переход, если флаг нуля сброшен в 0, и других. Данные команды полезны во мнотх случаях: от про- верки активности битов, используемых в качестве флагов прерываний, до определения знака числа путем проверки значения его старшего бита или проверки значения флагов в регистре STATUS. В конце этой главы приведен список расширений набора команд, которые введены в ассемблер MPASM, и даны соответствующие им эквиваленты команд PICMicro.
148 Часть 4. Микроконтроллеры PICMICRO Команда: bcf Register, Bit Код команды: 01 OObb bfff ffff Т - Регистр «Ь» - Номер бита Путь данных Число командных Выполнение: Пример: Register <- Register & (OxOFFA ( 1 « Bit )) циклов: 1 Тип микроконтроллеров: средние модели bcf PORTB, 3 ; Сбросить бит Portb.3 Примечание: Не рекомендуется использование команд «bcf» и «bsf» для портов ввода/вывода (как в приведенном примере) Команда 28.34. Команда bcf register, bit в PICMicro. Команда: bsf Register, Bit Выполнение: Register <- Register I (1 « Код команды: 01 01 bb bfff ffff “f" - Регистр «Ь» - Номер бита Путь данных Пример: Число командных Bit) циклов: 1 Тип микроконтроллеров: средние модели bsf PORTB, 3 ; Установить в 1 бит Portb.3 Примечание: Не рекомендуется использование команд «bcf» и «bsf» для портов ввода/вывода (как в приведенном примере) Команда 28.35. Команда bsf register, bit в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 149 Команда: btfsc Register, Bit Выполнение: PC <-(PC + 1) & Reg & Пример: (1 « Bit) btfsc STATUS, Z goto Label ; Перейти, если Код команды: 01 10bb bfff ffff “f" - Регистр «Ь>> - Номер бита .... Путь данных Путь номера бита Инкремент РС Число командных циклов: 1 Тип микроконтроллеров: средние модели равно нулю Примечание: Применение битовых команд пропуска является основным спо- собом реализации ветвлений по результатам сравнения Команда 28.36. Команда btfsc register, bit в PICMicro. Команда: btfss Register, Bit Выполнение: PC <- (PC + 1) & Reg Л Код команды: 01 11bb bfff ffff “f” - Регистр «Ь» - Номер бита .... Путь данных ....ф» Путь номера бита Пример: (1 « Bit) btfss STATUS, Z goto Label ; Перейти, если - - - - ф- Инкремент РС Число командных циклов: 1 Тип микроконтроллеров: средние модели не равно нулю Примечание: Применение битовых команд пропуска является основным спо- собом реализации ветвлений по результатам сравнения Команда 28.37. Команда btfss register, bit в PICMicro.
150 Часть 4. Микроконтроллеры PICMICRO Команды старших моделей PICMicro (серия 17С4х) Если вы применяете в своих разработках старшие модели PICMicro (серия 17Схх), то, вероятно, заметили, что несколько команд, используемых в этих микроконтроллерах, не были описаны выше. Набор команд для серии 17Схх насчитывает свыше 55 команд, в то время как младшие и средние модели PICMicro реализуют немногим более 30 команд. Дополнительные команды серии 17Схх можно разбить на три типа: до- полнительные арифметические команды, команды пересылки данных и ко- манды чтения и записи табличных элементов. Я не хочу останавливаться на дополнительных арифметических командах, так как они выполняются ана- логично командам, описанным выше. Они просто обеспечивают расширение функций (например, реализацию умножения 8x8 бит) для старших моделей PICMicro по сравнению с младшими и средними моделями этого семейства. Команды пересылки данных заменяют команду «movf», используемую в других моделях PICMicro. Для пересылки данных между основными регистра- ми и банками регистровых файлов применяются команды «movfp» и «movpf» (команда 23.38.) Тип микроконтроллеров: Пример. старшие модели movfp PORTB, w ; Соответствует команде «movf PORTB, w» ; в младших и средних моделях Примечание: Старшие модели микроконтроллеров используют команды «movfp» и «movpf», которые аналогичны командам «movf» и «movwf» в наборе ко- манд младших и средних моделей Команда 28.38. Команда movfp freg, preg в PICMicro.
Глава 28. Система команд микроконтроллеров PICMICRO 151 Описание команд, используемых в старших моделях для работы с табли- цами, выходит за рамки этой книги. Если сказать кратко, то применение этих команд позволяет осуществлять доступ к большим таблицам, расположен- ным в памяти программ, устраняя, таким образом, барьер между простран- ством команд и пространством данных. Эта память программ обычно состоит из внешних микросхем памяти RAM, подключаемых к микроконтроллеру PICMicro, но это также могут быть устройства ввода-вывода, которые входят в общее адресное пространство памяти и реализуют передачу 8-разрядных данных. Во время выполнения такой передачи остальные 8 разрядов 16-раз- рядной шины не должны быть активными, чтобы избежать возникновения конфликтов на шине. Чтобы произвести чтение или запись таблицы, необходимо сначала уста- новить указатель на адрес таблицы. После этого производится передача |6- разрядных данных между микроконтроллером PICMicro, который использу- ет специальные регистры-защелки для табличного обмена, и внешним устройством (команда 28.39). В большинстве приложений микроконтроллеры серии 17С4х работают так же, как другие модели PICMicro, но их характеристики расширяют возмож- ности применения и позволяют реализовать более сложные функции. Код команды: 1010 11 ti ffff ffff Команда: tablwt t, i, f «t» - Обновление содержимого TBLAT «I» - Инкремент содер- жимого TBLPTR «f>> - Номер файлового регистра Выполнение: if t == 0 TBLATL <- fReg else TBLATH <—fReg ProgMem <- TBLAT if i == 1 TBLPTR++ Число командных циклов: 1 Тип микроконтроллеров: старшие модели Команда 28.39. Команда tablwt t, i, f в PICMicro.
152 Часть 4. Микроконтроллеры PICMICRO Расширения MPASM Поддерживаемый фирмой Microchip ассемблер MPASM реализует ряд спе- циальных команд, которые позволяют упростить написание программ для микроконтроллеров PICMicro. Ниже приведен список команд для младших и средних микроконтроллеров этого семейства. Команда Описание команды Число циклов Влияние на флаги Действительный код PICMicro bz Label Переход, если флаг нуля Z—I 2-3 Нет btfsc STATUS, Z goto Label Clrc Сброс в 0 флага С (пе- ренос) I С bcf STATUS, C Clrdc Сброс в 0 флага DC (межтетрадный перенос) I DC bcf STATUS, DC clrz Сброс в 0 флага Z (нуль) I Z bcf STATUS, Z Icall Label Вызов подпрограммы с другой страницы 2-4 Нет Зависит от типа PICMicro и адре- са метки Igoto Label Переход к метке на дру- гой странице 2-4 Нет Зависит от типа PICMicro и адре- са метки movfw Reg Пересылка в W содер- жимого Reg I Z movf Reg, w negf Reg Reg = - Reg 2 Z comf Reg incf Reg setc Установка в I флага пе- реноса С I С bsf STATUS, C setdc Установка в I флага DC I DC bsf STATUS, DC setz Установка в I флага нуля Z I Z bsf STATUS, Z skpc Пропуск команды, если флаг С= I I Нет btfss STATUS, C skpdc Пропуск команды, если флаг DC=l I Нет btfss STATUS, DC skpnc Пропуск команды, если флаг С=0 I Нет btfsc STATUS. C skpndc Пропуск команды, если флаг DC=0 I Нет btfsc STATUS, DC skpnz Пропуск команды, если флаг Z=0 1 Нет btfsc STATUS, Z
Глава 28. Система команд микроконтроллеров PICMICRO 153 Команда Описание команды Число циклов Влияние на флаги Действительный код PICMicro skpz Пропуск команды, если флаг Z=l I Нет btfss STATUS, Z snbcf Reg, d Декремент Reg, если флаг С= I 2 Z btfsc STATUS. C decf Reg, d subdcf Reg, d Декремент Reg, если флаг DC=I 2 Z btfsc STATUS, DC decf Reg, d tstf Reg Установка флага Z= I, если содер- жимое Reg =0 I Z movf Reg Набор команд Parallax PICMicro Фирмой Parallax Inc. написан для микроконтроллеров PICMicro очень попу- лярный ассемблер, который называется PASM. В нем используется язык ас- семблера. команды которого очень похожи на команды микроконтроллера i805l. Данный ассемблер поддерживает также стандартный формат команд MPASM фирмы Microchip. Часть команд этого ассемблера разработана специально для младших мо- делей PICMicro. Поэтому, если вы работаете с микроконтроллерами средне- го уровня, то эти команды не должны использоваться. Необходимо отметить, что многие из используемых в PASM мнемоничес- ких команд заменяются несколькими командами PICMicro и могут привести к неожиданным изменениям содержимого регистров STATUS и W. Напри- мер, для меня стало большой проблемой выяснить, какие операции выпол- няет расширенная команда MOV, которая позволяет выбирать многие из команд PICMicro (смотрите ниже). Существенным преимуществом PASM является то. что многие его ко- манды являются более ортогональными, то есть, предоставляют больше раз- личных способов доступа к регистрам. Другое преимущество PASM состоит в том, что микроконтроллеры PICMicro становится более доступными хая пользователей, которые освоили i8051. Некоторым пользователям команды PASM нравятся потому, что в них более ясно определяется размещение ре- зультата операции - обратно в файловый регистр или в регистр W. Набор команд для PICMicro, предлагаемый фирмой Parallax, во многом подобен расширенному набору команд фирмы Microchip, которая представлена выше. Как и расширенный набор команд Microchip, команды Parallax могут эф- фективно использоваться только в том случае, если пользователь их хорошо понимает и правильно применяет. Ассемблер PASM доступен пользователям на Web-сайте фирмы Parallax. В приведенной ниже таблице команд PASM используются следующие обозна- чения:
154 Часть 4. Микроконтроллеры PICMICRO # - непосредственно заданная константа; fr — файловый регистр; Parm — поле параметров, варианты которого приведены для данной ко- манды в следующих строках таблицы. Символом * в таблице отмечены команды, которые используются только при работе с младшими моделями PICMicro. Команда PASM Описание команды Число циклов Влияние на контекст Действительный код PICMicro CLR Parm “W” Установка парамет- ра в 0 W=0 I z clrw fr fr=O I z clr fr WDT MOV Parm WDT=0 Пересылка данных I _TO, PD clrwdt “W, #” W = # I Нет movlw # “W, fr’ W = fr I Z movf fr, w “W, /fr” W = fr ' OxOFF I Z comf fr, w “W, fr-W” W=fr+(VCOxOFF)+l I Z, C, DC subwf fr, w “W, ++fr” W = fr + I I Z incf fr, w “W, —fr” W = fr - I I Z decf fr, w “W, »fr” W = fr » I I C rrf fr, w “W, <<fr” W = fr « I I C rlf fr, w “W, ofr” W = NibSwap fr I Нет swapf fr, w “fr, W” fr — W I Нет movwf fr, w “IPort, W” TRIS = W I Нет tris Port “IPort, #” TRIS = # 2 W movlw # tris Port “'Port, #’ “OPTION, W” TRIS = fr OPTION = W 2 I W, Z Нет movf fr, w tris Port option “OPTION, #” OPTION = # 2 W movlw # option “OPTION, fr” OPTION = fr 2 W, Z movf fr, w option “fr, #” fr = # 2 Нет movlw # movwf fr “fr, fr2” fr = fr2 2 Z movf fr2, w movwf fr
Глава 28. Система команд микроконтроллеров PICMICRO 155 Команда Описание команды Число Влияние на Действительный PASM ЦИКЛОВ контекст код PlCMicro ADD Parm Сложение двух чисел “W, fr” W = W + fr I Z, C, DC addwf fr, w “fr, W” fr = W + fr I Z, C, DC addwf fr, f “fr, #” fr = fr + # 2 W, Z, C, DC movlw addwf # fr, f “fr, fr2” SUB Parm fr = fr + fr2 Вычитание 2 W, Z, C, DC movf addwf fr2, w fr, f “fr, W” fr=fr+(WAOxOFF)+1 I Z, C, DC subwf fr, f “fr, #” fr=fr+(#"‘OxOFF)+ ] 2 W, Z, C, DC movlw subwf # fr, f “fr, fr2” AND Parm fr=fr+(fr2A0x0FF)+1 Операция AND 2 W, Z, C, DC movf subwf fr2, w fr, f “W, W = W & # I Z andlw # “W, fr” W = W & fr I Z andwf fr, w “fr, W” fr = W & fr I Z andwf fr, f “fr, #” fr = fr & # 2 W, Z movlw andwf # fr, f “fr, fr2” OR Parm fr = fr & fr2 Операция OR 2 W, Z movf andwf fr2, w fr, f “W, #” W = W | # I Z iorlw # “W, fr” W = W I fr I Z iorwf fr, w “fr, W’ fr = W | fr I Z iorwf fr, f “fr, #” fr = fr I # 2 W, Z movlw iorwf # fr, f “fr, fr2’ XOR Parm fr = fr I fr2 Операция XOR 2 w, z movf iorwf fr2, w fr, f “W, #” W = W A # I z xorlw # “W, fr’ W = W A fr I z xorwf fr, w “fr, W” fr = W л fr I z xorwf fr, f “fr, #” fr = fr ' # 2 w, z movlw xorwf # fr, f
156 Часть 4. Микроконтроллеры PICMICRO Команда PASM Описание команды Число циклов Влияние на Действительный контекст код PICMicro “fr, fr2’ DEC Parm fr = fr - fr2 Декремент содержи- мого регистра 2 w, z movf fr2, w xorwf fr, f “fr” INC Parm fr = fr - I Инкремент содер- жимого регистра I z decf fr, f “fr" NEG Parm fr = fr + I Изменение знака (перевод в дополнит, код) I z incf fr, f “fr” NOT Parm fr = 0 - fr Инверсия битов 2 z comf fr, f incf fr, f “W” W = W Л OxOFF I z xorlw OxOFF “r” TEST Parm fr = fr А OxOFF Тестирование пара- метра на равенство нулю I z comf fr “W’ Z = ( W == 0) I z iorlw OxOFF “fr” RR Parm Z = ( fr == 0) Сдвиг содержимого регистра вправо I z movf fr RL Parm fr = fr » I Сдвиг содержимого регистра влево I c rrf fr, f “fr" SWAP Parm fr = fr << I Поменять местами тетрады регистра I c rlf fr, f “fr" fr = fr О fr I Нет swapf fr, f CLRB fr, bit fr.bit = 0 I Нет bef fr, bit SETB fr, bit fr.bit = I I Нет bsf fr. bit CLC C = 0 I Нет bef STATUS, C STC C = I I Нет bsf STATUS, C CLZ Z = 0 I Нет bef STATUS, Z STZ Z = I I Нет bsf STATUS, Z
Глава 28. Система команд микроконтроллеров PICMICRO 157 Команда PASM Описание команды Число циклов Влияние иа контекст Действительный код PICMicro ADDB fr, bit fr = fr + bit 2 Z btfsc fr, bit incf fr, f SUBB fr, bit fr = fr - bit 2 Z btfss fr, bit decf fr, f MOVB fr.b, fr2.b2 Переслать бит 4 Нет btfss fr2, b2 bcf fr, b btfsc fr2, b2 bsf fr, b MOVB fr.b, / fr2.b2 NOP Переслать инвер- тированный бит Отсутствие опера- ции 4 I Нет Нет btfsc fr2, b2 bcf fr, b btfss fr2, b2 bsf fr, b nop SLEEP Переход в режим sleep N/A _ТО, PD sleep ‘LSET Addr MOVSZ Parm Установка номера страницы перед переходом Пропустить, если результат равен 0 0-2 РАО, РА! bcf/bsf STATUS, РАО (установка но- мера страницы в регистре STATUS) “W, ++fr” W = fr + I 1/2 W incfsz fr,w “W, —fr” W = fr - I 1/2 W decfsz fr, b INCSZ fr w = fr + I; если Z=l, то пропуск команды 1/2 W incfsz fr,f DECSZ fr W = fr - l; если Z= I, то пропуск команды 1/2 W decfsz fr.f SB fr, bit Пропуск команды, если бит = I 1/2 Нет btfss fr, bit SNB fr, bit Пропуск команды, если бит = 0 1/2 Нет btfsc fr, bit SC Пропуск команды, если С = I 1/2 Нет btfss STATUS. C
158 Часть 4. Микроконтроллеры PICMICRO Команда PASM Описание команды Число циклов Влияние на Действительный код контекст PICMicro SNC Пропуск команды, если С = 0 1/2 Нет btfsc STATUS, С SZ Пропуск команды, если Z = I 1/2 Нет btfss STATUS, Z SNZ Пропуск команды, если Z = 0 1/2 Нет btfsc STATUS, Z CJA fr, # Пропуск команды, если fr > tt 3/4 W, С, DC, Z movlw tt addwf fr, w btfss STATUS, C CJA fr, fr2 Пропуск команды, если fr>fr2 3/4 W. С, DC, Z movf fr, w subwf fr2. w btfss STATUS, C CJAE fr, # Пропуск команды, если fr >= tt 3/4 W, С. DC. Z movlw tt subwf fr. w btfss STATUS, C CJAE fr, fr2 Пропуск команды, если fr >= Гг2 3/4 W. С, DC, Z movf fr2. w subwf fr, w btfss STATUS, C CSB fr, # Пропуск команды, если fr < # 3/4 W, С, DC, Z movlw tt subwf fr, w btfsc STATUS. C CSB fr, fr2 Пропуск команды, если fr < fr2 3/4 W, С, DC, Z movf fr2, w subwf fr, w btfsc STATUS, C CSBE fr, # Пропуск команды, если fr <= tt 3/4 w. С, DC, Z movlw tt subwf fr, w btfsc STATUS. C CSBE fr, fr2 Пропуск команды, если fr <= fr2 3/4 w. С, DC, Z movf fr. w subwf fr2. w btfss STATUS, C CSE fr, # Пропуск команды, если fr == tt 3/4 W, С. DC, Z movlw tt subwf fr, w btfss STATUS, Z CSE fr, fr2 Пропуск коман- ды, если fr == Гг2 3/4 W, С, DC. Z movf fr2. w subwf fr, w btfss STATUS. Z
Глава 28. Система команд микроконтроллеров PICMICRO 159 Команда PASM Описание команды Число циклов Влияние на контекст Действительный код PlCMicro CSNE fr, # Пропуск команды, если fr != # 3/4 W, С, DC, Z movlw # subwf fr, w btfsc STATUS, Z CSNE fr,fr2 JMP Parm Пропуск команды, если fr != fr2 Переход по адресу 3/4 W, С, DC, Z movf fr2, w subwf fr, w btfsc STATUS, Z * “addr9” PC = 9-разрядный адрес 2 Нет goto addr9 “PC+W” PC = РС + смеще- ние из W 2 Z, С, DC addwf PCL, f “W” РС = W 2 Нет movwf PCL ‘CALL addr8 Вызов подпрограм- мы 2 Нет call addr8 RET Возврат из подпрог- раммы и W = 0 2 W retlw 0 ‘SKIP Пропуск следую- щей команды 2 Нет btfss FSR, 7 (бит 7 в регистре FSR всегда равен 0) *LJMP addr Выполнить LSET перед JM Р 2-5 РАО- РА2 bcf/bsf STATUS,РАх goto addr ‘LCALL addr Выполнить LSET перед CALL 2-5 РА0-РА2 bcf/bsf STATUS,PAx goto addr RETW ‘String’ Возврат таблицы 2 W retlw ‘S’ retlw ‘t’ retlw ‘r’ retlw ‘i’ retlw ‘n’ retlw ‘g’ IJNZ fr, addr9 Инкремент/ переход 2/3 Нет incfsz fr, f goto addr9 DJNZ fr, addr9 Декремент/ переход 2/3 Нет decfsz fr, f goto addr9
160 Часть 4. Микроконтроллеры PICMICRO Команда PASM Описание команды Число циклов Влияние i контекст на Действительный код PICMicro JB fr, bit, addr9 Переход, если бит установлен в I 2/3 Нет btfsc fr, f goto addr9 JNB fr, bit, addr9 Переход, если бит сброшен в 0 2/3 Нет btfss fr, f goto addr9 JC addr9 Переход, если С = I 2/3 Нет btfsc STATUS, C goto addr9 JNC addr9 Переход, если С = 0 2/3 Нет btfss STATUS, C goto addr9 JZ addr9 Переход, если Z =1 2/3 Нет btfsc STATUS, Z goto addr9 JNZ addr9 Переход, если Z = 0 2/3 Нет btfss STATUS, Z goto addr9 CJA fr, #, addr9 Переход по адресу addr9, если fr > # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS, C goto addr9 CJA fr, fr2, addr9 Переход по адресу addr9, если fr > fr2 4/5 W, С, DC, Z movf fr, w subwf fr2, w btfss STATUS, C goto addr9 CJAE fr, #, addr9 Переход по адресу addr9, если fr >= # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS, C goto addr9 CJAE fr,fr2, addr9 Переход по адресу addr9, если fr >=fr2 4/5 W, С, DC, Z movf fr2, w subwf fr, w btfsc STATUS, C goto addr9 CJB fr, #, addr9 Переход по адресу addr9, если fr < # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS, C goto addr9 CJB fr, fr2, addr9 Переход по адресу addr9, если fr < fr2 4/5 W, С, DC, Z movf fr2, w subwf fr, w btfss STATUS, C
160 Часть 4. Микроконтроллеры PICMICRO Команда PASM Описание команды Число циклов Влияние । контекст на Действительный код PICMicro JB fr, bit, addr9 Переход, если бит установлен в I 2/3 Нет btfsc fr, f goto addr9 JNB fr, bit, addr9 Переход, если бит сброшен в 0 2/3 Нет btfss fr, f goto addr9 JC addr9 Переход, если С = I 2/3 Нет btfsc STATUS, C goto addr9 JNC addr9 Переход, если С = 0 2/3 Нет btfss STATUS, C goto addr9 JZ addr9 Переход, если Z =1 2/3 Нет btfsc STATUS, Z goto addr9 JNZ addr9 Переход, если Z = 0 2/3 Нет btfss STATUS, Z goto addr9 CJA fr, #, addr9 Переход по адресу addr9, если fr > # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS, C goto addr9 CJA fr, fr2, addr9 Переход по адресу addr9, если fr > fr2 4/5 W, С, DC, Z movf fr, w subwf fr2, w btfss STATUS, C goto addr9 CJAE fr, #, addr9 Переход по адресу addr9, если fr >= # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS, C goto addr9 CJAE fr,fr2, addr9 Переход по адресу addr9, если fr >=fr2 4/5 W, С, DC, Z movf fr2, w subwf fr, w btfsc STATUS, C goto addr9 CJB fr, #, addr9 Переход по адресу addr9, если fr < # 4/5 W, С, DC, Z movlw # subwf fr, w btfss STATUS. C goto addr9 CJB fr, fr2, addr9 Переход по адресу addr9, если fr < fr2 4/5 W, С, DC, Z movf fr2, w subwf fr, w btfss STATUS, C
Глава 28. Система команд микроконтроллеров PICMICRO 161 Команда PASM Описание команды Число циклов Влияние на контекст Действительный код PlCMicro CJBE fr, #, Переход по адресу 4/5 W, С, DC, Z goto addr9 movlw # addr9 CJBE fr,fr2, addr9, если fr <= # Переход по адресу 4/5 W, С, DC, Z addwf fr, w btfss STATUS, C goto addr9 movf fr, w addr9 CJE fr, #, addr9, если fr <=f r2 Переход по адресу 4/5 W, С, DC, Z subwf fr2, w btfsc STATUS, C goto addr9 movlw # addr9 CJE fr, fr2, addr9, если fr == # Переход по адресу 4/5 W, С, DC, Z subwf fr, w btfsc STATUS, Z goto addr9 movf fr2, w addr9 CJNE fr, #, addr9, если fr == fr2 Переход по адресу 4/5 W, С, DC, Z subwf fr, w btfsc STATUS, Z goto addr9 movlw # addr9 CJNE fr,fr2, addr9, если fr != # Переход по адресу 4/5 W, С, DC, Z subwf fr, w btfss STATUS, Z goto addr9 movf fr2, w addr9 addr9, если fr != fr2 subwf fr, w btfss STATUS, Z goto addr9 11 Зак. 2025.
глава 29 ПРИМЕРЫ ПРИМЕНЕНИЯ PICMICRO Краткое содержание Создание первого приложения на базе PICMicro Цифровые часы/Термометр Язык PICLite и приложение «Цифровые часы/Термометр» Определение языка PICLITE Начинающие разработчики чаще всего используют в своих устройствах мик- роконтроллеры PICI6F84, потому что они содержат память программ на ос- нове EEPROM, которая позволяет быстро изменять программный код, не производя стирание памяти ультрафиолетовым светом. Этот микроконтрол- лер поставляется в 18-выводном DIP-корпусе и может быть запрограммиро- ван с помощью множества различных программаторов. В PICI6F84 использу- ется процессор, работающий с 14-разрядными командами и обеспечивающий поддержку прерываний. Этот микроконтроллер относится к разряду модетей PICMicro среднего уровня. Данная глава специально написана дтя того, что- бы показать, как функционируют PICMicro в различных приложениях. Большая часть документации, содержащейся в книгах и имеющейся в сети Internet, представляет микроконтроллер PICI6C84, как наиболее доступный для начинающих разработчиков. Однако в 1997 году этот микроконтроллер был объявлен морально устаревшим, и его место занял 16F84. Эти два мик- роконтроллера практически идентичны, за исключением некоторых отличий в регистре конфигурации. Кроме того, I6F84 имеет больше файловых регис- тров. Программирование 16F84 и I6C84 производится идентичным образом. Первое приложение PICMicro Чтобы создать программный код, показывающий как PICMicro включается и выполняет и выполняет программу, была разработана схема, реализованная на базе прототипной системы (рис.29.1).
Глава 29. Примеры применения PICMICRO 163 Vcc Vcc Рис.29.1. Схема управления светодиодами с помощью PICMicro. При разработке первой программы я хотел обеспечить мерцание одного из светодиодов с частотой, позволяющей наблюдать ее визуально. В этом слу- чае для наблюдения за выходным сигналом не требуется осциллограф. Я хо- тел также, чтобы это мерцание производилось с помощью прерываний, ини- циируемых таймером. В конечной версии была реализована процедура опроса состояния кнопочного переключателя, которая выполнялась основной про- граммой и не оказывала влияния на мерцание светодиода. Частота тактового сигнала составляла I МГц, а это означает, что реальная частота выполнения команд равна 250 КГц. Максимально возможная задерж- ка таймера TMR0 с учетом того, что ни его входе используется прелделитель с коэффициентом деления 256, составляет 65536 командных циклов. Таким образом, светодиод должен мерцать с частотой порядка двух раз в секунду. С учетом вышесказанного была написана программа «ProgI»: title “PROG1 - Flash an LED.” ; Первая программа для PIC контроллера. ; Предназначена для управления светодиодом. ; myke predko ; 95.05.17 Примечания к аппаратной реализации: Контроллер PIC работает на частоте 1 МГц, которая задается с помощью кристалла кварца и двух конденсаторов емкостью по 33 пФ. Вход запуска подключен к напряжению питания через резистор номиналом ЮК.
164 Часть 4. Микроконтроллеры PICMICRO ; Вывод RBO является выходом и соединен со светодиодом через ; резистор номиналом 220 Ом, другой вывод светодиода ; подключен к шине питания. LIST Р=16С84, R=DEC errorlevel 0,-305 INCLUDE “c:\mplab\p16c84.inc” ; Общие определения ; Используемые регистры CBLOCK ОхООС _w, -Status ; Сохраняемые контекстные регистры Count ENDC PAGE -CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF ; Сторожевой таймер отключен ; Код для Progl org 0 goto Mainline ; Пропустить обработчик прерываний org 4 Int ; Обработчик прерываний movwf _w ; Сохранить контекстные регистры movf ’STATUS, w movwf -Status bcf INTCON, TOIF ; Сбросить флаг прерывания movlw 1 ; Изменить состояние сигнала на xorwf PORTB ; выходе RB0 movf ^status, w ; Восстановить содержимое movwf STATUS ; контекстных регистров swapf _w swapf _w, w retfie
Главе 29. Примеры применения PICMICRO 165 Mainline bsf STATUS, RPO bcf TRISB & 0x07F, 0 ; Инициализировать RBO movlw 0x0D7 ; Разрешить работу таймера movwf OPTION, REG & 0x07F bcf STATUS, RPO bcf PORTB, 0 clrf TMRO ; Сбросить таймер movlw OxOAO ; Разрешить обработку movwf goto INTCON $ ; прерываний таймера ; Бесконечный цикл end Если эту программу представить с помощью псевдокода, то она будет выглядеть следующим образом: RBO = Output ; Сконфигурировать RBO в ; качестве выхода Prescaler = TMRO ; Инициализировать таймер Prescaler = 256 TMRO = О TMRInterrupt = Enabled While 1 == 1 ; Вечный цикл в основной программе TMRInt ; Прерывание таймера TMRInterrupt = Reset RBO = RBO Л 1 ; Изменить состояние сигнала ; на выходе Return from Interrupt Конечная версия первого приложения Prog2 построена на базе этого псев- докода, в котором была немного модифицирована основная программа Mainline. Псевдокод основной программы изменился следующим образом (символом * отмечены добавленные строки кода): RBO = Output *RB4 = Output ; Сконфигурировать RBO и RB4 в ; качестве выходов Prescaler = TMRO ; Выполнить инициализацию таймера
166 Часть 4. Микроконтроллеры PICMICRO Prescaler = 256 TMRO = О TMRInterrupt - Enabled While 1 == 1 * if RB5 == 0 * RB4 = 0 * else * RB4 = 1 ; Вечный цикл в основной программе ; Кнопка нажата Как вы можете видеть, единственная разница между Progl и Prog2 заклю- чается в дополнительном коде, который используется для опроса состояния кнопочного переключателя (SW на рис.29.1) и управления светодиодом LED2 в зависимости от результата опроса. title “PROG2 - Flash ап LED and Show Button Input.” ; Это модификация первой программы для PIC. Она предназначена ; для реализации мигания первого светодиода и опроса состояния ; кнопочного переключателя, если на вход поступает низкий ; уровень сигнала, то загорается второй светодиод. ; myke predko ; 95.05.17 ; Примечания к аппаратной реализации: ; Контроллер PIC работает на частоте 1 МГц, которая задается с помощью кристалла кварца и двух конденсаторов емкостью ; по 33 пФ. ; Вход запуска подключен к напряжению питания через резистор ; номиналом ЮК. ; Вывод RB0 является выходом и соединен со светодиодом через ; резистор номиналом 220 Ом, другой вывод светодиода ; подключен к шине питания. ; Вывод RB4 является выходом и соединен со светодиодом через ; резистор номиналом 220 Ом, другой вывод светодиода ; подключен к шине литания. ; Вывод RB5 соединен с резистором номиналом ЮК, подключенным ; к шине питания, и кнопочным переключателем, подключенным ; к “земле”. LIST Р=16С84, R=DEC errorlevel 0,-305 INCLUDE “c:\mplab\p16c84.inc”
Глава 29. Примеры применения PICMICRO 167 ; Общие определения ; Используемые регистры CBLOCK ОхООС _w, status ; Сохраняемые контекстные регистры Count ENDC PAGE _CONFIG ..СР .OFF & XT_OSC & _.PWRTE _ON & WDT _OFF ; Сторожевой таймер откпючен ; Код для Prog2 org 0 goto Mainline ; Пропустить обработчик прерываний org 4 Int ; Обработчик прерываний movwf _w ; Сохранить контекстные регистры movf STATUS, w movwf _status bcf INTCON, TOIF ; Сбросить флаг прерывания movlw 1 ; Изменить состояние сигнала на xorwf PORTB ; выходе RBO movf „status, w ; Восстановить содержимое movwf STATUS ; контекстных регистров swapf _w swapf w, w retfie Mainline bsf STATUS, RPO movlw OxOEE ; Инициализировать RBO и RB4 movwf TRISB & 0x07F movlw 0x0D7 ; Разрешить работу таймера movwf OPTION_REG & 0x07F bcf STATUS, RPO bcf PORTB, 0
168 Часть 4. Микроконтроллеры PICMICRO clrf TMRO ; Сбросить таймер movlw OxOAO ; Разрешить обработку прерываний таймера movwf INTCON Loop ; Цикл опроса входного сигнала btfsc PORTB, 5 ; Проверить состояние входного сигнала goto SetBit ; Бит установлен bcf PORTB, 4 ; Переключатель активен, включить LED goto Loop SetBit ; Установить бит bsf PORTB, 4 goto Loop end Как я всегда стараюсь делать при разработке программного обеспечения, я проанализировал программу в поисках возможностей улучшения ее отдель- ных частей. Наиболее явной частью кода, которая может быть улучшена, яв- ляется процедура передачи входного бита, указывающего состояние пере- ключателя, на вывод, управляющий вторым светодиодом. В приведенном выше примере программный код соответствует уровню, который можно получить с помощью хорошего оптимизирующего компиля- тора с языка С после ввода следующего исходного текста: if ( ( PORTB & 0x010 ) == 0 ) PORTB = PORTB & OxODF; else PORTB = PORTB I 0x020; Однако этот код можно написать по-другому, без использования опера- тора IF, и он будет иметь вид: PORTB = ( PORTB & OxCF ) I ( ( PORTB < < 1 ) & OxODF ); Возможно, это выражение покажется слишком запутанным, но на языке ассемблера PICMicro оно будет представлено следующим образом: rlf PORTB, w ; Сдвинуть содержимое PORTB на 1 ; и поместить в W andlw 0x020 ; Выделить бит состояния переключателя SW bcf PORTB, 5 ; Выключить светодиод
Глааа 29. Примеры применения PICMICRO 169 iorwf PORTB ; Если бит SW равен 1, то переслать его на ; выход светодиода Этот код проще, так как содержит меньшее количество команд, и всегда выполняется за одинаковое число циклов, тогда как в первоначальном вари- анте установка и сброс состояния выхода, к которому подключен светодиод, осуществлялись различными путями за разное число циклов. Однако при дан- ном варианте кода светодиод будет выключаться на один командный цикл при каждой процедуре опроса переключателя, то есть будет гореть не в пол- ную силу, как будто он управляется ШИМ-сигналом. Кроме того, в отличие от первоначального решения в последнем варианте кода происходят измене- ния содержимого регистра W и флага нуля. Таким образом, кажущийся вна- чале эффективным путь улучшения программного кода может на самом деле оказаться менее привлекательным, чем первоначальное решение. Однако без проведения экспериментов и попыток реализовать различные варианты вы никогда не сможете найти оптимальное решение поставленной задачи. Цифровые часы / Термометр Когда я начал писать эту книгу, я только что закончил просматривать верст- ку своей предыдущей книги «Программирование и применение микроконт- роллеров PICMicro», и поэтому был достаточно высокого мнения о своих знаниях в данной области. Однако разработка приложения, описанного в этой главе, заставила меня более реально оценить свои способности. Проблема возникла с установкой часов реального времени. Как и в других аналогичных приложениях, разработанных мной для дан- ной книги на базе других микроконтроллеров, я решил использовать в дан- ном приложении микроконтроллер, наиболее доступный для начинающих. Поэтому я выбрал из семейства PICMicro модель I6F84, которая содержит 14-разрядное процессорное ядро PICMicro с поддержкой прерываний, один 8-разрядный таймер (TMR0) с предделителем частоты и память программ EEPROM. В качестве частотозадающего элемента использовался кварц с ре- зонансной частотой 1МГц. Схема, спроектированная мной, для реализации этого приложения приведена на рис.29.2. Реализация интерфейса с термодатчиком DS1820 не доставила особых хлопот. Одним из обстоятельств, позволившим существенно упростить созда- ние интерфейса, стало наличие вывода RA4, который является выходом с «открытым стоком». Этот вывод был конфигурирован для работы в качестве выхода, и на нем устанавливался низкий потенциал, только когда PICMicro связывался с DS1820. Программа для данного приложения называется «Thermo5» и расположена в директории, где находятся все приложения для микроконтроллеров PICMicro. Часы реального времени запускаются обработчиком прерывания, затем они отсчитывают 50000 циклов, что при четырех тактах на цикл составляет 200 мс или одну пятую секунды. После сброса счетчика в нуль обработчик прерываний перезагружает счетчик и ожидает истечения следующей одной пятой секунды. Код обработчика прерываний очень прост:
170 Часть 4. Микроконтроллеры PICMICRO Рис.29.2. Цифровые часы/термометр на базе PlCMicro. Int ; Обработчик прерываний movwf _w movf STATUS, w movwf _status bcf INTCON, TOIF ; Сбросить флаг запроса прерывания call Dlay64 ; Выполнить задержку в 72 цикла call Dlay8 • movlw TMRStart ; Теперь ожидать выполнения 50000 ; циклов movwf TMRO movf status, w movwf STATUS swapf _w swapf _w, w retfie В основной программе реализован базовый цикл, в котором осуществля- ется слежение за таймером TMR0 и выполняется инкремент субсекундного счетчика каждый раз после сброса TMR0. При достижении содержимым это- го счетчика значения 5 производится инкремент секундного счетчика, а при достижении последним значения 60, будет в свою очередь увеличен на еди- ницу минутный счетчик, и новое время будет отображено на дисплее. Подпрограммы Dlay8 и Dlay64 представляют собой код, выполняющий обычную задержку в 72 командных цикла, который необходим для обеспече-
Глава 29. Примеры применения PICMICRO 171 ния точности установки задержки таймера в 50000 циклов. В их реализации используется стандартная процедура вызова вложенных подпрограмм, обес- печивающая определенное число временных задержек. Программа, реализу- ющая задержку, приведена ниже: Dlay64 ; Задержка в 64 командных цикла call Dlay32 Dlay32 call Dlay16 Dlay16 call Dlay8 Dlay8 call Dlay4 Dlay4 return Dlay4 является базовой процедурой, а ее выполнение занимает 4 цикла - два для выполнения команды «call» и два для выполнения команды «return». Эта задержка в четыре цикла используется подпрограммой Dlay8 при вызове Dlay4. Более длительные задержки получаются путем дальнейшего увеличе- ния числа вызовов. Этот метод формирования ряда временных задержек дли- тельностью в несколько командных циклов является достаточно эффектив- ным и гарантирует, что таймер и предделитель будут сброшены в нужное время. Если учесть, что стек имеет глубину, позволяющую выполнить только 8 вложенных подпрограмм, то существует опасность заполнения стека при вызове слишком большого количества вложенных процедур. Например, ис- пользуя вышеприведенный метод, максимальная задержка, которая может быть получена в основной программе, составляет 5I2 циклов. Хотя этот метод выглядит довольно простым, необходимо все-таки убедиться в точности фор- мируемых задержек, что может быть легко сделано с помощью симулятора MPLAB. Так как я уже немного работал с PICMicro, но еще не работал с термомет- ром фирмы Dallas Semiconductor, взаимодействие с которым осуществляется по однопроводному интерфейсу, я главным образом сосредоточил внимание на организации интерфейса с ЖКИ и с DS 1820. В ходе их реализации возникли лишь небольшие проблемы. Исходный текст, который был написан при созда- нии интерфейса с DS1820, находится в файле “ТйегтоЗ”. Разработка про- граммного интерфейса с этим устройством прошла довольно гладко. После того, как.реализация интерфейса с ЖКИ и термометром была за- вершена, я приступил к написанию программы для выполнения функций часов реального времени, используя прерывания таймера PICMicro, генера- ция которых осуществлялась через каждые 50000 циклов, как было показано выше. После запуска прикладной программы я сразу же заметил, что возник- ла проблема — часы довольно заметно отставали. Реально отставание состав- ляло около 30 - 40 секунд в час. Анализируя эту проблему, я нашел, что ошибка часов может достигать 1,25%.
172 Часть 4. Микроконтроллеры PICMICRO Причина ошибки заключалась в использованном способе реализации тай- мера и особенностях функционирования PICMicro. Разработанные часы ре- ального времени и PICMicro оказались несовместимыми по трем причинам. Первая причина заключается в различных временах отклика на прерыва- ние. Обработка прерывания начинается через три или четыре командных цикла после получения запроса. При написании этого кода, я учел задержку обслу- живания прерывания (то есть число циклов, необходимое для перехода к обработке запроса) длительностью в три цикла. Это означает, что при откли- ке на прерывание может быть случайным образом добавлен еше один цикл. Вторая причина того, что разработанное приложение не обеспечивает абсолютной точности, возникает из-за поступления команд, выполняющих- ся за два цикла (например, «goto» или «call»). Если в процессе выполнения такой команды возникает запрос на прерывание, то появляется задержка длительностью в один цикл, чтобы завершить выполнение команды. Это уве- личивает максимальную длительность отклика на прерывание еще на один цикл. Последняя причина несовместимости заключается в том, что во время обмена PICMicro с DSI820 (при чтении или записи), обслуживание преры- ваний запрещено в целях обеспечения необходимых временных характерис- тик обмена. Если прерывание возникает в течение цикла чтения или записи информации в DSI820, то обработка запроса откладывается на некоторое время. Пытаясь устранить эту проблему, я поместил процедуру считывания температуры из DSI820 сразу же после процедуры перезапуска таймера. Это позволило несколько уменьшить ошибку, но ее величина по-прежнему со- ставила несколько десятых долей процента. При этом величина ошибки будет различной в зависимости от времени поступления запроса прерывания. Новая идея возникла, когда я начал разработки на базе микроконтролле- ров семейства 68НС05. В некоторых моделях 68НС05 имеется 16-разрядный счетчик, функционирующий без какого-либо предделителя (его описание дается в главе, посвященной 68НС05). Взглянув на возникшую проблему после изучения 68НС05, я переделал программный код таким образом, чтобы тай- мер был похож на таймер 68НС05, и никогда не требовал перезагрузки. Это- го удалось достичь путем установки предделителя в 256, в результате чего прерывания должны возникать через каждые 65536 командных циклов. При этом обработчик прерываний стал иметь следующий вид: Int movwf movf movwf __w STATUS, w -Status ; Сохранить контекстные регистры bef INTCON, TOIF ; Сбросить флаг прерывания incf Frac3 ; Добавить 64К к содержимому счетчика movf -Status, w ; Восстановить контекстные регистры
Глава 29. Примеры применения PICMICRO 173 movwf STATUS swapf _ w swapf _ w, w retfie При переполнении таймера данный программный код осуществляет сброс флага прерывания и увеличивает на 64К содержимое 24-разрядного счетчика (регистры Fracl - Frac3). Когда пройдет по меньшей мере секунда (то есть установится в I бит 2 в регистре Frac3, показывая, что обработчик прерыва- ния был выполнен около четырех раз. и в 24-разрядном счетчике содержит- ся, по меньшей мере, число 250000, что соответствует I000 тактов или одной секунде), в основном коде программы будет произведено вычитание 250000 из содержимого 24-разрядного счетчика и модифицировано состояние се- кундного счетчика. При использовании такого обработчика прерывании генерация запроса возникает всегда через один и тот же промежуток времени (через 65536 ко- мандных циклов), причем если запрос не может быть обслужен немедленно, то таймер и п реддел и тел ь продолжают работу и после возникновения пере- полнения. Если гарантировать, что прерывание будет обслужено до того, как возникнет следующее переполнение счетчика, то можно не беспокоится о том, что какое-то время будет потеряно. После отладки вышеприведенного кода (тексты ог «2Т11епно1» до «2Т11егшо4») я пришел к выводу, что все проблемы полностью решены, а ошибка теперь составила порядка 0,01 (с. чего и следовало ожидать с учетом погрешности кристалла, используемого в данной аппаратной реализации. Более того, новый код. выполняющий функции часов реального времени получил- ся проще первоначального и не требовал того количества усилий для опреде- ления временных характеристик, которые были затрачены при реализации первого варианта. Если вы посмотрите на исходный текст приложения, то заметите, что серия программ «Thermo» была написана на пару месяцев раньше серии «2Тйегп1о». В реальной жизни очень редко дается возможность вернуться к старому приложению и взглянуть на него с другой стороны, как это было сделано здесь. Но данный опыт показывает, что изучение других микроконт- роллеров может дать полезные идеи, которые в будущем могут быть исполь- зованы при разработке новых приложений. Язык PICLite и приложение «Цифровые часы/Термометр» Разработка компиляторов для PlCMicro стала для меня настоящим хобби. Этот микроконтроллер является довольно интересным устройством с точки зрения написания компиляторов из-за характерных особенное гей в архитектуре про- цессора. Я заинтересовался разработкой нанлучшего языка для PlCMicro. так как не считаю, что ассемблер является лучшим способом разработки прило- жений. Однако большинство языков высокого уровня не позволяют использо-
174 Часть 4. Микроконтроллеры PICMICRO вать все преимущества этого микроконтроллера. Моей основной целью стало создание языка высокого уровня, который можно было бы использовать при написании программ для всех 8-разрядных микроконтроллеров. При разработке компилятора для PICMicro следует обратить внимание на следующие моменты: 1. Возможность сохранения результата операции либо в регистре W, либо в регистре-источнике. 2. Ограниченный объем памяти RAM (в каждом банке только по 100 байтов). 3. Ограниченные возможности индексирования. 4. Наличие регистра PCLATH и реализация переходов в пределах страницы, а также возможность организации таблиц данных в памяти программ. Прочитав это, вы, наверное, решили, что разработка компилятора для PICMicro более сложна, чем для других микроконтроллеров. Но точнее будет сказать, что она несколько отличается от разработки компиляторов для дру- гих устройств. Каждый микроконтроллер, представленный в данной книге, имеет свои особенности, которые делают написание компилятора для него сложным делом. Первым написанным мной компилятором стал компилятор языка С для 16С84. После его создания, я пришел к выводу, что язык С не очень хорошо подходит для микроконтроллерных приложений. Этот язык оперирует боль- шими значениями целых чисел, указателями и структурами данных, кото- рые довольно сложно реализовать на базе скудных ресурсов микроконтролле- ра. Язык С также плохо подходит для реализации регистров, расположенных в памяти по определенным адресам, и обработчиков прерываний, начинаю- щихся с определенного адреса. Позднее я пришел к выводу, что в общем случае к коду приложений, написанных на С, приходится добавлять большое количество ассемблерного кода, что не соответствует поставленной цели. Моей следующей разработкой стал структурированный язык, обладающий возможностью включения в текст ассемблерного кода и назначения опреде- ленных адресов переменным и функциям. Он представлял собой улучшенный С-подобный язык, но по-прежнему сохранились Проблемы с индексным ука- зателем, особенно при работе с массивами переменных. Реально я имел слож- ности только с реализацией таблиц. Вышло так, что таблица переменных мог- ла содержать только до 251 элемента одного типа. Мне очень понравился этот язык, но он мог работать только с микроконтроллерами 16С84. К тому време- ни мой опыт работы с PICMicro значительно вырос, и я начал использовать такие микроконтроллеры, как 16С73А, где имеются более одной страницы памяти программ и более одного банка файловых регистров. Третья разработка, которая и представлена в данной книге, является не- структурированным языком, способным генерировать код для всех PICMicro среднего уровня за исключением микроконтроллеров, имеющих четыре бан- ка файловых регистров. Я начал разрабатывать неструктурированный язык потому, что первоначально предполагалось подключить дополнительный мак- ропроцессор, который позволил бы добавить к разрабатываемому языку чер- ты структурного программирования.
Глава 29. Примеры применения PICMICRO 175 PICLite является очень простым языком, предназначенным для програм- мирования микроконтроллеров PICMicro среднего уровня, которые имеют 14-разрядное процессорное ядро с двумя банками регистров 0 и 1. На сегод- няшний день выходным файлом является файл на языке ассемблера, компи- ляция которого может быть выполнена из командной строки РС-DOS. Если ассемблер сделан хорошо, то его запуск на выполнение может быть произве- ден из среды MPASM (версии 1.40 или выше). Команды ассемблера могут быть непосредственно включены в текст программы без использования спе- циальных операторов или заголовков. Этот язык проще, чем BASIC, но, как я считаю, он хорошо организован и оптимизирован. Исходные тексты могут быть любого размера и ограничены только наличием свободного пространства на вашем жестком диске. Реализо- вана поддержка как 8-разрядных (байт) так и 16-разрядных (слово) перемен- ных и массивов переменных, однако регистры, размещаемые по определен- ным адресам, могут быть только 8-разрядными. Для выражений присваивания я, по возможности, постарался сохранить соглашения языка С. Осуществляется также поддержка прерываний PICMicro, а их реализация довольно проста. Если в конце основного кода поместить метку «int:», то это вызовет автоматическую вставку заголовка обработчика прерываний, а пос- ледующий код будет интерпретироваться как тело обработчика прерываний. В конце программы помещается оператор возврата из прерывания. Этот язык был разработан в результате дискуссии, проводившейся на стра- ницах P1CL1ST. Если вы имеете какие-либо соображения по поводу языка, пожалуйста, сообщите мне об этом тем же способом. ОПРЕДЕЛЕНИЯ ЯЗЫКА PICLITE Опции командной строки: [D:] [Path] FileNamef.Ext] - Диск/Путь Ввод исходного файла - Разрешение отладки (Не удалять файл ,~tm) I - Отсутствие отклика (Не печатать результаты) /С - Генерировать файлы MPLAB Вызов осуществляется следующим образом: PICLite [D:] [Path] FileName[.Ext] [.][!] Выходными файлами являются. FileName.lst FileName.asm FileName.~tm - Файл листинга - Файл с ассемблерным текстом в формате MPASM - Временный файл, необходимый для отладки Определения языка: Адресные метки ( Учитывается верхний/нижний регистр клавиатуры): Label {:} - Метка должна начинаться с первого столбца строки (все остальные команды должны начинаться с любого столбца, кроме первого).
176 Часть 4. Микроконтроллеры PICMICRO - Использование знака в конце метки необязатель- но, если в строке присутствует только метка, но если в той же строке есть выражение, например, “А = В + С”, то знак ставить необходимо. Объявление переменных/констант/регистров: Label { [Array] } DataType {= InitValue] - Элементами массивов могут быть только байты или слова. - InitValue может быть только байтом или словом, но не массивом. - Выражение должно начинаться с первого столбца. Типы данных (Учитывается верхний/нижний регистр клавиатуры): - value - Постоянная величина. byte - Файловый регистр. word - Два файловых регистра в формате Intel @ addr @ addr - Заранее определенный аппаратный регистр. - Для адресации к теневым регистрам Addr необходи- мо умножить на 2. - Адреса большие или равные 0x02000 будут иметь длину 14 бит. - Адреса, большие или равные 0x02000 будут вычис- ляться в процессе компиляции и не могут быть содержимым регистров или переменными. Объявление меток: Label { [Array] } DataType {= InitValue] - Элементами массивов могут быть только байты или слова. - InitValue может быть только байтом или словом. - InitValue в массиве может быть строкой или одиночным значением. - Если это одиночное значение, то каждому элементу массива будет присвоено это значение. - Выражение должно начинаться с первого столбца. Указание аппаратной спецификации PICMicro: type PIC Type - Спецификация PIC (например, “PlC_Type” = “16F84”) {sjmemory Start:End - “s” (“shadow”) означает сохранение содержимого банка 0 в банке 1. size - Число команд в памяти программ. Наряду с возможностью помещения этих определений в исходном тексте, предусмотрена возможность использования файлов с расширением «.def», которые содержат необходимую информацию о применяемом микроконт- роллере PICMicro. В настоящее время поддерживаются следующие типы микроконтролле- ров:
Глава 29. Примеры применения PICMICRO 177 I6F84 16C7I Форматы констант: 0x0#### ObO######## ### ‘c’ V - Число в шестнадцатеричном формате. - Число в двоичном формате. - Число в десятичном формате. - Символ. - Символ возврата каретки (имеется поддержка стан- дартных для языка С типов данных, вводимых символом Л”). “St”, “ring” - Строки данных, конкатенация которых производится символом «,» Имеется возможность включения в текст программы ассемблерных ко- манд в формате Microchip с учетом следующих особенностей: - Поддерживаются все команды серии 16Схх, включая “option” и “tris”. - “retfie” является допустимой командой, однако ее использование не рекомендуется за исключением случаев, когда надо правильно восстановить контек- стные регистры перед использованием “retfie”. - Если командам “goto" или “call” предшествуют выра- жения на языке PICLite, то перед их использованием следует правильно установить регистр PCLATH. - Если командам “goto” или “call" предшествуют выра- жения на языке ассемблера 16Схх, то производить установку PCLATH не следует. - Доступ к регистрам W и STATUS осуществляется также, как и к другим регистрам. - Команды языка могут изменять содержимое регист- ров STATUS, FSR и PCLATH, поэтому запись в эти регистры следует производить осторожно. - Примечание: Если в программе используется индекс для работы с массивами, то содержимое FSR будет изменяться. - В командах ассемблера, которые реализуют доступ к массивам переменных, могут использоваться только постоянные указатели на элементы массива. Допустимые операции языка: Выражения присваивания: Label = Label I Constant { Operator Label I Constant ... } = Expression 12 Зак. 2025.
178 Часть 4. Микроконтроллеры PICMICRO Операторы (расположены в порядке уменьшения приоритета): + - сложение - вычитание (либо унарный минус) * - умножение / - деление // - возведение в степень « - сдвиг влево » - сдвиг вправо & - поразрядная конъюнкция (AND) I - поразрядная дизъюнкция (OR) Л - поразрядное исключающее или (XOR) = = - сравнить значения и вернуть 1, если они равны != - сравнить значения и вернуть 1, если они не равны > - сравнить значения и вернуть 1, если левое значение больше >= - сравнить значения и вернуть 1, если левое значение больше или равно - сравнить значения и вернуть 1, если левое значение меньше - сравнить значения и вернуть 1, если левое значение меньше или равно && - конъюнкция (логическое AND) I I - дизъюнкция (логическое OR) Реализация операций деления и возведения в степень взяты из руковод- ства AN6I7 фирмы Microchip. Использование скобок: “(”, “)” - Используются для определения порядка выполнения опера- торов. “[”, “]” - Используются для обозначения индекса элемента массива. Ключевые слова языка: if Expression then Label - Если выражение !=0 то перейти к метке Label. ; - Комментарий, все, что расположено справа игнорируется. file [D:] [path]FileName.ext - Загрузить файл и вставить его в исходный текст. int: - Начало кода обработчика прерываний - Все, что следует за “int:” явпяется телом обработчика прерываний. - Обработчик прерываний позволяет осуще- ствлять переходы к основной программе и вызывать подпрограммы.
Глава 29. Примеры применения PICMICRO 179 Ключевые слова и идентификаторы ассемблера: “dt” - Текущий адрес из программного счетчика. - Определить элементы таблицы. Установка битов конфигурации (по адресу 0x02007): “CONFIG_BASE” - Переменная, расположенная по адресу 0x02007 и содержащая информацию о состоянии битов конфи- гурации (ее определение находится в файлах с расширением .def, поставляемых вместе с PICLite.exe) CONFIG_BASE = Parml & Parm2... - CONFIG_BASE можно задать с помощью предвари- тельно определенных параметров или констант. - Она имеет стандартные для конфигурации значения - Примечание: Эти значения различны для разных моделей PlCMicro. CP_OFF - Включение/отключение защиты кода CP_EN PWRTE_DIS - Разрешение/запрет задержки при включении питания PWRTE_EN WDTEN - Разрешение/запрет работы сторожевого устройства WDT_DIS RCOSC - Выбор типа осциллятора HS_OSC XT OSC LP_OSC Я решил переписать приложение «Цифровые часы/Термометр», исполь- зуя описанный выше язык вместо ассемблера. Ниже приведен полученный программный код на языке PICLite (я следовал обычному процессу разра- ботки, поэтому конечный код является пятым по порядку приложением): ; Thermo5 - Часы реального времени/Термометр ; Данная программа осуществляет функции часов реального времени ; с выводом информации и температуры, измеряемой датчиком ; DS1820, на экран ЖКИ. ; myke predko ; Написана: 97.09.05 ; Модифицирована: ; Примечания к аппаратной реализации: ; Контроллер PIC работает на частоте 1 МГц, которая задается с ; помощью кристалла кварца и двух конденсаторов емкостью по ; 33 пФ каждый.
180 Часть 4. Микроконтроллеры PICMICRO Вход сигнала Reset “подтягивается” к напряжению питания через резистор номиналом ЮК. Выводы RB0-RB7 используются в качестве входов данных ЖКИ. Сигнал на выводе RA0 “подтягивается” к напряжению питания. Перевод сигнала в низкое состояние приведет к переходу уст- ройства в режим установки времени. Вывод RA2 используется для управления 4-м выводом ЖКИ (сигнал R/S) Вывод RA3 используется для управления 6-м выводом ЖКИ (сигнал Е) Вывод RA4 используется для обмена с DS1820, причем сигнал на нем “подтягивается” к напряжению питания. 5-й вывод ЖКИ (R/W) подключен к земле. file 16F84.DEF ; Вставить код для инициализации регистров 16F84 ; Определение переменных i byte j byte count word SP[ 9 ] byte ; Данные, возвращаемые DS1820 Frac word = 0 ; Текущая часть байта FracHi byte = 0 ; Старший байт 24-разрядного счетчика uDlay byte = 0b000000001 Second byte = 0 ; Текущее время Minutes byte = 0 ; Начальная установка соответствует 12:00 Hours byte = 0 E = 3 ; Биты управления ЖКИ RS = 2 DSBit = 4 ; Бит управления DS1820 ; Основная программа для Thermo5 PORTA = 0x010 ; Установить высокое состояние на линии ; обмена с DS1820 PORTB = 0 TRISA = 1 TRISB = 0 ; Вывод RA0 служит входом сигнала от кнопки ; Порт В служит для вывода данных
Главе 29. Примеры применения PICMICRO 181 OPTION_REG = 0X0D7 ; Разрешить работу таймера ; Код инициализации call Dlay5 ЖКИ ; Ожидать 15 мс для установки ; начального состояния ЖКИ call Dlay5 call Dlay5 PORTB = 0x030 ; Установить ЖКИ на вывод двух ; строк по 8 символов call SendlNS call Dlay5 call SendlNS call SendlNS ; Повторить несколько раз PORTB = 0x038 call SendlNS POPRB = 0x010 call SendlNS PORTB = 0x001 call SendlNS POPRB = OxOOC call SendlNS ; Использовать две строки ЖКИ ; Выключить дисплей ; Очистить память ЖКИ ; Разрешить работу дисплея ; Теперь поспать сообщения в LCD j = о call SendlNS PORTB = OxOCO call SendlNS ; Послать первое сообщение ; Переместить курсор на вторую строку j = 1 call SendMSG ; Поспать второе сообщение ; Разрешить обработку прерываний INTCON = 0X0A0 ; Разрешить обслуживание прерываний ; от таймера goto DispTime ; Показать время перед модификацией ; Цикл ожидания длительностью в 1 секунду Loop:
182 Чвсть 4. Микроконтроллеры PICMICRO call DS_Reset i = OxOCC call SendDS i = 0x044 call SendDS call Dlay 160 call Dlay 160 call Dlay 160 call DS_Reset i = OxOCC call SendDS i = OxOBE call SendDS call Dlay 160 call GetDS SP[ 0 ] = i call Dlay 160 call GetDS SP[ 1 ] = i call Dlay 160 call GetDS SP[ 2 ] = i call GetDS SP[ 3 ] = i call GetDS SP[ 4 ] = i call GetDS SP[ 5 ] = i call GetDS SP[ 6 ] = i call GetDS SP[ 7 ] = i call GetDS SP[ 8 ] = i call DS_Reset ; Получить текущее значение температуры ; Поспать команду Skip ROM ; Выполнить преобразование температуры ; Ожидать 500 мкс преобразования температуры ; Теперь считать значение температуры ; Считать блок памяти и контрольную сумму (CRC) ; Выделить девять байтов из считанного блока ; памяти ; Выполнить инициализацию DS1820 PORTB = ОхОСб ; Ввести значение температуры call SendINS if ( SP[ 1 ] & 1 ) == 0 then DispTemp SP[ 0 ] = 0 - SP[ 0 ] ; Температура отрицательна, преобразовать ее
Главе 29. Примеры применения PICMICRO 183 PORTB = call SendCHAR Вывести на экран знак *-* DispTemp • Вывести значение температуры SP[ 0 ] = SP[ 0 ] / 2 Вычислить значение температуры в градусах Цельсия if SP[ 0 ] <= 99 then DispTens ; Не выводить, если темпера- тура выше 100С PORTB = T call SendCHAR DispTens - Вывести на экран значение десятков if SP[ 0 ] <= 9 then DispOnes PORTB = ( ( SP[ 0 ] / 10 ) call SendCHAR / / 10 ) + ‘0’ Послать в ЖКИ число десятков DispOnes PORTB = ( SP[ 0 ] / / 10 ) call SendCHAR + '0' Вывести на экран значение единиц ; Теперь определить, спедует ли модифицировать значение времени UPDTime ; Обновить значение времени if ( FracHi & 0x04 ) == 0 then Loop ; Ничего не посылать в ЖКИ if ( PORTA & 1) != 0 then CheckTime ; Клавиша “Set" нажата? Minutes = Minutes + uDlay - 1 ; Обновить число минут Seconds = Seconds + 60 ; Обновить чиспо секунд uDlay = ( ( uDlay « 1 ) + 1 ) & 0x03F goto IncTime ; Произвести увеличение значения времени CheckTime: ; Сбросить значение переменной uDlay uDlay = 1 IncTime: ; Определить, надо ли менять отображение ; времени
184 Часть 4. Микроконтроллеры PICMICRO if Frac >= 0x0D090 then IntTimeSkip FracHi = FracHi - 1 IntTimeSkip: ; Выполнить перенос для FracHi Frac = Frac - 0x0D090 FracHi = FracHi - 3 Seconds = Seconds + 1 if Seconds < 60 then Loop ; He производить изменение значения ; минут Seconds = 0 Minutes = Minutes + 1 ; Выполнить инкремент минут if Minutes < 60 then DispTime Minutes = 0 Hours = Hours + 1 if Hours < 24 then DispTime Hours = 0 DispTime: ; Отобразить значение времени на ; экране ЖКИ PORTB = 0x086 ; Отобразить текущее время путем ; вызова SendlNS j = Hours if j <= 12 then DispTimeHoursSkip j = j - 12 DispTimeHoursSkip PORTB = ‘ ‘ if ( j < 10 ) && ( j != 0 ) then DispTimeNoTens PORTB = ‘Г DispTimeNoTens: call SendChar PORTB = ( j // 10 ) + ( 2 * ( j == 0 ) ) + ‘O' call SendChar
Глава 29. Примеры применения PICMICRO 185 PORTB = call SendChar PORTB = ( Minutes / 10 ) + ‘0’ ; Теперь отобразить минуты call SendChar PORTB = ( Minutes // 10 ) + ‘0’ call SendChar j = 3 if Hours > 11 then DispTimePM j = 2 DispTimePM: call SendMSG goto Loop ; Завершить процедуру вывода времени на ; экран ; Подпрограммы для работы с DS1820 GetDS: j = 8 GetDSLoop: bef PORTA, DSBit bsf PORTA, DSBit nop bsf STATUS, C btfss PORTA, DSBit bef STATUS, C rrf i cal Dlay4 call Dlay4 decfsz j goto GetDSLoop ; Чтение информации из DS1820 ; Для чтения значения выполнить цикл 8 раз ; Переключить линию обмена с DS1820, ; чтобы посмотреть на его отклик ; Команда введена для соответствия ; первоначальному коду чтения бита ; Сигнал на линии еще в высоком состоянии? ; Нет, сохранить нулевое значение. ; Добавить бит к содержимому счетчика ; Теперь ввести задержку в 8 циклов ; перед следующим запросом
186 Часть 4. Микроконтроллеры PICMICRO return SendDS: ; Послать команду DS1820 j = 8 SendDS_Loop: ; Цикл посылки каждого бита bcf PORTA, DSBit ; Переслать бит btfsc i, 0 ; Переслать 1? bsf PORTA, DSBit ; Да ... rrf i call Dlay4 ; Ввести задержку в 12 циклов при посылке О call Dlay4 goto $ + 1 bsf PORTA, DSBit ; Установить на линии высокое состояние decfsz j goto SendDS .Loop return DS Reset ; Запуск DS1820 bcf PORTA, DSBit call Dlay160 ; Сформировать задержку в 500 мкс. call Dlay160 call Dlay160 bsf PORTA, DSBit ; Теперь установить на пинии высокое состояние call Dlay160 ; Сформировать задержку длительностью не ; менее 1 мкс call Dlay160 call Dlay160 call Dlay160 call Dlay160 call Dlay160 return
Глава 29. Примеры применения PICMICRO 187 SendlNS: ; Поспать команду в PORTB bcf PORTA, RS ; Установить бит RS в 1 bsf PORTA, E ; Переключить на вывод данных bcf PORTA, E call Dlay160 ; Ожидать 160 мкс if ( PORTB & OxOFC ) !+ 0 then SendlNS_End call Dlay5 ; Ожидать выполнения команды в течение 5 мс. SendlNS_End: ; Завершить выполнение подпрограммы return SendCHAR: ; Переслать символ в PORTB bsf PORTA, RS ; Установить бит RS в 1 bsf PORTA, E ; Переключить на вывод данных bcf PORTA, E call Dlay160 Ожидать 160 мкс. return SendMSG: ; Послать сообщение на ЖКИ i = 0 ; Задать нулевое смещение для обращения к ‘Table” SendMSG Loopl: if j = = 0 then SendMSG_ Loop2 ; Еспи j=0, то индекс i указы- вает на правильное ; сообщение call MsgTable iorlw 0 ; Был возвращен О? btfsc STATUS, Z decf j ; Да, выполнить декремент j i = i + 1 goto SendMSG Loopl ; Повторить цикл для следующего символа SendMSG__Loop2: • call MsgTable ; Получить текущий символ с индексом i movwf PORTB
188 Часть 4. Микроконтроллеры PICMICRO i = i ; Переход к “call SendCHAR” в PICLite call SendCHAR i = i + 1 call MsgTable iorlw 0 btfss STATUS, Z ; Это конец сообщения? goto SendMSG_Loop2 return ; Сообщение отправлено в ЖКИ MsgTable: ; Таблица сообщений movlw Table » 8 movwf PCLATH ; Установить PCLATH перед изменением PCL movf i, w ; Получить значение для i ADDLW Table & OxOFF btfsc STATUS, С incf PCLATH movwf PCL ; Выполнить инкремент PCLATH, если надо ; переход к элементу таблицы Table Table: dt “ Time: ”, 0 dt “Temp: ", 0 dt “ ”, 0 dt “ PM”, 0 ; Сообщения в коде ASCIIZ ; Подпрограммы задержки Dlay4 return ; Задержка в четыре цикла до возврата Dlay 160 count = 13 decfsz count goto $ - 1 return Dlay5 count = ( 256 * 2 ) decfsz count + 160 goto $ - 1 decfsz count + 1 goto $ - 3 return
Глава 29. Примеры применения PICMICRO 189 Int: ; Обработчик прерывания bcf INTCON, TOIF FracHi = FracHi + 1 ; Инкремент счетчика до 64Кх4 мкс ; Конец процедуры обработки прерываний ; Конец программы Theimo5.PIC Разработанный язык не соответствует уровню коммерческого продукта, однако, он довольно полезен и учитывает большее число особенностей мик- роконтроллеров PlCMicro среднего уровня. Мне представляется удачной реа- лизация интеграции команд ассемблера и текста, написанного на PICLite. Одной из особенностей, которая мне на самом деле нравится в этом ком- пиляторе, является использование индексного регистра FSR только для ра- боты с массивами переменных. В написанных мной ранее компиляторах FSR служил также для организации стека выполняемых операций. В PICLite для организации стека и указания на элементы массива вместо FSR используют- ся отдельные файловые регистры. Данный компилятор не является конечным продуктом. Ранее, когда я предполагал разработать коммерческую версию, я хотел добавить макропро- цессор, позволяющий использовать структурированные конструкции, такие как «if» — «else» — «endif» и «while» — «endwliile». На самом деле, одной из причин, по которым макропроцессор не был добавлен, стало мое желание переписать компилятор (четвертая версия) таким образом, чтобы обеспечить вызов стандартных функций, а не только выполнение основной программы и обработку прерываний.
глава 30 ЗАКЛЮЧЕНИЕ ПО СЕМЕЙСТВУ PICMICRO Краткое содержание Информационная поддержка PICMicro Web-сайты Информационные серверы Из всех микроконтроллеров, представленных в данной книге мне, пожалуй, больше всех нравится PICMicro. Наиболее ироничные читатели могут сказать, что PICMicro мне нравится больше потому, что я написал первую книгу о PICMicro, которая занимает определенное место в моем сердце. На самом деле, у меня есть особые чувства к каждому из микроконтроллеров. Микропроцессор 6800 был первым, на котором я изучал программирование. После окончания университета я много работал с микроконтроллерами 8048 и 8051. Мне нра- вится семейство AVR, так как его архитектура хорошо приспособлена для на- писания программ на языке высокого уровня. Мне нравится также микрокон- троллер Stamp, который стал для меня введением в PICMicro. Причина, по которой мне нравится PICMicro, заключается в элегантнос- ти его архитектуры. По сравнению с другими микроконтроллерами PICMicro очень прост. Однако эта простота имеет свою цену, которая состоит в необхо- димости применения определенного стиля программирования для создания эффективных приложений. Из всех микроконтроллеров, представленных в данной книге, PIC является, пожалуй, наиболее сложным для начального освоения методики разработки программного обеспечения. Простота его архитектуры отражается в наборе команд, который насчи- тывает всего 35 команд, каждая из которых выполняется за один командный цикл, за исключением тех случаев, когда производится загрузка нового со- держимого программного счетчика. Заслуживают высокой оценки две аппаратные особенности микроконт- роллеров PICMicro — простота программирования моделей среднего уровня и наличие в серии 12С50х внутреннего осциллятора, который мне очень по-
Глава 30. Заключение по семейству PICMICRO 191 нравился. Я надеюсь, что такой осциллятор появится и в других моделях PICM icro. Если сказать о том, что мне хотелось бы изменить в PICMicro, то список пожеланий будет очень мал. Я бы изменил две вещи (или хотел бы видеть их измененными). Во-первых, я бы уменьшил число циклов, требуемых для выполнения таких команд, как «goto», «call» и «return», а во-вторых, моди- фицировал бы аппаратную реализацию стека таким образом, чтобы обеспе- чить возможность создания для PICMicro систем реального времени. Уменьшение числа циклов, затрачиваемых на выполнение команд «goto», «call», «return», позволило бы упростить анализ временных характеристик. Практически отпала бы необходимость использования команд «пор» и «goto $+1» для того, чтобы выполнение различных ветвей программы при выпол- нении различных условий происходило за одинаковое число циклов, незави- симо от выбранного пути. Я считаю, что отсутствие доступа к пространству стека PICMicro стало самым большим препятствием в разработке ОСРВ, применение которых по- зволило бы повысить эффективность многих приложений. Когда я в первый раз задумался над этим вопросом, я начал искать методы чтения и модифи- кации сохраненного в стеке содержимого программного счетчика, однако чем дальше я думал над этой проблемой, тем больше склонялся к мысли, что гораздо эффективнее иметь массив стеков. Идея состоит в том, что каждая задача имеет свой стек, выбор которого осуществляется ядром ОСРВ перед выполнением команды «retfie». Наверное, архитектура PICMicro может показаться странной и довольно сложной для использования, особенно если вы хорошо знаете процессоры с архитектурой фон Неймана. Однако я думаю, что после получения некоторо- го опыта его применения вы придете к выводу, что микроконтроллеры PIC весьма эффективны, легко программируются и обеспечивают простой ин- терфейс с другими устройствами. Информационная поддержка PICMicro В сети WEB информационная поддержка PICMicro обеспечивается большим количеством источников. Имеющаяся в сети информация содержит как крат- кие советы по решению различных проблем, так и целые системы разработ- ки, компиляторы, программаторы, примеры приложений. Можно сказать, что это семейство микроконтроллеров имеет наиболее широкую поддержку в сети Internet. Web-сайты Как было указано выше, большая часть различных ресурсов PICMicro может быть найдена в WEB. Здесь я приведу адреса восьми наиболее понравившихся мне сайтов с указанием, что там можно найти. Вы, конечно, можете найти другие сайты, которые вам понравятся больше. Если вы сообщите мне о них, я буду вам очень благодарен.
192 Часть 4. Микроконтроллеры PICMICRO WEB сайт фирмы Microchip http://www. microchip.com Содержание: Документация на PlCMicro и информация по их применению. Ответы на часто задаваемые вопросы Документация на выпускаемые микросхемы памяти EEPROM фирмы Microchip и ответы на часто задаваемые вопросы по ним. Средства разработки для PlCMicro (MPASM, MPSIM, MPLAB, и т.д.). Информация об имеющихся в сети материалах. Информация о дистрибьюторах продукции Microchip Архив “GNUPIC” http://www.execpc.com/~rdmiller/gnupic/ Содержание: Свободно распространяемые ассемблеры, компиляторы и симуляторы Страница Эрика Смита, содержащая проекты на базе PIC: http://www.brouhaha.com/~eric/pic Содержание: Проекты Эрика Смита. «Маленькие хитрости». Различная информация Internet по PlCMicro. Англоязычная страница фирмы Ormix http://www.ormix.riga.lv/eng/index.htm Содержание: Различная информация по PlCMicro. Программное обеспечение для разработки и программирования. Схемы программаторов. Список внутрисхемных эмуляторов. Отладочные платы и наборы разработчика. Приложения. Страница фирмы Fast Forward (администратор Энди Уорен) http://www.geocities, сот/Silicon Valley/2499 Содержание: Раздел «Встраиваемые системы» содержит список вопросов и ответов по PlCMicro и другим микроконтроллерам. Страница Давида Тэйта с материалами по микроконтроллерам PIC http://www.man.ac.uk/~mbhstdj/piclinks.html Содержание: Программатор Давида Тэйта и программное обеспечение к нему. Информация о ресурсах PlCMicro и продукции на его основе.
Глава 30. Заключение по семейству PICMICRO 193 Страница фирмы DonTronics (администратор Дон Макензи) http://www.doiitronics.coni Содержание: Форум для разработчиков и программистов. Ссылки на информацию о PICMicro и продукции на его основе Страница фирмы Parallax Inc. http://www.parallaxinc.coni Содержание: Продукты и информация по применению PICMicro. Базовая информация по Stamp и информация по применению. Информация для доступа к списку разработок на базе микроконтролле- ров PICMicro и Stamp, использующих программное обеспечение фирмы Parallax. Информационные серверы PICLIST является информационным сервером в сети Internet, который за- нимается распространением почты для всех подписчиков. Для того чтобы подписаться на издание необходимо послать сообщение по e-mail: listserver@mitvma.mit.edu со словами «subscribe piclist» в первой строке сообще- ния (но не в поле темы). Для того чтобы отказаться от подписки надо послать сообщение по e-mail: listserver@mitvma.mit.edu со словами «unsubscribe piclist» в первой строке сооб- щения. Необходимо сделать одно замечание: так как информации очень много, то приходит большое количество сообщений (свыше 100 сообщений вдень). Конечно, вместо регулярного чтения почты вы можете просматривать архив. Архив информации находится по адресу: http://www. iversoft. сот/pidist/ Фирма Parallax также поддерживает информационный сервер для микро- контроллеров PICMicro и Stamp. Вы можете подписаться на получение ин- формации, для чего надо зайти на сайт Parallax (http://www.parallaxinc.com) и, пользуясь системой ссылок, сформировать запрос на подписку. Microclii р Microchip Technology Inc. 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: (602)782-7200 Fax: (602)899-9210 http://www. microclii p. com 1 3 Зак. 2025.
Часть 5 МИКРОКОНТРОЛЛЕРЫ СЕМЕЙСТВА AVR
глава 31 МИКРОКОНТРОЛЛЕР AVR Микроконтроллеры AVR фирмы Atmel открывают одно из новых направле- ний в области разработки и архитектуры микроконтроллеров. Структура про- цессора AVR представляется как «высокопроизводительная RISC-архитекту- ра с пониженным энергопотреблением» Гарвардского типа. Одним из основных достоинств этого контроллера является быстрое выполнение команд - он выполняет команду за один такт. AVR имеет, вероятно, наиболее разносто- ронний по своим возможностям процессор из всех микроконтроллеров, опи- санных в данной книге. Это означает, что при разработке приложений надо потратить немного больше времени на планирование размещения данных в памяти и регистрах, чем для других микроконтроллеров. Но благодаря своей разносторонности AVR очень прост в программировании как для разработ- чиков прикладных программ на языке ассемблера так и для тех, кто пишет компиляторы языков высокого уровня. Рис. 31.1. Микроконтроллеры AVR8515 в корпусе PLCC и AVR1200 в корпусе DIP
Глава 31. Микроконтроллеры AVR 197 Когда писалась эта книга, выпускались только модели AVR85I5 и AVRI200. Модель 1200 - это сравнительно урезанная версия RISC-архитектуры AVR. Модель 8515 имеет полнофункциональную RISC-архитектуру и поддержива- ет большую часть из тех возможностей, которыми будет обладать семейство AVR, когда появится и другие, более новые модели. Главным преимуще- ством AVR является наличие памяти EEPROM для хранения программ с возможностью программирования в системе, а также расширенный набор команд с возможностью выполнения большинства команд за один машин- ный цикл.
глава 32 АРХИТЕКТУРА ПРОЦЕССОРА AVR Краткое содержание Регистры общего назначения и АЛУ Регистр состояния Адресация устройств ввода-вывода и памяти SRAM Программный счетчик и стек Прерывания Способы адресации данных После прочтения первой части книги, вы, вероятно, почувствовали, что основ- ные варианты архитектуры процессоров, такие как Гарвардская и Принстонс- кая (Фон-Неймана), довольно просты и понятны. После знакомства с микро- контроллером 68НС05 эта уверенность в вас, наверное, еще больше укрепилась. Но есть ряд других архитектур, которые не вполне соответствуют этим моделям. Если вы заглянете в документацию на AVR, то увидите структуру микрокон- троллера, показанную на рис. 32.1. Хотя эта структура представляется достаточно сложной, но вы можете мысленно пройти по различным шинам (линиям на диаграмме) и получить представление о том, как идут через процессор потоки битов и байтов. Но есть некоторые особенности, которые не являются очевид- ными, и их придется объяснять позднее. Как и в любом процессоре, особенно- сти AVR являются следствием общих принципов, использованных при разра- ботке этих процессоров. После ознакомления с AVR станет понятно, что они реализованы на базе набора регистров, организация которого представлена в графическом виде на рис. 32.2. Такая организация обеспечивает высокую эффек- тивность процессора при обработке данных. Однако оба приведенных рисунка не дают представления о том, как была оптимизирована архитектура AVR, что- бы соединить достоинства Гарвардской и Принстонской архитектур для дости- жения очень быстрого и эффективного выполнения программ.
Глава 32. Архитектура микроконтроллеров AVR 199 РА0-РА7 РС0-РС7 VCC GND драйверы порта А ТТ цпшт регистр данных порта А Рет. направления данных порта А драйверы порта С j регистр данных порта С Рет. направления данных порта С 8-разрядная шина данных внутренний генератор XTAL1 XTAL2 генератор счетчик указатель стека сторожевой таймер и управление RESET FLASH-память программ регистр управле ния микроконт мшаа-_________ ♦ ALE регистр команд регистры общего назначения таймеры/ •* счетчики + дешифратор команд ь контроллер ** прерываний ICP линии управления АЛУ ♦ EEPROM регистр состояния 7 SPI г раммирования U ART драйверы порта В регистр данных порта О tn nrmJ направления Per направления данных порта В РВ0-РВ7 драйверы порта D PD0-PD7 Рис. 32.1. Структура микроконтроллера AVR 8515 фирмы Atmel
200 Часть 5. Микроконтроллеры семейства AVR Рис. 32.2. Приоритеты регистров в архитектуре процессоров AVR Регистры общего назначения и АЛУ Простое ядро процессора, которое содержит регистры общего назначения и АЛУ, может выполнять 91 из 120 команд, реализуемых А\ R. Каждая из этих команд использует содержимое регистров общего назначения (РОН) при выполнении операций (рис. 32.3.). Есть два типа команд, которые могут вы- полняться этим ядром. Арифметические операции выполняются над содер- жимым РОН, а операции изменения последовательности команд могут реа- лизовать только переходы в программе, но не могут производить вызов подпрограмм или сохранение содержимого программного счетчика. Позднее в этой главе будет показано, как в действительности реализован программ- ны й счетчик в AVR. Рис. 32.3. Структурная схема регистров общего назначения и АЛУ
Глава 32. Архитектура микроконтроллеров AVR 201 При обращении к РОН и АЛУ используется только один способ адреса- ции — прямая регистровая адресация, которая осуществляется путем указа- ния адреса выбираемого регистра. В команде могут быть указаны адреса одно- го или двух регистров. Например, сложение содержимого двух регистров с сохранением результата в первом из них выполняется при помощи команды «add»: add А, В которая может быть записана математически в виде: А = А + В, или пред- ставлена графически, как показано на рис. 32.4. ------> Направление передачи исходных данных ------> Направление передачи результата Рис. 32.4. Пути передачи данных при выполнении команды AVR add А,В Если второй операнд не требуется, в команде указывается только один регистр, как, например, в команде инверсии. Второй операнд может являть- ся частью команды (непосредственная адресация), в этом случае данные с шины команд поступают на шину данных. Прибавление константы выполняется при помощи команды: addiw A, const что означает: А = А + const, и показано графически на рис. 32.5. Содержимое программного счетчика инкрементируется после того, как очередная команда считывается из памяти, или принимает новое значение при выполнении команды безусловного перехода <>jmp» (рис. 32.6).
202 Часть 5. Микроконтроллеры семейства AVR --------► Направление передачи исходных данных --------► Направление передачи результата Рис. 32.5. Пути передачи данных при выполнении команды adiw A, const --------► Направление передачи метки "Label" Рис. 32.6. Пути передачи данных при выполнении команды безусловного перехода jump label Регистр состояния При первом взгляде на описание регистра состояния в документации на мик- роконтроллеры AVR вас может удивить количество битов в нем и кажущаяся сложность выполняемых ими функций. После включения регистр;! состояния структура AVR будет иметь вид, показанный на рис. 32.7.
Глава 32. Архитектура микроконтроллеров AVR 203 Рис. 32.7. Архитектура AVR с учетом регистра состояния SREG Регистр состояния является частью адресного пространства ввода-вывода, которое описано в следующем разделе, и в нем устанавливаются признаки результата арифметических операций. Отдельные биты регистра имеют сле- дующее назначение. Номер бита Обозначение Назначение 0 С Флаг переноса/заема 1 Z Флаг нуля 2 N Флаг отрицательного результата 3 V Флаг переполнения 4 S Флаг знака 5 н Флаг переноса между тетрадами (полупереноса) 6 т Временный бит 7 1 Бит общего разрешения прерываний Основным признаком в регистре состояния является флаг нуля, который устанавливается в 1, когда результатом операции является ноль. Когда будут рассматриваться команды процессора, вы увидите, что многие команды мо- гут изменить этот флаг, что делает его неудобным для передачи параметров. Вместо него лучше использовать флаг переноса С, который применяется для этих целей другими процессорами во многих приложениях. В ряде случаев более удобным может оказаться использование временного бита Т. с помо-
204 Часть 5. Микроконтроллеры семейства AVR щью которого можно задавать значение одного бита, в качестве условия вет- вления программы. Как и в большинстве микроконтроллеров и микропроцессоров, флаг пе- реноса/заема С в AVR устанавливается после каждой операции сложения или вычитания. Он также используется ;пя временного сохранения старшего или младшего бита операнда при операциях обыкновенных и циклических сдвигов, что типично для многих микроконтроллеров. При сложении флаг переноса устанавливается в 1. если результат больше $FF. а при вычитании - если результат меньше нуля. Флаг переноса между тетрадами Н (полуперенос) устанавливается после выполнения сложения или вычитания, в процессе которого произошел пе- ренос из младшей или заем в старшей тетраде (полубайте). Например, если вы прибавили 7 к содержимому регистра, в котором хранилось число 9: add R16, R17 ; R16 = 9, R17 = 7 Регистр R17 содержит число 7, и после сложения с содержимым R16, в котором хранится 9, результатом будет число $10. которое не может быть размещено в младшей тетраде. В этом случае будем установлен флаг Н в реги- стре состояния. Если младшая тетрада результата имеет значение меньшее, чем 10. то флаг Н будет сброшен в 0. Как и флаги полупереноса для всех других контроллеров, рассмотренных в этой книге, бит Н меняется при переносе/заеме из младшего шестнадцати- ричного разряда (тетрады). Его изменение не основано на десятичном ре- зультате операции. Но если требуется контролировать декадный перенос при операциях с двоично-десятичными числами, бит полупереноса может быть непосредственно использован при выполнении операции сложения, как это показано выше. Если результат операции больше или равен 10. то устанавли- вается значение флага Н = 1. которое указывает, что правильный двоично- десятичный результат может быть получен путем прибавления числа 6. Использование флагов отрицательного результата N. переполнения V и знака S может показаться довольно сложным, если рассматривать, как они устанавливаются в 1 или сбрасываются в 0 при арифметических операциях. Следует понять их назначение, и тогда их применение станет простым и ло- гичным. Эти биты надо проверять только после операций сложения или вы- читания. в процессе которых используются или получаются отрицательные числа, представляемые в дополнительном коде. Флаг отрицательного результата N устанавливается в 1. если старший (зна- ковый) разряд результата (биг 7) равен I. Когда знаковый разряд установлен в 1. это часто означает, что результат отрицателен. Следует, однако, отме- тить, что знаковый разряд может быть установлен в 1 и в результате логичес- кой операции. В этом случае знаковый разряд не должен использоваться в каких-либо других целях, кроме указания но то. что он был установлен в 1 после соответствующей операции. Флаг переполнения V устанавливается при сложении или вычитании двух чисел со знаком, представленных в дополнительном коде (дополнение до двух), в случае, если значение полученного результата выходит за пределы
Глава 32. Архитектура микроконтроллеров AVR 205 допустимого диапазона, который для восьмибитового числа со знаком со- ставляет от -128 до +127. При сложении двух положительных чисел флаг V устанавливается в 1, если сумма больше 127, в случае сложения двух отрица- тельных чисел — если результат меньше -128. Этот флаг показывает, что ре- зультат не является правильным 8-разрядным числом со знаком. Вы можете сказать, что на самом деле результат является правильным, только его нельзя разместить 8-разрядном регистре, и будете правы. Для раз- решения этой ситуации служит флаг знака S, который позволяет представить результат сложения или вычитания 8-разрядных чисел в дополнительном коде в виде 9-разрядного числа со знаком. Если после операций сложения или вычитания чисел со знаком флаг переполнения V установлен в 1, то резуль- татом будет 9-разрядное число со знаком, причем старшим (знаковым) раз- рядом числа является флаг S, а восемь бит результата будут храниться в 8- разрядном регистре-приемнике. Бит Т — временный бит, который используется для хранения результата команд «BST» и «BLD» или для передачи однобитовых параметров. Хотя бит Т не изменяется никакими другими командами, он должен быть сохранен вместе с другими битами регистра состояния при выполнении прерываний или подпрограмм, которые могут изменить содержимое этого регистра. Последним является общий флаг разрешения прерываний 1. Когда он ус- тановлен в 1, запросы прерываний будут обслуживаться. Если флаг 1 сброшен в 0, то обслуживание прерываний будет отложено до тех пор, пока этот флаг не будет установлен в 1. Адресация устройств ввода-вывода и памяти SRAM Понимание того, как адресуются регистры общего назначения, а как SRAM, может быть довольно затруднено. Это особенно верно, когда контроллеры младших моделей семейства AVR1200 работают вместе с контроллерами AVR8515, реализующими полный набор функций. В этом разделе будет рас- смотрена архитектура памяти и регистров для микроконтроллеров с полным набором функций, а затем кратко указаны отличия младших моделей этих приборов. Реализация обращения к памяти, регистрам общего назначения и регистрам ввода-вывода может показаться несколько сложной, так как суще- ствует два способа обращения к ним. Первый способ - прямое обращение к каждой из этих областей данных. Этот способ прямого доступа является ос- новным при выполнении арифметических операций. Второй способ доступа объединяет все три области регистров и памяти, включая внешнюю память, образуя общее адресное пространство данных (рис 32.8). Регистры ввода-вывода — это 64-байтовый блок, который содержит как регистры управления процессором, так и регистры интерфейса ввода-вывода. Команды «1п» и «out» используются для обмена данными между РОН и реги- страми ввода-вывода. Внутренняя память SRAM — это блок оперативной па- мяти для хранения переменных. Эта память доступна при помощи команд
206 Часть 5. Микроконтроллеры семейства AVR «load» и «store», которые позволяют также обращаться к РОН и регистрам ввода-вывода, которые располагаются в соответствующих областях адресного пространства данных. Память программ Область регист- ров общего назначения Область регист- Адресное лро- ров ввода- странство данных вывода 32 х 8 64 х 8 Внутренняя память SRAM Внешняя память $0000 $0020 $0060 $FFFF Рис. 32.8. Организация адресного пространства процессоров AVR Последней областью в адресном пространстве данных является внешняя память. Вся оставшаяся часть 64-килобайтного пространства данных может быть использована для адресации внешней памяти SRAM или устройств вво- да-вывода. Подключение внешней памяти будет рассмотрено в одном из сле- дующих разделов. Хотя различные модели микроконтроллеров семейства AVR отличаются составом регистров, имеется ряд регистров, общих для всех моделей, кото- рые располагаются по одним и тем же адресам в пространстве регистров ввода-вывода. Адреса Регистры ввода-вывода Область Данных Имя регистра Назначение S3F $5F SREG Регистр состояния $ЗЕ $5Е SPH Указатель стека — старший байт $3D $5D SPL Указатель стека — младший байт $зв $5В G1MSK Регистр маски прерываний $ЗА $5А G1FR Регистр запросов прерываний $35 $55 MCUCR Регистр управления микроконтроллера
Глава 32. Архитектура микроконтроллеров AVR 207 Другие регистры выполняют функции ввода-вывода, которые специфич- ны для определенных моделей микроконтроллеров. Как отмечено в предыдущем разделе, при выполнении арифметических операций используются только регистры общего назначения, и их адреса не зависят от того, используется ли для обращения к ним адреса РОН (при использовании арифметических инструкций) или адресное пространство дан- ных (при использовании команд «load»/«store»). Обращение к регистрам вво- да-вывода производится либо при помощи команд «in»/«out» с использова- нием области адресов ввода-вывода или при помощи команд «load»/«store» в адресном пространстве данных. Если используются команды «load»/«store», то к абсолютному адресу должно быть прибавлено начальное смещение $20 (десятичное число 32), как показано в приведенной выше таблице адресов регистров ввода-вывода. Обращение к внутренней памяти SRAM или внешней памяти произво- дится только через адресное пространство данных при помощи команд «load»/ «store», которые используют абсолютные адреса. Если надо считать операнд из внешней памяти, то обращение займет на один или два цикла больше, чем при использовании внутренней памяти. Команды «load»/«store» позволяют использовать индексные регистры. В адресном пространстве РОН последние 6 регистров могут использоваться как три 16-разрядных индексных регистра, содержимое которых загружается либо из адресного пространства данных, либо из памяти программ. Эти ин- дексные регистры имеют имена X (адреса S1A-S1B), Y (адреса S1C-S1D) и /(адреса S1E-S1F). Индексный регистр Z может также использоваться для чтения из памяти программ отдельных байтов, что позволяет хранить в ней таблицы данных. После всего вышесказанного структура AVR становится такой, как пока- зано на рис. 32.9. В этой структуре показана шина адреса, которая использует- ся для адресации регистров и оперативной памяти. Адрес может формиро- ваться разными способами, например, он может быть указан в команде или определяться с использованием индексного регистра Что касается младшей модели микроконтроллеров AVR1200, то она не содержат оперативной памяти SRAM и не выполняет команды обращения к РОН и регистрам ввода-вывода, использующие единое адресное простран- ство данных (рис. 32.10.) В этой модели имеются три отдельных адресных пространства для памяти программ, РОН и регистров ввода-вывода, кото- рые не объединяются в единое адресное пространство данных. К регистрам ввода-вывода можно обратиться только при помощи команд «in» и «out», а команды «load»/«store» фактически не используются. Младшие модели AVR имеют также только один индексный регистр Z, расположенный по адресам $1E-$1F в области регистров общего назначения. Этот индексный регистр может использоваться либо для выборки данных, хранящихся в РОН или в памяти программ.
208 Часть 5. Микроконтроллеры семейства AVR Шина команд Рис. 32.9. Структура AVR с памятью SRAM и Шина данных регистрами ввода-вывода Рис. 32.10. Области памяти в архитектуре младших моделей AVR
Глава 32. Архитектура микроконтроллеров AVR 209 Программный счетчик и стек Вы, вероятно, будете удивлены, узнав, что мы рассмотрели уже 90% струк- туры AVR. Единственной существенной частью архитектуры, которую оста- лось обсудить, являются программный счетчик команд и реализация стека. Реализация стека — главное отличие между младшими моделями AVR и дру- гими микроконтроллерами этого семейства. В младших моделях AVR стек ре- ализован в виде оперативной памяти типа LIFO («последний пришел-пер- вый ушел»), добавленной к программному счетчику. Когда вызывается подпрограмма или происходит запрос прерывания, содержимое счетчика команд вводится в этот стек (рис. 32.11.). В AVR 1200 такой стек имеет глубину в три элемента. Это значит, что вы можете иметь только три вложенные под- программы или два вложенных вызова функции в активном обработчике пре- рывания. Данное обстоятельство значительно ограничивает возможности этого микроконтроллера. Рис. 32.11. Счетчик команд и стек в младших моделях AVR Структурная схема для AVRI200 и других младших моделей приведена на рис 32.12. Другие модели семейства AVR не имеют таких жестких ограниче- ний на объем стека, так как они используют для размещения стека внутрен- нюю память SRAM и, возможно, внешнюю память (рис. 32.13.) Такая струк- тура позволяет использовать в качестве стека весь доступный объем оперативной памяти. Использование значительного объема памяти RAM в качестве стека дает ряд преимуществ при разработке приложений, которые будут рассмотрены ниже. Окончательная структурная схема микроконтролле- ров AVR имеет вид, показанный на рис 32.14. На этом мы завершаем обсуждение архитектуры AVR. Если вы вернетесь к началу этой главы и сравните структурную схему на рис. 32.14 со структурной схемой, представленной компанией Atmel, то обнаружите, что они не име- 14 Зак. 2025.
210 Часть 5. Микроконтроллеры семейства AVR ют ничего общего. Даже упрощенные структурные схемы в документации на микроконтроллеры AVR мало похожи на схему, приведенную на этом ри- сунке. Таким образом, у вас есть три структурные схемы микроконтроллера и ни одна из них не похожа на другую. Встает вопрос — какой же из этих схем можно доверять? Рис. 32.12. Структурная схема младших моделей AVR с учетом стека Шина данных Рис. 32.13. Программный счетчик и стек в архитектуре старших моделей AVR
Глава 32. Архитектура микроконтроллеров AVR 211 Рис. 32.14. Полная архитектура процессора AVR с указателем стека Вы должны доверять той схеме, которая больше всего вам подходит. Струк- турные схемы, которые приведены в этом разделе, отражают мое понимание архитектуры и того, как в ней выполняются команды. То, что вы видите - это взгляд автора на устройство микроконтроллера. Я не имею никакого понятия о том, как устроен кристалл. Все, что я сделал, - это рассмотрел все исполь- зуемые команды и способы адресации и попытался понять, как они совмес- тно реализуются. Как вы увидите в главе, посвященной набору команд, окон- чательная структурная схема, приведенная на рис.32.14, выполняет все команды. Она будет использована для демонстрации способов адресации и путей, по которым передаются команды и данные. Прерывания Реализация прерываний в AVR является специфичной для конкретных при- ложений. Я сделал такое утверждение, так как легко можно написать обра- ботчик прерываний, который абсолютно не будет менять контекстовую ин- формацию контроллера (содержимое стека, регистра состояния и других регистров), или такой, который будет сохранять содержимое всех РОН и некоторых специальных регистров. Описать, что происходит внутри процессора во время выполнения пре- рывания очень просто. Если произошел запрос прерывания, и флаг 1 в реги- стре состояния установлен в 1, то адрес следующей команды сохраняется в стеке, а выполнение программы продолжается с адреса, хранящегося в соот- ветствующем векторе прерывания. Когда запрос прерывания получен, и про-
212 Часть 5. Микроконтроллеры семейства AVR грамма перешла по этому вектору, флаг 1 сбрасывается в 0, чтобы предотвра- тить возможность вызова нового прерывания во время обработки текущего прерывания. Флаг I будет снова установлен в 1 в конце обработчика прерывания, когда выполняется команда возврата «reti». Он также может быть установлен в 1 в процессе обработки (после сохранения контекстовых регистров), чтобы раз- решить вложенные прерывания. Средние и старшие модели AVR могут обра- батывать столько вложенных прерываний, на сколько хватит объема стека для сохранения содержимого программного счетчика и регистров контекста. Младшие модели имеют ограниченный объем стека (три позиции), который может быстро переполниться при выполнении вложенных прерываний или подпрограмм. Способы адресации данных При рассмотрении набора команд AVR вы, вероятно, будете поражены ко- личеством различных способов адресации, которые поддерживаются полной архитектурой AVR. В этом разделе я хочу дать представление о том, как AVR выполняет команды, и как команды обращаются к РОН, регистрам ввода- вывода и памяти SRAM. Основным способом доступа к данным является пря- мое обращение к регистрам общего назначения. Обычно в формате команды отводятся пять бит, которые позволяют адресоваться к любому регистру. Пря- мое обращение к одному из РОН показано на рис. 32.15. Обычно такая адре- сация используется для операций с содержимым одного регистра (инкре- мент, декремент, инверсия знака, очистка и т.д.). Некоторые из этих команд дважды повторяют адрес в коде команды. Регистры Общего Назначения Рис. 32.15. Прямая адресация в AVR Команды, оперирующие с двумя регистрами, действуют, в основном, аналогичным образом. В этих командах регистр-приемник («destination») ука- зывается перед регистром-источником («source»), то-есть является первым параметром. Таким образом, команда
Глава 32. Архитектура микроконтроллеров AVR 213 add RO, R1 реально выполняется так: RO = RO + R1.Рассмотренные способы адресации операндов называются прямой регистровой адресацией (рис. 32.16.). команда Рис. 32.16. Прямая адресация AVR к двум РОН Операнды могут также входить в состав команды. В других контроллерах это называется «непосредственной адресацией». В AVR будем называть этот способ адресации «непосредственной прямой регистровой» (рис. 32.17.). Хо- рошим примером команды с такой адресацией является «ORI». Я хочу обра- тить ваше внимание на эту команду по одной важной причине. Так как поле адреса составляет 4 бита, вы можете обращаться только к 16 старшим РОН. Это, очевидно, окажет влияние на то, как разместить данные в ваших рабо- чих регистрах. Чтобы избежать ошибок, можно рекомендовать использовать в качестве рабочих 16 старших регистров общего назначения, имеющих адреса с $10 по $ IF. команда Непосред- ственный операнд Адрес Непосред- ственный операнд Рис. 32.17. Непосредственная адресация AVR Последняя форма прямой адресации, применяемая для доступа ко всему объему адресуемой памяти, использует второе слово команды для указания 16-разрядного адреса. При этом способе адресации данные, размещенные в любой точке адресуемой памяти, поступают в РОН или выбираются из них. Есть две особенности, на которые стоит обратить внимание при такой адре- сации. Первая особенность - опять доступны только 16 старших РОН. Вторая особенность — команды с такой адресацией не реализуются в младших моде- лях AVRI200. В этих моделях для передачи данных между РОН и набором регистров ввода-вывода используются команды «in» и «out», реализующие прямую адресацию двух регистров.
214 Часть 5. Микроконтроллеры семейства AVR Последний способ обращения к данным - косвенная адресация. Если вы уже познакомились с технической документацией на микроконтроллеры AVR, то видели, что в ней используется пять рисунков для описания этого способа адресации, реализация которого иллюстрируется на рис. 32.18. На этом ри- сунке показана только косвенно-регистровая адресация и не приведены ее варианты с предекрементом и постинкрементом. Основные команды косвен- ной адресации используют содержимое индексных регистров в качестве ад- реса для выборки данных. Это очень похоже на индексную адресацию в боль- шинстве других микроконтроллеров. Следует отметить, что это единственный режим, доступный в младших моделях AVR, где для обращения к РОН мо- жет использоваться только индексный регистр Z, а РОН и регистры ввода- вывода не образуют общее регистровое пространство. Рис. 32.18. Косвенная адресация к РОН/ памяти данных в AVR При обычной косвенно-регистровой адресации содержимое индексного регистра не изменяется при выполнении операции. Для получения эффек- тивного адреса можно использовать положительное смешение, прибавляе- мое к содержимому индексного регистра. Такой способ адресации называется косвенно-регистровая со смешением. Смещение может иметь значение от О до 63 и прибавляется к величине, хранящейся в индексном регистре. Такой способ адресации наиболее эффективен при обращении к структуре данных, когда смещение указывает на нужный элемент в структуре. Полученный эф- фективный адрес не сохраняется после операции. Есть и другие варианты косвенной адресации: косвенная-регистровая с предекрементом и косвенно-регистровая постинкрементом. При их исполь- зовании происходит изменение содержимого индексного регистра в процес-
Глава 32. Архитектура микроконтроллеров AVR 215 се выполнения команды — либо до обращения к памяти (предекремент), либо после (постинкремент). Значительным преимуществом этих команд яв- ляется возможность организации стека, а кроме того они могут служить для индексации элементов в структурах данных. Это позволяет эффективно при- менять AVR при разработке компиляторов для языков высокого уровня, ко- торые используют локальные переменные. В технической документации для микроконтроллеров AVR показано, ка- ким образом можно обеспечить обращение к данным, размещенным в памя- ти программ, и как изменяется содержимое программного счетчика. Мы рас- смотрим эти операции в главе «Набор команд AVR». гак как их выполнение связано с некоторыми специфическими особенностями реализуемых микро- контроллером команд.
глава 33 АППАРАТНЫЕ СРЕДСТВА AVR Краткое содержание Типы корпусов Системный тактовый генератор Таймеры Сторожевой таймер Параллельный ввод/вывод Последовательный ввод/вывод U ART SPI Аналоговый ввод/вывод Конфигурирование контроллера Память данных EEPROM Программирование Параллельное программирование Программирование по последовательному интерфейсу Маркировка микроконтроллеров AVR Моим первым впечатлением после ознакомления с документацией на AVRI200 было, что мы имеем дело с микроконтроллером следующего поко- ления, существенно отличающимся от других микроконтроллеров, рассмот- ренных в этой книге. По многим характеристикам он превосходит другие мик- роконтроллеры, соединяя в себе лучшие свойства других приборов. Это не значит, что любые его аппаратные возможности реализуются путем подачи одной команды. Однако он представляет собой следующий шаг в улучшении характеристик микроконтроллера.
Глава 33. Аппаратные средства AVR 217 Типы корпусов Вариантов корпусов, в которых выпускаются AVR, очень немного, особенно если сравнивать со множеством различных типов корпусов, в которых выпус- каются микроконтроллеры 8051, 68НС05 и PIC. Компания Atmel в данный момент выпускает эти микросхемы только в пластмассовых и стандартных типах корпусов (рис. 33.1). Расположение выводов делает эти приборы почти совместимыми по выводам с 8051 (за исключением вывода «reset»). 1200 (PD1P/SO1C/SSOP) 8515 PDIP -Reset vcc 1 < PDO PB7 (SCK) • • PD1 PB6(M1SO)> XTAL2 PB5 (MOSI) • «XTAL1 PB4 > • PD2 (INTO) PB3 > ‘ PD3 PB2 » <PD4(T0) PBl(AINl)' PD5 PBO(AINO)' • Gnd PD6 ’ PBO (TO) • PB1 (Tl) ' PB2 (AINO) « PB3(A1NI) PB4 (_SS) • PB5 (MISO) ' PB6 (MISO) « PB7 (SCK) ' _Reset • PDO(RXD) • PD1 (TXD) PD2 (INTO) PD3(INT1) ' PD4 ' PD5(OC1A) « PD6 (_WR) • PD7 (_RD) • XTAL2 XTAL1 • Gnd Vcc РАО (ADO) > PAI (ADI) > PA2(AD2) • РАЗ (AD3) > PA4(AD4) > PA5 (AD5) ' PA6(AD6) • PA7 (AD7) 1CP 1 ALE > OCIB ' PC7(A15) > PC6(A14) ' PC5(A13) > PC4 (A12) PC3(A11) > PC2(AIO) 1 PCI (A9) ‘ PC0(A8) • Рис. 33.1. PDIP корпуса микроконтроллеров AVR 1200 и AVR8515 PDIP — это пластмассовый DIР-корпус с расстоянием между осями вы- водов 2,54 мм. Корпуса SMT имеют шаг 1,27 мм. Следует обратить внимание, как реализован вариант микроконтроллера 8515 в PLCC-корпусе. Если вы посмотрите на обозначение выводов этою варианта 8515, то увидите, что они расположены так же, как в PDIP-варианте, за ис- ключением того, что в середине каждой стороны есть неподключенные выво- ды. Это очень удобный и продуманный вариант с учетом того, что некоторые пользователи не имеют достаточного опыта работы с SMT-корпусами, а дру- гие не любят работать с РТН-прототипами. Для многих микроконтроллеров SMT-варианты имеют другой набор выводов, чем РТН, включая дополни- тельные выводы «земли» и питания. А при таком размещении выводов, как у AVR, SMT-платы могут быть разработаны на основе PDIP-прототипов с наи- меньшими заботами и минимальным изменением разводки Системный тактовый генератор Реализация необходимой системной тактовой частоты для AVR обеспечива- ется обычными способами, но имеется несколько особенностей, которые
218 Часть 5. Микроконтроллеры семейства AVR необходимо знать для определения скорости работы приложения или при программировании микроконтроллера. Есть также некоторые особенности, которые оказывают влияние на разработку прикладного программного обес- печения. Первая особенность, которую вы должны знать — это время выполнения команды. Большинство микроконтроллеров требуют для этого несколько так- тов. но в AVR один машинный цикл выполняется за один такт. Это значит, что при подсчете скорости работы программы ваша работа упрощается, так как большинство команд выполняется с частотой тактовых сигналов, AVR может исполыовать три различных источника системной частоты: квар- цевый или керамический резонатор, внешний тактовый сигнал или встроен- ный RC-генератор (имеется не во всех моделях). Обычный диапазон частот для AVR - от 0 до I6 МГц. В сочетании с выполнением за каждый такт одной коман- ды это делает AVR по-настоящему быстрым, особенно на частоте I6 МГц Справедливо ли будет сказать, что AVR. работающий на частоте I МГц. эквивалентен по ирошводигельности микроконтроллерам 68НС05 на частоте 2 МГц. PIC на 4 МГц или 8051 на I2 МГц'.’ Конечно, нет. Такое сравнение будет некорректным, гак как микроконтроллеры с различной архитектурой работают по-разному. Я бы не удивился, если бы вы написали программу дтя PIC. 805 I и 68НС05. которая работает быстрее, чем на AVR даже при более низкой частоте. Поэтому не следует говорить, что какая-либо архитектура лучше и работает быстрее и эффективнее, чем любая другая. Кварцевый или керамический резонатор может быть подключен к AVR. как показано на рис.33.2. Если используется одна из этих схем, не подклю- чайте какие-либо другие устройства ни к одному из выводов XTAL. Кварцевый и керамический резонаторы без встроенных конденсаторов AVR AVR XTAL1 XTAL2 Керамический резонатор со встроенными конденсаторами XTAL1 XTAL2 Рис. 33.2. Схемы подключения к AVR керамического и кварцевого резонаторов Микроконтроллер AVR может синхронизироваться внешним тактовым сигналом, поступающим на вход XTALI. Если вы собираетесь использован,
Глава 33. Аппаратные средства AVR 219 один синхросигнал для нескольких AVR, можно рекомендовать схему, по- казанную на рис.33.3. Последний способ синхронизации — использование встро- енного RC-генератора. Такой генератор на данный момент есть только в AVR1200, он обеспечивает тактовую частоту I МГц. Этот режим задается при помощи одного из битов конфигурации (fuse bit) при параллельном про- граммировании контроллера. Встроенный RC-генератор не будет запущен, если программирование производится по последовательному интерфейсу. К нескольким Рис. 33.3. Генератор тактовой частоты для AVR на внешнем кварцевом резонаторе Несколько замечаний по поводу встроенного RC-генератора. При его ис- пользовании возможен IО-процентный разброс значений тактовой частоты. Это означает, что данный генератор нельзя использовать в приложениях, требующих стабильности тактовой частоты. Тот факт, что внутренний RC- генератор может быть включен только при параллельном программировании контроллера, в некоторых случаях может ограничивать его полезность. Одна- ко, чтобы смягчить это неудобство, фирма Atmel выпустила вариант кон- троллера AVR1200A, в котором этот генератор включен уже при его изготов- лении. Таймеры Используемые в AVR программируемые таймеры-счетчики хотя и несколько отличаются по реализации от счетчиков в других микроконтроллерах, но выполняют все функции, требуемые от них для работы контроллера. Источником сигнала переключения таймеров/счетчиков является либо тактовая частота процессора, либо внешний синхросигнал. Тактовая частота процессора может использоваться непосредственно или предварительно де- литься. Выбор источника сигнала и коэффициента деления производится с помощью мультиплексора (рис 33.4.) Биты CSxn, управляющие мультиплек-
220 Часть 5. Микроконтроллеры семейства AVR сором, расположены в регистре управления таймера TCCR0. В AVR 8515, который содержит два таймерных блока, имеется два мультиплексора — по одному на каждый таймерный блок. В AVR1200 есть только один таймерный блок и один мультиплексор. Содержимое таймера инкрементируется при по- ступлении переднего фронта переключающего сигнала. Поэтому синхросиг- нал со внешнего вывода микроконтроллера поступает мультиплексор в пря- мом и инвертированном виде. Значение внешнего синхросигнала проверяется при поступлении переднего фронта тактового сигнала процессора. Рис.33.4. Предварительный делитель частоты таймера/ счетчика в AVR Таймер 0 — очень простой 8-разрядный таймер, содержимое которого может быть считано или записано. Отключение входного сигнала происходит путем выбора «заземленного» входа при помощи мультиплексора. При переполне- нии счетчика ревизуется маскируемое прерывание (рис. 33.5). Таймер 1 является гораздо более сложным и может выдавать на выход AVR импульсы и ШИМ-сигналы. Таймер 1 работает так же, как и таймер 0, надо только принять во внимание, что таймер 1 — 16-разрядный, а таймер 0 — только 8-разрядный. Его большим достоинством является возможность ре- ализации дополнительных функций, таких как таймер событий или генера- тор ШИМ-сигналов. При работе в качестве таймера событий таймер 1 запоминает (захватыва- ет) в регистре захвата состояние таймера в произвольный момент времени, который определяется изменением сигнала на внешнем входе захвата. Этот вход захвата подключен через устройство подавления шумов, которое ждет, пока закончится «дребезг» контактов. Если вы измеряете длительность вход- ного импульса, меняя фронт сигнала захвата в промежутке времени между захватами, то можно не учитывать задержку для подавления дребезга, так как она одинакова как для переднего, так и для заднего фронта импульса.
Глава 33. Аппаратные средства AVR 221 Шина данных Рис. 33.6. Структура таймера 1 (Timerl) в AVR Таймер 1 имеет два ШИМ-режима. Первый режим вызывает запрос пре- рывания, когда текущее значение счетчика таймера станет равным «А» или «В». Когда содержимое счетчика таймера 1 по величине сравняется с содер-
222 Часть 5. Микроконтроллеры семейства AVR жимым 16-разрядного регистра «В», таймер может быть сброшен, чтобы обеспечить формирование следующего ШИМ-сигнала. На рис 33.7 показано состояние выхода микроконтроллера в промежуточных точках программы. Обратите внимание, что обработчики прерываний по совпадению содержат всего по две команды. При этих прерываниях не используются какие-либо флаги разрешения прерывания JF, которые надо было бы сбрасывать. PortA.О IntCmpA ; Таймер еще не сброшен sbi PortA, 0 ; Высокий уровень на выходе reti IntCmpb ; Таймер cbi PortA, 0 ; Низкий reti сброшен уровень на выходе Рис. 33.7. Пример программы вывода ШИМ-сигнала для таймера 1 Второй ШИМ-режим - это использование таймера I для вывода ШИМ- сигнала на выход ОС1А микроконтроллера без использования программы обработки. В этом режиме таймер считает до максимально возможного значе- ния и, когда содержимое счетчика становится равным заданному значению А или В, сигнал на выводе ОС1А меняет свое состояние. Когда таймер дости- гает максимального значения, он начинает считать в обратном направле- нии, и цикл повторяется. На рис 33.8 содержимое счетчика таймера! пред- ставлено пилообразной кривой, которая отражает его значение в разные моменты времени. Уровень сравнения - это заданное значение А или В. Рис. 33.8. Значения сигналов при формировании ШИМ-сигнапа с помощью таймера 1
Глава 33. Аппаратные средства AVR 223 Сторожевой таймер Сторожевой таймер в микроконтроллерах AVR представляет собой отдель- ный таймер с собственным генератором на I МГц. который при включении будет отсчитывать нужный интервал времени. Если произойдет переполне- ние до того, как команда «WDR» сбросит счетчик таймера в 0. то произво- дится перезапуск микроконтроллера (рис 33.9). Рис. 33.9. Структура сторожевого таймера AVR Сторожевой таймер включается при установке в I бига WDE в регистре управления сторожевого таймера WDTCR. Содержимое бигов WDP0 - WDP2 этого регистра определяет интервал времени до того, как сторожевой тай- мер произведет перезапуск микроконтроллера. WDP2 WDP1 WDP0 Период таймера 0 0 0 16 мс 0 0 1 32 мс 0 1 0 64 мс 0 1 1 12S мс 1 0 0 256 мс 1 0 1 512 мс 1 1 0 1.024 с 1 1 1 2.04S с
224 Часть 5. Микроконтропперы семейства AVR В AVRI200 сторожевой таймер может быть выключен простым сбросом в О бита WDE. В AVR85I5 есть дополнительный бит WDTTOE, который должен быть установлен в I не более чем за четыре такта до того, как будет сброшен бит WDE. Это выполняется с помощью следующего фрагмента программы: sbi WDTCR, WDTTOE ; разрешение выкпючения WDT cbi WDTCR, WDE ; выключить WDT Бит WDTTOE специально введен для того, чтобы предохранить стороже- вой таймер от случайного выключения программой. Как и ;пя аналогичных операций в других микроконтроллерах, когда время выполнения операции является критичным, надо запретить все прерывания, чтобы быть уверен- ным, что после команды «sbi» не произойдет запрос прерывания. Если вы собираетесь включать сторожевой таймер в произвольный мо- мент времени, а не только после включения питания или начального запус- ка, то перед тем, как установить бит WDE в I, надо сбросить сторожевой таймер с помощью команды «WDR», чтобы быть уверенным, что таймер находится в начальном состоянии и не произойдет перезапуска до того, как вы ожидаете. Параллельный ввод-вывод При первом знакомстве с описанием AVR85I5, меня удивило большое коли- чество различных диаграмм для всех линий ввода-вывода. Это было 15 разных диаграмм, которые показывали, как работает каждый из выводов при выпол- нении различных функций ввода-вывода. В этом разделе я хочу обратить вни- мание только на основные режимы линий ввода-вывода, не рассматривая их расширенные возможности, которые будут описаны позже в этой главе. Схема подключения внешнего вывода, показанная на рис. 33.10, дает пред- ставление о его работе. С каждым набором линий (который называется «пор- том») связано три адреса ввода-вывода, которые позволяют определять зна- чение данных, записанных в порт, направление передачи данных («I» — вывод, «0» — ввод) и реальное значение сигнала на внешнем выводе. Вследствие этого есть возможность «подтянуть» выводы порта к высокому потенциалу для работы в режиме ввода данных, и использовать состояние некоторых выводов в качестве запроса прерываний. Чтение данных может быть выполнено либо непосредственно с внешне- го вывода, либо с выхода регистра данных порта. Такая возможность являет- ся важной особенностью работы порта. Если внешняя линия перегружена или случайно закорочена на «землю» или питание, то состояние внешнего выхода никогда не будет меняться. Поэтому в некоторых случаях очень важ- но иметь возможность прочитать содержимое регистра порта и сравнить его с реальным состоянием внешнего вывода. Хотя линии ввода-вывода AVR работают подобно аналогичным линиям в других микроконтроллерах, они имеют одно существенное отличие. Оно зак- лючается в том, что «подтягивание» внешнего вывода к высокому потенци-
Глава 33. Аппаратные средства AVR 225 алу управляется не отдельными битами регистра, а для этого используется специальная комбинационная схема. Эта схема разрешает «подтягивание» только, когда внешний вывод работает в режиме ввода данных. На рис.33.11 показано, как работает линия ввода-вывода AVR при чтении состояния кноп- ки, которая подключает внешний вывод к «земле». Vcc Чтение состояния вывода Рис. 33.10. Схема подключения внешнего вывода AVR Vcc Рис. 33.11. Подключение внешнего вывода AVR с «подтягиванием” к высо- кому потенциалу 15 Зак. 2025.
226 Часть 5. Микроконтроллеры семейства AVR Последовательный ввод-вывод Последовательные порты SP1 и UART в AVR работают во многом так же. как в других микроконтроллерах. Интерфейс SP1 предназначен для последо- вательной передачи данных между двумя AVR или AVR и параллельным реверсивным сдвиговым регистром. Аппаратные средства AVR не поддержи- ваются сложные протоколы синхронного последовательного обмена, такие, как 12С или CAN. UART В старшей модели AVR85 15 данные могу г асинхронно передаваться и прини- маться по последовательному каналу в полнодуплексном режиме при помо- щи модуля UART. В AVR этот модуль так же, как в дручих микроконтролле- рах, которые не имеют возможности передавать бит четности. Основной частью UART является генератор синхросигналов обмена, определяющий скорость передачи данных. Это программируемый счетчик, при помощи ко- торого обеспечивается частота, в 16 раз превышающая скорость передачи. Значение, которое надо занести в регистр UBRR, определяющий скорость обмена UART («UART baud rate register»), вычисляется по формуле: UBRR = f / (16 * Data_Rate)-1, где Data_Rate - желаемая скорость передачи данных. Как и для других гене- раторов, задающих скорость передачи данных, необходимо проверить значе- ние получаемой ошибки скорости обмена (отношение фактической скорос- ти обмена к 1ребуемой), прежде, чем использовать определенный кварцевый резонатор и конкретное значение UBRR. Частота генератора в 16 раз превышает скорость передачи данных, чтобы дать возможность приемнику считывать значение с входной линии примерно в середине каждого бита в потоке поступающих данных. Структура приемни- ка UART приведена на рис. 33.12. В этой схеме имеется специальное устрой- ство — детектор фронта, который применяется для того, чтобы определить, что в данный момент времени присутствует на линии: поток передаваемых данных или какие-то помехи. Если передаются данные, то он определяет се- редину бита и указывает сдвиговому регистру приемника RX, когда надо на- чинать принимать данные из входного потока. Детектор фронта обеспечивает также обновление содержимого USR — регистра состояния UART в следую- щих случаях: при окончании приема байта данных; в случае возникновения ошибки приема, например, переполнения сдви- гового petистра приемника, когда новые данные приняты раньше, чем из регистра RX считано предыдущее значение; при ошибке кадра, когда данные идут не с той скоростью, с какой ожи- далось, что обычно определяется по отсутствию стоп-бита.
Глава 33. Аппаратные средства AVR 227 Рис. 33.12. Структура приемника последовательного порта AVR Прием данных и сброс приемника осуществляется путем считывания со- держимого U DR — регистра данных приемника Rx. Как вы уже догадались, передатчик UART также содержит сдвиговый ре- гистр (рис. 33.13). Устройство управления выводом позволяет передавать либо данные, либо сигнал режима ожидания (все «I» на линии). Для передачи символа достаточно записать его код в регистр данных передатчика Тх. Рис. 33.13. Структура передатчика последовательного порта AVR Как и в последовательных портах других контроллеров, данные в регистр передатчика можно записывать, когда предыдущий символ только начал
228 Часть 5. Микроконтроллеры семейства AVR передаваться. Загрузка в регистр новых данных сразу после того, как предыду- щий символ поступил из него в сдвиговый регистр передатчика, позволяет достичь максимальной скорости передачи, когда старт-бит следующего бай- та данных следует непосредственно за стоп-битом предыдущего байта. SPI Хотя порт SPI есть на всех микроконтроллерах AVR для обеспечения воз- можности их программирования по последовательному интерфейсу (ISP), которая рассмотрена позднее в этой главе, он доступен для обмена данны- ми с внешними устройствами только в некоторых моделях. В этих моделях SPI-порт работает почти так же, как аналогичный порт в 68НС05 (рис 33.14). Рис. 33.14. Синхронный последовательный порт ввода/ вывода AVR Для обмена с другими устройствами используются четыре вывода порта SPI. Например, совместная работа ведущего («master») и ведомого («slave») микроконтроллеров AVR может быть реализована, как показано на рис 33.15. Передачу инициирует ведущий AVR. который выдает синхросигналы обмена на вывод SCK. При этом вывод SCK ведомого контроллера будет работать в качестве входа синхросигнала. Чтобы включить порт SPI. надо установить в I бит SPE в регистре управления SPCR порта SPI. С помощью этого регистра можно выбрать режим работы SPI в качестве ведущего, однако если на вне- шний вывод _SS поступает низкий уровень сигнала, то порт SPI будет рабо- тать только в режиме ведомого. Биты SPR в регистре SPCR используется для установки скорости переда- чи данных ведущим контроллером. Важно отметить, что ведущий контрол- лер не может использовать для синхронизации внешний синхросигнал, по- этому можно выбирать только только одно из четырех значений частоты.
228 Часть 5. Микроконтроллеры семейства AVR передаваться. Загрузка в регистр новых данных сразу после того, как предыду- щий символ поступил из него в сдвиговый регистр передатчика, позволяет достичь максимальной скорости передачи, когда старт-бит следующего бай- та данных следует непосредственно за стоп-битом предыдущего байта. SPI Хотя порт SPI есть на всех микроконтроллерах AVR для обеспечения воз- можности их программирования по последовательному интерфейсу (ISP). которая рассмотрена позднее в этой главе, он доступен для обмена данны- ми с внешними устройствами только в некоторых моделях. В этих моделях SPI-порт работает почти так же, как аналогичный порт в 68НС05 (рис 33.14). Рис. 33.14. Синхронный последовательный порт ввода/ вывода AVR Для обмена с другими устройствами используются четыре вывода порта SPL Например, совместная работа ведущего («masler») и ведомого («slave») микроконтроллеров AVR может быть реализована, как показано на рис 33.15. Передачу инициирует ведущий AVR, который выдает синхросигналы обмена на вывод SCK. При этом вывод SCK ведомого контроллера будет работать в качестве входа синхросигнала. Чтобы включить порт SPI, надо установить в I бит SPE в регистре управления SPCR порта SPL С помощью этого регистра можно выбрать режим работы SPI в качестве ведущего, однако если на вне- шний вывод SS поступает низкий уровень сигнала. то порт SPI будет рабо- тать только в режиме ведомого. Биты SPR в регистре SPCR используется для установки скорости переда- чи данных ведущим контроллером. Важно отметить, что ведущий контрол- лер не может использовать для синхронизации внешний синхросигнал, по- этому можно выбирать только только одно из четырех значений частоты.
Глава 33. Аппаратные средства AVR 229 полученных делением частоты тактового сигнала процессора. Чтобы полу- чить более высокую скорость передачи, вы должны увеличить тактовую час- тоту AVR. Рис. 33.15. Синхронный последовательный обмен в AVR Передача данных осуществляется ведущим контроллером путем записи информации в регистр данных SPDR порта SPI и последующим периодичес- ким опросом (или ожиданием запроса прерывания) бита SPIF в регистре состояния SPSR этого порта для определения момента окончания передачи. Аналоговый ввод-вывод В настоящее время возможности аналогового ввода-вывода микроконтрол- леров AVR ограничиваются наличием встроенного аналогового компарато- ра напряжений. Компаратор в AVR дает возможность не только сравнивать входное напряжение с опорным, но и измерять длительность импульса при помощи встроенного таймера. Схема компаратора может показаться несколько сложнее, чем вы ожидаете (рис 33.16). Выход компаратора находится в со- стоянии I, если значение напряжения на неинвертирующем входе AINO боль- ше, чем на инвертирующем AIN1. Состояние выхода может использоваться для реализации различных вариантов запроса прерывания, которые задают- ся при помощи битов ACISI-0 в регистре прерывания и состояния аналого- вого компаратора ACSR. Определить текущее состояния выхода компаратора можно путем оп- роса значения бита АСО в ACSR. Для уменьшения мощности потребления можно отключить компаратор, установив в I бит ACD в регистре ASCR. Пе- ред тем, как включить или выключить компаратор, надо запретить все его
230 Часть 5. Микроконтроллеры семейства AVR прерывания путем сброса в 0 бита ACIE в ACSR, чтобы предотвратить воз- можность поступления ложных запросов прерывания от компаратора. ACIS1 ACIS0 Тип прерывания 0 0 Прерывание при изменении состояния выхода компаратора 0 I Прерывание при переключении выхода компаратора из 0 в I I 0 Прерывание при переключении выхода компаратора из I в 0 Запрос прерывания компаратора IRQ Рис. 33.16. Компаратор напряжения в AVR В микроконтроллере AVR85I5 к выходу компаратора можно подключить вход захвата таймера. При этом можно зафиксировать момент изменения сиг- нала на выходе компаратора, если в регистре ACSR бит ACIC установлен в I. Такая возможность позволяет измерять длительность сигнала, поступающего на компаратор. Аналогичное измерение можно также выполнить с помощью входа ICP, но использование компаратора позволяет измерять длительность сигнала, уровни которого отличаются от стандартных уровней 0 и I. Чтобы измерить длительность импульса с стандартными уровнями ТТЛ/КМОП уровня с помощью комбинации таймер/компаратор, надо подать на отрицательный вход компаратора (вывод AINI) напряжение с выхода простого резистивного делителя, использующего два резистора по I0 КОм. к; В! Ф Hi ш pi и н к л р п U п с 3 I ( г ( I 1 I I I I I Конфигурирование микроконтроллера В AVR есть два типа битов, задающих конфигурацию микроконтроллера. Биты конфигурирования «fuses» (плавкие перемычки) используются для выбора режима работы AVR, тогда как биты зашиты «lock bits» выполняют такую же функцию, что и аналогичные биты в 8051. Хотя они не так структурированы.
Глава 33. Аппаратные средства AVR 231 как биты конфигурации в микроконтроллерах PIC, однако они позволяют выполнять функции программирования и конфигурирования AVR. Биты кон- фигурирования «fuse bits» различны для разных типов AVR. В AVR1200 уста- новка в I бита RCEN подключает встроенный RC-генератор, при этом вне- шние тактовые генераторы игнорируются. Когда бит SPIEN сброшен в О, разрешается программирование микроконтроллера по последовательному интерфейсу через порт SPI. Во всех AVR 1200 биты SPI EN и RCEN по умолча- нию сброшены в 0, хотя можно заказать микроконтроллер AVR1200A, в котором они будут установлены в I. Микроконтроллер AVR8515 имеет биты SPIEN и FSTRT, которые позво- ляют при использовании внешнего тактового генератора производить быст- рое включение микроконтроллера без обычной задержки в 16 мс. Биты конфигурирования «fuse bits» недоступны при программировании по последовательному интерфейсу. Они могут быть установлены или сбро- шены только при параллельном программировании. Биты защиты «Lock bits» используются для запрещения доступа к области программ в памяти EEPROM. Если установлен в I бит «lock I», то запрещает- ся программирование EEPROM, а когда установлен в I еще и бит «lock 2», то запрещается также и чтение содержимого EEPROM. Память данных EEPROM Операции чтения и записи области данных EEPROM в AVR довольно просты и надежны. Однако, по-моему, компании Atmel следовало бы разместить область памяти EEPROM в пространстве адресов данных (над регистрами ввода-вывода), чтобы разрешить прямое обращение к ней. Это, правда, не так актуально, как для некоторых других контроллеров, например, PIC, которые не имеют такого большого количества регистров и памяти данных, как в AVR. Обращение к EEPROM производится при помощи команд с ин- дексной адресацией, которые используют адрес, хранящийся в регистре EEAR. Если EEPROM имеет емкость больше 256 байт, как в AVR85I5, то ис- пользуются два адресных регистра: EEARH - для хранения старшей части адреса и EEARL для хранения младшей части. Эти регистры должны сохра- нять правильный адрес до тех пор, пока не будет закончена операция чтения или записи. Запись в память данных EEPROM производится следующим образом. 1. Ожидание сброса в 0 бита EEWE в регистре управления EECR памяти EEPROM 2. Запись в EEAR нового адреса (если нужно). 3. Запись в регистр данных EEDR памяти EEPROM новых данных (при необ- ходимости). 4. Установка в 1 бита EEMWE в EECR. Это может быть сделано при помощи команды SBI. (Бит EEMWE не используется в AVR 1200). 5. В течение четырех тактов после установки бита EEMWE установить EEWE в I для начала записи в EEPROM. Операция записи занимает от 2.5 до 4 мс.
232 Часть 5. Микроконтроллеры семейства AVR Бит EEMWE регистра EECR в AVR 8515 обеспечивает аппаратную блоки- ровку записи для того, чтобы уменьшить вероятность случайного изменения EEPROM. Чтение из EEPROM выполняется аналогичным образом. 1. Ожидание сброса в 0 бита EEWE в регистре EECR. 2. Запись нового адреса в регистр EEAR (при необходимости). 3. Установка в I бита EERE в EECR. 4. Чтение данных из EEDR. Операция записи должна быть закончена до того, как программа произ- ведет попытку чтения из EEPROM. Есть одна особенность, которую следует учитывать при работе с EEPROM, хотя она, возможно, не влияет на работу большинства приложений. После установки в I бита EERE процессор перехо- дит в состояние ожидания в течение двух тактов, пока данные выбираются из EEPROM. Это означает', что выполнение команды «SBI EECR, EERE», которая инициирует операцию чтения, занимает не один такт, а три. Программирование Особенностью AVR является то, что он может быть запрограммирован как по последовательному, так и по параллельному интерфейсу. В основном ис- пользуется параллельный способ программирования, так как он позволяет это делать более быстро, и, кроме того, обеспечивает реализацию всех воз- можностей AVR. Последовательный интерфейс разработан для использова- ния в процессе производства готовых изделий для программирования микро- контроллеров, уже установленных на плате. Программирование по параллельному интерфейсу Основной режим программирования микроконтроллеров AVR схож с ана- логичным режимом для 8051 (рис. 33.17). Управляющие линии, расположенные слева на приведенной схеме, слу- жат для управления процессом программирования. До того, как будет произ- ведено какое-либо действие по программированию в микроконтроллер по шине данных должна быть загружена соответствующая команда. Когда ко- манда поступила, управляющие биты ХА1/ХА0 устанавливаются в состоя- ние I/O, указывая, что на шине данных находится байт команды. Биты команды имеют следующее назначение. Бит Назначение 0 Тип EEPROM (0 — память программ, I — память данных) I Чтение из памяти программ/данных 2 Чтение битов защиты и конфигурирования 3 Чтение байтов сигнатуры (идентификационного кода) 4 Запись в EEPROM программ/данных
Глава 33. Аппаратные средства AVR 233 Бит Назначение 5 Запись битов защиты (блокирования) 6 Запись битов конфигурирования 7 Стирание кристалла Рис. 33.17. Схема соединений для параллельного программирования AVR Биты защиты «lock bits» используются для предотвращения изменения про- граммы, записанной в AVR, или несанкционированного чтения кода, заг- руженного в память контроллера. Биты защиты могут быть сброшены в 0 во время выполнения команды «стирание кристалла» («erase chip»). Биты конфигурирования («fuse bits») используются для управления ре- жимом работы AVR, например, реализация быстрого запуска или использо- вание встроенного RC-генератора. Значение этих битов может быть измене- но только при параллельном программировании. Назначение битов управления можно объяснить довольно легко. Биты ХА1/ ХАО используются для управления процессом программирования: «00» - заг- рузка адреса, «01» — загрузка данных и «10» — загрузка команды. Необходимо отметить, что все команды имеют длину четыре байта. Если же для команды требуется меньше четырех байт (например, команда «Erase Chip» содержит только один байт), то все равно .тля ее выполнения значение сигнала на линии XTALI должно измениться четыре раза При чтении данных меняется состояние сигнала на линии ОЕ . Сигналы ОЕ и WR используются для управления вводом-выводом дан- ных. Сигнал BS показывает, что происходит обращение к младшему или старшему байту памяти программ. Рассмотрев все это, можно показать, как программируется один байт, используя временные диаграммы, приведен-
234 Часть 5. Микроконтроллеры семейства AVR ные на рис 33.18. Данный рисунок поясняет назначение всех выводов. Для загрузки памяти программ надо установить необходимое значение сигналов на выводах ХА1/ХА0 и подать команду $10 на шину данных. Обратите внима- ние, что при передаче адреса бит BS следует за физическим адресом, в кото- ром старший байт идет после младшего. Как показано на рис 33.19, чтение байта из памяти программ производит- ся в соответствии теми же соглашениями, которые приняты .тля записи. X №нные х~ Рис. 33.18. Запись при программировании AVR по паралпельному интерфейсу .ные X КомзВД ба^ГХ Г ХА1 / ‘\ ОЕ ХАО BS XTAL1 Рис. 33.19. Чтение при программировании AVR по параллельному интерфейсу
Глава 33. Аппаратные средства AVR 235 Каждый микроконтроллер AVR содержит три байта сигнатуры (иденти- фикационный код), которые считываются при помощи трех последователь- ных операций чтения после подачи команды $08. Программирование по последовательному интерфейсу Как отмечено выше, последовательная загрузка EEPROM используется, в основном, в тех случаях, когда требуется программирование AVR в системе. Схема электрического соединения для программирования очень проста (рис. 33.20). Данные для программирования передаются и принимаются контрол- лером по последовательному синхронному интерфейсу (рис. 33.21). Рис. 33.20. Схема включения AVR для программирования по последователь- ному интерфейсу MSB LSB [ Входные данные 1 считываются по переднему фронту । Выходные данные 1 устанавливаются ло заднему фронту Рис. 33.21. Сигналы при передаче байта в режиме последовательного про- граммирования по последовательному интерфейсу
236 Часть 5. Микроконтроллеры семейства AVR На рис. 33.21 не соблюден реальный масштаб времени. Кварцевый резона- тор должен работать на частоте около I МГц. Вместо него в AVRI200 или других моделях AVR можно использовать встроенный RC-генератор, кото- рый должен быть включен с помощью параллельного программирования. Длительность высокого уровня синхросигнала SCK должна быть больше че- тырех машинных тактов (больше 4 мкс при тактовой частоте 1МГц), а дли- тельность низкого уровня - больше одного такта. Команды последовательного программирования занимают четыре байта и имеют следующий формат. Команда Байт1 Байт2 БайтЗ Байт4 Разрешение программирования 1010 1100 0101 0011 ХХХХ хххх ХХХХ хххх Стирание кристалла 1010 1100 100х хххх хххх хххх хххх хххх Чтение программы 0010 вооо Старший байт адреса Младший байт адреса Ч итаемые данные Запись программы 0100 вооо Старший байт адреса Младший байт адреса Данные Чтение EEPROM 1010 0000 хххх хххО Адрес Читаемые данные Запись EEPROM 1100 0000 хххх хххО Адрес Данные Запись битов защиты 1010 1100 11 lx х21х ХХХХ хххх ХХХХ хххх Чтение идентификационного ООН 0000 ХХХХ хххх хххх xxbb Код по адресу «ЬЬ» гр; па пр нг IV К; ж< об КС р< кода («В» — 0 для младшего байта / 1 для старшего) («1» — бит защиты 1, «2» - бит защиты 2) При программировании AVR необходимо учитывать следующее. Чтобы перевести микроконтроллер в режим последовательного программирования необходимо после включения напряжения удерживать низкое значение сиг- нала на выводах RST и SCK в течение 20 мс, прежде чем начать программи- рование. Если в памяти AVR находились данные, то сначала надо включить напряжение питания и выполнить команду «Стирание кристалла» (chip erase), затем выждать 10 мс, подать на вход Reset высокий уровень сигнала, после чего повторить описанную выше процедуру включения питания с вводом микроконтроллера в режим последовательного программирования. Память данных EEPROM в отличие от памяти программ не требует опе- рации стирания. Это происходит потому, что для хранения программ ис- пользуется флэш-память, которая имеет возможность выполнять общее сти- рание содержимого, а то время как в EEPROM каждый байт очищается автоматически в начале цикла программирования.
Глава 33. Аппаратные средства AVR 237 Последнее, на что надо обратить внимание при последовательном про- граммировании, — это отсутствие возможности опроса EEPROM и флэш- памяти программ о завершении процесса записи. Необходимо реализовать в программе управления записью соответствующие задержки: 10 медля стира- ния памяти программ и 4 мс для записи байта в EEPROM и память программ. Маркировка микроконтроллеров AVR Компания Atmel обозначает AVR как AT90Sxxxx, где хххх — код модели. В то же время для микроконтроллеров Atmel, совместимых с 18051, используется обозначение AT89Sxxxx (я сделал ошибку, когда впервые заказывал несколь- ко экземпляров AVR). Назначение различных символов при маркировке мик- роконтроллеров AVR 1200 и 8515 указано на рис. 33.22. Диапазон температур С - ОС to 70С (Коммерческий) I - -40С to 70С (Промышленный) Рабочая частота AVR AT90Sxxxx- (хх) х х Код модели AVR (1200 ипи 8515) Тип корпуса «J» - PLCC «Р» - Пластмассовый DIP «S» — SOIC «У» - SSOP Рис. 33.22. Маркировка микроконтропперов
глава 34 РАЗРАБОТКА СИСТЕМ НА БАЗЕ AVR Краткое содержание Подключение питания Запуск Прерывания Операционные системы реального времени Программирование в системе При изучении справочных данных по AVR я увидел ряд особенностей, кото- рые отражают их относительную молодость по сравнению с другими микро- контроллерами. Фирмы Atniel разрабатывала этот микроконтроллер, начиная «с нуля», поэтому она смогла создать его с учетом лучших характеристик других микроконтроллеров, уже имевшихся на рынке. Это особенно заметно при взгляде на го, как AVR взаимодействует с другими устройствами системы. Подключение питания Подключение питания к AVR осуществляется очень просто, что. впрочем, справедливо и для других микроконтроллеров, описанных в этой книге. Для этого требуется только напряжение +5В, шина «земля» и развязывающий конденсатор. Работать с AVR очень приятно, так как все его модели имеют широкий диапазон напряжений питания 2.7 В - 6,0 В, что позволяет легко реализовать батарейное питание, используя от 2 до 4 обычных батареек или никель-кадмиевых элемента. Одна из особенностей, которая особенно мне нравится в AVR, это воз- можность параллельного программирования без использования напряжения + 12В. Дальше в этой главе возможность программирования AVR в системе будет рассмотрена более подробно. Мне хотелось указать на эту возможность здесь, чтобы повлиять на ваш выбор микроконтроллера для использования в
Глава 34. Разработка систем на базе AVR 239 определенных приложениях, когда может потребоваться программирование AVR уже смонтированного на плату. Что касается потребления энергии, то микроконтроллеры AVR потребля- ют несколько мА в рабочем режиме и несколько сотен мкА в режиме ожида- ния («sleep mode»). Запуск Вывод _Reset в AVR имеет внутреннее соединение с шиной питания через резистор («подтягивание» к питанию), что избавляет от необходимости ис- пользования внешнего соединения. В процессе отладки системы, когда надо постоянно перезапускать микроконтроллер и наблюдать за его поведением, все, что вам для этого нужно - это простая кнопка, которая будет замыкать вывод Reset на землю (рис 34.1). В законченной системе вы можете оставлять вывод Reset не подключенным. Рис. 34.1. Запуск AVR при помощи внешнего выключатепя Включение питание в AVR выполняется типичным для микроконтролле- ров/микропроцессоров способом. Оно может производиться либо внешней схемой, либо просто подачей напряжения Vcc (при этом используется внут- ренняя схема запуска). Если AVR включается путем подачи Vcc, то диаграм- мы внутренних сигналов имеют вид, показанный на рис 34.2. Сигнал POR на этом рисунке вырабатывается внутренней схемой запус- ка, которая используется, чтобы задержать включение AVR пока не стабили- зируется напряжение питания. Триггер Шмидта включает эту схему, которая затем обеспечивает задержку в Змс (интервал времени Трог на рис. 34.2). Как только это время задержки закончится, специальная схема блокировки ждет, пока не стабилизируется частота внутреннего генератора, прежде чем запус- тить программу на выполнение (интервал времени Tout на рис 34.2). Номи- нально этот период составляет 15 мс, но если используется AVR с внешним генератором, он может быть уменьшен до I мс.
240 Часть 5. Микроконтроллеры семейства AVR । । Рис. 34.2. Временная диаграмма сигналов при запуске AVR Если во время выполнения программы на вход Reset поступит сигнал низкого уровня длительностью более двух тактов, то выполнение программы сбрасывается в начальное состояние, а тактовый генератор продолжает рабо- тать. Когда на этом выводе снова установится высокий уровень, выполнение программы начнется с нулевого адреса. Прерывания Реализация прерываний в AVR довольно проста, хотя вы должны тщательно спланировать их выполнение. Вы можете написать обработчик прерываний всего из нескольких команд или обрабатывать прерывания в очень сложных приложениях. Данный пример является обработчиком прерываний таймера для микро- контроллера AVR 1200, который состоит всего из трех команд. Tmrlnt ; установить бит при переполнении таймера cbi TOVO, T1FR set ; установить в 1 флаг Т в регистре SREG reti Здесь предполагается, что флаг Т служит для индикации того, что про- изошло прерывание, и этот флаг должен опрашиваться в основной программе. На самом деле, использование при обработке прерываний команд, не изме- няющих содержимое регистра SREG, является предметом особой заботы, так как, если они будут менять значения флагов, то информация о состоянии процессора будет потеряна для основной программы. Об этом не надо забо- титься при использовании микроконтроллеров семейства 68НС05, потому что они сохраняют содержимое регистра состояния CCR в процессе обработки запроса прерывания, так что изменение CCR в обработчике не влияет на ра-
Глава 34. Разработка систем на базе AVR 241 боту основной программы. В микроконтроллерах 8051 об этом не надо беспоко- иться, так как их регистр состояния PSW не содержит флага нуля. Если при обработчике прерывания меняется содержимое регистра состо- яния, то вы сначала должны его сохранить. Самым простым способом явля- ется выделение одного регистра общего назначения (РОН) для хранения содержимого SREG во время прерываний. В этом более общем случае обра- ботчик прерываний таймера может выглядеть следующим образом. Tmrlnt ; код, выполняемый при обработке прерываний in RO,SREG ; сохранение регистра состояния ; выполнение кода обработчика out SREG, RO ; восстановление регистра состояния reti Если у вас нет свободных РОН, то можно использовать следующий рас- ширенный вариант обработчика. IntHandler ; обработчик прерывания push R16 ; сохранение регистров, испопьзуемых ; обработчиком push R17 in R16, SREG ; сохранение регистра состояния push R16 ; выполнение кода обработчика pop R16 ; восстановпение регистра состояния out SREG, R16 pop R17 ; восстановление испопьзуемых регистров pop R16 reti Следует заметить, что команды «push» и «рор» могут быть заменены на «Id» и «st» с предекрементом/постинкрементом. Старшие модели микроконтроллеров AVR используют стек в оператив- ной памяти, что означает, что можно довольно легко реализовать вложенные прерывания (почти как в 68НС05). После того, как началось выполнение об- работчика прерывания, и было сохранено содержимое регистров контекста, можно выполнить команду «sei», чтобы разрешить обслуживание других пре- рываний. Следует дать несколько комментариев относительно обработки прерыва- ний в младших моделях микроконтроллеров, то есть в серии AVR1200. Так как они имеют очень маленький стек (только на 3 элемента) и не содержат памяти RAM (имеются только регистры общего назначения), вам придется более осторожно планировать обработчики прерываний, которые собирае- тесь использовать. Лично я всегда оставляю в запасе, по меньшей мере, три регистра общего назначения (или пять, если в обработчике прерываний пред- полагается использовать индексный регистр Z) для сохранения содержимого 16 Зак. 2025.
242 Часть 5. Микроконтроллеры семейства AVR регистров контекста основной программы. Я не использую вложенные пре- рывания и исключаю вызовы функций внутри обработчика, а также, по воз- можности, стараюсь не использовать вызовы функции в основной програм- ме. Реализовать обработчик прерывания, удовлетворяющий этим условиям, не очень сложно, зато это поможет избежать впоследствии лишних проблем, таких как переполнение стека. Операционные системы реального времени (ОСРВ) Если вы познакомились ранее с описанием реализации ОСРВ (и mykeRTOS) для семейства 68НС05, вы, вероятно, поняли, что полная архитектура AVR может быть достаточно легко использована для создания ОСРВ. При таком богатстве способов доступа к памяти, которое доступно программе для обра- щения к данным и указателям, написать настоящую программу реального времени будет довольно просто. После всего вышесказанного следует принять ряд решений по поводу того, как будет работать ОСРВ, и как будут сохраняться данные. Так как микро- контроллеры AVR имеют большое количество регистров, доступных .тля боль- шинства команд, в системах реального времени их можно использовать не- сколькими способами. Первый способ - это разделить 32 регистра общего назначения на отдель- ные блоки для различных задач. Для выполнения всех арифметических ко- манд необходимо два регистра (за исключением операций с непосредствен- ными операндами). Это значит, что можно реализовать до 15 задач. В этой схеме два регистра резервируются для временного храпения данных ОСРВ. и индексный регистр используется для обслуживания задач (хотя, когда задача использует индексный регистр, надо еще запретить прерывания, чтобы не потерять его содержимое в случае, если аппаратное прерывание изменит ход выполнения задачи). При такой схеме параметры, запрашиваемые ОСРВ, можно передавать через стек или через индексный регистр. Такое распределение РОН, хотя и поддерживает большое количество за- дач, на мой взгляд, не является оптимальным. Вместо этого, если вы собира- етесь использовать 32 регистра для сохранения параметров задач, то лучше разделить их на части по четыре регистра для стека задач, а последние четыре использовать в качестве индексных. При таком способе разделения регистров каждой задаче соответствует своя область стека. Распределение РОН на груп- пы показано на рис. 34.3. При этом возможно выполнение до семи задач. Другое решение можно предложить для того, чтобы можно было выпол- нять операции с непосредственными значениями. Вместо того, чтобы распо- лагать подряд регистры в блоке каждой задачи, можно разместить один ре- гистр в первых 16-ти адресах РОН, а остальные в старшей половине 32-адресного пространства РОН. Такой подход позволит выполнять арифме- тические операции как с содержимым РОН, так и с непосредственно задан- ными операндами. Чтобы избежать неожиданностей, лучше заранее опреде- л п н к
Глава 34. Разработка систем на базе AVR 243 лить регистры для каждой задачи, а не вычислять их в процессе выполнения программы. Например, можно определить, что задача п использует смеще- ние п*4 для доступа к своему блоку информации. Программный код для та- кой модели ОСРВ может выглядеть следующим образом: RTOS cli ; запретить прерывания st ParmO, R30 ; сохранить информацию запроса st Parml, R31 push R28 ; сохранить индекс push R29 in R28, SREG ; сохранить SREG данной задачи push R28 Id R30, CurTask ; попучить индекс бпока данных ; задачи в SRAM Id R31, CurTask+1 in R28, SPL ; сохранить стек задачи in R29, SPH st Z+, R28 st Z+, R29 ; выпопняемый код задачи Id R30, CurTask ; восстановить стек задачи Id R31, CurTask+1 Id R29, -Z ; попучить информацию о стеке Id R28, -Z st SPL, R28 st SPH, R29 pop R28 out SREG, R28 ; восстановить содержимое SREG ; задачи pop R29 Pop R28 Id R30, ParmO ; попучить информационное ; сообщение для задачи Id R31, Parml reti ; возврат и разрешение прерываний Такой подход приводит к необходимости использования всего 26 допол- нительных команд, что является весьма впечатляющим результатом, кото- рый обеспечивает очень быстрое переключение задач. Более традиционный способ, при котором происходит сохранение всех регистров, также возможен. Но он имеет недостаток - очень большой требу- емый объем памяти SRAM, используемой ;ыя записи всех регистров контек- ста задачи. Например, в микроконтроллерах AVR, которые имеют память SRAM объемом 512 байт, а сохранение содержимого всех регистров для каж- дой задачи требует минимум 32 байта, при использовании этого метода мо-
244 Часть 5. Микроконтроллеры семейства AVR жет поддерживаться не более 12 задач. Другим его недостатком является зна- чительное время, необходимое для сохранения и восстановления всех регис- тров каждый раз, когда происходит прерывание или переключение задач. Я пробовал использовать этот вариант и обнаружил, что для его реализации необходимо 83 команды — это более чем в три раза превышает размер приве- денного выше кода. Регистры общего назначения Рис. 34.3. Пример использования регистров AVR для реализации ОСРВ Обратите внимание еще на одну вещь — явное использование команд «cli» и «reti» в программе ОСРВ. В AVR нет команды программного прерывания, поэтому би г I в регистре SREG не будет автоматически замаскирован при переключении задач. Поэтому при вызове процедуры ОСРВ надо замаскиро- вать прерывания и сохранить содержимое SREG. Микроконтроллеры AVR очень хорошо подходят для выполнения про- грамм под управлением ОСРВ. Как и при создании ОСРВ для работы с мик- роконтроллерами 68НС05, необходимо потратить некоторое время, чтобы спланировать реализацию ОСРВ и задач, которые будут под ней выполняться. При чтении этого раздела, вам, наверное, приходила в голову мысль, что реализация самой ОСРВ затерялась среди описания того, что должно быть учте- но при ее разработке. Поэтому попытаемся все систематизировать. Перечислим наиболее важные аспекты, которые необходимо учесть при разработке ОСРВ: 1. Обеспечение интерфейса для обращения задач к ОСРВ. 2. Обеспечение надежного механизма для сохранения информации о теку- щей задаче в случае, если придет новый запрос к ОСРВ или случится аппаратное прерывание. 3. Создание системы сообщений, способной передавать информацию меж- ду задачами. Это, пожалуй, все. Как вы будете это осуществлять, зависит только от вас. Преимуществом микроконтроллеров AVR является множество способов того, как можно реализовать ОСРВ. Надеюсь, что в этом разделе вы получили на-
Глава 34. Разработка систем на базе AVR 245 чальные сведения о различных способах решения проблемы, которые не ос- нованы на традиционном подходе, потому что он. скорее всего, не будет оптимальным при использовании AVR. Программирование в системе Используя программирование по последовательному интерфейсу, можно менять программу в памяти микроконтроллера AVR. уже установленного в готовую к применению систему. Для этого плата с контроллером должна быть подключена к питанию и генератору тактовых сигналов (рис. 34.4). Рис. 34.4. Схема подключения AVR для программирования в системе На рис. 34.4 я включил согласующие резисторы в линиях программирова- ния, чтобы быть уверенным, что если схема программирования подает на эти линии сигналы, уровень которых отличается от того, который поступает на них от других устройств системы, состояние выводов не изменится, и на них не возникнут «состязания» сигналов. Для линии запуска используется другое подключение. Нормально на этой линии поддерживается высокий уровень сигнала, а программатор может по- дать на нее низкий, чтобы перевести контроллер в режим программирования по последовательному интерфейсу. Управление состоянием линии _Reset осуществляется схемой, имеющей выход с «открытым коллектором». Можно ли использовать эту схему для программирования прикладной систе- мы? Действительно можно, при этом я соединяю AVR с программатором при помощи 5-контактного I DC-разъема (для сигналов «земля». Reset, MISO, MOSI и SCK) вместо того, чтобы использовать что-то вроде разъема DB-25 для под- ключения системы напрямую к принтерному порту персонального компьютера, как это делается в некоторых современных схемах программирования AVR.
глава 35 СРЕДСТВА РАЗРАБОТКИ ДЛЯ AVR Краткое содержание Ассемблеры Средства разработки Языки высокого уровня Так как микроконтроллеры AVR появились на рынке недавно, для них пока нет большого количества средств разработки. Несмотря на это фирма Atmel уверена в том, что для AVR уже есть полный набор таких средств, и некото- рые производители уже начали выпускать программные и аппаратные сред- ства, доступные для пользователей. Ассемблеры Большая гибкость архитектуры AVR означает, что требуется продумать, как организовать использование регистров. Как вы, наверное, уже поняли, AVR имеет высокую степень ортогональности. Именно поэтому и требуется опре- деленное планирование при распределении регистров. В большинстве типовых применений микроконтроллеров используется очень мало переменных. Это особенно справедливо в тех случаях, когда часть функ- ций реализуется аппаратно с помощью таймеров, последовательных портов и других устройств, что облегчает создание приложений. При этом 32 регистра общею назначения должны быть способны обеспечить выполнение множества потребностей, которые имеются в основной прикладной программе. Прочитав предыдущее утверждение, вы можете подумать, что я что-то упу- стил. И это действительно так. Если вы пишете приложение, которое интенсив- но использует прерывания, то необходимо задуматься о планировании их обра- ботки, что было отмечено в предыдущей главе. Если вы реализуете обработку прерываний в AVR, то должны принять обдуманное решение, содержимое ка- ких контекстных регистров вы хотите сохранить перед выполнением функций
Глава 35. Средства разработки для AVR 247 обработчика прерывания. Так как при выполнении арифметических операций AVR может обращаться к любому из 32-х РОН, количество регистров, содержи- мое которых надо сохранять, может оказаться на удивление маленьким. РОНы Основная программа Прерывание от таймера Прерывание от последовательного интерфейса Рис. 35.1. Распределение РОН между основной программой и обработчика- ми прерываний в AVR Например, в прикладной программе, использующей два обработчика пре- рываний, которые могут быть вложенными, я произвел разделение регист- ров, как показано на рис. 35.1. Такое разделение позволяет обработчикам пре- рываний работать без сохранения содержимого каких-либо РОН, используемых основной программой, так как обработчики прерываний име- ют отдельные индексные регистры и регистры общего назначения. Единствен- ным регистром, содержимое которого надо сохранять в этом примере, явля- ется регистр состояния, который сохраняется в сегменте «Сохраненное содержимое SREG» блока регистров каждого обработчика. При таком спосо- бе разделения регистров обработчик прерываний может быть очень простым. Int Id SREG_Save, SREG ; Сохранение SREG прерванной ; программы ; Обработка прерывания st SREG SREG Save ; Восстановление SREG reti ; Возвращение к месту прерывания Я лично не люблю загружать из памяти сразу большое количество регис- тров и пытаться запомнить, что в них находится. По-моему, эго приводит к увеличению числа ошибок и затрудняет их выявление. Вместо этого лучше
248 Часть 5. Микроконтроллеры семейства AVR загружать из памяти содержимое регистров только тогда, когда оно требует- ся, и сохранять результат сразу после окончания обработки. Я хочу довести это до вашего сознания в первую очередь. Такая техника программирования выработалась у меня еще со времен программирования на ассемблере для IBM 370. Тогда я понял, как трудно запомнить, какой регистр за что отвечает. Поэтому при программировании на AVR я стараюсь держать в РОН только самые нужные переменные и загружать их из памяти, только когда они тре- буются. Чтобы избежать проблем с запоминанием, что хранит данный ре- гистр, можно дать им символьное обозначение: tfdefine i R16 ; Обозначить регистр R16 Языки высокого уровня Фирма Atmel утверждает, что архитектура AVR хорошо подходит для эффек- тивного получения программных кодов с помощью компиляторов. Однако, моим первым впечатлением было, что это не совсем правильно. Разделение РОН и памяти SRAM может привести к неэффективности программного кода, а ограниченное количество РОН не позволит эффективно выполнить код. В процессе размышления о данной проблеме и изучения своих попыток напи- сать компилятор для Р1С, я понял, что AVR обладает некоторыми свойства- ми, которые позволяют относительно легко написать эффективный компи- лятор по сравнению с другими контроллерами, которые описаны в этой книге. Мои комментарии в этом разделе основываются на моем собственном стиле написания компиляторов и могут отличаться от того, что принято в лучших технологиях компиляции. В большинстве компиляторов при вычислении выражений используются стековые операции. Например, операция А = В + С может быть представлена в виде последовательности стековых операций : push В push С add ; Взять из стека два верхних элемента, сложить их ; вместе и поместить результат обратно в стек pop А Причиной использования стека является то, что его применение позво- ляет организовать очередь данных при выполнении сложных операций. В дру- гих архитектурах это возможно, но громоздко, так как в них нет регистров, которые можно легко использовать в операциях со стеком. Например, выражение: А = В + (C*D) может быть представлено следующим образом:
Глава 35. Средства разработки для AVR 249 push В push С push D mul add pop A Для микроконтроллеров AVR, если все переменные «А», «В», «С» и «D» находятся в памяти SRAM (или в РОН; это не имеет значения при использо- вании команды загрузки «Id»), то исполняемый код, генерируемый компи- лятором, может иметь вид: Id RO, В ; Загрузить В в стек push RO Id RO, C ; Загрузить С в стек push RO Id RO, D ; Загрузить D в стек push RO call mul ; Так как нет встроенной команды умножения Pop RO ; Извлечь из стека результат операции умножения pop R1 ; Извлечь из стека В add RO, R1 ; Сложить два элемента стека push RO ; Сохранить результат в стеке pop RO ; Извлечь результат из стека и сохранить его в А st A, RO При этом оптимизирующий компилятор может определить избыточные опе- рации загрузки переменных в стек и их извлечения и выдать следующий код: Id RO, В push RO Id RO, C push RO Id R1, D call mul pop R1 ; Восстановить R1 add RO, R1 st A, RO Далее этот код может быть улучшен, если компилятор использует опреде- ленный набор регистров для каждого выражения. После дальнейшего сокра- щения программный код может иметь вид: Id R2, В Id RO, C Id R1, D call mul add RO, R2 st A, RO
250 Часть 5. Микроконтроллеры семейства AVR Приведенный выше пример использует глобальные переменные, доступ- ные из любого места программы. Если же компилятор разрабатывается для языка, использующего локальные переменные и параметры, доступные только в данной процедуре, то AVR очень хорошо подходит для решения этой про- блемы исключительно простым способом. Локальные переменные должны обслуживаться либо одним из индексных регистров, используя команды «load/ store» с предекрементом и постинкрементом, которые позволяют эмулиро- вать стек, либо при помощи стековых команд «push» и «рор». Лично я скло- няюсь в сторону использования индексных регистров и эмуляции стека. Если вами был написан компилятор языка С для AVR, и в вашей программе имеется такой фрагмент: main () { А = Complex(B, С, D); // «A=B+(C*D)>> - часто используемое //выражение, реализуемое как функция } /* End main */ int Complex (int V1, int V2, int V3) { //Обработчик функции Complexint i; return (V1 + (V2 * V3));// Возврат из операции Complex } /* End Complex */ Как будет выглядеть откомпилированный и оптимизированный код для AVR? Перед вызовом функции Complex один индексный регистр должен быть определен как указатель стека данных, а другой - как указатель базового адреса. Когда данные помещаются в стек, указатель должен увеличиваться на единицу, чтобы указывать на следующий элемент стека. При вызове функ- ции, указатель базового адреса должен указывать на текущую позицию. Итак, для приведенного выше С-кода компилятор может генерировать следующую последовательность команд AVR (здесь предполагается, что «X» — указатель стека данных, a «У» — указатель базового адреса): main Idi RO, DataStackStart & OxOFF st X, RO Idi RO, DataStackStart >: > 8 st X + 1, RO Основная программа функции Установка указателя стека на его начало
Глава 35. Средства разработки для AVR 251 Id R0, В st (Х)+, R0 Id RO, С st (X)+, RO Id RO, D st (X)+, RO ; Поместить параметры в стек данных call Complex Idd RO, (X)-4 sbi X, 4 sbci 0 ; Теперь вызвать функцию ; Получить возвращаемое значение ; Восстановить стек данных ; Это 16-и разрядное число Complex ; Теперь выполнить функцию Complex addiwX, 1 ; Отвести место для i mov (X)+, Y ; Сохранить текущий указатель ; базового адреса mov (Х)+, Y + 1 mov Y, X mov Y + 1, X + 1 Сохранять текущий указатель стека ; так же, как и указатель базового адреса Id R2, (Y) - 5 Id RO, (Y) - 4 Id R1, (Y) - 3 call mul add RO, R2 std (Y) - 6, RO ; Получить V1 или В ; Получить V2 или С ; Получить V3 или D ; Сохранить результат как ; возвращаемое значение mov X, Y mov X + 1, Y + 1 ; Восстановить стек sbi 1 sbci 0 ; Освободить место, выделенное для i ret В этом примере для вычисления выражения В + (С * D), используется такое же количество команд и такой же объем в памяти, как и при использо- вании глобальных переменных в основной программе. Эта возможность дела-
252 Часть 5. Микроконтроллеры семейства AVR ет AVR очень привлекательным при разработке компиляторов; можно рабо- тать с данными в разном формате без особых проблем с объемом используе- мой памяти. Индексные регистры позволяют легко использовать указатели. Если со- держимое регистра X служит в качестве указателя стека, а содержимое Y — в качестве указателя базового адреса, то остается еще регистр Z, который можно использовать для реализации чтения таблиц из памяти программ или в каче- стве индексного регистра общего назначения. В предыдущем примере можно также использовать указатель сгека. но в этом случае при обращении к како- му-либо параметру, находящемуся в стеке данных, содержимое указателя стека придется сохранять в регистрах X, Y или Z, чтобы найти смещение этого параметра в стеке. Гораздо проще вместо этого непосредственно ис- пользовать индексные регистры в операциях «ldd»/«std» с инкрементом. Прочитав все вышесказанное, вы можете счесть это чем-то довольно ин- тересным для себя (во всяком случае, я на это надеюсь), но не приносящим вам особой пользы, поскольку вы программируете только на ассемблере. Та- кое детальное обсуждение было приведено здесь, чтобы показать, как ло- кальные переменные и вычисления сложных выражений, ориентированные на использование стека, могут быть довольно легко реализованы при про- граммировании на языке ассемблера без необходимости прямой реализации очень сложных операций. Средства разработки Для создания программ, представленных в этой книге я использовал свобод- но распространяемые ассемблер и симулятор для AVR фирмы Atmel и стар- товый комплекс разработчика АТ89/90 Series Flash Microcontroller Starter Kit. Он состоит из программатора, образца микроконтроллера AVR 1200 и программного обеспечения для разработки прикладных программ, а также включает CD-ROM со справочными данными на микроконтроллеры. При цене менее 100$ этот комплекс предоставляет действительно большой пакет средств для разработки приложений на базе AVR. Программатор может рабо- тать с любыми моделями Atmel 8051 (то есть с AT89S2051) и AVR в DIP- корпусах, имеющих 20 или 40 выводов (рис. 35.2). Как и другие комплексы для разработки, представленные в этой книге, комплекс Starter Kit фирмы Atmel запускается из Microsoft Windows или командной строки DOS. Что необычно дтя этого комплекса, так это отсут- ствие полностью интегрированной среды разработки. Ассемблер, симулятор и программатор — это самостоятельные программы, работающие под управ- лением Windows, которые не являются настоящей интегрированной средой разработки (IDE). Хотя эти средства не интегрированы вместе, симулятор и программатор могут быстро загрузить в микроконтроллер файлы ассембли- рованной программы. Ассемблер фирмы Atmel, называемый «wavrasm». является простым ре- дактором текста, работающим под Windows, с интегрированной программой ассемблирования. На рис. 35.3. показан вид экрана, который появляется после
Глава 35. Средства разработки для AVR 253 завершения ассемблирования. В случае ошибки можно дважды щелкнуть на сообщении о ней, чтобы перейти на строку исходного текста, в которой она произошла. Рис. 35.2. Стартовый комплекс разработчика на базе микроконтроппера с Flash-памятью серии АТ89/90 to Ух it® «с th» FFaXS/O Йе*? л $ т йг I» DEF Cvur.t DEF Counth< ОН' ЙГ? йг'О DEF X асге-ае» ГО FxacSecL DEE FracSecH да FrarOz.T Ю Sec-ourf да Mjm.t© ГО Hour да sfo да of? ST К HP С • L РЖ X. РГ.<$ - X. Creating .T&at inig :re«t чет AF2VS o.p- ННГ *жз LOT’ 4PJV5 .. . c -usurtooisKeppnatess^23{l0<3«t tna' Pr->jrs* »es»ox у usa^e Ccxj« '. inured words yards да- :iS!5fcfteMy owepiete Deleting 'AF270 Рис. 35.3. Вид экрана ассемблера wavrasm фирмы Atmel 45» RFF3
254 Часть 5. Микроконтроллеры семейства AVR Если вы получили программу без синтаксических ошибок, прежде чем загружать программу в память микроконтроллера, вы можете проверить ее работу на симуляторе. Фирма Atmel предоставляет для этого два средства. Первое средство - «wavrsim» является симулятором, написанным под Windows, который загружает объектный файл «.obj» прикладной программы и позво- ляет выполнять ее по шагам в процессе отладки (рис. 35.4). nop interrupt Pin Г)жр Tsrlnt Tiber Interrupt Handier nop Analog Comparator T»rlnt Tiber Interrupt Handiei - Toggle the ’Flashing* LED at FB? Save the Status Registers tnc FracSecTop , Ir»cx**ent the Value at the Fraction Top cmt SPEC RO Finished - Return to the Mainline Start of Mainline M 09 R1* ОС Ж1 00 81’ co 82 00 9И 00 Ю 00 RH 00 84 00 «20 00 85 00 «21 00 ft* 00 K22 00 P? 00 RJ5 00 M 00 824 CO H 00 W5 00 Рис. 35.4. Вид экрана симулятора wavrsim фирмы Atmel Самым большим недостатком, который я обнаружил в этой программе, является то, что нельзя просматривать содержимое регистров ввода-вывода, кроме регистров TCCR0 и TCNT0 таймера 0 и некоторых регистров масок прерываний. Вывод на экран окна регистров, выбираемых пользователем, как, например, в окне регистров (JMP или окне просмотра в MPLAB, был очень полезен для разработки приложений. После того как ошибка в про- грамме найдена и исправлена, программа снова ассемблируется. Получен- ный «,оЬ)»-файл может быть снова быстро загружен с помощью меню «files» с перезапуском виртуального микроконтроллера, после чего выполнение программы продолжается. Второе средство — симулятор «AVRStudio» (рис. 35.5), который является улучшенной версией «wavrsim» для Windows/95 и Windows/NT. Он может по- казывать содержимое регистров ввода-вывода, как видно на рис. 35.5, что является большим преимуществом по сравнению с «wavrsim», но в осталь- ном, он очень похож на первоначальную версию.
Глава 35. Средства разработки для AVR 255 AWShidw А>?*Ь«»Ь} RC '3, С Х^й-я^ичжУшч к.-Ло.чЛс/у*! <*» t M4<<n<№K «wUwWjM .4ч ИТ? fa .хОО the LCO's display RAM R4 R< RS R?l! R2<r НК 4 р: R?? ОхЛП 0x00 ПЖ'НАР рзо 'Ti»*'” Меэза^е Р8 Рис. 35.5. Виц экрана симулятора AVRStudio фирмы Atmel Когда прикладная программа написана и отлажена на симуляторе, наста- ет время ее загрузки («прошивки») в память микроконтроллера. Это произво- дится при помощи программатора, поставляемого в составе Starter Kit, и экрана среды Windows для загрузки .hex файла, в формате Intel (рис. 35.6). AviPtoq Рис. 35.6. Окно управления программатора из набора Starter Kit фирмы Atmel
256 Часть 5. Микроконтроллеры семейства AVR После завершения процесса программирования микроконтроллер будет готов к работе. С помощью IDC-разъемов его можно соединить с макетной платой, а можно использовать и встроенные светодиоды и кнопочные вык- лючатели. Окно программатора может оставаться активным во время работы ассем- блера/симулятора, чтобы оперативно модифицировать программу. Единствен- ное, что мне не понравилось в этом программаторе - это отсутствие возмож- ности выключения питания программируемого микроконтроллера. Во время работы мне приходилось вручную отключать питание, чтобы быть уверен- ным, что я не провожу «горячую замену» микроконтроллера при отладке приложения совместно с другими устройствами. Программное обеспечение программатора работало без каких-либо проблем при подключении и отклю- чении платы программатора. I I I I I Г ч к Г L Г с
глава 36 СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ AVR Краткое содержание Команды пересылки данных AVR Команды арифметических и логических операций AVR Команды ветвления AVR Битовые команды и команды тестирования битов AVR Микроконтроллеры AVR имеют очень широкий набор команд. Как уже отме- чалось в других главах, AVR позволяет более просто произвести разработку компиляторов, что также означает, что AVR может быть легко запрограмми- рован с использованием разнообразных команд, упрощающих решение зада- чи. Реализация большого набора команд — это палка о двух концах. Когда вы прочтете описание команд AVR в фирменной документации и начнете пи- сать свою первую программу, то, вероятно, обнаружите, что довольно труд- но запомнить все эти команды. Многие из них повторяются, одна и та же команда может иметь разные названия в зависимости от того, значения ка- ких битов устанавливаются при ее выполнении или какие входные парамет- ры модифицируются. При рассмотрении системы команд в этой главе я со- кратил их набор по двум причинам: во-первых, для экономии места, а во-вторых, чтобы объединить похожие команды в группы и дать вам возмож- ность увидеть общую картину. Это сокращение получилось довольно значи- тельным. В документации фирмы описана 121 команда, а в данной главе я сократил их количество почти вдвое. Даже без такого сокращения система команд AVR является довольно по- нятной, хотя есть ряд вещей, на которые следует обратить внимание, когда вы пользуетесь документацией фирмы Atmel или данным мной описанием для создания прикладных программ. Первое, на что надо обратить внимание, 17 Зак. 2025.
258 Часть 5. Микроконтроллеры семейства AVR это адреса регистров и диапазон данных, с которыми оперирует команда. Многие команды могут обращаться только к 16-ти старшим РОН и не имеют доступа к 16-ти младшим. Значения смещений и констант могут быть ограни- чены и оказаться не в том диапазоне, который вы ожидпи. Вы должны знать обо всех этих ограничениях, когда будете планировать, какие РОН использо- вать и какие значения констант являются допустимыми в структурах данных. Фирма Atmel делает следующее заявление по поводу микроконтроллера AVR 8515: «120 мощных команд, большинство из которых выполняется за один такт». Это подразумевает, что микроконтроллер позволяет гораздо про- ще создавать программы, критичные ко времени: если для любой команды требуется один цикл, вычисление времени значительно облегчается. Но лич- но у меня возникло много сомнений по поводу этого утверждения после того, как я подробно ознакомился с системой команд. Хотя большая часть команд действительно выполняется за один такт, многие все же требуют не- скольких тактов. Что еще хуже, реальное время выполнения для многих ко- манд трудно предсказуемо, например, команда «cpse» может выполняться за 1, 2 или 3 такта. Это не значит, что архитектура AVR плохо подходит реали- зации приложений, критичных ко времени. В большинстве случаев это не так, однако, данные приложения не так просто реализовать, как можно ожидать при первом знакомстве с документацией. Последнее, что следует учитывать при знакомстве с набором команд AVR - это различие между «полноценными» старшими моделями AVR серии AVR 8515 и их младшими моделями серии AVR 1200. Младшие модели контролле- ров реализуют часть полного набора команд AVR, в которых доступен только один индексный регистр Z. Хотя при переносе программы с младших моде- лей на старшие вряд ли возникнут проблемы, они весьма вероятны при пе- реносе программ в обратном направлении. Даже с учетом всех этих предосте- режений, мне кажется, что AVR — это микроконтроллер очень простой для программирования благодаря богатству набора команд и особенностям его структуры, которые облегчают процесс программирования. Команды пересылки данных AVR Пересылка данных из одного места в другое является для AVR очень простой операцией, так как имеется большое количество команд, предназначенных для выполнения этой задачи. Многие из них хорошо подходят для реализации языков высокого уровня, как уже отмечалось в предыдущих главах. В старших моделях AVR серии 8515 планирование того, как надо хранить данные и про- изводить обмен между РОН и памятью SRAM, очень важно для создания хо- рошей программы. Ни одна из команд пересылки данных не оказывает влия- ния на биты регистра состояния. Это означает, что для проверки значения данных после этих команд надо выполнить команду «tst» для соответствующей установки флагов нуля и отрицательного результата в регистре состояния SREG. Первой будет рассмотрена команда «mov» (команда 36.1), которая копи- рует содержимое одного регистра общего назначения в другой. Команда «Idi» (команда 36.2) используется для загрузки в регистр значения константы. На-
Глава 36. Система команд микроконтроллеров AVR 259 ряду с командой «mov» эта команда является базовой при создании про- грамм, простых для выполнения. Команда «Idi» загружает в один из 16-ти старших РОН байт, содержащийся в команде. Она служит для записи произ- вольных констант в регистры общего назначения. Для прямого обращения к пространству регистров ввода-вывода исполь- зуются команды «in» и «out» (команда 36.3 и команда 36.4). Эти команды обеспечивают доступ к регистрам, начиная с нулевого адреса в пространстве ввода-вывода, а не с адреса $IF, с которого в пространстве данных AVR определены адреса регистров ввода-вывода. Перечисленные выше команды — это практически все, что имеется в млад- ших моделях AVR серии 1200 для пересылки данных. Остальные команды позволяют получить доступ к любой ячейке в пределах 64К пространства дан- ных AVR, которое включает в себя РОН, регистры ввода-вывода и память SRAM, или к памяти программ, а не только к отдельным регистрам, как это было в предыдущих командах. «Lds» и «sts» — четырехбайтовые команды, которые передают данные между РОН и пространством данных, используя прямую адресацию (команды 36.5 и 36.6). Можно также использовать косвенную адресацию, применяя коман- ды «ld(d)» и «st(d)» (команды 36.7, 36.8, 36.9, 36.10, 36.11, 36.12, 36.13, 36.14). В командах 36.10 и 36.14 обращение к данным производится с помощью ин- дексных регистров X, Y или Z. При использовании команд «Id» и «st» можно увеличивать или уменьшать на единицу содержимое индексных регистров. Возможности такого предекре- мента и постинкремента позволяют эмулировать стек при помощи этих ко- манд. Команды «Idd» и «std» очень полезны в случаях, когда индекс является указателем на структуру данных. В других главах я рассмотрел более детально, как можно использовать эти команды при работе со структурами данных в программном коде, генерированном компилятором. Младшие модели AVR используют основные возможности этих команд, чтобы производить доступ к данным в пространстве регистров общего назна- чения с помощью индексного регистра Z. Это значит, что можно создавать таблицы в РОН, хотя при этом не обеспечиваются все возможности, доступ- ные в старших моделях AVR. Стек в старших моделях AVR реализуется с помощью команд «push» и «рор», выполняющих операции с регистрами общего назначения (команды 36.15 и 36.16). Вас это может удивить, но я избегаю использования этих ко- манд. Вместо них я предпочитаю применять команды «Id» и «st», реализую- щие индексную адресацию с предекрементом и постинкрементом, так как с их помощью можно обеспечить более простой доступ к данным. При этом стек микроконтроллеров AVR служит только для сохранения содержимого программного счетчика во время выполнения подпрограмм или обработчи- ков прерываний. Последняя из команд пересылки данных — это команда загрузки из памя- ти программ «1рт» (команда 36.17). Она служит для загрузки данных из таб- лиц, хранящихся в памяти программ. Хотя ее применение кажется довольно очевидным, есть одна вещь, которую следует опасаться при обращении к
260 Часть 5. Микроконтроллеры семейства AVR памяти программ. В этой команде младший бит индексного регистра Z ис- пользуется для указания байта, который будет читаться (старший или млад- ший), тогда как оставшиеся 14 бит используются для указания адреса слова (рис. 36.1). Хотя большинство таблиц может создаваться с использованием словарной организации: читаем младший байт, увеличиваем содержимое Z на 1, читаем старший байт и т.д., имеются некоторые случаи, когда это невозможно. Например, если вы имеете таблицу с нечетным числом элемен- тов, следует позаботиться, чтобы следующие команды размещались в памя- ти, начиная с четных адресов, Иначе в зависимости от программного обес- печения, генерирующего объектный код, эти команды могут быть размещены так, что границы слов окажутся посередине команды. Рис. 36.1. Выполнение команды «1рт» в AVR Команда: “mov Rd, Rr” Код команды: Выполнение: Число циклов: 1 Rd <- Rr Пример: mov RO, R2 ; RO = R2 Типы микроконтроллеров: все модели AVR Команда 36.1. Команда AVR «mov Rd, Ro
Глава 36. Система команд микроконтроллеров AVR 261 Команда: “LDI Rd, Constant” Код команды: 1110 kkkk dddd kkkk «d>> - РОН-приемник ($10 <= d <= $1F) «к» - Константа ..Значение, указанное в команде Z х а го X 3 3 Выполнение: Rd <- к Пример: Idi R20, $АА Число циклов: 1 Типы микроконтроллеров: все модели AVR ; Загрузить в R20 число $АА Команда 36.2. Команда AVR «Idi Rd, constant» Команда: “in Rd, Reg” Код команды: Выполнение: Rd IOReg(r) Пример: in RO, porta Число циклов: 1 Типы микроконтроллеров: все модели AVR Ввести содержимое регистра ввода-вывода «porta» Примечание: регистры общего назначения имеют адреса с $00 no $1F, а регистры ввода-вывода - с $00 no $3F Команда 36.3. Команда AVR “in Rd, reg"
262 Часть 5. Микроконтроллеры семейства AVR Команда: “out Reg, Rd" Код команды: Выполнение: IOReg(r) <- Rd Пример: out porta, RO Число циклов: 1 Типы микроконтроллеров: все модели AVR ; Записать новое значение в «porta» Примечание: регистры общего назначения имеют адреса с $00 по $1F, а регистры ввода-вывода - с $00 по $3F Команда 36.4. Команда AVR «out reg, Rd» Команда: “LDS Rd, Address Код команды: Выполнение: Rd <- (k) Пример: Ids RO, $1235 sts $1234, RO Число циклов: 3 Типы микроконтроллеров: старшие модели AVR ; Получить и сохранить число в SRAM Команда 36.5. Команда AVR «Ids Rd, addr»
Глава 36. Система команд микроконтроллеров AVR 263 Команда: “STS Address, Rd” Код команды: Выполнение: (k) <- Rd Пример: Idd RO, Х+7 sts $1234, RO Число циклов: 3 Типы микроконтроллеров: старшие модели AVR ; Получить и сохранить указатель данных из ; регистра X Команда 36.6. Команда AVR «sts addr, Rd» Команда: “LD Rd, Index” Код команды: 1001 000d dddd iiOO <«d» - РОН-приемник «(>• - Индексный регистр (“1Г-"Х”) (“00"-"Z") к £ ...> Адрес данных из индекса з > Передача данных Выполнение: Rd <- (X) Пример: Id RO, X Id R1, Y Число циклов: 2 Типы микроконтроллеров: все модели AVR Использовать X и Y как указатели данных Примечание: младшие модели AVR (серия 1200) могут использовать только индексный регистр Z Команда 36.7. Команда AVR «Id Rd, index»
264 Часть 5. Микроконтроллеры семейства AVR Команда: “LD Rd, lndex+" Код команды: Выполнение: Rd <- (X) X <- Х+1 Пример: Id RO, Х+ Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X как указатель стека данных st -X, RO Команда 36.8. Команда AVR «Id Rd, index+» (с постинкрементом) Команда: “LD Rd, -Index” Код команды: Выполнение: Пример: Id RO, -X X <- Х-1 Rd <- (X) Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X как указатель стека данных st Х+, R0 Команда 36.9. Команда AVR «Id Rd, -index» (с предекрементом)
Глава 36. Система команд микроконтроллеров AVR 265 Команда: “LDD Rd, Index+Off” Код команды: Выполнение: Rd <- (X+q) Пример: Idd RO, X + 7 Id R1, Y Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X и Y как указатели данных Команда 36.10. Команда AVR «Idd Rd, index+constant» Команда: “ST Index, Rd” Код команды: Выполнение: (X) <- Rd Пример: Id RO, X st Y, RO Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X и Y как указатели данных Примечание: младшие модели AVR (серия 1200) могут использовать только индексный регистр Z Команда 36.11. Команда AVR «st index, Rd»
। 266 Часть 5. Микроконтроллеры семейства AVR Команда: “ST lndex+, Rd” Код команды: Выполнение: (X) <- Rd X <- Х+1 Пример: Id RO, -X Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X как указатель стека данных st Х+, R0 Команда 36.12. Команда AVR «st index+, Rd » (с постинкрементом) Е ( Г I I Команда: “ST -Index, Rd” Код команды: I Выполнение: X Х-1 (X) <- Rd Пример: Id RO, X- Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Использовать X как указатель стека данных st -X, R0 Команда 36.13. Команда AVR «st -index, Rd » (с предекрементом)
Глава 36. Система команд микроконтроллеров AVR 267 Команда: “STD Index+Off, Rd” Код команды: Число циклов: 2 Выполнение: (X+q) <- Rd Пример: Idd RO, Х+7 std Y+5, RO Типы микроконтроллеров: старшие модели AVR ; Использовать X и Y как указатели данных Команда 36.14. Команда AVR «std index+constant, Rd» Команда: “push Rd” Код команды: Выполнение: (SP) <- Rd SP <- SP-1 Пример: push RO Число циклов: 2 Типы микроконтроллеров: старшие модели AVR pop RO ; Сохранить содержимое R0 «а время выполнения ; операции ; Операция, изменяющая содержимое R0 ; Восстановить содержимое R0 после операции Команда 36.15. Команда AVR «push Rd»
268 Часть 5. Микроконтроллеры семейства AVR Команда: “pop Rd” Код команды: Выполнение: Rd <- (SP) SP <_ SP+1 Пример: push R0 pop RO Число циклов: 2 Типы микроконтроллеров: старшие модели AVR ; Сохранить содержимое R0 на время выполнения ; операции ; Операция, изменяющая содержимое R0 ; Восстановить содержимое R0 после операции Команда 36.16. Команда AVR «pop Rd» Команда: “LPM” Код команды: Выполнение: RO <- (Z) Пример: Idi R30, table & $FF Idi R31, Table » 8 Ipm Число циклов: 3 Типы микроконтроллеров: старшие модели AVR ; Чтение таблицы из памяти программ Команда 36.17. Команда AVR «1рт»
Глава 36. Система команд микроконтроллеров AVR 269 Команды арифметических и логических операций AVR Выполнение арифметических и логических команд в AVR, на самом деле, довольно очевидно. Если вы знакомы с программированием на ассемблере для микропроцессоров Intel 8085 или 8086, у вас не будет никаких проблем и с AVR. Во всех командах первый параметр является источником первого опе- ранда, используемого при операции, а также приемником результата (destination). Второй параметр, который не является обязательным, служит источником второго операнда (source). Основными арифметическими операциями являются сложение и вычита- ние двух чисел (команды 36.18, 36.19, 36.20 и 36.21). Эти команды, по боль- шей части, очевидны. Сложение и вычитание содержимого двух регистров производится при помощи команд «add» и «sub». Модификаций этих команд, которые учитывают значение флага переноса, позволяют выполнять опера- ции над 8- или 16-разрядными числами, хранящимися в регистрах. Вычисление выражения А = А - В, где 16-разрядное число А хранится в R0 и R1, а число В - в R2 и R3, может быть реализовано при помощи следу- ющего ассемблерного кода для AVR: sub RO, R2 ; Вычесть младшие 8 биг sbc R1, R3 ; Теперь вычесть старшие 8 бит Используя команды сложения и вычитания с учетом переноса можно лег- ко обрабатывать 24- и 32-разрядные числа со знаком. Прежде, чем перейти к описанию следующих команд, я хочу пояснить функции флагов отрицательного результата N («negative»), переполнения V («overflow») и знака S («sign»), так как они имеют некоторые особенности и сложны для понимания при первоначальном знакомстве. Флаг отрицательного результата N просто копирует значение бита 7 ре- зультата, который показывает, является результат положительным или отри- цательным числом. При выполнении команды: sub R4, R5 если содержимое регистра R4 больше или равно содержимому R5, то резуль- тат будет положительным, и бит 7 равняется нулю. Если же содержимое R4 меньше, чем содержимое R5, то бит 7 будет установлен в I, показывая, что результат отрицателен и представлен в дополнительном коде. Назначение флага переполнения V в регистре SREG может показаться вам не очень понятным. Этот флаг указывает на переполнение во время сло- жения или вычитания чисел со знаком. Рассмотрим пример: add R1, R2 Флаг V будет установлен в I, если в регистрах Rl и R2 содержатся поло- жительные числа, а результат их сложения окажется больше 127, или оба числа отрицательны, а результат будет меньше -128. Возможно, это не слиш-
270 Часть 5. Микроконтроллеры семейства AVR ком понятно, но если рассмотреть пример с конкретными значениями, все станет гораздо яснее: Idi R1, 100 Idi R2, 100 add R1, R2 ; Занести 0Ь001100100 в R1 и R2 ; R1 = R1 + R2 ; =100+100 ; = 200 ; = $C8 = 0b011001000 Десятичное число 200 в двоичной записи имеет значение бита 7 равное I, что указывает на получение отрицательного результата число. Следовательно, после выполнения операции сложения флаг N будет установлен в I. Но в данном случае вместе с флагом N будет также установлен в I флаг V, указы- вая, что произошло переполнение при обработке чисел со знаком. Если содержимое RI и R2 равно -100, то результатом сложения этих чи- сел будет -200 или $38, что является положительным числом. При этом флаг N будет сброшен в 0, показывая, что результат положителен, однако будет установлен флаг'У, означающий, что на самом деле это не так. При чтении предыдущего абзаца вы, возможно, заметили, что при помо- щи флагов N и V можно определить настоящий знак результата. Именно это и делает флаг знака S в регистре состояния. Если вы внимательно изучите описание команд, то увидите, что этот флаг принимает следующее значение: S = N л V. Использование флага S позволяет рассматривать результат как 9-разряд- ное число со знаком, где старшим (знаковым) разрядом как раз и является флаг S. Как было отмечено при описании флага V, он устанавливается в I, когда бит 7 результата имеет неправильное значение, то есть результат не представлен правильным числом со знаком в дополнительном коде. Выпол- нив операцию «Исключающее ИЛИ» над значениями флага V и бита 7 ре- зультата, который хранится в бите N, вы получите реальный знак результата. В первом примере (100 + 100) происходит установка в I флагов V и N, в результате флаг S будет равняться нулю (I л I = 0). Во втором примере (-100 - 100) флаг N сбрасывается в 0. а флаг V устанавливается в I, поэтому флаг S будет равняться единице, указывая на то, что результат отрицательный. Флаг S должен использоваться только со старшим байтом числа. При опе- рациях с 16-, 24- и 32-разрядными числами значение флага S надо проверять только после завершения последней операции со старшим байтом числа. При операциях с младшими байтами используется флаг переноса С, как обычно при выполнении сложения и вычитания. Возвращаясь к командам сложения и вычитания, надо заметить, что кроме их модификаций, учитывающих флаг переноса, существует еще ряд команд, на которые следует обратить внимание, так как они облегчают жизнь разра- ботчика программ. Первая - это вычитание непосредственно заданного опе- ранда (команды 36.22 и 36.23). Эти команды производят вычитание констан- ты из числа, хранящегося в регистре, и заносят результат обратно в этот
Глава 36. Система команд микроконтроллеров AVR 271 регистр (аналогичных команд сложения нет). Важной особенностью команд, использующих непосредственно заданное число в качестве второго операн- да, является то, что они могут обращаться только к 16-ти старшим РОН. Команды «subi» и «sbci» могут использоваться совместно, чтобы произве- сти вычитание 16-разрядной константы из содержимого пары регистров. Вычитание 16-разрядной константы из содержимого индексного регистра X может быть выполнено при помощи следующей последовательности команд: subi R26, Constant & $FF ; Вычитание из младшего байта sbci R27, Constant >> 8 ; Вычитание из старшего байта с ; учетом переноса В начале описания команд «subi» и «sbci» было сказано, что нет аналогич- ных команд сложения. Но это не совсем так. Вы можете эмулировать сложе- ние при помощи вычитания отрицательной константы, как это делается в следующем макросе: MACRO addi Register, Value subi Register, 0 - Value ENDMACRO В данном случае «ноль минус значение» дает отрицательное число в до- полнительном коде, а вычитание отрицательного значения эквивалентно прибавлению положительного. Такая операция не может быть проделана для сложения непосредственного операнда с учетом флага переноса, так как зна- чение этого флага будет вычитаться из результата. После предыдущего примера надо указать, что есть простой способ для прибавления числа к содержимому индексных регистров или вычитания чис- ла из него. Этим способом является использование команд «adiw» и «sbiw» (команды 36.24 и 36.25), которые позволяют прибавлять значение константы к содержимому 4-х старших пар РОН (в их число входят индексные регистры X, Y и Z) или вычитать их. Так как эти команды имеют пину в одно слово, значения констант, которые можно использовать, не должны превышать 63. Эти две команды хорошо подходят для программ, где индексные регистры являются указателями на стеки или структуры данных. Команды инкремента и декремента (команды 36.26 и 36.27) являются еще одной формой явного сложения и вычитания. При этих операциях прибавляет- ся или отнимается единица. Подобно командам инкремента и декремента в большинстве других микроконтроллеров и процессоров, выполнение этих опе- раций не оказывает влияния на флаг переноса (хотя команды «adiw» и «sbiw» изменяют его значение). Но, несмотря на это операцию инкремента 16-раз- рядного числа можно выполнить довольно легко, как и в других процессорах: inc А ; Инкремент младшего байта 16-разрядного числа sbic SREG, Z ; Если результат равен 0, то инкремент старшего байта inc А + 1 Декремент 16-разрядного числа выполняется не так просто, хотя для это- го и используется такое же количество команд:
272 Часть 5. Микроконтроллеры семейства AVR subi А, 1 sbic SREG, С dec А + 1 Вычесть единицу из младшего байта Если результат меньше нуля, то декремент старшего байта В дальнейшем в реальных программах этот код можно сократить до одной команды «sbiw». Но здесь мне хотелось показать, что при работе с числами, разрядностью больше 8, надо вычитать I вместо выполнения операции дек- ремента. Должен также еше раз обратить ваше внимание на то, что приведен- ный выше код для операции декремента будет работать только, если число находится в 16-ти старших РОН. Смена знака содержимого регистра производится при помощи команды «neg» (команда 36.28). Она просто вычитает содержимое регистра из нуля и помешает результат обратно в регистр. Смена знака 16-разрядного (и более) числа гораздо более сложная операция, которая требует применения команд вычитания и использования дополнительного регистра. пед А ; Меняем знак младшего байта clr Rn ; Выполняем команду «sbc» с нулем ; для старшего байта sbc Rn, А + 1 ; Здесь Rn - любой РОН mov А + 1, Rn Команда дополнения «сот» (команда 36.29) инвертирует значения всех битов в заданном РОН. Она не изменяет знак числа, а выполняет те же дей- ствия, что и логическая операция Исключающее ИЛИ (XOR) с числом S0FF. Эта команда называется также «дополнение до единицы». Приятной особенностью набора команд AVR является возможность сравнения содержимого двух регистров или регистра и константы без сохра- нения результата в каком-либо РОН (команды 36.30, 36.31 и 36.32). Команды сравнения, в сущности, производят вычитание без записи результата на ме- сто первого операнда. Команда «ср» сравнивает содержимое двух регистров, «срс» — содержимое двух регистров с учетом переноса, a «cpi» — содержимое регистра и константу. Команда «Г5Ь>(команда 36.33) выполняет логическую операцию ИЛИ с содержимым указанного регистра и нулем, по результатам которой уста- навливаются флаги нуля и отрицательного результата в регистре SREG. При рассмотрении команды «1st» вы будете удивлены, обнаружив, что флаг пере- полнения V сбрасывается в 0. Это сделано для того, чтобы быть уверенным, что флаг S будет установлен правильно. Так как S = N л V, то при V=0 флаг знака будет иметь правильное значение S = N. Последняя арифметическая команда «mul» выполняет операцию ум- ножения (команда 36.34). Она перемножает два 8-разрядных числа, обеспе- чивая получение 16-разрядного результата. Команда умножения работает только с числами без знака. Команды логических операций я называю «побитовыми» («bitwise»), так как они изменяют значения отдельных битов. Чтобы было меньше пута-
Глава 36. Система команд микроконтроллеров AVR 273 ницы, я сгруппировал их таким же образом, как это сделала фирма Atmel. но буду рассматривать их не как логические, а как ''побитовые» команды. Выполнение логической операции И с содержимым регистра (команды 36.35 и 36.36) не содержит чего-либо необычного и реализуется точно так. как вы ожидаете. Следует только обратить внимание на команду «сЬг». Она выпол- няется как команда «andi» с инвертированием значения битов заданной кон- станты перед логической операцией И с содержимым РОН, которое является первым операндом. Инвертирование значения константы производится при помощи операции Исключающее ИЛИ с числом SFF. Назначение команды «сЬг» - сбросить в нуль значения указанных битов вместо того, чтобы сохра- нить их неизменными, как это делает обычная команда AND. Команды логического ИЛИ (команд$ 36.37 и 36.38) в AVR имеют такой же формат записи, что и команды логического И. Это справедливо и для команды «sbr», которая аналогична команде «оп» так же, как «сЬг» аналогич- на «andi». Однако при этом значение константы не инвертируется, как в ко- манде «сЬг», так как «sbr» предназначена для установки в 1 определенных битов, а не для сброса их в 0, как команда «сЬг». Команда «еог» (команда 36.39) выполняет операцию Исключающее ИЛИ над битами содержимого двух регистров. К сожалению, нет команды «eori». которая позволила бы инвертировать значения определенных битов в регис- тре с помощью одной команды. Команда «еог» может быть использована для обмена содержимым между двумя регистрами без использования третьего регистра для временного хранения: еог А, В еог В, А еог А, В ; А = А л В, ; А = А л В, ; А = А л В л А, ; А = В, В = В В = В л (А л В) = В л В л А = А В = А В = А Действительно удивительным аспектом этого маленького фрагмента кода является го, что он содержит такое же число команд, что и вариант с проме- жуточным регистром: mov Rn, А mov А, В mov В, Rn Чтобы быть совершенно честным, скажу, что узнал об этой хитрости при изучении микроконтроллеров Р1С. Последние две команды «с1г» и «ser» (команды 36.40 и 36.41) используются, соответственно, для сброса в 0 и установки в 1 всех битов указанного регистра. С командой «с!г» вы, вероятно, уже знакомы и знаете, для чего ее можно исполь- зовать, тогда как команда «ser» кажется, на первый взгляд, менее полезной. На самом деле эта команда очень полезна для записи в регистр начального значе- ния -1 (SFF равно -1 в десятичном счислении). Я часто использую начальное значение -1, чтобы показать, что в регистр еще не была записана переменная. 18 Зак. 2025.
274 Часть 5. Микроконтроллеры семейства AVR Команда: “add Rd, Rr" Код команды: Выполнение: Rd <- Rd + Rr Z <- ((Rd + Rr) & $FF) C «- (Rd + Rr) » 8 H <- ((Rd & $0F) + (Rr N <- (Rd + Rr) » 7 V <- (Rd < 0) & ((Rr + S «- N Л V & $0F)) » 4 Типы микроконтроллеров: все модели AVR Rd) < -128)) I ((Rd >= 0) & ((Rr + Rd) > 127)) Пример: add RO, R2 ; R0:R1 R0:R1 + R2:R3 adc R1, R3 ; Сложение двух 16-разрядных переменных Команда 36.18. Команда AVR «add Rd, Rr» Команда: “adc Rd, Rr” Код команды: 2 X Э c C) & C) > = $FF) == 0 8 Типы микроконтроллеров: все модели AVR S Выполнение: Rd <- Rd + Rr + Z <- ((Rd + Rr + C <- (Rd + Rr + H <- ((Rd & $0F) + (Rr & $0F) + C) » 4 N <- (Rd + Rr + C) » 7 V <- (Rd < 0) & ((Rr + Rd + C) < -128)) I I ((Rd >= 0) & ((Rr + Rd + C) > 127)) S <- N Л V Пример: add RO, R2 ; R0:R1 = R0:R1 + R2:R3 adc R1, R3 ; Сложение двух 16-разрядных переменных Команда 36.19. Команда AVR «abc Rd, Rr»
Глава 36. Система команд микроконтроллеров AVR 275 Команда: “sub Rd, ЯГ Код команды: Выполнение: Rd <- Rd - Rr Z «- ((Rd - Rrl & Типы микроконтроллеров: все модели AVR С «- (Rd - Rr) » 8 Н «- ((Rd & $0F) • (Rr & $0F)) » 4 N «- (Rd - Rr) » 7 V (Rd < 0) & ((Rr - Rd) < -128)) I ((Rd >= 0) & ((Rr - Rd) > 127)) S < N Л V Пример: sub RO, R2 ; R0:R1 = R0:R1 - R2:R3 sbc R1, R3 ; Вычитание двух 16-разрядных переменных Команда 36.20. Команда AVR -sub Rd, Rr» Команда: “sbc Rd, ЯГ Код команды: Выполнение: Rd < Rd - Rr - C Z «- ((Rd - Rr - Cl & $FF} == 0 Тилы микроконтроллеров: все модели AVR С «- (Rd - Rr - С) » 8 Н ((Rd 8, $0F) - (Rr 8, $0F) - С) » 4 N < (Rd - Rr - C) » 7 V «- (Rd < 0) & ((Rr - Rd - C) < -128)) I ((Rd >= 0) & ((Rr - Rd - C) > 127)' S «- N Л V Пример: sub RO, R2 sbc R1, R3 ; R0:R1 = R0:R1 - R2:R3 ; Вычитание двух 16-разрядных переменных Команда 36.21. Команда AVR -sbc Rd, Rr»
276 Часть 5. Микроконтроллеры семейства AVR Команда: "subi Rd, k” Код команды: Выполнение: Rd < Rd к С « Rd < к Z « ((Rd & к) & SFF) -= О N < (Rd & к) >> 7 V . О S < N л V Типы микроконтроллеров: все модели AVR Пример: subi R20. 4 , Вычесть 4 из содержимого регистра Примечание: Используются регистры с номерами от S10 до $1F Команда 36.22. Команда AVR --subi Rd. constant» Команда: “sbci Rd, k” Код команды: Выполнение: Rd < Z < Rd - к - С ((Rd - к - С) & (Rd - к - С) » ((Rd & $0F) - (к & $0F) (Rd - к - С) » 7 (Rd < 0) & ((Rr к - С) SFF) == 8 Типы микроконтроллеров: все модели AVR - С) » 4 О N < V < S < -128)) I ((Rd >= 0) & ((Rr к - С) - 127)) : Очистить флаг переноса . R20:R21 = R20 R21 к Пример: с Ic sbci R20, k&$FF sbci R21. к » 8 Команда 36.23. Команда AVR »sbci Rd. constant»
Глава 36. Система команд микроконтроллеров AVR 277 Команда: "adiw Rd, Const” Код команды: Выполнение: Rd <- Rd + К Rd + 1 «- Rd + 1 + С Типы микроконтроллеров: все модели AVR Z «- ((Rd +1 << 8) + Rd + k) == О С <- (Rd + 1 << 8) + Rd + k) » 16 H «- ((Rd & $0F) + (k & $0F)) » 4 N «- (Rd + 1 -< 8) + Rd + K) » 15 V «- (((Rd + 1 « 8) + Rd + k) » 15) & (Rd + 1.7 » 7) Пример: adiw X, 1 . Инкремент содержимого индексного регистра X Примечание: Rd может быть 24, 26, 28 или 30. а “к» - от 0 до 63 Команда 36.24.Команда AVR «adiw Rd, const» Команда: “sbiw Rd, Const" Код команды: 1001 0111 kkdd kkkk «d» - РОН-источник/приемник (24, 26, 28, 30) к» - Значение константы (0 - 63) ------► Передача данных из Rd -.► Передача константы 3 z а СЗ Z S в Число циклов: 1 Выполнение: Rd т- Rd - К Rd + 1 < Rd =+ 1 + С Z «- ((Rd +1 « 8) Rd k) == 0 С (Rd + 1 « 8) - Rd - k) » 16 H e- ((Rd & $0F) - (k & $0F)) » 4 N <- (Rd + 1 « 8) -) Rd - K) » 15 V «- (((Rd + 1 « 8) - (Rd - k) » 15) & (Rd = 1.7 » 7) S <- N Типы микроконтроллеров: все модели AVR Примечание: Rd может быть 24, 26, 28 или 30, а «к- - от 0 до 63 Пример: cbiw X, 1 ; Декремент содержимого индексного регистра X Команда 36.25. Команда AVR “sbiw Rd, const" S <- N
278 Часть 5. Микроконтроллеры семейства AVR Код команды: 1001 010d dddd 0011 «d» - РОН-источник/приемник ♦ Передача данных из Rd Команда: “inc Rd" Выполнение: Rd <• - Rd + 1 Z (Rd +1) == 0 N «- (Rd + 1) » 7 V <- Rd = 127 S <- N Л V 3 а го э Число циклов: 1 Типы микроконтроллеров: все модели AVR Пример: inc R0 Инкремент содержимого регистра Команда 36.26. Команда AVR «inc Rd» Команда: “dec Rd” Выполнение: Rd < Rd - 1 Z <- (Rd - 1) == О N <• (Rd - 1) » 7 V < Rd = -128 S < N Л V Код команды: 1001 010d dddd 1010 «d» - РОН-источник/лриемник ♦ Передача данных из Rd а s э Число циклов: 1 Типы микроконтроллеров: все модели AVR Пример: dec R0 ; Декремент содержимого регистра Команда 36.27. Команда AVR «dec Rd
Глава 36. Система команд микроконтроллеров AVR 279 Команда: “neg Rd” Код команды: Н <• - (0 - (Rd & OxOF)) < О Z «- (0 - Rd) == О N «- (0 - Rd) » 7 V <- (0 - Rd) == $80 S < N Л V Пример: neg RO ; Поменять знак содержимого регистра Команда 36.28. Команда AVR «neg Rd» Команда: “com Rd” Выполнение: Rd <- Rd & SFF C <- 1 Z (Rd Л SFF) == 0 N < (Rd Л SFF) » 7 V <- 0 S < N Л V Пример: com R0 inc R0 Код команды: 1001 010d dddd 0000 «d” - РОН-источник/приемник ♦ Передача данных из Rd а го X э Число циклов: 1 Типы микроконтроллеров: все модели AVR Поменять знак содержимого регистра Команда 36.29. Команда AVR «сот Rd»
280 Часть 5. Микроконтроллеры семейства AVR Команда: “ср Rd, Rr” Код команды: Выполнение: Z «- (Rd - Rr) & $FF) == О С «- (Rd - Rr) < О Н «- (Rd & $0F) - (Rr & $0F)) < 0 N «- (Rd - Rr) » 7 0001 01 rd dddd rrrr «d» - РОН-источник/приемник «г» - РОН-приемник ------► Передача данных из Rd -----► Передача данных из Rr 3 х I 3 Число циклов: 1 Типы микроконтроллероа: все модели AVR V <- ((Rd < 0) & ((Rr - Rd) < -128)) I (Rd >=0) & ((Rr - Rd) > 127)) S <- N л V Пример: ср RO, R2 breq Label ; Если RO = R1, то переход к метке Label Команда 36.30. Команда AVR «ср Rd, Rr» Команда: “cpc Rd, Rr” Код команды: X а I в Z <- (Rd - Rr - C) & $FF) == 0 C e (Rd - Rr - C) < 0 H «- (Rd & $0F) - (Rr & $0F) - C) » 4 0000 01 rd dddd rrrr «d» - РОН-источник/приемник «г» - РОН-приемник * Передача данных из Rd/C -----». Передача данных из Rr N «- (Rd - Rr - С) » 7 V <- ((Rd < 0) & ((Rr - Rd - С) < -128)) I (Rd >=0) & S «- N Л V Пример: ср X, Y ; Переход, если X > Y cpc X + 1. Y + 1 brpl Label Команда 36.31. Команда AVR «cpc Rd, Rr» Число циклов: 1 Типы микроконтроллеров: все модели AVR ((Rr - Rd - С) > 127))
Глава 36. Система команд микроконтроллеров AVR 281 Команда: “cpi Rd, k" Код команды: Выполнение: С « (Rd - к) < О Н < (Rd & $0F) - (к & $0F) С) < О Типы микроконтроллеров: все модели AVR Z < (Rd k) & SFF) == О N < (Rd к) » 7 V < О S < N Л V Пример: cpi R0, 47 brne Label Переход, если содержимое R0 не равно 47 Примечание: Используются регистры с номерами от $10 до $ IF Команда 36.32. Команда AVR «cpi Rd, const» Команда: "tst Rd" Код команды: V < о S < N Пример: tst R0 : Если содержимое R0 отрицательно, то ветвление к метке Label brmi Label Примечание: Адрес регистра повторяется в коде команды Команда 36.33. Команда AVR «tst Rd»
282 Часть 5. Микроконтроллеры семейства AVR Команда: “mul Rd, Rr” Код команды: Выполнение: R1:RO <- Rd * Rr С <- (Rd*Rr) » 15 Типы микроконтроллеров: все модели AVR Пример: Idi R0, 5 Idi R1, 7 mul RO, R1 ; Умножить 5 на 7 Команда 36.34. Команда AVR «mul Rd, Rr» Команда: “and Rd, Rr” Код команды: Выполнение: Rd <- Rd & Rr Z <- (Rd & Rr) & SFF) == 0 N <- (Rd & Rr) » 7 V <- 0 Типы микроконтроллеров: все модели AVR S < N Л v Пример: and RO, R2 = RO & R2 : RO Команда 36.35. Команда AVR «and Rd, Rr>
Глава 36. Система команд микроконтроллеров AVR 283 Команда: “andi Rd, k” Код команды: Выполнение: Rd <- Rd & к Z <- ((Rd & к) & $FF) == О N <- (Rd & к) » 7 V <- О S <- N Л V Типы микроконтроллеров: все модели AVR Пример: andi X, $Е7 ; Очистить два средних бита в регистре X (РОН 26) Примечание: Используются регистры с номерами от $10 до $1F «CBR» выполняет те же действия, что и «ANDI», но с инвертированным значением константы. Команда 36.36. Команда AVR «andi Rd, const» Команда: “or Rd, Rr” Код команды: Выполнение: Rd Rd I Rr Z <- ((Rd I Rr) & $FF) == 0 N <- (Rd I Rr) » 7 V <- 0 S <- N Л V Типы микроконтроллеров: все модели AVR Пример: or RO, R2 ; RO = RO I R2 Команда 36.37. Команда AVR «or Rd, Rr>
284 Часть 5. Микроконтроллеры семейства AVR Команда: “ori Rd, k” Код команды: Выполнение: Rd <- Rd I k Z <- ((Rd I k) & $FF) == 0 N <— (Rd I k) » 7 V « 0 S < N Л V Типы микроконтроллеров: все модели AVR Пример: ori X, $Е7 ; Установить в 1 все биты, кроме двух средних, в регистре X (РОН 26) Примечание: Используются регистры с номерами от S10 до $1Е -SBR» - это команда -ORI”, предназначенная для установки в 1 указанных битов. Команда 36.38. Команда AVR «ori Rd, const» Команда: “eor Rd, Rr” Код команды: Выполнение: Rd < Rd Л Rr Типы микроконтроллеров: все модели AVR Z ((Rd N <- (Rd V <- 0 л Rr) & $FF) == 0 л Rr) » 7 S « N л V Пример: eor RO, R2 ; RO = R0 Л R2 Команда 36.39. Команда AVR «eor Rd, Rr>
Глава 36. Система команд микроконтроллеров AVR 285 Команда: “clr Rd” Код команды: Выполнение: Rd < - О Z - О N < - О V <- О S < О Пример: clr R0 Очистить R0 Типы микроконтроллеров: все модели AVR Примечание: в коде команды адрес регистра повторяется два раза. Старший разряд адреса повторяется во второй тетраде команды, а третья и четвертая тетрады содер- жат четыре младших разряда адреса. Команда 36.40. Команда AVR «clr Rd» Команда: “ser Rd” Код команды: Выполнение: Rd <- $FF Типы микроконтроллеров: все модели AVR Пример: ser R20 ; Установить в 1 все биты в R20 Примечание: Адреса регистров от $10 (десятичное 16) до S1F (десятичное 31). Команда 36.41. Команда AVR «ser Rd»
286 Часть 5. Микроконтроллеры семейства AVR Команды ветвления AVR Архитектура AVR предоставляет широкие возможности .гтя изменения по- рядка выполнения программы. Чтобы использовать все преимущества А\ R и этой области, вы должны хорошо понимать, какие способы изменения со- держимого программною счетчика реализуются в данной архитектуре. Команды относительною перехода «rjinp» и вызова подпротраммы «гса11» (команды 36.42 и 36.43) являются основными хтя изменения последовагеть- ности выполнения команд в микроконтроллерах AVR. При этом содержимое протраммною счетчика [вменяется на величину смещения, которое тадается в 12 младших бигах кода команды (рис. 36.2). Команда Смещение Рис. 36.2. Изменение содержимого программного счетчика в AVR при выпол- нении команд «rjmp» и “Гса11» При [аком способе п тменения содержимого программною счетчика в слу- чае вызова подпротраммы с помощью команды <-гса|1» его старое содержимое записывае гея в стек до того. как в него посту пит новый адрес. Это позволяет микроконтроллеру AVR вернуться обратно к месту, где произошел вызов подпрограммы, нетависимо ог текущею состояния выполнения про1раммы. Смещение может прои тводшься в пределах + /-2 К адресов в пространстве памяти про1рамм. что означает. чго команды относительных переходов по- зволяют обратиться к любой позиции памяти программ младших моделей AVR серии 1200. Блаюларя этой возможносги, описанные далее команды прямых переходов <фнр» и«са!1» не требуются ;стя мпкроконгроллеров серии AVR 1200. Важной особенноегью. о которой я не упоминал ранее, является адреса- ция и организация памяти программ в микроконтроллерах А\ R. Котла фирма Atmel укатывает обьем памяти программ своих контроллеров, го. как прави- ло. приводятся цифры в байтах. Каждая команда занимает два или четыре байта, так чго количество хранящихся команд можег быть равно половине (или меньше, если используется большое количество 4-байтовых команд) ог заявленного объема памяти программ. Все эго можег быть знакомо вам. если вы работали ранее с микропроцес- сорами типа 8086. которые используют 16-битовые слова, или с микрокон- троллерами семейства 68НС05. где команды с различными способами адре- сации содержат ра шое количество байтов. Во многих микропроцессорах, таких как Intel 8086. каждый байт имеет собственный адрес, и каждое слово начи- нается с бай га. имеющего четный адрес. В микроконтроллерах AVR обраще- ние к каждому слову производи гея с помощью инкремента адреса. Понима- ние этою обстоягельства явлзтется очень важным, как было показано в предыдущем разделе при рассмотрении команды «1рщ».
Глава 36. Система команд микроконтроллеров AVR 287 Вслед за командами «rjmp» и «rcall» рассмотрим команды безусловных переходов «jmp» и «call» (команды 36.44 и 36.45). Эти две команды предназна- чены для перехода на любой адрес в пределах 4 Мб памяти. Микроконтролле- ры серии 8515 имеют память программ EEPROM емкостью 4 Кб, что свиде- тельствует о том, что фирма Atmel имеет большие планы по расширению возможностей AVR. Хотя я и не вижу необходимости в использовании дтя микроконтроллеров памяти программ емкостью 4 Мб, все же приятно ви- деть, как компания готовится к будущему. Я помню, что, когда появились первые компьютеры Apple II с емкостью памяти 64 Кб, многие думали, что эго предел желаний для выполнения персональных вычислений. Команды «jmp» и «call» имеют длину в два слова (четыре байта), что ока- зывает некоторое воздействие на ход выполнения программы. Во-первых, это влияет на число тактов, необходимых для выполнения команды. Выпол- нение команд «jmp» и «call» требует на один такт больше, чем команд «rjmp» и «rcall», которые выполняются за два и три такта, соответственно. Как вы увидите дальше, они также оказывают влияние на выполнение других ко- манд. Две последние команды для выполнения переходов и вызовов подпрог- рамм, которые следует обсудить — это команды «ijmp» и «icall», использую- щие индексный регистр Z (команды 36.46 и 36.47). Эти команды индексных переходов и вызовов подпрограмм имеются только в старших моделях AVR, Они модифицируют содержимое программного счетчика, как показано на рис. 36.3. РС ◄-------- Z Рис. 36.3. Изменение содержимого программного счетчика в AVR при выпол- нении команд «ijmp» и «icall» С помощью команд индексных переходов и вызовов подпротрамм можно легко реализовать конечный автомат (state machine) или логические структу- ры, выполняющие обработку таблиц. Эти команды отсутствуют is младших моделях AVR серии 1200, что означает, что они не могут выполнять индекс- ные или табличные переходы и вызовы (is данных моделях не реализуется также команда «1рт»), Как было упомянуто выше, при выполнении любой команды вызова «call» в AVR происходит сохранение в стеке полного адреса возврата, даже если эта команда осуществляет короткий относительный переход к адресу подпрог- раммы. Для возврата из подпрограммы используется команда «ret» (команда 36.48). Команда «reti» (команда 36.49) выполняется так же, как и «ret», с той лишь разницей, что после возврата еще разрешаются прерывания. Далее в этом разделе мы еще вернемся к прерываниям, но я хочу обратить внимание на один малоизвестный вариант использования команды «reti» - ее примене- ние в подпрограммах, для которых время является критическим параметром, например, при работе с термодатчиком DSI820. Если ны не хотите, чтобы тратилось время на обслуживание прерывания, то надо замаскировать пре- рывания при входе в подпрограмму, а при выходе из нее снова их разрешить.
288 Часть 5. Микроконтроллеры семейства AVR Можно использовать команду «sei» для разрешения прерываний, а затем ко- манду «ret» для возврата, однако обе эти команды заменяются одной — «reti». Микроконтроллеры AVR могут выполнять команды ветвления по значе- нию определенных битов в регистре состояния SREG (команды 36.50 и 36.51). Поскольку номер бита и его значение должны быть указаны в коде команды, то диапазон возможных адресов перехода уменьшается до +/- 63 относитель- но текущего адреса. Это означает, что применение команд условных ветвле- ний весьма ограничено, хотя эту проблему можно решить так же, как в мик- роконтроллерах 8051 и 68НС05 при помощи ветвления к команде, которая затем выполнит необходимый безусловный переход. Например, переход на метку Label при значении флага нуля Z=l может быть реализован следую- щим образом: brne Skip ; Пропустить команду перехода на метку Label rjmp Label Skip Таким образом обеспечивается возможность перехода в диапазоне адре- сов +/- 2 Кб вместо +/- 63 байта, как в командах условного ветвления. При описании набора команд фирма Atmel рассматривает целый ряд (в общей сложности 18) команд, основанных на «ЬгЬс» и «brbs». Я привожу их в виде списка (см. таблицы в описании команд 36.50, 36.51). вместо того, что- бы отводить на каждую по отдельной странице описания. При рассмотрении команд ветвлений я хочу показать, как команды срав- нения и ветвления могут использоваться для реализации оператора «if» при использовании содержимого РОН. Например, if (А == В) // Сравнить переменные А и В, находящиеся в РОН, goto Label // В случае равенства перейти на метку Label может быть скомпилировано в следующий код: ср А, В breq Label что является очень простым преобразованием двух строчек исходного кода, написанного на языке высокого уровня. После недолгих раздумий можно найти решение для проверки условий «меньше, чем» и «больше, чем». Код на ас- семблере AVR для операторов: if (А < В) // Сравнить переменные А и В, находящиеся в РОН, goto Label // Перейти на метку Label, если А < В будет иметь простой вид: ср А, В brlt Label Рассмотрим реализацию операторов : if (А > В) // Сравнить переменные А и В, находящиеся в РОН, goto Label // Перейти на метку Label, если А > В
Глава 36. Система команд микроконтроллеров AVR 289 Если вы посмотрите на список команд условных ветвлений AVR, то не найдете такую, которая прямо решает эту задачу. В этом случае вам придется изменить последовательность операндов в команде сравнения, чтобы решить проблему имеющимися средствами. Ассемблерный код может выглядеть так: ср В, А brlt Label Его можно легко получить с помощью следующей перестановки перемен- ных в операторе «if» : if (В < А) Используя эту методику, можно легко выполнить переходы по условиям «меньше или равно» и «больше или равно»: Например, операторы: if (А >= В) // Сравнить переменные А и В, находящиеся в РОН, goto Label II Перейти на метку Label, если А >= В реализуются с помощью кода: ср А, В brge Label Операторное выражение: if (А <= В) // Сравнить переменные А и В, находящиеся в РОН, goto Label // Перейти на метку Label, если А <= В можно представить в следующем виде: if (В >= А) // Сравнить переменные А и В, находящиеся в РОН, goto Label // Перейти на метку Label, если А <= В что после компиляции дает такой код: ср В, А brge Label Я использую команду «brge» (переход, если больше или равно) вместо «Ьгр1» (переход, если знак плюс), так как эта команда учитывает значение флага S в регистре SREG. Как уже отмечалось в предыдущем разделе, данный флаг учитывает переполнение при сравнении чисел со знаком. Команда «Ьгр1» учитывает только флаг N, который может быть неправильно установлен в случае переполнения. Последний класс команд ветвления или изменения последовательности выполнения программы — это команды пропуска. После проверки указанно- го условия, данные команды либо выполняют следующую команду, либо пропускают ее. При взгляде на описание команд можно увидеть, что команды пропуска могут выполняться за один, два или даже три такта. Впервые увидев это, вы, так же, как и я, можете подумать, что это просто чья-то ошибка. На самом деле это не так. Команды пропуска реализуются следующим образом: 19 Зак. 2025.
290 Часть 5. Микроконтроллеры семейства AVR 1. Если условие не выполняется, то происходит переход на следующую ко- манду, что занимает один такт, 2. Если условие выполняется и следующая команда не «jmp» или «call», то команда пропускается, а на выполнение команды пропуска требуется два такта. 3. Если условие выполняется, и следующей командой является «jmp» или «call», то пропускаются оба слова этой команды, а команда пропуска вы- полняется три такта. Теперь, надо поговорить о командах «sbic» и <<sbis» (команды 36,52 и 36.53), которые пропускают следующую команду при определенном значении бита в регистре ввода-вывода. Здесь надо быть аккуратным, так как они работают только с 32-мя первыми адресами в пространстве ввода-вывода. Вы. навер- ное, думаете, что это не проблема, но, взглянув на решстр SREG, можно увидеть, что его адрес в пространстве ввода-вывода равен S3F. Данную проблему можно решить при помощи команд условного ветвле- ния «ЬгЬс» и «brbs>>. Использовать их можно следующим обратом: brbs Bit, $ + 2 ; Пропустить следующую команду, если Bit = 1 Instruction Но в таком случае может возникнуть проблема, если следующей коман- дой будет «jmp», «call», «Ids» или «sts», то есть такая, которая занимает два слова. Переход может произойти на адрес, соответствующий середине ко- манды, и контроллер будет пытаться интерпретировать часть команды так. как если бы эго была самостоятельная команда, что может привесiи к раз- ным неприятностям. Чтобы избежать этого, лучше выполнять переход на межу, а не на относительный адрес. Вы также можете пропусти гь следующую команду при определенном зна- чении бита в РОН. Для этого используются команды «srbc» и «sbrs» (команды 36.54 и 36.55). Последняя команда ветвления «cpse» производит сравнение операндов и пропуск следующей команды в случае их равенства (команда 36.56). Как по- казано ниже, эта команда лучше всего подходит для проверки условия оконча- ния цикла: Loop cpse А, В ; Выход из цикла, если условие выполняется rjmp Loop
Глава 36. Система команд микроконтроллеров AVR 291 Команда: “rjmp Label” Код команды: S о 3 X 3 Выполнение: PC <- PC + к + 1 Типы микроконтроллеров: все модели AVR Пример: rjmp Label Переход на метку Label Label Примечание: метка может находиться на расстоянии от -2048 до +2047 байт от команды rjmp Команда 36.42. Команда AVR «rjmp Label» Команда: “rcall Label" Выполнение: Push PCL Push PCH PC + PC + k + 1 Код команды: 1101 kkkk kkkk kkkk «к» - Смешение (+/- 2k) -----► Новое содержимое программного счетчика Сохраняемое содержимое программного счетчика з х а 3 X 3 Число циклов: 3 Типы микроконтроллеров все модели AVR Пример: rcall Label Переход к подпрограмме Label Примечание: метка может находиться на расстоянии от -2048 до +2047 байт от команды rcall Команда 36.43. Команда AVR «rcall Label»
292 Чвсть 5. Микроконтроллеры семейства AVR Команда: “jmp Label” Выполнение: PC «- k Код команды: 1001 kkkk kkkk kkkk kkkk kkkk kkkk kkkk «к» - Адрес метки Label ------► Изменение содержимого программного счетчика X X а Число циклов: 3 Типы микроконтроллеров: старшие модели AVR Пример: jmp Label ; Переход на метку Label Label Команда 36.44. Команда AVR «jmp label» Команда: “call Label” Выполнение: Push PCLOW Push PCHigh PC e k Код команды: 1001 010k kkkk 111k kkkk kkkk kkkk kkkk к» - Адрес подпрограммы -----* Сохранение в стеке содержи- мого программного счетчика 3 Д 1 а Изменение содержимого программного счетчика Число циклов: 4 Типы микроконтроллероа: старшие модели AVR Пример: call Label ; Вызов подпрограммы Label Команда 36.45. Команда AVR «call Label»
Главе 36. Система команд микроконтроллеров AVR 293 Команда: “ijmp” Код команды: Выполнение: PC « Z Типы микроконтроллеров: старшие модели AVR Пример: Idi R30, Label & $FF Idi R31, Label / 256 ijmp Переход на метку Label Команда 36.46. Команда AVR «ijmp» Команде: "icall" Код комвнды: Выполнение-. Push PCL Push PCH PC <- Z Типы микроконтроллеров: старшие модели AVR Пример: Idi R30, Label & $FF Idi R31, Label / 256 icall ; Вызов подпрограммы Label Команда 36.47. Команда AVR «icall-
294 Часть 5. Микроконтроллеры семейства AVR Команда: “ret" Код команды: Выполнение: pop РСН pop PCL Типы микроконтроллеров: все модели AVR Пример: call Label ; Вызов подпрограммы Label Label ; Метка начала подпрограммы ret ; Возврат к месту вызова Команда 36.48. Команда AVR «ret» Команда: “reti” Код команды: Число циклов: 4 Выполнение: pop РСН Типы микроконтроллеров: pop PCL все модели AVR SREG.I 1 Пример: Основная программа Interrupt ; Обработчик прерывания reti ; Возврат к основной программе Команда 36.49. Команда AVR «reti»
Глава 36. Система команд микроконтроллеров AVR 295 Команда: “brbc bit, Label” Код команды: 5 3 Дешифра- тор команд Указатель стека Память программ Программ- ный счет- чик Выполнение: if (SREG.bit == 0) PC = PC + Offset 1111 01kk kkkk kbbb к» - смещение (-64<=к<=63) Ь» - Номер бита МьЩ, Память SRAM (внешн/внугр) Регистры ввода- вывода Число циклов: 1-2 Регистр состояние Передача бита данных Изменение содержимого программного счетчика Типы микроконтроллеров: все модели AVR Пример: ср RO, R1 brbc Bit, Lab Lab ; Установить биты ; в SREG согласно ; результату ; операции RO - R1 Бит регистра состояния SREG Номер бита Команды ветвления Флаг переноса ООО brcc, brsh Флаг нуля 001 Ьгпе Флаг отрицательного результата 010 brpl Флаг переполнения 011 brvc Флаг знака 100 brge Флаг промежуточного переноса 101 brhc Временный бит 110 brtc Флаг разрешения прерываний 111 brid Команда 36.50. Команда AVR «brbc bit, Label» Команда: “brbs bit, Label” Код команды: S 3 Указатель стека Программ- ный счет- чик Память программ Дешифра- тор команд Выполнение: if (SREG.bit == 1) PC = PC + Offset 1111 OOkk kkkk kbbb к.. - смещение (-64<=к<=63) Ь” - Номер бита Память SRAM (внешн/внугр) Регистры ввода - вывода Регистр СОСТОЯ НИ5 Передача бита данных Изменение содержимого программного счетчика Число циклов: 1-2 Типы микроконтроллеров: все модели AVR Пример: ср RO, R1 brbs Bit, Lab Lab Установить биты в SREG согласно результату операции RO - R1 Бит регистра состояния SREG Номер бита Команды ветвления Флаг переноса ООО brcs, brio Флаг нуля 001 breq Флаг отрицательного результата 010 brmi Флаг переполнения 011 brvs Флаг знака 100 brlt Флаг промежуточного переноса 101 brhs Временный бит 110 brts Флаг разрешения прерываний 111 brie Команда 36.51. Команда AVR «brbs bit, Label-
296 Часть 5. Микроконтроллеры семейства AVR Команда: “sbic Reg, bit” 5 Выполнение: if (Reg.bit == о) PC = PC + 1 Регистр . состояние Код команды: 1001 1001 rrrr rbbb 'г» - Регистр (0<=г<=31} «Ь»» - номер бита > Передача бита данных Число циклов: 1-2 Типы микроконтроллеров: все модели AVR Пример: sbic porta, О rcall Label ; Выполнить подпрограмму, если бит установлен в 1 Команда 36.52. Команда AVR «sbic Reg, bit» Выполнение: if (Reg.bit == 1) PC = PC + 1 Типы микроконтроллеров: все модели AVR Пример: sbis porta, О rcall Label Выполнить подпрограмму, если бит сброшен в О Команда 36.53. Команда AVR «sbis Reg, bit-
Глава 36. Система команд микроконтроллеров AVR 297 Команда: “sbrc Reg, bit” Выполнение: if (Reg.bit == 0) PC = PC + 1 Пример: sbrc R0, О rcall Label Код команды: 1111 110r rrrr Obbb ««г» - Регистр (0<=г<=31) ««Ь» - номер бита » Передача бита данных д та х х а Число циклов: 1-2 Типы микроконтроллеров: все модели AVR ; Выполнить подпрограмму, если бит установлен в 1 Команда 36.54. Команда AVR «sbrc Reg, bit» Команда: “sbrs Reg, bit” Выполнение: if (Reg.bit == 1) PC = PC + 1 Пример: sbrs R0, О rcall Label Код команды: 1111 111 r rrrr Obbb «г» - Регистр (0<=г<=31) «Ь» - номер бита » Передача бита данных Число циклов: 1-2 Типы микроконтроллеров: все модели AVR Выполнить подпрограмму, если бит сброшен в О Команда 36.55. Команда AVR «sbrs Reg, bit-
298 Часть 5. Микроконтроллеры семейства AVR Команда: “spse Rd, Rr” Выполнение: if ((Rd - Rr) == 0) PC = PC + 1 Код команды: 0001 OOrd dddd rrrr <<d» - номер регистра источника-приемника «г» - номер регистра-источника Передача операнда из регистра Rd Передача операнда из регистра Rr а з 3 Число циклов: 1 Типы микроконтроллеров: все модели AVR Пример: cpse RO. R2 inc RO Если RO == R1, пропустить операцию инкремента R0 Команда 36.56. Команда AVR «cpse Rd, Rr» Битовые команды и команды тестирования битов Когда вы впервые посмотрите на эту группу команд, вы. вероятно, удиви- тесь. почему фирма Atmel дала им такое название. Здесь есть несколько «на- стоящих» битовых операций, но в целом эта группа выглядит, как попытка собрать в одну кучу все оставшиеся команды, особенно, если принять во внимание наличие в ней команд сдвигов и циклических сдвигов. Команды сброса (очистки) и установки битов (команды 36.57, 36.58. 36.59 и 36.60) предназначены пя модифицирования содержимого регистров вво- да-вывода. Когда вы рассмотрите выполнение команд «bclr». «bset». «cbi» и <<sbi» . то увидите, чго они могут работать только с частью пространства ввода-вывода: «bclr» и «bset» модифицируют бит в регистре состояния, a «cbi» и «sbi» имеют доступ только к 32-м первым адресам регистров ввода-вывода. Это значит, что для большинства регистров ввода-вывода вы должны снача- ла переписать их содержимое в РОН, модифицировать, а затем снова сохра- нить it регистре ввода-вывода. Для выполнения этой процедуры можно напи- сать специальную макрокоманду: MACRO IOCBI Port,Bit in Temp, Port cbr Temp, 1 << Bit Очистить бит Bit в регистре ввода-вывода Port Загрузить Rn ($10 <= л<= $1F) содержимым регистра Port Очистить указанный бит (cbr Temp, 1 « Bit = = ANDI Temp,
Глава 36. Система команд микроконтроллеров AVR 299 ; $FF Л (1 « Bit) out Port, Temp ; Сохранить результат ENDMACRO Эту макрокоманду можно также использовать для сброса в 0 битов, нахо- дящихся в РОН. Обратите внимание, что регистр общего назначения Тетр должен иметь адрес от )6 до 31. Команды «bset» и «bclr» имеют также ряд «псевдокоманд», которые слу- жат для изменения значений отдельных битов в регистре SREG. Мнемокоды, используемые для «псевдокоманд», позволяют лучше запомнить выполняе- мую операцию. Эти «псевдокоманды» приведены ниже в описаниях соответ- ствующих команд. Привлекательными для пользователей являются особенности реализации некоторых команд в AVR. Одной из таких приятных особенностей я считаю реализацию команд «bst» и «Ый» (команды 36.6I и 36.62). Они позволяют легко пересылать отдельные биты содержимого регистров, не изменяя содер- жимого других регистров, которые могут повлиять на ход выполнения про- граммы. Что же замечательного в этих командах? Я часто сталкиваюсь с ситуациями, когда надо переслать бит из одного регистра или переменной в другой: А.2 = В.5 ; Переслать бит 5 переменной В в бит 2 переменной А Для микроконтроллеров PIC в этом случае необходимо использовать та- кой код: rrf В, W ; Сдвинуть В вправо на один бит movwf Temp ; Сохранить результат во временном регистре rrf Temp ; Теперь бит 5 стал битом 3 rrf Temp ; Теперь бит 5 стал битом 2 movlw В'ОООООЮО' ; Сбросить в 0 значения всех битов, кроме ; бита 2 andwf Temp movf A ; Получим переменную А andlw B’11111011' ; Очистить бит 2 iorwf Temp, W ; Прибавить В.5 movwf A ; Сохранить переменную А с битом 2, ; взятым из бита 5 переменной В В микроконтроллерах AVR это можно сделать гораздо проще: bst B, 5 ; Поместить бит 5 переменной В в бит Т ; регистра SREG bld A, 2 ; Сохранить бит Т регистра SREG в качестве ; бита А.2 При выполнении данных операций мне больше всего нравится, что при этом совсем не надо думать. В приведенном выше примере для PIC я должен был искать кратчайший путь для передачи бита, думать о том, какие биты требуется переслать, надо ли выполнять логическую операцию И, чтобы быть
300 Часть 5. Микроконтроллеры семейства AVR уверенным, что не произойдет никаких неожиданностей Данный пример содержит наиболее общий набор команд ;гтя пересылки бита в микроконт- роллерах PIC. В реальных программах возможны различные модификации, которые позволяют выполнить эту операцию гораздо проще. Команда «swap» (команда 36.63) производит обмен содержимым тетрад в заданном РОН. Это полезно, когда вы храните в регистре две цифры, а не одно 8-битовое число. Чтобы вывести его на индикатор, можно использовать следующий код: mov Temp, Value ; Сохранить число, так как оно будет меняться swap Temp ; Поместить старшую цифру на место младшей andi Temp, $0F ; Очистить все, кроме выводимой на ; индикатор цифры subi Temp, 0 - $30 ; Преобразовать ее в ASCII-символ call SendCHAR ; Послать символ на экран mov Temp, Value ; Послать затем младший символ andi Temp, $0F subi Temp, 0 - $30 ; Преобразовать в ASCII-код call SendCHAR Команды сдвигов и циклических сдвигов «Isl», ><lsr», «го1», «гог» и <<asr>> (команды 36.64, 36.65, 36.66, 36.67 и 36.68) полезны как ;ыя выполнения сдвигов данных в процессе их ввода или вывода, так и для проверки значе- ния определенного бита в РОН без необходимости выполнения 8 отдельных операций тестирования битов. С помощью циклического сдвига можно про- извести индивидуальную проверку любого бита в заданном месте байта. Если вы интересуетесь, в чем состоит различие между командами обыч- ного («shift») и циклического («rotate») сдвига, то я советую представить себе операцию «rotate» как вращение колеса, на котором расположена пос- ледовательность блоков, содержащих по одному биту. Такое расположение битов показано на рис. 36.4, где также показан флаг переноса, который зани- мает одну из позиций на колесе. Колесо может повернуться в любую пози- цию, при этом данные перемещаются, но не теряются Команда циклическо- го сдвига помещает выдвигаемый бит в флаг переноса, а старое значение флага продвигается дальше, Это означает, что флаг переноса является одним из блоков на колесе, содержащем 9 бит. В командах обычного сдвига «shift» биты можно представить выстроенными в один ряд на уступе (рис. 36 4). Когда вы сдвигаете блоки, один из них падает с уступа и теряется. Вы можете затем сдвигать биты в обратном направлении, но данные уже будут потеряны. В этом состоит основное отличие этих операций от циклического сдвига, при котором не имеет значения, как часто и в каком направлении производятся сдвиги — данные никогда не будут потеряны. Различные типы сдвигов отличаются между собой тем, как заполняются освобождающиеся биты. В логических сдвигах «Isl», «Isr». заполнение всегда происходит нулями. При арифметическом сдвиге вправо «asr» знаковый раз- ряд (бит 7) остается неизменным, что важно, когда сдвиг используется для деления числа со знаком на числа, являющиеся степенями двойки.
Глава 36. Система команд микроконтроллеров AVR 301 Циклический сдвиг («Круглый стол») Обычный сдвиг («Уступ») Биты Направление вращения Рис. 36.4. Команды AVR Shift/Rotate Последние три команды в этой группе скорее относя 1ся к командам уп- равления процессором и должны быть хорошо нам шакомы. i а к как они есть но всех типах микроконтроллеров н многих микропроцессорах Первая из них - это команда «пор» (команда 36.69). работа коюрой синь очевидна, чго чем меньше мы будем о ней говорить, тем лучше. Команда «wdr» (команда 36.70) сбрасывает в нелепое сосюяние стороже- вой таймер (watchdog timer) прежде, чем он полечи i во пюжцоегь перезапу- стить микроконтроллер. Далее мы вернемся к рассмотрению работы стороже- вою таймера в AVR. Команда «sleep» (команда 36.7I) переводит AVR в состояние ожидания с пониженным jnepiоиогреблением. при которое! работ микроконгроллера останавливается. Он остается в этом состоянии до поступления сигнала пре- рывания или запуска, которые снова переводят его в рабочее сосюяние. Если бит SM в pei ticrpe управления процессора MCLJCR сброшен и 0. ю внешние тактовые chi налы продолжают поступать, так чго внутренние опросы пре- рывания от таймера или сторожевого устройства моте г «ра loe.in гь» микро- контроллер так же. как и внешний сигнал прерывания. В документации на AVR написано, чго команда «sleep» выполняется за три цикла. Эти три цикла тратятся на выполнение самой команды «sleep», а шкже на iai ру жу и вы- полнение следующей команды. Если бит SM установлен в I. то при выполнении команды «sleep» генера- тор тактовых сигналов останавливается. При этом микроконтроллер может вернуться в рабочий режим только после прихода внешнего сигнала преры- вания ([вменения уровня потенциала ни входе прерывания), так как при остановленном генераторе таймеры не работают В данном случае при возвра- те в рабочей режим вы должны учитывать задержку в I6 мс, которая необхо- дима для того, чтобы снова запустить генератор тактовых импульсов и дож- даться слабили киши ею частоты. Такая задержка реали тусгся вс троенной в AVR схемой.
302 Часть 5. Микроконтроллеры семейства AVR Команда: “bclr bit" Код команды: Выполнение: Определение поля «s» SREG.s <— 0 Бит в SREG Команды CLx ООО Флаг переноса clc 001 Флаг нуля clz 010 Флаг отрицательного результата cln 011 Флаг переполнения civ 100 Флаг знака cis 101 Флаг промежуточного переноса clh 110 Временный бит clt 111 Флаг разрешения прерываний ell Команда 36.57. Команда AVR «bclr bit» Команда: “bset bit’’ Код команды: Выполнение: Определение поля «s» SREG.s <- 1 « s » Бит в SREG Команды SEx 000 Флаг переноса SEC 001 Флаг нуля SEZ 010 Флаг отрицательного результата SEN 011 Флаг переполнения SEV 100 Флаг знака SES 101 Флаг промежуточного переноса SEH 110 Временный бит SET 111 Флаг разрешения прерываний SEI Команда 36.58. Команда AVR «bset bit-
Глава 36. Система команд микроконтроллеров AVR 303 Команда: “cbi lOReg, bit" Выполнение: lOReg.Bit <— 0 Код команды: 1001 1000 iiii ibbb »i» - Регистр ввода-вывода (0 - 31) «Ь» - Бит. который сбросывается в 0 Передача данных «lOReg» Число циклов: 2 Типы микроконтроллеров: все модели AVR Пример: cbi porta, 0 ; Очистить бит 0 порта A (PortA) Примечание: Доступны только младшие 32 регистра ввода-вывода Команда 36.59. Команда AVR «cbi lOReg, bit» Код команды: 1001 1010 iiii ibbb .. - Регистр ввода-вывода (0 - 31) «Ь» - Бит для установки в 1 Передача данных «lOReg Число циклов: 2 Команда: “sbi lOReg, bit” Выполнение: lOReg.Bit <— 1 Типы микроконтроллеров: все модели AVR Пример: sbi porta, 0 ; Установить в 1 бит 0 порта A (PortA) Примечание: Доступны только младшие 32 регистра ввода-вывода Команда 36.60. Команда AVR «sbi lOReg, bit»
304 Часть 5. Микроконтроллеры семейства AVR Команда: “bst Rd, Bit” Код команды: Выполнение: все модели AVR Т <— Rd.bit Пример: bst RO, 2 bld R1, 4 ; R1.4 = RO.2 Команда 36.61. Команда AVR «bst Rd, Bit» Команда: “bld Rd, Bit” Код команды: все модели AVR Выполнение: Rd.bit <- Т s Пример: bst RO, 2 bld П, 4 ; R1.4 = R0.2 Команда 36.62. Команда AVR «bld Rd, Bit»
Глава 36. Система команд микроконтроллеров AVR 305 Команда: “swap Rd” Выполнение: Rd <- ((Rd & $0F0 « 4) + ((Rd & $F0) » 4) Код команды: 1001 010d dddd 0010 «б» - номер регистра источника-приемника Передача операнда из реги- стра Rd 4 g * Число циклов: 1 Типы микроконтроллеров: все модели AVR Пример: swap RO ; Поменять местами старшую и младшую тетрады в R0 Команда 36.63. Команда AVR «swap Rd» Команда: “Isl Rd” Выполнение: Rd <— Rd « 1 С <- Rd.7 Н <- Rd.3 Z <- (Rd « 1) == 0 N <- Rd.6 Пример: Isl RO Код команды: 0000 11dd dddd dddd «б» - номер регистра источника-приемника Передача операнда из реги- стра Rd 2 з Число циклов: 1 Типы микроконтроллеров: все модели AVR ; Умножить содержимое RO на два V <- N Л C S «- N Л V Примечание: адрес регистра повторяется в коде команды Команда 36.64. Команда AVR «Isl Rd» 20 Зак. 2025.
306 Часть 5. Микроконтроллеры семейства AVR Код команды: 1001 010d dddd 0110 “d>> - номер регистра источника-приемника Команда: “Isr Rd” Выполнение: Rd <- Rd » 1 С <- Rd.О Передача операнда из реги- стра Rd Д g * Число циклов: 1 Типы микроконтроллеров: все модели AVR Z <— (Rd » 1) == 0 N <- О V <— N Л С S <- N * V Пример: Isr R0 Разделить содержимое R0 на два Команда 36.65. Команда AVR «Isr Rd» Команда: “rol Rd" Выполнение: Rd <- (Rd « 1) + С Код команды: 0001 11dd dddd dddd “d» - номер регистра источника-приемника Передача операнда из реги- стра Rd 5 з Число циклов: 1 Типы микроконтроллеров: все модели AVR С «--- Rd.7 Z <- ((Rd « 1) + С) == О N <- Rd.6 V <- N ЛС S <— N л V Пример: rol R0 ; Умножить содержимое R0 на два с учетом флага переноса Примечание: адрес регистра повторяется в коде команды Команда 36.66. Команда AVR «го! Rd»
Глава 36. Система команд микроконтроллеров AVR 307 Код команды: 1001 01 Od dddd 0111 «d» - номер регистра источника-приемника Команда: “ror Rd” Выполнение: Rd <- (Rd » 1) + (С « 7) С <- Rd.О Передача операнда из реги- стра Rd Число циклов: 1 Типы микроконтроллеров: все модели AVR Z <- ((Rd » 1) + (С « 7)) == О N <— С V <— N Л С S <— N л V Пример: ror R0 ; Разделить содержимое R0 на два с учетом флага переноса Команда 36.67. Команда AVR «ror Rd» Команда: “asr Rd” Выполнение: Rd <- Rd » 1 Rd.7 <- Rd.7 С <- Rd.О Z <— (Rd » 1) == О N <- Rd.7 Код команды: 1001 010d dddd 0101 «d» - номер регистра источника-приемника Передача операнда из реги- стра Rd X I | Число циклов: 1 Типы микроконтроллеров: все модели AVR V <— N Л С Пример: asr R0 Разделить содержимое R0 на два с сохранением знака числа Команда 36.68. Команда AVR «asr Rd:
308 Часть 5. Микроконтроллеры семейства AVR Код команды: 5 Команда: “пор’ Выполнение: все модели AVR Пример: пор ; Ничего не делать в течение одного цикла Команда 36.69. Команда AVR «пор Команда: ‘wdr’ Код команды: 2 все модели AVR Выполнение: wdr <— 0 Пример: wdr ; Сброс сторожевого таймера ; переполнения и перезапуска микроконтроллера для предотвращения его Команда 36.70. Команда AVR «wdr>
Главе 36. Система команд микроконтроллеров AVR 309 Команда: «sleep» Код команды: Выполнение: все модели AVR Пример: sleep Ничего не делать до прихода сигнала прерывания Команда 36.71. Команда AVR «sleep
глава 37 ПРИМЕРЫ ПРИМЕНЕНИЯ AVR Краткое содержание: Первое приложение Часы реального времени и термометр Вывод видеоизображения при помощи AVR с возможностью его позиционирования Для проверки работы приведенных ниже программ для микроконтроллеров AVR использовалась младшая модель этого семейства AVR1200. Этот микро- контроллер позволил мне получить достаточно хороший опыт работы с реги- страми AVR и его набором команд. Первые программы, написанные мной, не имели прямого практического применения — они разрабатывались с це- лью получения опыта работы с этими микроконтроллерами. Проблемы, с которыми я столкнулся при разработке этих приложений, были не очень серьезными. Две первые прикладные программы я написал в один вечер за несколько часов, одновременно изучая основы работы со стар- товым комплексом разработчика Atinel АТ89/90 Starter Kit. Трудности были связаны с отсутствием у меня опыта работы с архитектурой AVR. Первой ошибкой было то, что я впервые использовал микроконтроллер AVR, кото- рый имеет возможность самопроизвольного повторного запуска без какого- либо предупреждения, что привело к проблемам при отладке второй про- граммы. Кроме того, все другие микроконтроллеры, представленные в этой книге, имеют специальный регистр-аккумулятор для хранения промежуточ- ных результатов арифметических операций, поэтому при написании про- грамм для AVR мне пришлось изменить свой стереотип разработки приклад- ных программ.
Глава 37. Примеры применения AVR 311 Первое приложение Если вы внимательно ознакомились с первыми тремя семействами микро- контроллеров, то, вероятно, уже стали большим специалистом по написа- нию приложений для устройств, использующих одну кнопку и два светодио- да. Микроконтроллер AVR не доставит вам особых забот в этом приложении. Схема, используемая в данном примере, не содержит никаких сюрпризов (рис. 37.1). Единственное, на что стоит обратить внимание в этой схеме - это включение резистора сопротивлением Ю К на входе _Reset. Его использова- ние не является обязательным, то есть вы можете оставить этот вывод непод- ключенным («плавающим»), но я сделал такое включение просто по при- вычке. Вы также должны обратить внимание на то. что я использовал внутреннее «подтягивание» к напряжению питания вывода 5 порта D (PD.5) вместо внешнего подключения кнопки к этой шине. Рис.37.1. Схема первого приложения, использующая AVR Написание, проверка на симуляторе и тестирование этого приложения заняло у меня чуть меньше часа, хотя эго была моя первая программа для AVR. Я был очень доволен таким результатом, потому что данная прикладная программа содержит обработчик прерываний для обслуживания запросов прерывания от таймера и не использует каких-либо РОН, за исключением инициализации регистров ввода-вывода. ; Приложение вызывает мигание светодиода и ждет нажатия кнопки ; Это приложение для AVR вызывает мигание светодиода, ; подключенного к выводу РВ7, и с помощью кнопки, подключенной ; к выводу PD5, зажигает светодиод, подключенный к выводу РВО ; Майк Предко (Муке Predko)
312 Часть 4. Микроконтроллеры семейства AVR ; 97.11.06 ; Замечания по аппаратной части: ; , AVR1200 работает на частоте 1 МГц, используя внешний кварц ; РВ7 - подключен к светодиоду и токоограничивающему резистору ; РВО - подключен к светодиоду и токоограничивающему резистору ; PD5 - подключен к кнопке, соединенной с «землей» . include «c:\avrtools\appnotes\1200def.inc» rjmp Start ; Вектор сброса микроконтроллера пор ; Пропустить обслуживание прерывания IRQ0 rjmp Tmrlnt ; Обработчик запроса прерывания таймера Tmrlnt: ; Обработчик прерывания таймера, вызывающий ; мигание светодиода, подключенного к РВ7 in RO, SREG ; Сохранить содержимое регистра состояния ; Примечание: фпаг TOVO автоматически сбрасывается ; при входе в подпрограмму in R16, PORTB ; Получить текущее состояние порта В (PortB) Idi R17, $80 ; Число, с которым производится операция XOR еог R16, R17 out PORTB, R16 out SREG, RO reti ; Конец - возврат в основную программу Start: ; Начало основной программы Idi R18, $81 ; Разрешение работы в режиме вывода данных out DDRB, R18 clr R18 out PORTB, R18 clr R18 ; Установка всех выводов порта D на режим ; ввода out DDRD, R18 Idi R18, $20 ; Внутреннее подключение вывода 5 порта D ; к Vcc out PORTD, R18
Глава 37. Примеры применения AVR 313 Idi R18, 5 ; Запустить таймер с задержкой на 1024 такта out TCCRO, R18 Idi R18, 2 ; Запретить маскирование прерываний таймера out sei Loop: TIMSK, R18 ; Разрешить прерывания ; Постоянный цикл sbic PIND, 5 ; Пропустить, если на вывод PortD.5 поступает 0 rjmp PORTBO_Hi ; Выполнить, если на этот вывод поступает 1 cbi rjmp PORTB, 0 Loop ; Если PortD.5=0, установить 0 на выводе ; светодиода PORTBCLHi: ; Установить 1 на выводе светодиода PortB.0 sbi PORTB, 0 rjmp Loop Единственной неожиданностью, которую я обнаружил, когда первый раз запустил эту программу, было слишком частое мигание светодиода, управ- ляемого таймером. Он мигал гораздо чаще, чем два раза в секунду, как ожи- далось при проектировании. Дело в том, что при вычислении множителя для определения периода срабатывания таймера я по привычке использовал ко- мандные циклы, длительностью по 4 такта каждый, а не такты. Когда значе- ние коэффициента для предварительного делителя частоты было увеличено в четыре раза - с 256 до 1024, приложение стало работать без каких-либо проблем. Как уже говорилось при описании стартового комплекса разработчика Starter Kit АТ89/90, плата программатора имеет восемь светодиодов и восемь кнопоч- ных переключателей, которые могут быть подсоединены к программатору при помощи кабеля с разъемом 1DC. входящего в состав комплекса. Рассмотрен- ное приложение может быть легко реализовано на данном комплексе, надо только подключить кабели. Хотя тактовая частота в комплексе составляет 4 МГц вместо 1 МГц, как предполагалось при написании программы, это при- ведет только к тому, что светодиоды будут мигать очень часто. Часы реального времени и термометр Как и создание первого приложения, описанного выше, реализация часов с термометром является для вас давно знакомой задачей. Здесь никаких сюрп- ризов. Единственное, что следует отметить - я не использовал внешний ре-
314 Часть 4. Микроконтроллеры семейства AVR зистор для «подтягивания» к напряжению питания вывода, к которому под- ключена кнопка установки времени, хотя такой резистор подключен к ли- нии последовательного интерфейса термодатчика DS182O (рис 37.2). Это сде- лано для того, чтобы избежать каких-либо неприятностей с внутренними КМОП-схемами, «подтягивающими» выводы к напряжению питания. । Рис. 37.2. Цифровые часы/термометр на основе AVR < Особенностью реализации этого приложения на базе AVR по сравне- нию с аналогичными приложениями, написанными для других микроконт- роллеров, является недостаток возможностей для размещения таблиц в па- мяти программ. Вместо этого, заголовки «Time:» и «Тетр:» должны быть введены в исходный код программы следующим образом: Idi rcall LCDOut, $54 SendCHAR ; Написать заголовок “Time:" [ i Idi LCDOut, $69 ; “i” < rcall SendCHAR Idi LCDOut, $6D ; “m” rcall SendCHAR Idi LCDOut, $65 ; “e” rcall SendCHAR Idi LCDOut, $3A . И.1’ rcall SendCHAR В данном приложении проявляются некоторые недостатки ассемблера/си- мулятора AVR. Первый — это отсутствие возможностей определять константы в
Глава 37. Примеры применения AVR 315 виде ASCII-символов. Обычно при написании программ я стараюсь использо- вать наиболее подходящий тип для реализации данных. То обстоятельство, что в AVR нельзя вводить константы в виде символов, иногда вызывает значитель- ные неудобства. Обычно я никогда не пользуюсь таблицей символов ASCII при написании программ. Симулятор AVR также несколько разочаровал меня, так как он не показывает содержимое регистров ввода-вывода, а только содержи- мое РОН и некоторых других регистров процессора. Честно говоря, данные недостатки не очень значительны, и я никогда не имел проблем с программ- ным обеспечением, которое использовал. При этом я уверен, что в последую- щих версиях программ все недочеты будут устранены. Единственной значительной проблемой, с которой я столкнулся при на- писании этой программы, была необходимость следить за допустимым уров- нем вложения подпрограмм. Как я упоминал в начале этого раздела, у меня возникли некоторые проблемы с надежностью работы отдельных программ, которые были связаны с отсутствием у меня опыта работы с микроконтрол- лерами, которые имеют стек, содержащий всего три позиции. Когда вы рас- смотрите исходный код моей программы, то увидите, что первоначально в ней широко использовались вызовы подпрограмм, которые, в основном, обеспечивали реализацию задержек и вывод десятичных цифр на жидкокри- сталлический дисплей. Когда я в первый раз запустил эту программу, то уви- дел, что она содержит много ошибок: неправильные символы выводились в неправильных позициях на экране ЖКИ. Когда я более внимательно рас- смотрел код программы, то понял, что, скорее всего, происходит перепол- нение стека. Чтобы исправить это, пришлось запретить вызов вложенных под- программ. Это изменение устранило все проблемы с неправильным выводом символов на ЖКИ. Однако это не решило проблем сложными сбросами микроконтроллера. Данная проблема была решена путем замены контроллера на другой образец AVR1200. Образец, который я первоначально использовал, относился к очень ранним партиям выпуска, поэтому не удивительно, что при его использова- нии возникли некоторые проблемы. При разработке данного приложения я попутно нашел один интересный способ реализации 16-битовой задержки в AVR: Idi Count, LowValue ; (начальное значение счетчика) & $FF Idi Counthi, HighValue ; (начальное значение счетчика) » 8 + 1 Loop: dec Count ; Декремент младших 8 бит brbc 1, Skip ; Пропустить следующую команду, если dec Counthi ; флаг нуля сброшен в 0 ; Декремент старших 8 бит Skip: brne Loop ; Повторение цикла, если флаг нуля не установлен в 1 Здесь Count и Counthi — регистры общего назначения с адресами в диапа- зоне от S10 до $ I F. При помощи этого фрагмента кода можно обеспечить
316 Часть 4. Микроконтроллеры семейства AVR очень широкий диапазон задержек значительно проще, чем это реализуется в микроконтроллерах PIC. Каждый цикл выполняется в течение 5 тактов не- зависимо оттого, производится инкремент старшего байта счетчика циклов, или не производится. Чтобы получить необходимую задержку, можно вос- пользоваться формулой: Задержка=(Начальное значение счетчика*5)/Тактовая частота Чтобы определить требуемое начальное значение счетчика при заданной задержке, можно переписать формулу следующим образом: Начальное значение = (Задержка * Тактовая частота)/5 При реализации задержки но этой формуле следует учесть, какие зна- чения должны быть загружены в регистры Count и Counthi. В регистр Count заносятся младшие восемь бит начального значения, а в регистр Counthi - старшие 8 бит плюс I, для того, чтобы выполнялось требуемое число циклов. Это отражено в комментарии к приведенному выше фрагменту программно- ю кода. Вывод изображения с возможностью его позиционирования В начале этой книги был затронут вопрос о работе микроконтроллера с ана- логовыми сигналами — как входными, так и выходными. Как было отмечено, для ввода аналогового сигнала можно использовать простой потенциометр с конденсатором, а для реализации аналогового выхода — резисторный дели- тель напряжения. Мне хотелось написать приложение, которое демонстриро- вало бы. как все это можно реализовать на практике. Лучшим примером, на мой взгляд, могла бы стать программа, в которой аналоговый вход будет использоваться ;гля перемещения пятна на видеоэкране. Эту программу мне хотелось написать именно для микроконтроллеров AVR. которые выполняют большую часть команд за один командный никл, что является большим пре- имуществом при работе с изображением (рис. 37.3). Данная схема выводит на экран полный видеосигнал в системе NTSC с иомошью программною обеспечения, написанного для данного приложе- ния. Соответствующая схема оказывается неожиданно простой (рис 37.4). Макет был реализован на основе набора SimmStick. Схема была подклю- чена к интерфейсной плате с источником питания DT003, а видеосигнал поступал полиции А15 на видеомодуля гор, подсоединенный к макетной плате SimmStick. Такой метод макетирования очень прост и эффективен (рис. 37.5). Как показано на рис. 37.4. я поместил все компоненты схемы на плату SimmStick. Это несколько расходится с моими рассуждениями о том. что интерфейс с периферийными устройствами должен быть реализован отдель- но от SininiStick, но я имел возможность подключить выходные резисторы непосредственно к выводам микроконтроллера и соединить их с резистором, «подтягивающим» выходной сигнал к напряжению питания. Конденсатор и
Глава 37. Примеры применения AVR 317 потенциометр были смонтированы с обратной стороны платы SimmStick, так, чтобы можно было менять позицию потенциометра, когда перед этой платой включена плата модулятора. Такая компоновка упрощает работу с макетом. Рис. 37.3. Платы SimmStick, используемые для вывода видеосигналов с помо- щью микроконтроллера AVR (на рисунке по часовой стрелке, начиная с правого-верхнего угла, показаны: макетная плата с видеомодулятором, ин- терфейсная плата DT003 с источником питания и плата SimmStick DT104 на основе процессора AVR с резистивным делителем для вывода видеосигнала) Рис. 37.4. Схема на основе AVR, реализующая позиционирование и вывод видеосигнала
318 Часть 4. Микроконтроллеры семейства AVR Рис. 37.5. Плата SimmStick DT104 с микроконтроллером AVR и резисторным делителем для вывода полного видеосигнала При первом запуске программы я столкнулся с одной проблемой — не- большим «шумом» на выходной линии. С помощью осциллографа я опреде- лил, что шум имеет частоту 60 МГц, а его амплитуда равна 200 мВ. При низком уровне сигнала на выходе AVR этот шум мог вызвать некоторые про- блемы. Когда я посмотрел на плату SimmStick, то увидел, что развязываю- щий конденсатор расположен слишком далеко от выводов микроконтролле- ра AVR. После того, как конденсатор емкостью 0,1 мкФ был включен непосредственно между выводами питания Vcc и “земля” микроконтролле- ра, шум был уменьшен до приемлемого уровня в 50 мВ. Аналоговое выходное напряжение формируется при помощи делителя напряжения, в котором верхний резистор имеет сопротивление 470 Ом. При первом взгляде на схему вас, наверное, удивило, где я нашел для нее рези- сторы с сопротивлением 74 и 66 Ом. Реально эти сопротивления получаются с помощью параллельного соединения резисторов: 74 или 75 Ом — это два резистора по 150 Ом, соединенных параллельно, а 66 Ом реализуется при параллельном соединении трех резисторов по 200 Ом. Для формирования тре- буемого напряжения определенные выводы подключаются к «земле» (логи- ческий 0), в результате чего образуется делитель напряжения из верхнего резистора сопротивлением 470 Ом и параллельного соединения нижних ре- зисторов, соединенных с выводами микроконтроллера. Правда, это не та схема, которую можно запускать в производство, так как она предполагает, что при включенном питании микроконтроллер все- гда активен и правильно выполняет программу. Если все выводы контроллера находятся в режиме ввода, или в режиме вывода с подачей на них высокого уровня потенциала, то на выходе делителя установится потенциал +4,5 В или
Глава 37. Примеры применения AVR 319 больше, что может быть проблемой для ТВ-модулятора, к которому подклю- чена схема. Если бы я собрался снова сделать такую схему, я бы использовал этот делитель для управления другим делителем напряжения, который бы умень- шил уровень выходного сигнала до нужной величины, то есть из 5 В сделал бы 1,5 В в качестве сигнала «белого» поля. Видеомодулятор был куплен мной за 1,5 доллара в местном магазине уце- ненных товаров. Для его питания требуется напряжение +12В. Чтобы не ус- ложнять схему подсоединения макета, я подавал на модулятор напряжение + 13В с выхода питания «Wall Wart», подсоединив модулятор к выводу PWR на шине SimmStick. Видеомодулятор должен быть помещен в металлический корпус для уменьшения излучения при работе устройства. Прежде чем продолжить описание устройства, я должен сделать несколь- ко важных замечаний. Первое — это то, что при написании приложения я не имел полной спецификации видеосигналов NTSC. Я использовал видеока- меру «Tyco VideoCam», купленную в магазине игрушек, которая имеет вы- ход полного видеосигнала, просмотрел на осциллографе выходной видео- сигнал и то, что увидел, применил в данном приложении. Это приложение отлично работало на 12-дюймовом черно-белом телевизоре, который был куплен на распродаже за 10 долларов. Я не советую испытывать это приложение на «домашнем кинотеатре» сто- имостью 3000 долларов. Нет каких-либо объективных предпосылок для того, чтобы данная схема могла испортить телевизор или монитор, но я не хочу проверять это на своей аппаратуре. Как и в других приложениях, описанных в этой книге, многие детали брались из магазина уцененных вещей или из моей коробки для старых деталей, так что некоторые спецификации могут быть нарушены, а при неправильном соединении между вашей схемой и телевизором может потечь слишком большой ток. Если же вы полны решимости испытать работу этого приложения на се- мейном телевизоре, я не отвечаю за возможное недовольство ваших близ- ких, если что-нибудь получится не так. Второе, на что следует обратить внимание — схема работает на очень боль- шой частоте, и неправильное экранирование или заземление модулятора может вызвать у вас и ваших соседей помехи в радиоприемниках и телевизорах. Этот прибор не прошел испытание федеральной комиссии по связи, поэто- му его можно использовать только для экспериментов. После этого неболь- шого отступления давайте продолжим рассмотрение нашего приложения. Полный видеосигнал устанавливает на выходе четыре различных уровня потенциала. Это можно показать на примере импульса горизонтальной синх- ронизации (рис. 37.6). Каждый из этих четырех уровней образуется путем по- дачи на один из выходов микроконтроллера низкого уровня потенциала. При этом образуется делитель напряжения, который может отдавать в нагрузку ток величиной более 100 мкА без существенного изменения уровня выходно- го потенциала.
320 Часть 4. Микроконтроллеры семейства AVR Рис. 37.6. Импупьс горизонтальной синхронизации видеосигнала AVR Обратите внимание, что каждый импульс горизонтальной синхрониза- ции делится на три части. Первая часть, имеющая уровень 0,6 В — это задний участок видеоимпульса, за которым следует импульс горизонтальной синх- ронизации (0,2 В), после которого снова идет сигнал 0,6 В - передний учас- ток видеоимпульса, на который накладывается сигнал цветовой синхрониза- ции, если используется цветное изображение. Когда говорят о сигнале горизонтальной синхронизации, всегда подразумевают эти три части, кото- рые обязательно должны присутствовать перед началом строки. Сигнал горизонтальной синхронизации является частью полного строч- ного сигнала, вид которого представлен на рис. 37.7. После каждого импульса горизонтальной синхронизации идет передача видео данных в течение 53 мкс. На рис. 37.7 показаны различные уровни серого цвета, но в приложении ис- пользовались только черный и белый цвета. Различные градации “серого” । Уровни напряже- >| ния импульса ' синхронизации «чернее черного» Данные сканиро- вания строки (длительность 53 мкс) напряжения “черного” Рис. 37.7. Вывод строки видеосигнала с помощью AVR
Глава 37. Примеры применения AVR 321 Вывод данных в течение 53 мкс — это только одна из областей, в которых с успехом может применяться AVR. Большая тактовая частота и возможность выполнения команд за один цикл означает, что за это время можно выпол- нить до 795 команд. Это особенно важно, так как первоначальной целью этого приложения была реализация видеоигры наподобие настольного тен- ниса. Использование других микроконтроллеров значительно уменьшило бы количество выполняемых команд, так как они требуют больше циклов для их реализации. Приложение выводит 268, а затем 267 строк данных (в обшей сложности 535 строк) в каждом из двух полей. В конце каждого из полей выводится шесть или семь коротких строк, за которыми следует шесть импульсов вертикаль- ной синхронизации, пять или шесть коротких строк и затем одиннадцать длинных строк, после которых начинаются данные. Это повторяется дважды для каждого полного кадра. Разница в коротких импульсах, содержащих дан- ные должна составлять подстроки для каждого поля, чтобы заполнить экран строками, которые пропущены в предыдущем полукадре. На рис. 37.8 приведена форма сигнала на потенциометре. Во время начала поля происходит заряд конденсатора, а во время вывода изображения меня- ется режим работы вывода (с вывода данных на их ввод) и происходит ожи- дание разряда конденсатора. Суть идеи состоит в том, чтобы вывести белое пятно на экран в точке разряда конденсатора. Рис. 37.8. Вертикальная синхронизация полного видеосигнала AVR с интег- ральным чтением положения потенциометра На самом деле, все работало не так, как планировалось. При работе при- ложения я обнаружил, что максимальное время разряда конденсатора, кото- рое можно получить, составляло одну шестую от времени вывода на экран одного полукадра. Это было скомпенсировано программными средствами путем умножения величины задержки на шесть до начала вывода следующего поля. Во время вывода поля на экран производилось сравнение уже с этим новым значением, и пятно выводилось, начиная с места, в котором произошло 21 Зак. 2025.
322 Часть 4. Микроконтроллеры семейства AVR совпадение. Это не самый оптимальный способ — если бы я стал переделы- вать это приложение, то лучше подобрал бы номиналы конденсатора и по- тенциометра так, чтобы время разряда совпадало с длительностью поля. Та- кое решение позволит упростить программную реализацию. На прилагаемом к книге CD-ROM вы обнаружите три версии программ для этого приложения. Первая предназначена для проверки уровня аналого- вого выхода до попытки работы с видеосигналом. Вторая программа (Ap3v2.ASM) выводит в центр телевизионного экрана белую полоску, и пос- ледняя (Ap3v3.ASM) — обеспечивает вывод полоски в правом нижнем углу экрана, а также вывод светового пятна, которое можно двигать путем враще- ния потенциометра. Последняя программа использует 179 слов памяти программ из 512 дос- тупных, так что ее легко можно расширить до игры, более напоминающей теннис. Я не стал до конца реализовывать эту игру из-за аппаратных неудобств — реальный уровень выходного напряжения несколько отличался от того, который хотелось бы иметь, хотя приложение хорошо работало на моем де- шевом телевизоре. Другая важная причина связана с работой связки конден- сатор-потенциометр, используемой для управления. Надо было бы поменять номиналы компонентов для того, чтобы максимальное время разряда кон- денсатора было больше времени вывода на экран одного поля. Можно было бы также включить между потенциометром и землей дополнительный резис- тор сопротивлением 10 К для того, чтобы помочь решить эту проблему Кро- ме того, это позволило бы немного улучшить форму сигнала при минималь- ном значении сопротивления потенциометра. Когда я правил эту книгу перед посылкой ее в издательство, то обнаружил, что неправильно включил по- тенциометр. Контакт потенциометра, подсоединенный к земле, должен ос- таваться неподключенным. Должен сказать, что это приложение было единственным из тех, которые 1 я разрабатывал для этой книги, которое заставило меня после его создания 1 расслабиться и почувствовать, что я действительно чего-то достиг. Хотелось ’ бы, конечно, найти хорошую спецификацию полного видеосигнала NTSC, ; так как было очень трудно анализировать выходной сигнал видеокамеры с «TycoVideoCam» и применять все это к моему приложению. На реализацию г этого приложения я потратил больше времени, чем проведу, глядя на экран г и вращая ручку переменного резистора. Если у меня будет свободное время, г я, возможно, займусь улучшением этого приложения, но пока я удовлетво- k рен тем, что могу, показывая на экран, рассказывать детям о том. что сделал х их отец. Р 3 с с п п
глава 38 ЗАКЛЮЧЕНИЕ ПО СЕМЕЙСТВУ AVR Краткое содержание: Информационная поддержка AVR WEB-сайты Информационный сервер Компании-производители За то короткое время, которое AVR присутствует на рынке, он оказал огром- ное влияние на весь мир микроконтроллеров. Как я уже упоминал, к моменту написания этой книги AVR был доступен для пользователей только шесть месяцев, и я был сильно удивлен тем интересом, который он вызвал. Каж- дый производитель, продукция которого описывается в книге, придержива- ется своей собственной модели бизнеса. Фирма Atmel ориентируется на вы- пуск микроконтроллеров, которые имеют только флэш-память для хранения программ, что является весьма привлекательным и отличает ее от других производителей. Лично мне это очень нравится, так как я всегда предпочитал контроллеры, которые используют для хранения программного обеспечения флэш-память с возможностью внутрисхемного программирования, а не па- мять EPROM с однократным программированием или масочно-программи- руемую память ROM. Я собираюсь продолжить свои опыты с микроконтроллерами AVR и со- здать ряд новых приложений, а также провести эксперименты с созданием структур данных. Хотя в начале своего описания я отметил наличие 32 реги- стров общего назначения как ограничение AVR, при написании прикладных программ для этой книги увидел, что можно обеспечить баланс между ис- пользованием РОН микроконтроллера и памяти RAM.
324 Часть 4. Микроконтроллеры семейства AVR Оглядываясь назад, я понимаю, что надо было бы уделить больше внима- ния различиям между архитектурой старших и младших (серия 1200) моде- лей AVR. Хотя AVR1200 может выполнять большую часть команд из тех, которые реализуют старшие модели, недостаток внешней памяти и наличие стека глубиной всего в 3 элемента оказывают большое влияние на создание приложений. В 1998 году фирма Atmel планирует выпустить ряд новых моделей из числа тех, которые были анонсированы. Они будут иметь дополнительные перифе- рийные устройства и варианты реализации памяти, что значительно обога- тит семейство AVR. Информационная поддержка AVR Так как AVR один из самых новых микроконтроллеров, имеющихся на рын- ке (первые образцы появились в продаже в середине 1997 г.), вполне понят- но, что ему посвящено меньшее количество информации по сравнению с другими микроконтроллерами, доступными для пользователя. Я думаю, что ситуация скоро изменится в лучшую сторону, и не удивлюсь, если информа- ция, представленная в этом разделе, устареет уже к концу 1998 г. WEB сайты Я думаю, что сайты, посвященные AVR, в ближайшее время будут распрос- транены более широко. Ниже перечислены первые появившиеся сайты, ко- торые могут предоставить вам много полезной информации по микроконт- роллерам AVR, а также по разным программным проектам. http: //www.dontronics.com/ сайт SimmStick, где приведены интерфейсы AVR программные проекты по AVR http: //www.i pc.o.za/people/kalle/atmel.htm ссылки на сайты, посвященные микроконтроллерам AVR домашняя страничка информационного сервера AVR http: //www.sistudio.com программаторы AVR некоторые часто задаваемые вопросы и руководства по применению, на- писанные третьими фирмами. Информационный сервер Благодаря фирме Interface Products стал доступен информационный сервер, посвященный Atmel. На момент написания книги на нем ежедневно появля- лось в среднем от пяти до десяти сообщений. Чтобы зарегистрироваться на нем, надо послать заявку на адрес; Atmel-reguest@pic.co.za со словом “JOIN” в теле сообщения.
Глава 38. Заключение по семейству AVR 325 Компании-производители Atmel Atmel Corporation 2325 Orchard Parkway San Jose, California 95131 Tel: 408-441-031 I http: //www.atmel.com
ЧАСТЬ 6 КОНТРОЛЛЕР BASIC STAMP ФИРМЫ PARALLAX
глава 39 КОНТРОЛЛЕР BASIC STAMP ФИРМЫ PARALLAX Краткое содержание: Аппаратные средства Stamp Процессор Stamp Программные «лексемы» Линии ввода-вывода Последовательная память EEPROM Интерфейсы программирования Контроллер BASIC Stamp фирмы Parallax действительно является очень про- грессивным продуктом. Программируемый и управляемый с помощью пер- сонального компьютера в процессе работы в схеме приложения, не требую- щий для работы никаких дополнительных схем, он является хорошим средством для реализации различных устройств и отличным инструментом для пользователей, начинающих разработки в области электроники, про- граммировании или микроконтроллеров. Он также нашел свою нишу приме- нения в создании устройств управления для различных приложений. Для него имеется большое количество доступной информации: от пособий по про- граммированию и реализации интерфейсов на PBASIC (язык программиро- вания BASIC для Stamp) до примеров приложений. Имя «Stamp» пошло от названия первоначальной разработки, которая являлась законченной вычис- лительной системой, но занимала такую же площадь, как почтовая марка. В настоящий момент существует два прибора, предлагаемых фирмой Parallax Inc, которые показаны на рис. 39.1. Контроллер BS1 (BASIC Stanipl) постав- ляется в 14-контактном однорядном корпусе (single inline package — SIP), который позволяет ему занимать минимальную площадь на плате. Контрол-
Главе 39. Контроллер Basic Stamp фирмы Parallax 329 лер BS2 (BASIC Stamp 2) сделан так, чтобы занимать такое же место, что и 24-контактный двухрядный корпус (dual inline package — DIP) шириной 1,52 см (0,6 дюйма) и обеспечивает значительно лучшие характеристики и более широкие возможности, чем BS1C. Рис. 39.1. Контропперы BS1 и BS2 рядом с монетой в 10 центов, чтобы показать их относительные размеры. Контроллеры Stamp не являются встраиваемыми микроконтроллерами в том смысле, как это определялось ранее в данной книге, так как они состоят из нескольких активных микросхем, образующих систему. Однако Stamp может выполнять задаваемую пользователем программу, как микроконтроллер, но без схем поддержки, необходимых для реализации сброса, синхронизации или обеспечения внутрисистемного программирования, как во встраивае- мых микроконтроллерах. Загружаемые прикладные программы хранятся в памяти EEPROM, так что они не будут потеряны, даже если отключится питание или будет отсоединен управляющий компьютер. Хотя характеристики контроллеров Stamp можно оценить как скромные по сравнению со встраиваемыми микроконтроллерами, они предоставляют гораздо более простой интерфейс программирования и простоту использова- ния, с которой встраиваемые микроконтроллеры не могут состязаться. Если вы получили Stamp и комплекс для его программирования в пятницу, то сможете разработать свое собственное приложение уже к понедельнику. Эта простота использования может сделать Stamp счень привлекательным на- чальным инструментом для разработки систем на микроконтроллерах. В данном разделе книги оба типа контроллеров Stamp будут рассмотрены вместе, но где надо, я буду указывать на различия между этими двумя уст- ройствами. Чтобы дать представление о возможностях Stamp, ниже я воспро- извел таблицу, данную фирмой Parallax.
330 Часть 6. Контроллер Basic Stamp фирмы Parallax Характеристика STAMPl (BS1C) STAMP2 (BS2C) Число линий ввода- вывода 8 16, плюс 2 линии RS-232 Емкость памятиЕЕРКОМ 256 байт 2048 байт Емкость памяти RAM (переменные) 7 словарных регистров 16 словарных регистров Максимальный размер программ в EEPROM ~80 команд ~500 команд Тактовая частота 4 МГц 20 МГц П роизводител ьность ~2000 команд/с ~4000 команд/с Ток потребления в рабочем режиме 2 мА 7 мА Ток потребления в режиме ожидания 20 мкА 50 мкА Скорость последова- тельного ввода-вывода 300-2400 бит/с 300-50000 бит/с 0-19200 бит/с с контро- лем потока Корпус 4-контактный SIР 24-контактный DIP Интерфейс программи- рования Параллельный порт ПК Порт RS-232 Как вы можете увидеть из таблицы, контроллер BS2 обладает несколько большими возможностями по сравнению с BSI, но он имеет более высокую стоимость, а также занимает больше места и потребляет больше энергии. Контроллер BS2 реализует также больше функций PBAS1C, что облегчает взаимодействие с внешними устройствами. Аппаратные средства Stamp Контроллеры Stamp содержат микроконтроллер PICMicro, который соеди- нен с последовательной памятью EEPROM и интерфейсом управляющего персонального компьютера. В PIC предварительно записываются программа начальной загрузки, интерфейс с EEPROM и программа, выполняющая лек- семы. Также на плате Stamp есть регулятор напряжения, датчик для сброса при понижении напряжения и керамический резонатор для обеспечения так- товой частоты. Контроллер BASIC Stamp IС (BS1) содержит все эти схемы, которые конструктивно оформлены как корпус SIP. Назначение выводов контролле- ра приведено на рис. 39.2. Контроллер BASIC Stamp 2С (BS2) предоставляет значительно больше возможностей для ввода-вывода данных и занимает такое же посадочное ме- сто, что и 24-контактный DIP-корпус с шириной 1,52 см (рис. 39.3).
Глава 39. Контроллер Basic Stamp фирмы Parallax 331 BS1-IC Полная схема BASIC Stamp на печатной плате Характеристики Микросхема интерпретатора PBASIC 1.4 Схема памяти EEPROM емкостью 256 байт Резонатор на 4МГц Регулятор напряжения на 5В Схема сброса при понижении напряжения питания до 4В Параллельный интерфейс с ПК 8 пинии ввода-вывода для пользователя 1,4 мА в рабочем. 40мкА в ждущем режиме (без нагрузки, линии ввода-вывода подключены к шинам питание-'земля'') Вывод Название Назначение Описание 1 VIN Вход регулятора Вход 5-Вопьтового регулятора Принимает от 5 до 40В Если питание подается непосредственно на шину VDD. вывод можно оставить не подсоединенным 2 VSS Земля Соединяется с выводом 25 (GND) па- раллельного порта ПК для програм- мирования Эти выводы размещены так. чтобы располагаться прямо 3 РСО Выход ПК Соединяется с выводом 11 (BUSY) параллельного порта ПК для програм- мирования напротив выводов 3-контак- тного разъема, используе- мого в стандартном кабеле 4 PCI Вход ПК Соединяется с выводом 2 (DO) па- раллельного порта ПК для програм- мирования для программирования BASIC Stamp 5 VDD Выход регулятора Вход питания Выход с 5-Вопьтового регулятора напряжения, питающегося от VIN. Нельзя использовать для питания схем, потребляющих боль- ше 50мА, включая нагрузку Р0-Р7 6 RES Запуск (вход/выход) Вход питания (питание на VIN не подается) Принимает 4.5-5,5В. Нагрузка зависит от режима (рабочий/ждущий) и от тока, выдава- емого пиниями Р0-Р7 Выдает низкий уровень, когда напряжение VDD становится мень- ше 4В. “Подтянут" к напряжению питания через резистор 4,7к. Можно рассматривать его как индикатор пониженного налряже- ния/сброса Может подключаться к “земле” внешней схемой (те кнопкой, соединенной с 'землей") дпл операции сигнала запуска Не подавать высокий уровень напряжения Рис. 39.2. BS1-IC: Полная схема контроллера BASIC Stamp на печатной плате с поверхностным монтажем
332 Часть 6. Контроллер Basic Stamp фирмы Parallax Вывод Название Назначение Описание 7 Р0 Линия 0 ввода-вывода Выводы порта попьэоватепя, которые могут конфигурироваться как входы ипи выходы. 8 Р1 Линия 1 ввода-вывода В режиме выхода: Могут выдавать ток до 20мА каждый. Общая нагрузка по току 9 Р2 Линия 2 ввода-вывода для всех выводов не должна достигать 40мА. Каждый вывод может пропускать ток до 25мА. Максимальный ток через все 10 РЗ Линия 3 ввода-вывода выводы не должен превышать 50мА В режиме входа: 11 Р4 Линия 4 ввода-вывода Выводы плавающие (ток утечки 1мкА) и могут управляться вы- соким ипи низким уровнем напряжения. Порог переключения 12 Р5 Линия 5 ввода-вывода примерно равен 1,4В. Примечание: Для обеспечения наименьшего потребления знер- 13 Р6 Линия 6 ввода-вывода гии в ждущем режиме не оставляйте выводы плавающими, так как это приводит к неуправляемому потреблению энергии. Под- соедините их либо к VSS, либо к VDD, или переведите их в 14 Р7 Линия 7 ввода-вывода режим вывода (в котором ток не должен выдаваться) Рис. 39.2. BS1-IC: Полная схема контроллера BASIC Stamp на печатной плате с поверхностным монтажем (продолжение) BS2-IC Полная схема BS2-IC на печатной плате Интерпретатор PBASIC2 Память EEPROM емкостью 2048 байт Резонатор на 20МГц 5-Вопьтовый регулятор напряжения Схема сброса при понижении напряжения пи- тания до 4В Последовательный интерфейс с ПК 16 пиний ввода-вывода попьэователя 8 мА в рабочем, ЮОмкА в ждущем режиме (без нагрузки, линии ввода-вывода подключены к шинам питание-“земля”) вОО*м 1 «I Рис. 39.3. BS2-IC: Полная схема контроллера BASIC Stamp на печатной плате с поверхностным монтажем
Глава 39. Контроллер Basic Stamp фирмы Parallax 333 Соединение DK-BS2-IC Соединить DSR и RTS Последовательный порт ПК Вывод Название Назначение Описание 1 SOUT Выход последовательно- го порта Временно подсоединяется к пинии Rx ПК После программи- рования эти выво- ды можно оставить неподключенными 2 SIN Вход последовательного лорта Временно подсоединяется к линии Тх ПК 3 ATN Сигнализация (Attention) Временна подсоединяется к линии DTR ПК 4 VSS Земля Временно подсоединяется к линии GND ПК 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 РО Р1 Р2 РЗ Р4 Р5 Р6 Р7 Р8 Р9 РЮ Р11 Р12 Р13 Р14 Р15 Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия Линия 0 ввода-вывода 1 ввода-вывода 2 ввода-вывода 3 ввода-вывода 4 ввода-вывода 5 ввода-вывода 6 ввода-вывода 7 ввода-вывода 8 ввода-вывода 9 ввода-вывода 10 ввода-вывода 11 ввода-вывода 12 ввода-вывода 13 ввода-вывода 14 ввода-вы вода 15 ввода-вывода Выводы лорта пользователя, которые могут конфигури- роваться как входы или выходы. В режиме выхода: Выдают напряжение от VDD до VSS. Не должны выда- вать ток больше 20мА или пропускать ток 25мА каж- дый. По группам (Р0-Р7 и Р8-Р15) общая нагрузка по току для всех выводов не должна достигать 40мА, об- щий ток через них не должен превышать 50мА В режиме входа: Выводы плавающие (ток утечки меньше 1мкА). Порог переключения примерно равен 1,4В. Примечание: Для обеспечения наименьшего потребле- ния энергии в ждущем режиме не оставляйте выводы плавающими, так как это приводит к неуправляемому потреблению энергии. Подсоедините их либо к VSS, либо к VDD, или переведите в режим вывода, при котором ток не должен выдаваться 2 1 VDD Выход регулятора Вход литания Выход с 5-Вопьтового регулятора напряжения, питаю- щегося от VIN. Нельзя использовать для питания схем, потребляющих больше 50мА, включая нагрузку Р0-Р15. Вход питания (питание на VIN не подается). Принима- ет 4.5-5.5В. Ток потребления зависит от режима (рабо- чий/ждущий) и пиний ввода-вывода 22 RES Вход/выход запуска При низком уровне все линии ввода-вывода являются входами, а выполнение программы останавливается. При высоком уровне программа запускается с начала. Выдает низкий уровень, когда на VDD меньше 4В или на ATN больше 1,4В. “Подтянут* к напряжению питания через резистор 4.7К. Можно рассматривать его как индикатор пониженного напряжения/сброса. Может быть подключен к “земле” внешней схемой (т.е. кнопкой, соединенной с “землей”) для генерации сигнала запус- ка. Не подавать высокий уровень напряжения. 23 VSS Земля Земля. Расположена ло соседству с ния подсоединения батареи. VIN для облегче- 24 VIN Вход регулятора Вход 5-Вопьтового регулятора. Принимает от 5 до 15В Если литание подается непосредственно на шину VDD, то вывод можно оставить не подсоединенным Рис. 39.3. BS2-IC: Полная схема контроллера BASIC Stamp на печатной плате с поверхностным монтажем (продолжение)
334 Часть 6. Контроллер Basic Stamp фирмы Parallax Процессор STAMP Вместо того чтобы просто отговориться, скатав, что Stamp - это только надстройка над PlCMicro и имеет такую же архитектуру, я хочу представить Stamp как имеющий свою собственную процессорную архитектуру (рис.39.4). Рис. 39.4. Структурная схема контроллера BS1 В Stamp используется младшая модель PlCMicro, которая не реализует прерывания и не содержит каких-нибудь аппаратных средств, работающих одновременно с основной программой. Специальные характеристики АЛУ и линий ввода-вывода реализуются программно, что дает гораздо большую гибкость, чем специализированный микроконтроллер. Но это также приво- дит к тому, что Stamp выполняет некоторые специальные функции медлен- нее, чем микроконтроллеры, в которых они реализованы аппаратно. BASIC Stamp2 имеет похожую архитектуру, но с одним важным отличи- ем. Программный счетчик имеет стек на четыре элемента для хранения адре- са возврата из подпрограмм, что позволяет иметь до трех вложенных под- программ (см. рис. 39.5). Рис. 39.5. Структурная схема контроллера BS2
Главе 39. Контроллер Basic Stamp фирмы Parallax 335 Программные «лексемы» Одной важной особенностью, которую надо иметь в виду при работе со Stamp - это то, что он выполняет не обычные команды, а «лексемы», поступаю- щие из памяти EEPROM. Лексемы — это маленькие команды, которые фор- мируются из исходного кода. Обычно они имеют длину два или три байта, которые последовательно выбираются из EEPROM. Последовательная пере- дача данных — основная причина низкой производительности Stamp по срав- нению со встраиваемыми микроконтроллерами. Вы, вероятно, уже обратили внимание, что PICMicro в контроллере BS2 работает в пять раз быстрее, чем в BS1, но скорость выполнения команд всего в два раза выше. Это происхо- дит потому, что BS2 использует более длинные лексемы для выполнения команд, что требует больше времени для загрузки из EEPROM. Как только лексема загружена, она выполняется при помощи вызова соответствующей функции. Этими функциями могут быть арифметические операции, пересылки данных, проверки условий, операции управления вы- водами или последовательный обмен с системным/пользовательским интер- фейсом управляющего компьютера. Из-за различий в длине и возможном времени выполнения лексем очень трудно определить реальное время вы- полнения программы. Фактически приходится определять это время эмпи- рически, измеряя время работы приложения. АЛУ работает с 16-разрядными целыми словами. Как показано в главе «Программирование на PBASIC для Stamp» есть ряд слов, которые могут быть разбиты на биты, полубайты и байты. Линии ввода-выводы Если систематизировать возможности контроллера BS1 в области реализации ввода-вывода данных, то их можно представить в следующем виде: Параллельный ввод-вывод с разрешением вывода. Последовательный ввод-вывод. Генерация импульсов/определение длительности импульсов. Устранение дребезга контактов. Генерация сигналов звуковой частоты. Ввод-вывод ШИМ-сигналов. Для контроллера BS2 этот список расширяется следующими возможнос- тями: Синхронный ввод-вывод данных. Счетчики циклов. Интерфейс X-10 (используется в бытовой технике). Это довольно впечатляющий список. Ни один другой микроконтроллер из описанных в этой книге, и ни один из тех, которые я знаю, не реализует столько разнообразных функций, как Stamp, особенно если учесть, что эти функции реализуются на любой линии ввода-вывода. Вы, возможно, удиви- тесь, как контроллер Stamp все это обеспечивает — ведь его тинии ввода-
336 Часть 6. Контроллер Basic Stamp фирмы Parallax вывода являются частью выводов стандартного микроконтроллера PlCMicro, причем его младшей модели. Все эти функции обеспечиваются не аппаратно, а программно. Далее я подробно рассмотрю каждую из различных функций, имеющихся в языке PBASIC для Stamp. Здесь я просто хотел указать на то, что Stamp действи- тельно ограничен возможностями используемого в нем микроконтроллера PIC, выходы которого могут пропускать не более 20 мА вытекающего тока и не более 25 мА втекающего тока. Встроенные функции ввода-вывода значи- тельно повышают гибкость применения BASIC Stamp, но они не могут вы- полняться одновременно с основной программой. Это ограничивает слож- ность прикладных программ, которые могут быть написаны хтя данного контроллера. Память EEPROM с последовательной выборкой Когда программа написана и откомпилирована в лексемы, ее надо загрузить с управляющего компьютера в контроллер Stamp, который, в свою очередь, загружает ее во внутреннюю память EEPROM с последовательной выборкой. Эта память служит не только хтя хранения программ - ее можно также ис- пользовать для хранения переменных. Преимущество такого использования памяти EEPROM состоит в том. что данные сохранятся в Stamp даже после отключения от него питания. В обоих типах контроллеров Stamp размещение программы начинается с конца EEPROM, а адреса располагаются последовательно в порядке убыва- ния, так как обращение к памяти EEPROM рехтизуется с декрементом адре- са (см. рис. 39.6). Запись и чтение можно проводит в любом месте EEPROM. Это означает, что надо соблюдать осторожность, чтобы преобразованный в лексемы исходный код не был записан на место уже существующего. BS1 0x000 Программа OxOFF 0x07FF BS2 0x0000 - Пространство данных Рис. 39.6. Организация памяти EEPROM с последовательной выборкой в BASIC Stamp
Глава 39. Контроллер Basic Stamp фирмы Parallax 337 Вычисление того, где могут располагаться данные — непростая задача, и может потребовать выполнения нескольких программных итераций, чтобы обеспечить достаточный объем памяти и его правильную адресацию. В BASIC Stamp 11 после компиляции программы, выполняемой с помощью комби- нации клавиш «Alt-R», можно проверить объем памяти EEPROM, использу- емой как для хранения данных (используя программный оператор «EEPROM»), так и для программных лексем, нажав комбинацию клавиш «Alt-М». В контроллерах BASIC Stamp 1 это не так просто. Когда программа загру- жена в Stamp появляется окно с диаграммой, показывающей, какой объем EEPROM был использован. На рис. 39.7 изображено 32 символа, которые отображают 256 доступных байт в EEPROM (по 8 на символ). Семь символов закрашены, что означает, что для хранения данных доступно 200 байт в EEPROM с последовательной выборкой. Диаграмма памяти Память, используемая \ программой ЖГГКП1 ''lllilll Press Any Key to Continue End Рис. 39.7. Диаграмма загрузки памяти BS1 Микросхемы памяти EEPROM соединены с PICMicro, как стандартные устройства с последовательным доступом. В контроллерах Stamp 1 использу- ются микросхемы памяти Microchip 93LC56, которые имеют последователь- ный интерфейс Microwire. В контроллерах BASIC Stamp 11 применяются схе- мы памяти Microchip 24LC16Bc интерфейсом 12С.Обе эти микросхемы не могут быть замещены памятью большего объема. Но это не исключает воз- можности использования в качестве дополнительной памяти EEPROM с последовательной выборкой, подключенной к линиям ввода-вывода контрол- лера Stamp. В контроллерах BSI объем используемой памяти EEPROM может быть считан из последнего байта, имеющего адрес SFF. Это значение является последним адресом программы и может быть преобразовано в ее размер в байтах следующим образом: Read 255, Last Size = 255 - Last “ Чтение содержимого ячейки EEPROM с “ адресом 255 ($FF) “ «Size» - размер программы в байтах 22 Зак. 2025.
338 Часть 6. Контроллер Basic Stamp фирмы Parallax Такая возможность отсутствует в контроллерах BS2, но вы можете ис- пользовать описанную выше команду «Alt-М» хтя определения размера про- граммы. а затем изменить исходный код, чтобы отметить в нем конец про- гра м м ы. Интерфейсы программирования Контроллер Stamp имеет интерфейс хтя программирования в системе. Оба типа контроллеров Stamp имеют двунаправленный последовательный ин- терфейс, который используется как для программирования EEPROM с пос- ледовательной выборкой, так и хтя передачи отладочной информации хтя управляющего компьютера во время выполнения программы. Контроллер Stamp I использует хтя передачи данных параллельный (прин- терный) порт персонального компьютера (рис 49.8’.). Этот интерфейс прини- мает данные с линии DO параллельного порта и посылает их по линии BUSY этого же порта. Хорошей особенностью этого метода передачи данных явля- ется то, что парштлельный порт не должен быть специфицирован при ини- циализации систем редактирования-огладки. Это происходит потому, что обычные приложения, работающие с этим портом, используют для синхро- низации передачи данных сигнал на линии STROBE. Изменение состояния на линии DO будет влиять только на контроллер BASIC Stamp 1. подсоеди- ненный к параллельному порту. Так как этот интерфейс очень прост, я всегда ввожу в схему приложения три контакта хтя реализации программирования. В этом случае нет необходи- мости покупать несущую плату, которая используется хтя программирова- ния контроллера Stamp вне рабочей системы. Рис. 39.8. Интерфейс программирования контроллера BS1
Глава 39. Контроллер Basic Stamp фирмы Parallax 339 Контроллер Stamp II использует последовательный порт для приема и передачи данных при программировании (см. рис. 39.9). Аппаратные средства для программирования и связи с компьютером по последовательному интер- фейсу немного сложнее, чем интерфейс для программирования Stamp 1. Этот интерфейс может использоваться для последовательного приема-передачи данных между контроллером Stamp и управляющим компьютером. Так как к последовательному порту могут быть подключены другие устройства, порт, который будет использоваться для программирования, должен быть специ- фицирован при запуске системы редактирования-разработки. Рис. 39.9. Интерфейс программирования контроллера BS2 Чтобы инициализировать систему редактирования-разработки для Stamp II необходимо ввести следующую командную строку: stamp2 /п где п — номер используемого COM-порта. Приложение использует интер- фейс программирования в качестве последовательного порта, если в коман- дах «SERIN» и «SEROUT» указан вывод 16. В этом случае линия DTR должна быть отключена, если вы используете терминальную программу компьютера для интерфейса с приложением. Контроллер BS2 использует бит ATN, чтобы запустить себя и выполнить поиск программы «stamp2.exe», загружающей в него программный код. Если последовательный порт не управляется програм- мой «stamp2.exe», он будет ждать, пока она не поступит, или будет испол- нять программу, записанную в EEPROM. Самый простой способ реализовать такую процедуру — это разорвать ли- нию ATN между компьютером и BS2. Я обычно ставлю два отдельных кон-
340 Часть 6. Контроллер Basic Stamp фирмы Parallax такта с шагом 0,1 дюйма и соединяю их перемычкой (джампером), когда хочу произвести программирование. Такое использование последовательного порта позволяет произвести внутрисистемное программирование BS2 и из- бавляет от необходимости приобретать несущую плату для программирова- ния Stamp II. Если вы соответствующим образом спроектировали ваше приложение, включая реализацию прототипа схемы на макетной плате, то вам не придет- ся покупать несущие платы, которые обычно используются для программи- рования контроллеров Stamp, не включенных в систему. Если коммуникаци- онное программное обеспечение вашего компьютера может непосредственно записывать данные в регистры приема-передачи последовательного порта, то вы можете не обращать на это внимания, так как на линию DTR, к кото- рой подключен вход ATN контроллера, будет постоянно выдаваться 0 (поло- жительный уровень потенциала). Когда вы только начинаете работать с контроллерами Stamp, вы можете захотеть программировать их вне рабочей системы или подключить к ним дополнительные схемы с собственным питанием. Фирма Parallax предлагает две платы для макетирования-программирования, которые вы можете ис- пользовать (рис. 39.10 и 39.11). Обе эти платы имеют разъем для контроллера Stamp, интерфейс программирования для связи с компьютером и контакты для подключения 9-вольтовой радиобатарейки, что позволяет упростить ма- кетирование устройств. Рис. 39.10. Интерфейс программирования и макетная ппата для BS1
Глава 39. Контроллер Basic Stamp фирмы Parallax 341 Рис. 39.11. Интерфейс программирования и макетная ппата для BS2
глава 40 ПРОГРАММИРОВАНИЕ НА PBASIC ДЛЯ STAMP Краткое содержание: Интерфейс Язык PBASIC для Stamp Типы данных ввода-вывода для BS2 Переменные и «символы» для BSI Переменные для BS2 Операторные выражения Подпрограммы Форматирование исходного кода на PBASIC Отладка Благодаря использованию языка PBASIC, который я часто буду называть BASIC для Stamp, контроллеры Stamp действительно становятся легкими для программирования. Работа с языком высокого уровня избавляет вас от необходимости понимания того, как отдельные биты и байты проходят через процессор. Однако есть некоторые хитрости, нестандартные языковые конст- рукции и общие особенности, которые вы должны понять, прежде чем на- чать создавать свои собственные приложения. Интерфейс Оба типа контроллеров Stamp используют полноэкранный редактор, кото- рый запускается из командной строки MS DOS. Этот редактор позволяет со- здавать программы, загружать их в Stamp, а также обеспечивает некоторые возможности для отладки приложений. Редактор запускается из различных эмуляторов MS DOS, если вы работа-
Глава 40. Программирование на PBasic для Stamp 343 ете не с IBM-совместимым компьютером Сам редактор кажется немного неудобным, особенно, если вы использовали для работы редакторы с графи- ческим интерфейсом, которые требуют наличия мыши. Но в большинстве случаен редакторы Stamp используют такие же сочетания управляющих кла- виш, как и стандартный Windows редактор. Сочетание клавиш Функция Enter Начать новую строку Tab Перейти на границу следующих S-ми символов Backspace Сдвинуть на один символ влево и удалить его Delete Удалить текущий символ или выделенный текст Shift-Delete Удалить символы до копна строки Left Arrow Сдвинуть курсор на одну поишию влево Right Arrow Сдвинуть курсор на одну позицию вправо Up Arrow' Сдвинуть курсор на одну строку вверх Home Перейти к началу строки End Перейти к концу строки Ctrl-Left Arrow Перейти к началу текущего слова пли. если курсор на- ходится перед пробелом или в начале слова — к началу предыдущего слова Ctrl-Right Arrow Перейти к началу следующего слона Shift- Honie Перейти к началу файла Shift - Encl Перейти к концу файла Shi ft-Arrow Key Сдвинуть курсор, как описано выше, и выделить текст с начальной точки до позиции курсора Shift-Insert Выделить текущее слово ESC Снять выделение текста Alt-X Удалить выделенный гексг и поместить его в буфер об- мена Alt-C Поместить выделенный гексг в буфер обмена Alt-V Поместить текст из буфера обмена по месту текущего курсора Основные функции редактирования, которые вы должны знать, это опера- ции с файлами, которые включают: Alt-L Alt-S Alt-Q Загрузить файл Сохранить текущий файл Выйти с возвратом в режим командной строки
344 Часть 6. Контроллер Basic Stamp фирмы Parallax После того, как программа закончена, она может быть откомпилирована в лексемы и запущена для выполнения на подключенном контроллере Stamp с помощью команды Alt-R. Любые синтаксические ошибки будут выявлены до того, как Stamp будет запрограммирован и начнет выполнение програм- мы. Чтобы помочь в определении реального диапазона переменного сопро- тивления. которое будет использоваться, в редакторе Basic Stamp I может быть выполнена команда Alt-Р. При этом загружается специальная програм- ма, и на экран выводится окно, в котором по вашему запросу будет пред- ставлено, как работает этот потенциометр при определенной величине со- противления в заданном диапазоне. Эти результаты могут использоваться в команде РОТ, которая служит для «настройки» программы на реальные но- миналы переменного резистора и конденсатора, включенных в приложении. Команда Alt-M есть только в Basic Stamp II и используется для демонст- рации того, какой объем памяти EEPROM был использован для хранения программ и данных. Такой возможности нет в Basic Stamp I; вместо этого, как описано в главе «Аппаратная часть Stamp», окно загрузки будет показы- вать, какой объем памяти EEPROM используется программой. Язык PBASIC для Stamp Если вы работали с языками высокого уровня, у вас, скорее всего, не будет никаких проблем с PBASIC для Stamp. Есть некоторые отличия его от стан- дартов, которые вам следует учитывать. Этот раздел посвящен описанию имеющихся отклонений PBASIC от более традиционных версий языка BASIC и других языков высокого уровня. Типы данных ввода-вывода для BS2 При посылке последовательных данных из контроллера BS2 на внешнее уст- ройство с помощью команды DEBUG либо SEROUT, данные должны быть сформатированы в определенные типы. Эти типы используются также ко- мандой SERIN для форматирования входящих данных. Такие типовые ко- манды избавляют от необходимости преобразования значений переменных в ASCII-код, шестнадцатеричный или десятичный код и позволяют передавать строки данных. Есть следующие типы выходных данных, которые задаются в PBASIC с помощью префиксов. Префикс Параметры Описание ASC bytevar Послать ASCll-значение STR bytevar[\n ] Выдать массив байтов до тех пор, пока не встре- тится 0 или не будет послано п значений REP vakie\n Послать символ п раз [S]DEC[n] value Послать значение как десятичное число (S — со знаком) длиной п символов
Глава 40. Программирование на PBasic для Stamp 345 Префикс Параметры Описание |I]|S]HEX|n| value Послать значение как шестнадцатеричное число (S-co знаком) длиной п символов. Если указано «1», то в начале послать «$» [l]|S|BIN|n| value Послать значение как двоичное число (S-co зна- ком) длиной п символов. Если указано «I», то в начале послать «%» Если в качестве значения указана переменная и в конце префикса стоит знак «?», то вместе со значением передается и имя переменной. Например: DEBUG dec X выведет (если X = 42): 42 Но если указать Debug dec? X то будет выведено X = 42 Знак «?» можно использовать со всеми префиксами за исключением «REP». В команде SERIN префиксы используются для фильтрации входных дан- ных и преобразования входящих ASCH-строк в двоичные данные, которые могут быть помещены прямо в переменные для дальнейшего использования. Это позволяет выполнять довольно сложную обработку входных данных без необходимости для пользователя явно использовать оператор IF для обработ- ки данных. Команды WAIT и SKIP используются для фильтрации входных потоков. Префиксы Wait и Skip для SERIN имеют следующее назначение. Префикс Параметры Описание SKIP п Пропустить п байтов WA1TSTR byteArray[\L] Ждать строку (подстроку) для приема WAIT (Value[, value |) Ждать последовательность длиной до 6 байт STR byteArray\ n[\E] Ввести п байт и остановиться, если при- нят символ “Е" Все другие операции, реализуемые с командами DEBUG/SEROUT, за исключением REP, можно также использовать и с командой SERIN, но только для изменения входных данных.
346 Часть 6. Контроллер Basic Stamp фирмы Parallax Есть также несколько управляющих ASCII-кодов, запрограммированных в контроллерах BS2. Метка Значение Описание CLS 0 Очистить экран и поместить курсор в его начало (дос- тупна не во всех ASCII-устройствах) НОМЕ I Вернуть курсор в начальную позицию BELL 7 Подать звуковой сигнал BKSP 8 Вернуть курсор на одну позицию и стереть предыду- щий символ TAB 9 Продвинуться вперед к следующей 8-символьной ко- лонке CR I3 Возврат каретки Единственный ASCll-символ, который следовало бы еще включить в этот список — это «LF» или «LineFeed» (ОхООА). Но его можно определить в виде константы при помощи следующей операции: LF con 10 Переменные и «символы» в контроллере BS1 При описании организации доступа к переменным в BASIC Stamp я разбил этот раздел на две части: для BASIC Stamp I и BASIC Stamp 2, так как между этими устройствами есть несколько значительных различий. Переменные в PBASIC для Stamp I работают, вероятно, не так, как в других языках высокого уровня, с которыми вы имели дело, так как все они имеют предварительно определенные функции, места размещения в памяти и имена. Память переменных в BASIC Stamp I определена как восемь шест- надцатибитовых слов. Обращение к каждому слову в PBASIC может быть вы- полнено просто путем указания идентификатора этого слова, например, W0. Слово Имена байтов Описание Port Pins, Dirs Линии ввода-вывода и направление передачи данных ("TRIS") Чтение/запись W0 BO, Bl Слово общего назначения с битовой адресацией Чтение/запись Wl B2, B3 Слово общего назначения Чтение/запись W2 B4, B5 Слово общего назначения Чтение/запись W3 B6, B7 Слово общего назначения Чтение/запись W4 B8, B9 Слово общего назначения Чтение/запись
Глава 40. Программирование на PBasic для Stamp 347 Слово Имена байтов Описание W5 BIO, BII Слово общего назначения Чтение/запись W6 B12, BI3 Изменяется функцией «Gosob» Ч гение/запись Доступ к байтам в этих словах можно получить, прямо указав «В#» вместо «W#». В двух первых словах также можно получить доступ ко всем отдельным битам. Обращение к восьми линиям ввода-вывода (внешним выводам кон- троллера) битам и управление выводом данных через них осуществляется в первом слове («PORT»). Эти выводы работают таким же образом, как в боль- шинстве других микроконтроллеров, поскольку данный контроллер реализо- ван на базе PlCMicro. Важно обратить внимание на то. что при включении питания вывод данных по всем восьми внешним линиям запрещен (то есть они работают в режиме ввода). Все шесть слов данных, используемых в качестве переменных общего на- значения, при включении питания инициализируются нулями. При разработке программы можно непосредственно обращаться к раз- личным битам, байтам и словам. Это позволяет очень эффективно пересы- лать данные внутри Stamp. Хороший пример приведен далее в этой книге в главе «Первое приложение для Stamp». В нем я хочу передать один входной бит, поступающий на вывод 7, в качестве выходного бита на вывод 4. В обыч- ном микроконтроллере эту процедуру можно реализовать с помощью языка С следующим образом: if ((PORT & 0x080) != 0) PORT = PORT I 0x010; else PORT = PORT & OxOEF; или PORT = (PORT & 0x0EF)l((PORT & 0x080) » 3); Но на языке BASIC для контроллеров Stamp I и Stamp 2 это выражение может быть заменено одной строкой: PIN4 = PIN7 Этот пример может быть сделан еще более легким для чтения и понима- ния путем использования «символов». «Символы» на самом деле являются простыми макросами, которые могут использоваться для определения раз- личных областей в памяти при помощи меток, имеющих смысловое значе- ние. Символы могут также использоваться для определения констант. В приведенном выше примере, если определить выводы с помощью сим- волов: symbol LED2 = PIN4 symbol SW = PIN7
348 Часть 6. Контроллер Basic Stamp фирмы Parallax это даст нам идентификаторы, работать с которыми намного легче, чем с номерами выводов. В таком случае последняя строка, которая берет входные данные с одного вывода и выводит их на другой, будет иметь вид' LED2 = SW По моему мнению, серьезным недостатком в возможностях задания пере- менных для контроллера StampI является отсутствие массивов переменных. Если требуются реализовать массив данных, можно использовать память EEPROM для сохранения и выборки данных в соответствии с адресом - ин- дексом массива. Для выборки данных из массивов, предназначенных только для чтения, можно пользоваться табличными командами «'LOOKUP». Переменные в контроллере BS2 Переменные в контроллерах BS2 отличаются от переменных в BSI одной очень важной особенностью — они являются ресурсами, размещаемыми в памяти компиляюром, а не пользователем, как эго делалось в BSI. Область переменных в BS2 определяется так же. как и в BSI. где каждое слово имеет длину 16 бит. Слово Описание $0 Состояние входных контактов только чтение $1 Разрешение вывода чтение/запись $2 Пространство переменных чтенпе/заппсь $3 П ространс гво пере мен н ы х ч гение/запись $4 Пространство переменных чгение/запись $5 Пространство переменных чтение/гапись $6 Пространство переменных чгение/запись $7 Пространство переменных чтенпе/заппсь $8 Пространство переменных ч гение/запись $9 Пространство переменных ч гение/запись $А П ространство перемеиных чтение/запись $В Пространство переменных чгение/запись $с Пространство переменных ч гение/запись $D Пространство переменных чтение/запись $Е Пространство переменных чтение/запись Обращение к линиям ввода/вывода в BS2 производится с использовани- ем их символических имен «IN», «OUT» и «D1R». Эти линии выполняют те же функции, что и в BS1. Как и в BS1, можно получить доступ к этим линиям или группам линий, указав соответствующее окончание в символическом имени. Например, для обращения к битам, поступающим на линии ввода, используются следующие символические имена.
Глава 40. Программирование на PBasic для Stamp 349 1NS Все 16 входных линий как слово INL Входы 0 — 7 INH Входы 8—15 INA Входы 0-3 INB Входы 4 — 7 INC Входы 8-11 IND Входы 12—15 INO Вход 0 INI Вход 1 IN2 Вход 2 IN 15 Вход 15 Эти же окончания используются для символических имен OUT и DIR. Чтобы сохранить совместимость с BS1, доступ к регистрам BS2 можно выполнять по именам от W0 до W12 или от ВО до В25, однако рекомендуе- мым методом обращения к регистрам является их объявление при помощи оператора «var», которая имеет следующую форму: Symbol var size (array), где параметр «size» определяет разрядность данных: Word 16 бит Byte 8 бит Nib 4 бита Bit 1 бит Декларация массива «array» является необязательной и может быть опре- делена для любого типа данных. Имена переменных для линий ввода-вывода могут быть определены тем же способом. Например, младшие 8 линий ввода-вывода могут быть опреде- лены как входы следующим образом: LCDOut var INL Переменные могут быть разбиты на переменные меньших размеров путем использования «модификаторов переменных», которые являются простой формой структур данных. Используются следующие модификаторы перемен- ных: HIGHBYTE BYTE! LOW BYTE BYTEO HIGHNIB Старший байт (байт!) слова Старший байт слова Младший байт (байт 0) слова Младший байт слова Старший полубайт слова или байта
350 Часть 6. Контроллер Basic Stamp фирмы Parallax NIB3 Старший полубайт слова N1BI Старшиз! полубайт байта или полубайт 1 слова LOWN 1В Младший полубайт слова или байта NIB2 Полубайт 2 слова NIBO Младший полубайт слова или байта H1GHB1T Старший бит слова, байта или полубайта LOWBIT Младший бит слова, байта или полубайта BITO БшО слова, байта или полубайта BITI Бит1 слова, байта или полубайта BIT7 Бит7 слова или старший бит байта BITI 5 Старший бит слова В качестве примера рассмотрим определение 14-битовой команды PICMicro. использующей непосредственную адресацию. Во-первых, коман- ду можно определить выражением: PICInstruct var word Далее можно определить различные части команды — сначала код операции: PICInstruction var PICInstruct.HIGHBYTE вслед за которым идут непосредственные данные: PIC Immediate var PICInstruct.LOWBYTE Массивы обрабатываются так же, как в большинстве других языков высокого уровня, хотя важно отметить две особенности, касающиеся обработки мас- сивов в Stamp II. Первая особенность — это то, что не производится проверка индекса массива. Выход за границы массива не приводит к выдаче информа- ции об ошибке, но может оказать влияние на работу контроллера Stamp. Вто- рая особенность, на которую следует обратить внимание, - это то, что мас- сивы занимают место в памяти, а так как доступными являются только 26 байт программной памяти RAM. то большие массивы (больше десяти байт) могут очень быстро использовать всю эту память. Операторные выражения Я полагаю, что «операторное выражение» - это формула, расположенная справа от знака равенства («=») в выражениях присваивания или справа от оператора «if» в условных выражениях. Хотя это похоже на формат, использу- емый в других языках, с которыми вы знакомы, есть одна важная особен- ность, которая может вызвать проблемы при разработке программ для Stamp. Эта особенность заключается в том, как вычисляются выражения, преоб- разуемые, в конечном счете, в лексемы. В контроллерах Stamp эти выраже- ния вычисляются слева направо независимо от приоритета выполнения one-
Глава 40. Программирование на PBasic для Stamp 351 раций (при выполнении арифметических операции и порядке приоритета умножение выполняется до сложения или вычитания, но не раньше сравне- ния). Это частично исправлено в BS2, но даже при создании программного кода для этого контроллера следует обратить особое внимание на то. чтобы операции выполнялись в правильном порядке. Например, если мы должны выполнить следующее выражение присваивания: А = А * В + С * D то во многих языках оно вычисляется в следующем порядке: I. А * В 2. С* D 3. Результат! + Результат? 4. Сохранить РезультатЗ в «А» Так как BASIC Stamp I выполняет все операции слева направо, это дан- ное выражение присваивания будет вычисляться следующим образом: I. А * В 2. (А * В) + С 3. ((А * В) + С) * D 4. Сохранить РезультатЗ в «А» Если вы что-то знаете об «обратной польской записи» (называемой также «RPN» — такой метод работы и программирования используется в калькуля- торах Hewlett-Packard), то, возможно, придете к выводу о целесообразности записи арифметических выражений в этом формате. Это можно сделать в не- которых случаях, но сложные выражения, подобные приведенному выше примеру, не могут быть вычислены таким образом, потому что в BASIC Stamp I нельзя сохранять промежуточные значения. Выражение из данного выше примера может быть преобразовано в два выражения для BASIC Stamp I: Temp = С * D A = A * В + Temp Алгоритм, который я использую для реализации сложных вычислитель- ных выражений в BASIC Stamp I, состоит в том, чтобы помещать все высо- коприоритетные операции в отдельные строки и затем складывать или вычи- тать их в конечной строке, обеспечивая «склеивание» этих операции вместе. Иногда, как в показанном здесь примере, есть возможность поместить одну высокоприоритетную операцию непосредственно в конечную строку с опе- ратором присваивания. Если в BASIC Stamp 2 две операции умножения заключены в круглые скобки: А = (А * В) + (С * D) то выражение будет вычисляться с «нормальным» порядком выполнения операций. Контроллер BASIC Stamp 2 может обрабатывать до 8-ми уровней
352 Часть 6. Контроллер Basic Stamp фирмы Parallax круглых скобок, что позволяет вам писать программы, реализующие необхо- димый порядок выполнения операций. Еще одна дополнительная сложность в работе с BASIC Stamp 2 — это реализация им унарных операций (операций, имеющих только один входной параметр), таких как NOT, и бинарных операций, таких как AND, прежде чем будут выполнены бинарные арифметические операции, такие как «+», «*» и «/». Самый простой способ обеспечить необходимый порядок выполне- ния операций в BASIC Stamp 2 это помнить, что операции, которые задают- ся словами, имеют более высокий приоритет, чем те, которые используют символы арифметических выражений. При разработке приложений я рекомендую после любого сложною опера- торного выражения использовать команду «DEBUG» для распечатки результа- та выражения до тех пор, пока вы хорошо не познакомитесь со способом, которым BASIC для Stamp вычисляет выражение. И если вы похожи на меня, то будете всегда использовать команду «DEBUG» для отладки программы пос- ле каждого сложного выражения, потому что годы работы с традиционными языками заставляют меня писать выражения обычным способом. Все вышесказанное касается также операций отношения, которые явля- ются частью операторных выражений. По этой причине я никогда не исполь- зую больше одного сравнения в операторе «if». Например, «1F А > В» - это выражение обычной для меня сложности. Подпрограммы Если вы знакомы с операторами «GOSUB» и «RETURN» в обычном языке BASIC, то вам покажется, что их двойники в PBASIC работают аналогичным образом. Однако есть несколько отличий от их стандартных реализаций в BASIC, которые вы должны учитывать при использовании этих команд в BASIC Stamp. Возможности реализации подпрограмм в BSI, вероятно, покажутся вам довольно ограниченными из-за того, что можно использовать только 16 опе- раторов «GOSUB» (вызовов подпрограмм) и только одно слово W6 ;1ля хране- ния адреса возврата. На самом деле данное ограничение максимальною числа вызываемых подпрограмм является несущественным ,ия микроконтроллера, который имеет только 256 байт для хранения программ. Фактически реализа- ция даже 16 вызовов займет очень значительный процент памяти программ. Гораздо большее значение имеет отсутствие стека ,1ля хранения содержи- мого программного счетчика. Если вы находитесь в подпрограмме и вызыва- ете из нее другую (вкладываете вторую подпрограмму), то обнаружите, что невозможно вернуться к месту, откуда была вызвана первая подпрограмма. Нет никакого стека программного счетчика и нет возможности прочитать или сохранить адрес оператора «CALL». Вы можете изменить свой стиль про- граммирования, используя линейное размещение программного кода и из- бегая применения подпрограмм, если это вообще возможно. Хотя это и мо- жет показаться кощунством для специалистов, которые были воспитаны на технике структурного программирования, но использование такого програм- мирования для BS1 может дать значительные преимущества в смысле эконо- мии требуемой памяти и несущественно сказывается на читаемости программы.
Глава 40. Программирование на PBasic для Stamp 353 Для контроллеров BS2 в программный код можно внести до 255 операзоров «GOSUB». реализуя четыре уровня вложения подпрограмм. При этом какие- либо регистры, хранящие данные, не меняют свое содержимое и не использу- ются для хранения содержимого программного счетчика. Это значит, что при работе с BS2 можно использовать традиционную технику программирования, не опасаясь каких-либо неприятностей при выполнении программ. Форматирование исходного текста в PBASIC Язык PBASIC отличается от мнозих других языков, и я считаю, что написа- ние с его помошью программного кода, удобного для чтения, является до- вольно сложной задачей. Эго происходит потому, что PBASIC. как и боль- шинство вариантов BASIC, находится в промежуточной «серой» области между ассемблерным кодом и языком высокого уровня. Так как есть много разных ззариангов BASICa. то эти оттенки серого меняются от гря зно-белого до угольно-черного. Язык PBASIC находится где-то посередине. При обычном стиле программирования я всеша раснолазаю объявления переменных и констант в начале каждой функции. Глобальные переменные и константы объявляются в начале проз раммы. за ними следуют подключае- мые файлы, подпрограммы и затем - основная программа. Я размещаю подпрограммы перед основной программой, так как многие языки высокою уровня, особенно С. и некоторые ассемблеры не могу] ссы- латься на метки, расположенные ниже текущего положения без непосред- ственною их обьявления в начале программы. Вместо того чтобы повторять ссылки, чю можег привести к проблемам, когда кол модифицируется в од- ном месте, а в другом не модифицируется, я размещаю подпрограммы ввер- ху кода и декларирую их только одни раз. В большинстве языков начало кода или место, где начинается программа, явно обьяваяется. В PBASIC программы начинаются с первой строчки кода. Это означает, чго в PBASIC приходится размещать noanpoiраммы после тек- ста основной npoi раммы. Когда я начинаю писать программу на PBASIC. я размещаю объявление всех переменных и коне тан г сразу за заголовочными комментариями, чтобы позволить себе следить за ресурсами, то есть словами в памяти RAM. кото- рые требуются для программы. Если объявлять переменные обычным образом, чго на языке PBASIC выглядит гак: “ Начало программы SubRtnl: * Первая подпрограмма Symbol i = W2 ' Объявление “локальной" переменной
354 Часть 6. Контроллер Basic Stamp фирмы Parallax SubRtn2: ‘ Вторая подпрограмма Symbol j = W3 ‘ Объявление “локальной" переменной то возникают неприятности в виде повторяющихся переменных или, в слу- чае использования BS2. из-за объявления большего числа переменных, чем это доступно. Определение всех переменных is одном месте может ограничить удобочи- таемость программы по сравнению определением, принятом при структур- ном программировании, но позволит в дальнейшем избежать возникновения проблем с переменными, которые трудно ра (решить в ходе отладки. Другими факторами, которые, как я считаю, снижают удобочитаемость программного кода, являются отсутствие возможности подключать файлы и отсутствие файла листинга с возможностями условной компиляции и раз- личными вариантами его выдачи, например, с возможностями разрешения и запрещения листинга, разбиения его на страницы. Язык PBAS1C, как и другие варианты BASICa, позволяет использовать несколько операторов в одной строке. Например, если вы хотите очистить строку (или столбец) на ЖКИ, то можно использовать код: OutChar = “ “ for i = 0 to 20 gosub SendCHAR ‘ Послать пробел на ЖКИ next Этот код может быть записан в следующем виде: OutChar = “ “: for I = 0 to 20: gosub SendChar: next ‘ Очистить столбец ЖКИ Количество лексем, которое будет генерированы для каждого из этих при- меров, будет одинаковым, так как для их генерации используется один и гот же код, который различается только форматом. Я не рекомендую применять такую запись для условных программ, коюрые используют оператор «if», так как действия таких программ не всегда будут очевидными, и она станет слож- ной для отладки, так как ход выполнения программы окажется трудным для понимания. После всего, что я здесь написал, у вас может возникнуть ощущение, что Stamp не подходит для написания удобочитаемого кода. Разделение отдель- ных блоков пробелами может оказать значительную помощь, так как разме- щение кода и комментариев по отдельным колонкам позволит создать исход- ный код, который легко просматривать и анализировать, а именно это и определяет на практике «удобство чтения». Отладка Большим недостатком контроллера Stamp и созданных для него средств раз- работки является то, что очень трудно «войти внутрь» приложения и его про- граммного обеспечения в процессе выполнения и посмотреть, что же там на
Глава 40. Программирование на PBasic для Stamp 355 самом деле происходит. Я всегда считал. чю для этою необходим симулятор/ эмулятор, поэтому я сам разработал один его вариант, который приведен в примере приложений. Традиционная отладка для Stamp заключается в размещении команды «Debug» в коде программы для посылки информации о состоянии из опреде- ленной точки в программе. Очень важно делать это эффективно, так как ко- манда DEBUG занимает место в памяти EEPROM. В этом разделе представлены правила, которыми я руководствуюсь при работе. Во-первых, не используйте сообщений в операторах отладки или де- лайте их очень короткими. Такие команды отладки, как: DEBUG “Bottom Pressed, Count = ", Count использует все доступное пространство EEPROM гораздо быстрее, чем: DEBUG “А” , Count Это означает, что вы будете должны распечатать копию текста программы на PBASIC. чтобы следить за тем. в какой точке находится процесс выпол- нения программы. Следующее правило, которое я использую при отладке Stanip-приложе- ний - это активизация только тех команд отладки, которые необходимы в данный момент для текущей задачи. Чтобы «деактиви зировать» команду, надо просто представить строку как комментарии, поместив символ «/> в первом столбце. Таким образом, строка: /DEBUG “А" , Count не будет откомпилирована и загружена в EEPROM до тех пор. пока не будет убран симтзол «/». и программа не откомпилирована заново. Это также сдела- ет текущую задачу проще, так как не будут передаваться какие-либо посто- ронние сообщения. Последняя хитрость, которую я использую для того, чтобы сделать про- цесс отладки более летким. была описана мной в первой части книги. Она заключается в отладке отдельных функций ввода-вывода и затем их вставке в окончательную программу. В большинстве других систем разработ ки это яв- ляется сравнительно простой задачей, но в системе редактнрования/разра- ботки для Stamp невозможно редактирование нескольких файлов или под- ключение внешних. Это означает, что некоторая часть разработки проводится отдельно тз ре- дакторе MS-DOS или Windows. Я понимаю, что это может быт проблемой для некоторых пользователей, не очень знакомых с персональным компью- тером. К сожалению, контроллер Stamp не предоставляет тзозможностей инте- рактивной отладки, но при грамотном планировании процесса разработки приложения и его отладки, можно быстро получить рабочий вариант прило- жения. Это является одной из целей третьего примера приложения - эмуля- тора BS1, которое разработано для применения в ваших проектах.
глава 41 РАЗРАБОТКА ПРИЛОЖЕНИЙ НА БАЗЕ STAMP Краткое содержание: Конструктивная реализация Подключение питания Запуск По сравнению с другими микроконтроллерами, описанными в этой кише. Stamp имеет очень мало специфических устройств для реализации приложе- ний. Он содержит только размешенный на плате осцилляюр и схему запуска. Из-за особенностей своей конструкции и технологии производства Stamp более, чем другие микроконтроллеры, чувствителен к фитическим и элек1- рическим повреждениям. Конструктивная реализация Обычный микроконтроллер заключается в эпоксидный герметик. С контрол- лерами Stamp дело обстоит иначе. Они сами являются SMT-компонентами. размещенными на плате-носителе, в качестве которой используется стан- дартная печатная плата на стекловолоконной основе. Поэтому они являются довольно хрупкими, и их компоненты могут повредиться, если котроллеры часто вставляются в разъем и удаляются из него. Эти повреждения могут быть вызваны сгибанием несущей платы и разрывом паяных соединений, а также нарушением точек пайки и металлических проводников под нажатием паль- цев. Никогда не следует использовать плоскогубцы, чтобы вынуть Stamp из схемы, так как это увеличивает вероятность повреждения компонентов, па- яных соединений или несущей платы. Вместо этого при разработке приложений для Stamp я всегда выделяю три Сия BS1) или четыре (для BS2) линии, чтобы программировать Stamp
Глава 41. Разработка приложений на базе Stamp 357 при помощи персонального компьютера, не вынимая его из схемы. Для BS1 предусматривается 3-контактный разъём Для BS2 я делаю на плате разводку проводников для монтажа 9-выводного разъема D-типа. Это исключает необ- ходимость удаления контроллера Stamp с платы при разработке приложе- ния. Контроллеры Stamp не рекомендуются для применения в условиях, где они будут подвергаться воздействию высокой влажности или химических испарений. Причиной этого является влияние таких воздействий на паяные соединения компонентов и проводники на печатной плате. Вода может выз- вать коррозию, короткое замыкание или миграцию металла между вывода- ми, а химикаты могут ускорить процесс миграции металла или коррозию. Если приложение со Stamp предполагается использовать в среде, где потен- циально возможно повреждение паяных соединений, то я рекомендую гер- метично изолировать Stamp от этой среды. Герметичная изоляция может быть сделана путем помещения Stamp в герметичный корпус или покрытия его и подключенной к нему схемы эпоксидной смолой или пластиком, которые используются при ремонте различных изделий, где требуется замена изно- шенных или сломанных деталей. Я бы также позаботился о надежности соединения контроллера BSI со схемой в аппаратуре, работающей при сильной вибрации, например, в ра- диоуправляемых моделях автомашин или самолетов. Контроллер BSI разра- ботан для размещения на несущей плате, причем основной вес размещен на ее конце. В аппаратуре, подверженной сильной вибрации, соединения с пла- той, самим контроллером или его выводы могут в конце концов сломаться из-за механической усталости. Чтобы предотвратить такую возможность, контроллер BSI должен быть жестко прикреплен к плате, в которую он вставляется. Имеются различные виды прямоугольных держателей и соединителей, которые можно использо- вать для этой цели. Таким образом, можно исключить возможности переме- щения Stamp относительно этой платы. Если это невозможно, вы можете купить кристалл PlCMicro и припаять его вместе с памятью EEPROM прямо на плату. Другой возможностью является использование компилятора PBASIC, который поставляется в составе комплекса разработчика, и программирова- ние 16С58, как только приложение будет отлажено. Подключение питания Контроллеры Stamp могут получать питание от большого числа разных ти- пов источников, так как они имеют встроенные регуляторы напряжения. Наиболее типичным источником питания для Stamp является 9-вольтовая радиобатарейка. Нельзя сказать, что вообще не надо заботиться о питании для Stamp. Ос- новной заботой является контроль допустимой величины гока, который мо- жет протекать через регулятор. Регуляторы напряжения имеют достаточную мощность для обеспечения током не только самих контроллеров Stamp, но также и некоторых внешних устройств. Компоненты, используемые в Stamp
358 Часть 6. Контроллер Basic Stamp фирмы Parallax (микросхемы LM2946 в BS1 и S-O135 в BS2) очень легко выюрают. если внешние устройства потребляют через них слишком большой ток. Контроллер BS1 потребляет от 1 мА до 2 мА тока, позволяя регулятору напряжения издавать излишки тока внешним устройствам при следующих входных напряжениях. Входное напряжение Излишек тока 5 - 9 В 50 мА 10 - 15 В 25 мА 16-25 В 10 мА 25 -35 В 5 мА Более 35 В 0 мА Отбор большего тока даже на короткое время может сжечь регулятор на- пряжения. В контроллере BS2 используется более совершенный регулятор, коюрый может нормально работать при напряжениях от 5 В до 15 В и выдавать вне- шним устройствам ток 50 мА. Но величину тока все равно надо внимательно контролировать. При определении токов, отдаваемых внешним устройствам. необходимо учитывать, чго ток. потребляемый контроллером Stamp, например, для уп- равления светодиодами, должен вычитаться из значения тока, доступного для внешних устройств. Как вы дзьтее увидите, довольно часто производится замена регуляторов напряжения на плате Stamp на микросхемы 7SL05. Они могут выдавать ток до 100 мА и выключаться при его превышении. Однако должен признаться, что я очень редко использую регуляторы на- пряжения. Обычно я обхожусь без них. обеспечивая подвод напряжения пи- тания 5 В для схемы, в которую встроен Stamp, а затем подаю отдельное питание на Stamp через выводы Vdd. Эго избавляет oi необходимости опа- саться за регуляторы Stamp, особенно при отладке приложения, когда кон- такты ввода-вывода могут быть случайно закорочены с шипами питания или «земли». Запуск Как BS1 гак и BS2 имеют встроенную схему перезапуска при понижении питания. Когда напряжение питания становится ниже 4.5 В. зта схема под- ключает к «земле» линию запуска, которая «подтянута» к напряжению пита- ния через резистор с сопротивлением 4,7 К. Линии запуска контроллеров Stamp могут также подключаться к «земле» внешним драйвером с «откры- тым коллектором» («открытым» стоком) или кнопкой, которая в момент нажатия подключает линию к «земле». I Г г I I I £ ч 1 ( I } ( Е п т д т в я
глава 42 ФУНКЦИИ ЯЗЫКА PBASIC ДЛЯ STAMP Краткое содержание: Математические операторы для BS1 Математические операторы для BS2 Команды ветвления/циклов Условные ветвления Цифровой ввод-вывод Последовательный ввод-вывод Аналоговый ввод-вывод Звук Таблицы данных Обращение к памяти EEPROM Реализация задержек Управление питанием/выполнением Отладка Встроенные функции языка PBASIC для контроллеров Stamp достаточно просты для понимания. Я разбил эти функции на группы в соответствии типом выполняемых операций, чтобы было легче понять, как они взаимо- действуют с аппаратными средствами контроллера. Язык PBASIC для этих типов контроллеров имеет определенные различия, и я хочу обратить на них ваше внимание. Есть одна важная особенность, которую надо отметить в этих описаниях - я не включил в них указания на количество времени (циклов), требуемых
360 Часть 6. Контроппер Basic Stamp фирмы Parallax для выполнения команд. Это сделано потому, что оно зависит от разных факторов (разрядности данных, скорости их передачи, количества парамет- ров и т.д.), которые делают время выполнения операции непредсказуемым. По этой причине, а также из-за отсутствия внутреннего аппаратного тайме- ра, вам придется засекать вручную время, чтобы определить, как долго бу- дет выполняться программа или ее часть. В данном описании функций следует обратить внимание на следующее обстоятельство. В языке PBASIC ссылки на функции можно давать в смешан- ном виде. В приведенном ниже тексте и на страницах, поясняющих выполне- ние команд, я сознательно использовал разные способы представления, чтобы показать, что это не имеет значения. Однако, хотя способ представления не имеет значения для функций, его следует учитывать при назначении имен переменных и меток. Математические операторы для BS1 Математические операторы, используемые в языке PBASIC, аналогичны как по формату, так и по их действию с соответствующими операторами в других языках высокого уровня. Как я показано в этой главе, главное отличие зак- лючается в отсутствии приоритета операций - все они выполняются слева направо. Контроллер BSI, как и можно было ожидать, имеет меньшее количе- ство и более ограниченные по возможностям операторы. Я попытаюсь сгруп- пировать операторы вместе, что поможет объяснить их функции. В отличие от PBASIC для BS2 и большинства других языков высокого уровня, эти операторы не могут использоваться в условных выражениях опе- ратора «if» - в этом случае выдается ошибка «Expected ап Operator» («Ожи- дается оператор»). Это означает, что выражения типа: if (W1 + W2) > 77 then Greater Than не могут использоваться для BSI. Вместо этого сложение должно быть вы- полнено перед оператором «if», как показано в следующем примере: Temp = W1 + W2 ‘ Попучить значение для “if” if Temp > 77 then Greater Than Сложение (“ + ") и вычитание (“-“) выполняются, как и ожидалось, с 8- и 16-битными величинами. Прежде чем продолжить, я должен пояснить, что имел в виду, говоря, что эти операторы выполняются “как ожидалось". Луч- ший способ пояснить это — сказать, что сложение и вычитание, а также и другие операторы, выдают 16-разрядный результат (одно слово). Если прием- ник в операторе присваивания имеет разрядность 16 бит, то результат будет передан без изменений. Если приемник содержит меньше разрядов, чем сло- во, то старшие биты результата будут потеряны. Покажем это на следующем примере.
Глава 42. Функции языка PBASIC для STAMP 361 Symbol А = W2 Symbol В = В6 1 16-битовый источник ‘ 8-битовый источник Symbol DestBit = Bit3 Symbol DestByte = B7 Symbol DestWord = W4 A = $1234 В = $EF DestWord = A + В DestByte = A + В DestBit = A + В ‘ Инициализация переменных ‘ В приемнике $1323 ‘ В приемнике $23 ‘ В приемнике 1 (младший бит) Вычитание большего числа из меньшего приведет к образованию отрица- тельного числа, представленного в дополнительном коде. Если в предыду- щем примере одна из строк будет иметь вид: DestWord = В - А 1 Вычесть большее чиспо из меньшего то результатом, который помещается в DestWord, будет число $ЕЕВВ, пред- ставляющее результат в дополнительном коде. Чтобы проверить, является ли результат отрицательным числом, вы должны проверить, установлен ли в 1 старший (знаковый) бит результата. Это значит, что представляемые чис- ла находятся в диапазоне от —32768 до + 32767 или от 0 до 65535, если отрица- тельные числа не используются. Выполнение умножения с помощью операторов <•*» и «**>> довольно оче- видно - производится умножение 16-битных чисел, которое дает 32-битный результат. Выполнение одной «решетки», как я предпочитаю называть сим- вол «звездочка», позволяет получить младшее слово или 16 бит результата. Операция «двойной решетки» дает значение старших 16 бит результата. Это может быть показано на примере программы: Symbol А = W2 Symbol В = W3 Symbol С = W4 ‘ Все 16-битные Symbol Dest = W5 А = $4 В = $1234 С = $10 ‘ Некоторые величины для умножения Dest = А ‘ В Dest = А “ В Dest = В * С Dest = В ** С Dest = $48 DO Dest = $0000 Dest = $2340 Dest = $0001
362 Часть 6. Контроллер Basic Stamp фирмы Parallax Обработка отрицательных чисел при умножении оказывается более слож- ной. Например: Symbol А = В2 ‘ Это 8-битная переменная Symbol В = W2 ‘ Остальные 16-битные Symbol С = W3 Symbol Dest = W4 А = -5 ‘ Установка значений тестовых переменных В = -5 С = 7 Dest = А * С ‘ Результат равен $0699 Dest = В * С ‘ Результат равен $FFDD Этот неправильный результат возникает из-за того, что PBASIC для Stamp не распознает отрицательные числа, как и почти все другие языки высокого уровня для 8-разрядных микроконтроллеров. Чтобы получить правильный ответ (SFFDD), строку Dest = А * С надо поменять на: Dest = А & $80 ‘ Получить бит 7, чтобы посмотреть, ‘ является ли число отрицательным if Dest <> 0 then NegSkip ‘ Если отрицательное, то работаем ‘ как с отрицательным Dest = А * С ‘ Иначе положительное goto MulSkip NegSkip: ‘ Попучен отрицательный результат Dest = А - 1 Л $FF * С Л $FFFF + 1 MulSkip: При переходе к метке NegSkip переменная А преобразуется в положи- тельное число, умножается на С, а затем затем преобразуется в 16-битное отрицательное число в дополнительном коде. Причиной использования опе- ратора «if» является необходимость обрабатывать как отрицательные, так и положительные числа. Этот код учитывает, является ли число А отрицатель- ным или положительным. Но код не изменяется, если С будет отрицатель- ным числом, так как С представлено в виде полного слова. В предыдущей главе я упоминал, что вставляю отладочный оператор «debug» после каждого сложного присваивания, которое выполняется в PBASIC. Присваивание: Dest = А - 1 Л $FF * С Л $FFFF +1
Глава 42. Функции языка PBASIC для STAMP 363 квалифицируется как сложное, и. когда я писал этот раздел, то отлаживал этот фрагмент программы, используя BS1 и многократно выполняя коман- ду отладки. Операция деления (“/") следует за умножением, но отличается от нею тем. что делимое и делитель могут иметь максимум 16 бит. Деление отрицатель- ных чисел требует использования следующего кода на PBASIC. ActDividend = Dividend Quotient = ActDividend & MSBDividend: if Quotient = 0 then DividendDone ActDividend = - Dividend DividendDone: ActDivisor = Divisor Quotient = ActDivisor & MSBDivisor if Quotient = 0 then DiviSorDone ActDivisor = -Divisor DivisorDone: Quotient = ActDividend / ActDivisor if Divisor > 0 AND Dividend > 0 OR then DivideDone Quotient = -Quotient DivideDone: Старший бит = О, +Dividend Убедиться, что используемое делимое > О 'Старший бит=0, +Divisor ' Убедиться, что испопьзуемый ‘ депитепь > О ‘ Получить действительное ‘ значение Divisor < О AND Dividend < О Частное имеет правильное значение В этой программе содержится больше сложностей, чем хотелось бы. Во- обще, следует, по возможности, избегать деления отрицательных чисел. Наличие оператора вычисления остатка («//») является хорошим свой- ством языка PBASIC. В большинстве языков, чтобы получить целочисленный остаток от деления, необходимо использовать следующий алгоритм: modulo = Dividend - ((Dividend / Divisor) * Divisor) Этот алгоритм «обманывает» компилятор, заставляя его выполнять це- лочисленное деление, при котором теряется остаток или дробная часть ча- стного. Умножение этого значения на делитель восстановит делимое минус остаток, который можег быть найден вычитанием этой величины из перво- начального делимого. Следует заметить, что в некоторых компиляторах приведенное выше вы- ражение будет оптимизировано и представлено в следующем виде: modulo = О Это происходит потому, что компилятор воспринимает результат опера- ции «/Divisor * Divisor» как I. и значение делимого Dividend не будет изме- няться. Поэтому результатом вычитания двух одинаковых величин будет ноль.
364 Часть 6. Контроллер Basic Stamp фирмы Parallax Это значит, что для вычисления остатка необходимо использовать другой способ, но в языке PBASIC это можно сделать простым использованием оператора «//». Операторы «Min» и «Мах», которые не используют никаких специальных символов и просто представляются как метки, выделяют, соответственно, минимальное или максимальное из представленных значений, например: Dest = 5 max 7 ‘ Dest = 7 Как и в предыдущих операциях, отрицательные числа должны рассматри- ваться отдельно. Так как реально PBASIC не воспринимает отрицательные числа, они будут обрабатываться как числа, у которых старший бит установ- лен в 1, что заставит PBASIC думать, что в данный момент проверяется большое положительное число. В этом случае результат операции не будет соответствовать ожидаемому. Последними в PBASIC для BS1 являются битовые операторы: AN D («&»), OR («|») и XOR (« Л »). В литературе по BS1 эти операторы определяются как «логические». Операторы AND и OR обеспечивают выполнение логических операций И и ИЛИ в выражениях, используемых операторм «if». Как и опе- раторы сравнения («=», «>», и другие), данные операторы не могут исполь- зоваться в операциях присваивания языка PBASIC для BS1. Односимвольные версии этих операторов «&» и «|» выполняют битовые операции над отдельными битами двух операндов. Как показано выше, если вы хотите выделить бит 7 и сохранить его для дальнейшего использования, например, для проверки, является ли число отрицательным, то можно ис- пользовать следующее выражение: Dest = А & $80 ‘ Выделить бит 7 Эти битовые операции выполняются так же, как аналогичные операции в микроконтроллерах. Математические операторы для BS2 Многие понятия из тех, которые мы только что обсудили для BS1, приме- нимы и для контроллера BS2, но для BS2 существует еще много дополни- тельных математических операторов. В этом подразделе я дам описание тех операторов, которые реализуются только для BS2. Одно из первых различий, на которое следует обратить внимание, состо- ит в том, как определяются параметры для различных функций. Для кон- троллеров BS2 каждый параметр является величиной, которая может быть получена с использованием математических операторов. Это делает процесс получения параметров более простым и логичным. Как и в BS1, логические операторы, такие как «=», «>», «AND» и другие, не могут использоваться в каких-либо выражениях, кроме оператора «if».
Глава 42. Функции языка PBASIC для STAMP 365 Оператор Описание SQR Квадратный корень беззнаковой величины - Преобразование 16-битового числа в дополнительный код Инверсия битов 16-битового числа ABS Абсолютное значение16-битового числа DCD Декодирование 4-битового числа в 16-битовое NCD Приоритетное кодирование 16-битового числа SIN Синус 8-битового числа COS Косинус 8-битового числа Первая группа операторов — унарные операторы BS2. Эти операторы име- ют приоритет над всеми другими математическими операциями. Этот при- оритет означает, что только один операнд, расположенный справа от унар- ного оператора, будет использоваться унарной операцией. Например. оператор: SQR 4 + 5 даст результат 7, как и во многих других компиляторах (то есть вычисляется квадратный корень из 4 и прибавляется к 5). Много лет назад меня учили, что в сложных выражениях основные блоки должны быть заключены в скобки, чтобы не возникало путаницы по вине программиста или компилятора. Это надо делать и с унарными операторами PBASIC для BS2, чтобы быть уверенным, что при выполнении операций не возникнет какой-либо неопределенности. Поэтому данный выше пример я бы предпочел записать в виде: SQR(4) + 5 В такой записи унарный оператор выглядит как функция, зато порядок вычисления выражения выглядит более очевидным. Действительно, с боль- шинством унарных операторов я обращаюсь, как с функциями, выделяя входной параметр скобками. В инженерной математике (если бы я назвал ее «чистой» математикой, то уверен, что кто-нибудь был бы недоволен) вычисление квадратного кор- ня из отрицательного числа приведет к комплексному результату, где ис- пользуются мнимые числа <4» или «j». В контроллерах BS2 отрицательное число в дополнительном коде обрабатывается оператором SQR. как обычное 16- битное число, и результатом будет квадратный корень из этого числа. A var nib В var byte С var word D var word
366 Часть 6. Контроппер Basic Stamp фирмы Parallax Dest var word A = -4 В = -4 С = -4 D = 4 ‘ Реапьно $C ' Реапьно $FC ‘ Реапьно $FFFC ‘ Реапьно $0004 Dest = SQR(A) Dest = SQR(B) Dest = SQR(C) Dest = SQR(D) ‘ Dest = SQR($C) = 3 ' Dest = SQR($FC) = 15 ‘ Dest = SQR($FFFC) = 255 ‘ Dest = SQR($0004) = 2 Итак, вы убедились, что для получения правильного значения квадрат- ного корня необходимо, чтобы с оператором SQR использовались только положительные числа. Я слегка удивлен, что так как он присутствует изменить знак параметра: «-» в BS2 рассматривается как унарный оператор, и в PBASIC для BS1 и указывает на то, что надо В = -А При этом 16-битовое число А преобразуется в дополнительный код и за- писывается в В. Если вы вернетесь к описанию работы контроллера BS1, то увидите, что действия над 4- или 8-битовыми отрицательными числами в 16-битовых опе- рациях приводят к несколько странным результатам. Рассмотрим пример: A var byte В var word ‘ Опредепить переменные Dest var word А = -5 В = 7 ‘ Инициализировать переменные Dest = А + В Dest = А Dest = -А ‘ Dest = $102 ‘ Dest = $FB ‘ Dest = $FF05 Обратите внимание, что оператор «-» не может использоваться для пре- образования переменной А в положительную величину, которая даст пра- вильный результат при сложении с переменной В. Вместо этого, чтобы по- лучить правильное значение суммы «А + В» (ожидаемый результат равен 2) выражение должно быть записано в виде: Dest = -((А Л $FF) +1) + В Оператор <'» реализует операцию Исключающее ИЛИ (XOR) с 16-бит- ными числами. Математическая запись выглядит так: ~А = А Л $FFFF
Глава 42. Функции языка PBASIC для STAMP 367 Я использую данную операцию не очень часто просто потому, что этот символ иногда трудно распознать — его можно легко спутать с символом изменения знака числа «-». При этом если переменная А определена как байт (как и данном выше примере), то результат будет 16-битовым, а не 8-бито- вым, как ожидалось. Оператор получения абсолютного значения «ABS» определяет модуль 16- битного числа. Важно заметить, что он воспринимает именно 16-битные числа. Если в примере с вычислением квадратных корней использовать оператор «ABS», то мы получим следующие результаты: A var nib В var byte С var word D var word Dest var word A = -4 ‘ Реально $C В = -4 ‘ Реально $FC C = -4 ‘ Реально $FFFC D = 4 ‘ Реально $0004 Dest = ABS(A) ‘ Dest = ABS($C) = $C Dest = ABS(B) ‘ Dest = ABS($FC) = $FC Dest = ABS(C) ‘ Dest = ABS($FFFC) = 4 Dest = ABS(D) ‘ Dest = ABS($0004) = 4 Как все 16-битные операторы, ABS не будет давать правильный резуль- тат, если используемые операнды имеют не 16 разрядов. Операторы кодирования и декодирования «NCD» и «DCD» могут исполь- зоваться как функции мультиплексирования — демультиплексирования. Опе- ратор NCD выдает номер старшего единичного бита в 16-битном слове, уве- личенный на 1, или выдает 0, если ни один бит этого слова не установлен в 1. Это немного отличается от того, что говорится в документации для BS2, но правильность данного описания операции может быть легко проверено эмпирически при помощи кода: A var word Dest var word A = 1234 ‘ Некоторая произвольная величина Dest = NCD(A) ' Dest = 11 (самый старший бит) Значение числа А можно изменять, чтобы посмотреть, что произойдет при других его значениях. Функцию «DCD» можно рассматривать как оператор, вычисляющий сте- пень числа два:
368 Часть 6. Контроллер Basic Stamp фирмы Parallax A var word Dest var word A = 4 Dest = DCD(A) ‘ Dest = 16 = (2 Л 4) Вычисление степени двойки можно использовать для выполнения функ- ции демультиплексора, выдающего в каждый момент времени сигнал управ- ления для одной из схем. Двумя последними унарными операторами являются тригонометричес- кие функции «синус» и «косинус» — «SIN» и «COS», соответственно. Эти функции, которые, по-моему, не следует называть «операторами», выдают 8-битовое число от —127 до 127, которое является значением соответствую- щей тригонометрической величины для окружности с 256 точками, имею- щей радиус 127 единиц (рис. 42.1). Рис. 42.1. Окружность для вычисления синуса и косинуса в Stamp Каждый квадрант окружности разбит на 64 условных «градуса» вместо 90 обычных угловых градусов. Выходная величина (реальное тригонометричес- кое значение) может быть вычислена как 1/127 от полученного результата. Ниже в этом разделе я покажу, как вычислять дроби с помощью BS2. Реализация операции «дробного умножения» («*/») является очень инте- ресным свойством языка PBASIC для BS2. При умножении двух 16-битных чисел результат может содержать до 32-х значащих разрядов. Оператор «*/» выделяет два средних байта результата, игнорируя старший и младший бай- ты. Это делает его очень полезным для нахождения дробных значений. Предположим, у вас есть стержень длиной 36 дюйма, который закреплен под углом 50 градусов. Высота конца стержня может быть найдена по формуле: Высота = Длина Стержня * Sin(Yron) = 36 * Sin(50) дюймов
Глава 42. Функции языка PBASIC для STAMP 369 На язык PBASIC для BS2 это может быть переведено в следующем виде: Height = (Stick_Length * 2 * sin((Angle * 64) / 90)) 71 Вычисление выражения «(Angle * 64) / 90» выполняется для того, чтобы получить правильное значение угла в 256-градусном круге, используемом PBASIC (рис. 42.1). Каждый угол отличается от стандартного в 64/90 раза. По- местив «Angle» и 64 в общие скобки, я гарантирую, что полученное произве- дение будет больше 90, и в результате вычисления будет получено правиль- ное значение угла. Синус угла умножается на два, так что эффективный радиус окружности равен 256, а не 127, как предполагается по умолчанию ;ыя этой функции. После этого остается только выполнить дробное умножение на 1 для получения результата, который дает правильное значение 27 дюймов. Максимальное значение синуса равно 256 (фактически 254, при этом ошибка составит менее 1% при любых условиях), поэтому я использую опе- ратор «*/», чтобы получить 32-битный результат и преобразовать его в 16- битный с отброшенной дробной частью (первые 8 бит). Эту операцию можно также выполнить с использованием операторов би- товых сдвигов («<<» ;пя сдвига влево и «>>» для сдвига вправо). Тетр = (36 ” Sin((Angle * 64) / 90)) « 9 Height = (36 * Sin((Angle * 64) / 90)) » 7 Height = Height + Temp В этом примере 16 бит, задающих высоту, сдвигаются на 9 бит влево (или умножаются на 512), а затем младшая часть результата сдвигается вправо на 7 бит (делится на 128), чтобы получить произведение длины палки на синус угла для окружности, радиус которой равен 128 / (2 Л 7) = 1. В приведенном выше примере операторы сдвига могут использоваться для сдвига 16-разрядных половин 32-разрядного результата, чтобы получить зна- чение в определенной точке (т.е. для отбрасывания дробной части) или для сдвига данных при тестировании битов. Например, если вы хотите найти стар- ший бит в байте, не используя оператор «NCD». то можно использовать код: A var byte Bit var byte A = Something Bit = 7 Некоторое значение для проверки Loop: ‘ Цикл, пока старший бит не будет ‘ установлен в 1 if((A & $80) о 0) OR (В = 0) then Stop А = А « 1 Сдвиг впево переменной А Bit = Bit - 1 24 Зак. 2025.
370 Часть 6. Контроллер Basic Stamp фирмы Parallax goto Loop Stop: ‘ Получить бит или проверить их все При каждом проходе цикла число сдвигается влево на один разряд, поме- щая более младший бит на место бита 7. который тестируется. Производится также декремент счетчика битов. Оператор «Stop» выполняется, когда уста- новлен в 1 бит 7 переменной А или проверено значение каждого бита числа. Оператор «DIG» полезен для получения определенного разряда десятич- ною числа. Возможным применением данного оператора может быть вывод числа на семисегментный индикатор: А = 1234 ‘ Определим число для вывода Digit = 2 ‘ Хотим вывести «3» или второй разряд Lookup A Dig Digit, [PatO, Pat1, ... Pat9], Pat После команды «Lookup» оператор «Pat» будет содержать битовый шаб- лон, необходимый для вывода указанного разряда на жидкокристаллический экран. Последним унарным оператором для BS2 является «REV», который ме- няет порядок битов для определенного количества битов. А = %10010110 В = A Rev 8 ‘ В = %01101001 Этот оператор полезен в тех случаях, когда вы по ошибке сделали разводку вашей схемы с обратным порядком выводов. Я бы не стал относиться к этому случаю несерьезно, так как сам несколько раз неправильно разводил схему- преобразователя последовательного интерфейса в параллельный, и хотел бы. чтобы у меня был такой оператор вместо того, чтобы писать его самому при отладке программы. Данный оператор можно также использовать при работе с несколькими устройствами, подключенными к внешней шине, одни из кото- рых требуют, чтобы сначала шел младший биг. а другие - старший бит. Вее сказанное здесь и в предыдущем разделе представляет собой доста- точно полное описание того, как контроллеры Stamp обрабатывают дан- ные в операциях присваивания и функциях. Хотя, несомненно, можно пи- сать программы для Stamp и без детального изучения его команд, я настоятельно рекомендую внимательно прочитать то. что здесь написано, и потренироваться сначала на примерах, прежде чем писать приложения, ис- пользующие сложные операции. Команды ветвления/циклов Теперь, когда вы понимаете, как работают математические операторы, мы можем начать обсуждение встроенных функций языка PBASIC. Первой функцией PBASIC, которую стоит обсудить, является безуслов- ный переход «goto label» (команда 42.1). выполняемый контроллерами BS1 и BS2. Используемая метка должна начинаться с первой позиции в строке кода
Глава 42. Функции языка PBASIC для STAMP 371 и заканчиваться двоеточием («:»). Чтобы зрительно отделить код и метки, а также следуя соглашениям, принятых для других языков, я помешаю осталь- ную часть программы с некоторым отступом, а не с первого символа строки, хотя программа будет нормально выполняться и при размещении с первого символа. Вызов подпрограмм в BS! с помощью команды «Gosub» (команда 42.2) изменяет содержимое W6. после чего выполняется переход на указан- ную метку. Как было сказано ранее. W6 не должен использоваться для каких- либо других целей, а подпрограмма не может быть вызвана из других под- программ. В программе на PBASIC для BS! может быть только 16 операторов «gosub». При чтении документации фирмы Parallax вас может заинтересовать, можно ли команду «return» в PBASIC для BS! использовать для реализации «вычис- ляемого перехода»: W6 = Label ‘ Получить адрес для перехода return Label: Данная программа не будет работать, так как в W6 не загружается адрес возврата из подпрограммы. Гораздо лучшим способом обеспечения вычисля- емых переходов является использование команды ветвления «Branch», опи- санной в следующем разделе. Выполнение операторов «gosub» и «return» (команды 42.4 и 42.5, соответ- ственно) в BS2 больше похоже на реализацию аналогичных команд в «тра- диционных» языках высокого уровня. Адрес возврата помещается в стек про- граммного счетчика и не доступен для выполняющейся программы. Код операции: Не определено Команда: “Goto” > Изменение содержимого PC Выполнение: PC <- Label Пример: goto Label Label Комментарии: Метка «Label текста на языке PBASIC Команда 42.1. Команда BS1/BS2 Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 может находиться в любом месте исходного “goto label".
372 Часть 6. Контроллер Basic Stamp фирмы Parallax Код операции: Не определено Команда: “Gosub” Сохранение содержимого ► РС ------> Изменение содержимого РС Выполнение: Сохраняемое содержимое Пример: <- Label gosub Label PC <- PC Число командных циклов: Не определено Микроконтроллеры: BS1 Label return Комментарии: В исходном коде на PBASIC может находиться максимум 16 команд «gosub». Адрес возврата НЕ сохраняется в W6. Команда 42.2. Команда BS1 «gosub label». Код операции: Не определено Команда: “Return” Восстановление содержимо- го РС Выполнение: РС <- Сохраняемое содержимое РС Пример: gosub Label Число командных циклов: Не определено Микроконтроллеры: BS1 Label: return Команда 42.3. Команда BS1 «return».
Глава 42. Функции языка PBASIC для STAMP 373 Код операции: Не опредепено Команда: Gosub . Сохранение содержимого РС Изменение содержимого РС Выполнение: Стек <— Следующая команда Пример: <- Label gosub Label Число командных циклов: Не опредепено Микроконтроллеры: BS2 Label return Комментарии: В исходном тексте можно использовать до 255 команд «gosub». Уровень вложенности подпрограмм - до 4-х. Команда 42.4. Команда BS2 "gosub label». Код операции: Не определено Команда: Return Выполнение: РС <- Стек Пример: gosub Label Восстановление содержимо- го РС Число командных циклов: Не определено Микроконтроллеры: BS2 Label: return Команда 42.5. Команда BS2 «return».
374 Часть 6. Контроллер Basic Stamp фирмы Parallax Условные ветвления Условное выполнение программ является одной из определяющих особен- ностей архитектуры процессоров. Язык PBASIC имеет ряд функций, которые служат для управления последовательностью выполнения программы. Функция «if then» является фундаментальной для всех я зыков высокого уровня (команда 42.6). В отличие от многих других языков оператор «if» в языке PBASIC реализует переход, если выполняется заданное условие. Это может вызвать недоразумение, если вы ранее использовали языки структур- ного программирования, где при выполнении условия реализуется следую- щая команда. В PBASIC при выполнении условия осуществляется переход в программе, то есть используется инверсная логика. Например, на языке С можно записать следующее предложение: if ( А > В ) i = i + 1 В PBASIC эта операция может быть выполнена так: if А <= В then Skip i = i + 1 Skip: Как BSI так и BS2 имеют возможность обработки составных условий в операторе «if», используя операторы «AND», «OR», а для BS2 и оператор «NOT». Это позволяет использовать более сложные условия для оператора «if». В контроллерах Stamp эти выражения имеют более высокий приоритет, чем операции сравнения (то есть они выполняются после операций сравне- ния), тогда как в BSI они имеют тот же уровень приоритета. В предыдущем примере, если величина «i» должна быть увеличена, когда «А» будет больше, чем «В» AND «С» равно «D», его следует записать как: if А <= В OR С <> D then Skip i = i + 1 Skip: Обратите внимание, что логика в данном выражении инвертирована от- носительно того, как это было бы записано на языке структурного програм- мирования. Очень полезной программной конструкцией является оператор никла «for» (команда 42.7). Он используется для выполнения кода заданное число раз. Например, код для BS2: debug str “%” for i = 0 to 8 debug dec (Data & $80) » 7 Data = Data « 1 next
Глава 42. Функции языка PBASIC для STAMP 375 представит «Data» в виде 8-разрядного двоичного числа. Оператор «next» оп- ределяет конец оператора «Гог» и возвращает выполнение программы к нача- лу соответствующего никла «for». В контроллере BS1 можно использовать до 8, а в BS2 — до 16 вложенных операторов «for». Как показано на рисунке (см. команда 42.7). существует также параметр «step», который используется, чтобы задать величину инкремента. Эта вели- чина может быть любым положительным или отрицательным числом. На- пример. если вы хотите вывести сообщение, выполняющее обратный от- счет, можно использовать код. приведенный ниже: debug str “Counting down...", cr for i = 10 to 0 step -1 pause 1000 ' Задержка в 1c между сообщениями debug dec i, cr next debug str “Liftoff!!, cr Использование параметра «step» может привести к некоторым пробле- мам в случае, когда переменная в счетчике циклов никогда не достигает конечного значения. Примером этого является код: for i = 0 to 3 step 2 “ Что-нибудь делаем next Выполнение этого цикла никогда не прекратится, так как значение «)» никогда не станет равным 3. если начинать считать от 0 с шагом 2. Обычно значение переменной в счетчике циклов никогда не модифици- руется. Но если ее установить в конечное значение минус один шаг (так как оператор «next» прибавит к пей шаг «step» перед проверкой условия), то вы обеспечите выход из цикла. В следующем примере проверка того, что выпол- нение цикл;) перескочило заданное место прекращения (то есть значение <4» в приведенном выше коде стало больше трех), может быть легко вставлена таким образом: for i = 0 to 3 step 2 ‘ Что-нибудь депаем if i < 3 then Skip ‘ Проверка на правильность “i” i = 3 - 2 Skip: next Последней условно выполняемой функцией является ветвление «Branch» (команда 42.8). Эта функция позволяет программе перейти на мет- ку, заданную с помощью смещения. Данная команда позволяет легко реали- зовывать программные конечные автоматы. Классическим примером явля- ется управление светофорами. В этом примере контроллер Stamp управляет тремя светодиодами для каждого из двух направлений - север-юг (N/S) и восток-запад (Е/W). Всего используется тесть светодиодов, которые струп-
376 Часть 6. Контроппер Basic Stamp фирмы Parallax пированы в два дисплея (N/S и Е/W), каждый из которых содержит крас- ный, желтый и зеленый светодиоды. Имеется пять возможных состояний этих дисплеев: 1. Оба дисплея красные. 2. N/S желтый и Е/W красный. 3. N/S зеленый и Е/W красный. 4. Е/W желтый и N/S красный. 5. Е/W зеленый и N/S красный. Для управления светодиодами дисплея N/S используются три младшие бита, для управления дисплеем E/W — три старших бита. В программе я буду использовать всего две 8-разрядные переменные для реализации необходи- мого изменения состояний светофоров. Программа управления светофором Symbol NSRed = pinO Symbol NSYel = pin! ‘ Определение цветов Symbol NSGrn = pin2 Symbol EWRed = pin3 Symbol EWYel = pin4 Symbol EWGrn = pin5 Symbol State = bO Symbol Direct = Ы ‘ Переменная состояния ‘ Текущее «включенное» направление State = 0 Direct = 0 ' В начале оба дисплея дают красный цвет ‘ Направление N/S будет обслуживаться ‘ первым Loop: ‘ Возврат в эту точку для изменения цвета branch State, (Statel, State2, State3) Statel: pins = 0 NSRed = 1 EWRed = 1 ‘ Выключить все светодиоды ‘ Включить красные светодиоды pause 2000 ‘ Оба красные на две секунды State = State + 1 ‘ Перейти в следующее состояние goto Loop State2: ‘ Включить зеленый свет на 30 секунд If Direct=0 then State2NS ' Обработка условия для N/S
Глава 42. Функции языка PBASIC для STAMP 377 EWRed = О EWGrn = 1 goto State2Skip State2NS: NSRed = 0 NSGrn = 1 State2Skip: Pause 30000 ‘ Оставить зепеный свет на 30 секунд State = State + 1 State3: ‘ Включить жептые светодиоды if Direct = 0 then State3NS EWGrn = 0 EWYel = 1 goto State3Skip State3NS: NSGrn = 0 NSYel = 1 State3Skip: Pause 5000 ‘ Задержка желтого на пять секунд State = 0 Direct = Direct Л1 ‘ Сбросить состояние ‘ Поменять направление goto State 1 ‘ Запустить все снова Рассматривая эту программу, вы, возможно, подумаете — чго здесь осо- бенного9 На этом простом примере показано, как выполняется формули- ровка задачи и вводятся дополнительные улучшения. Вы, вероятно, могли бы довольно легко написать линейный вариант этой прикладной программы и сэкономить, таким образом, несколько байт в памяти EEPROM. Но в этом случае как вы смогли бы добавить проверку нажатия кнопки, если кто-ни- будь запросил бы изменение цвета? В обычной программе это было бы до- вольно трудно и потребовало большого числа изменений. В приведенном выше конечном автомате подпрограммы, определяющие его состояние, можно легко изменять. При этом изменение для одного направления будет влиять на оба направления. Функция «Branch» упрощает также реализацию нескольких операторов «if», когда она используется вместе с командой «lookdown», описанной ниже в разделе «Таблицы данных» этой главы.
378 Часть 6. Контроллер Basic Stamp фирмы Parallax Код операции: He определено Команда: "if Cond then label» Чтение условия -----—► Новое содержимое PC Выполнение: If Cond ! < О Пример: Label if А > В then Label ‘ Conditional Code Label Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Комментарии: Для вычисления условия используются логические операции «AND», «ОН», «NOT» и «XOR» (последние две - только с BS2). Команда 42.6. Команда BS1/BS2 «if Cond then label» Код операции: He определено Команда: «for Var = Start to End» Start Выполнение: * Изменение содержимого PC > Чтение и изменение пере- менной «Var» Var = Loop if Var == End then End Var = goto Loop End Var + Step ' ’’next' Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Пример: For i = О Code next Комментарии: Параметр «step» используется для указания величины инкре- мента переменной «Var» при каждом проходе цикла Команда 42.7. Команда BS1/BS2 «for Var = Start to End» to step 21
Глава 42. Функции языка PBASIC для STAMP 379 Код операции: Не опредепено Команда: «branch var, (label, ...)>> Выполнение: PC <- LabelTable[Var] > Переменная Новое содержимое РС Пример: Branch i, (Label 1, Label2) Label 1: Label2: Число командных циклов: He опредепено Микроконтроллеры: BS1/BS2 Команда 42.8. Команда BS1/BS2 «branch var, (label, ...)» Цифровой ввод-вывод Цифровой параллельный ввод-вывод в Stamp производится также как в дру- гих микроконтроллерах. Первый метод, который я использовал для чтения и записи сигналов с линий ввода-вывода с помощью PBASIC — это прямая запись в регистры, связанные с этими линиями. Но в PBASIC есть ряд функ- ций, которые можно использовать для того, чтобы непосредственно обра- щаться к линиям ввода-вывода. Как я объяснял раньше в этом разделе, в обоих типах контроллеров Stamp состояние линий ввода-вывода отображается в первых регистрах (перемен- ных), которые находятся в адресном пространстве данных Stamp. В контроллере BSI, который имеет 8 линий ввода-вывода, первый байт ВО указывает значение данных на этих линиях, а второй байт В! определяет направление их передачи (в Р1С аналогичный регистр называется TR1S). Как в BS1, так и в BS2 биты «Dir», определяющие направление передачи дан- ных, инвертированы по отношению к тому, как это принято для битов в регистре TR1S микроконтроллера PICMicro. В контроллерах Stamp, если бит регистра направления сброшен в 0, то данный внешний вывод является входом данных, что соответствует тому, что бит TR1S в PICMicro установ- лен в 1. В контроллере BS2 первые три 16-битных слова отражают состояние 16 линий ввода-вывода. Слово W0 используется для чтения текущего состояния линий, слово W1 содержит значение выводимых на линию данных, которое, как указано в описании линий ввода-вывода PICMicro, может отличаться от W0. Слово W2 является содержимым регистра TRIS, определяющего направ- ление передачи данных по линиям ввода-вывода.
380 Часть 6. Контроллер Basic Stamp фирмы Parallax В контроллерах BSIh BS2 все линии ввода-вывода при включении лита- ния или запуске устанавливаются в режим ввода данных (это следовало ожи- дать, исходя из поведения PlCMicro и других микроконтроллеров, рассмот- ренных в этой книге). В случае если вы разработали схему, в которой 6 младших линий (битов) ввода-вывода контроллера BS1 используются в качестве вы- ходов, то наиболее простым способом установки их режима функционирова- ния является загрузка соответствующего слова направления W2: Dir = %00111111 ' Установить 6 младших бит на вывод Можно также использовать функцию «Output», которая устанавливает режим работы отдельных выводов контроллера в качестве линий вывода дан- ных: output О output 1 output 5 Кроме функции «output» в PBASIC есть также функции «input» и «reverse» (команды 42.9, 42. Ю и 42.11). Функция «Input» устанавливает отдельные ли- нии в режим ввода данных, а функция «reverse» меняет для соответствующих линий режим ввода на вывод и наоборот. Чтение и запись данных через линии ввода-вывода (внешние выводы) выполняется точно также, как и управление направлением передачи данных. Вместо непосредственного чтения или записи в регистры можно использо- вать функции «low», «high» и «toggle» (команды 42.12, 42.13 и 42.14) для дос- тупа к отдельным битам. Как правило, при программировании вместо использования этих функ- ций я выполняю прямое обращение к регистрам ввода-вывода. Однако я так- же написал несколько прикладных программ, где использовались только эти функции. В идеале надо соблюдать баланс между обращением к регистрам ввода-вывода и использованием для передачи данных описанных выше бито- вых функций. Рассмотрим, например, следующую подпрограмму для вывода данных на ЖКИ и 4-разрядном режиме, где данные выдаются на 4 младшие линии вво- да-вывода. SendChar ‘ Вывести символ в «OutChar» на ЖКИ Pins = OutChar /16 ‘ Начать со старших 4-х бит High RS ‘ RS = 1 для записи символа Pulsout Е, 1 ' Импульс “Е” на 2 - 10 мкс Pins = OutChar //16 ‘ Повторить последовательность для ' младших 4-х бит High RS Pulsout Е, 1 return ‘ Возврат к месту вызова
Глава 42. Функции языка PBASIC для STAMP 381 На первый взгляд в этой программе действительно соблюдается хороший баланс между записью в регистры и обращением к линиям порта ввода-вы- вода. Но здесь можно столкнуться с одной неприятностью: приведенный выше код не позволяет портам ввода-вывода управлять другими внешними устрой- ствами, так как при записи 4-х младших бит переменной «Pins» одновремен- но производится непредусмотренная запись в 4 старших бита. В реальном при- ложении запись в порт «Pins» надо выполнять так: Pins = Pins $ $F0 ' Очистить младшие 4 бита Pins = OutChar / 16 I Pins ' Записать соответствующие 4 бита Однако, приведенный выше код является хорошим введением для пере- хода к командам «Pulsout» и «Puisin» (команды 42.15 и 42.16). Команда «Pulsout» переключает вывод из его начального состояния в про- тивоположное на заданный промежуток времени с шагом в Юмкс для BSI и 2мкс для BS2, а затем возвращает вывод в исходное состояние. Это очень полезно для приложений, аналогичных приведенному выше, так как при этом программный код значительно упрощается. Как и при работе со многими другими времязадаюгцими функциями, я не думаю, что применение команды «Pulsout» превратит Stamp в инструмент, который можно использовать в приложениях, от которых требуется доста- точно высокая точность. Причиной этого не в том, что функция «Pulsout» выполняется с недостаточной точностью, а в гом, что время выполнения остальной части программы трудно определить достаточно точно. Обычно выходной импульс посылается в соответствии с рядом других сигналов, од- нако выдачу импульса нельзя точно синхронизировать с этими сигналами. Команда «Puisin» используется для итмерения длительности импульса (в мкс), поступающего на входной контакт. Если импульс не будет получен в течение заданного интервала времени ожидания, равного 65535 шагам тай- мера, то выполнение функции прекращается, и в качестве длительности импульса выдается 0. При выполнении функций «Puisin» и «Pulsout» временной интервал (шаг из- мерения) для BSI и BS2 различается. Для BSI его значение равно Юмкс, а для BS2 — 2мкс. Различие в этих значениях влияет на максимальную длительность импульса, а также на длительность времени отключения для функции «Puisin». Как я уже писал в этой книге (и, возможно, отпугнул вас этим от попытки реализовать свою собственную функцию), устранение дребезга кнопки может быть очень утомительным занятием. Чтобы упростить его, разработчики PBASIC предложили функцию «button», которая ожидает, пока закончится дребезг контактов после нажатия кнопки, исполняя программу в фоновом режиме. Параметры для устранения дребезга при нажатии кнопки влияют на выпол- нение программы. Реализация функции «button» гораздо сложнее, чем других встроенных функций, и мне пришлось провести некоторое время, разбираясь с ней (команда 42.17). Не огорчайтесь, если при первом знакомстве с функци- ей «button» вы не поймете, как она работает. Я советую провести с ней некото- рые эксперименты, а также разобраться с тем. как она описана в руководстве по контроллерам Stamp и представлена в приложениях.
382 Часть 6. Контроллер Basic Stamp фирмы Parallax Основная процедура, которая при этом исполыушся — это подсчет того, сколько раз производился вызов функции «button». Этот подсчет затем ис- пользуется для определения того, прекратился ли дребезг или надо произве- сти автоматическое повторение функции. Это значит, что функция ‘"button” должна быть помещена в цикл опроса с определенной задержкой. ЬО = 0 ‘ Сброс таймера Button Loop button 0, 0, 10, 125, ЬО, 1, Press ' Ждать, пока кнопка на ‘ выводе 0 не будет нажата ‘ в течении 20 мс goto Loop Press ‘ Кнопка нажата В этом примере цикл выполняется 20 раз при нажатой кнопке (низкий уровень потенциала на выводе 0), пока не прои зойдег переход на мечку Press. Чтобы оценить время выполнения этого кода, я предположил, что выполне- ние каждого оператора занимает 1мс. При гаком предположении каждое вы- полнение цикла «Loop» занимает 2 мс, и для того, чтобы дребезга кнопки не было is течение 20мс, функцию Button надо выполнить 10 раз (третий параметр функции «button»). Первые два параметра функции указывают номер вывода («Pin») и его ак- тивное состояние («Downstate» — состояние, когда кнопка нажата). В приве- денном выше примере использовался вывод 0. на котором в нормальном состоянии установлен высокий уровень потенциала (вывод «подтянут» к на- пряжению питания через резистор), а при нажатии кнопки линия под- ключается к «земле». Третий параметр функции — это «задержка» («delay»), и хотя вам. наверное, было бы удобнее, чтобы он задавался is единицах времени, в PBASIC он измеряется совсем по-другому. Как упоминалось выше, он указывается в виде количества вызовов функции «button». Косвенным образом эпи параметр определяет количество повторений кода, реализующею данную функцию. Необходимо иметь в виду, что есть два специальных значения этого парамет- ра. Нулевое значение задержки обеспечивает считывание состояния вывода без устранения дребезга: если вывод находится в активном состоянии, то выполняется переход к метке «address». Значение задержки, равное 255. реа- лизует гарантированное устранение дребезга без автомаiического повторе- ния, хотя занимает достаточно длительное время. Следующий параметр — «интенсивность повторения» («rate») использу- ется для указания времени, измеряемого в количестве вызовов функции «button», в течение которого кнопка должна бьпь нажата, прежде чем будет зарегистрировано следующее нажатие кнопки. Это п есть функция автопов- торения. В приведенном примере я использовал для задания этого параметра число 125, так что после каждых 125 вызовов (каждый и з которых происходит раз в 2мс) происходит .переход на метку «Press». Эта задержка в 125 единиц соответствует 250 мс, другими словами, автоматическое повторение «нажа- тия» кнопки выполняется примерно четыре раза в секунду.
Глава 42. Функции языка PBASIC для STAMP 383 Параметр «bytevariable» — «байтовая переменная» — (в нашем примере «ЬО») зло 8-разрядная величина. которая задает текущее значение количества вызовов функции «button» (счетчик задержки). Перед первым вызовом функции «button», это значение надо сбросить в 0, чтобы таймер запускался с нужного начального значения. Это значение можно менять (например, чтобы перезапустить процесс или изменить интервал автоповторения), но я хотел бы предостеречь вас от этого. Однажды установив лля кнопки 8-битовое значение данного параметра, не сле- дует. затем его и вменять или выполнять с ним какие-нибудь другие действия. И з- менение этого значения может привести к непредсказуемому поведению кон- троллера Stamp - другими словами, вы можете получить неожиданное выполнение условия нажагия кнопки или не зафиксировать такое нажатие. Параметр «ожидаемое состояние» («targetstate» - шестой параметр фун- кции button) используется для указания состояния кнопки, при котором производи гея переход на заданную ветвь программы. Значение 1 данного па- раметра указывает, чго переход происходит при нажатом состоянии кнопки (при этом может послу пять сигнал «О» или «1»), а значение «О» - при нена- жатом состоянии. Обычно лля этого параметра устанавливается значение 1. но если i3i,i хотите подождать окончания нажагия кнопки (устранение дре- безга при от пускании кнопки), то можно использовать значение 0. Последний параметр («address») - «адрес» или метка кола, который дол- жен выполняться при срабатывании кнопки, го есть после устранения дре- безга ол первого нажатия кнопки или после автоповторения. В приведенном выше примере при нажатии кнопки выполнение программы переходил к метке «Press», тз противном случае продолжается выполнение никла. Можно подумать, что с учетом двух последних параметров наш пример можно было бы упростить: ЬО = 0 ' Сброс таймера Button Loop button 0, 0, 10, 125, ЬО, 0, Loop ' Ждать, пока кнопка на Press Press ‘ выводе 0 не будет нажата Но этот кол не будет работать гак. как вам хотелось. После первого вызо- ва выполнение программы будет продолжаться с метки «Press» до гех пор. пока функция «button» не будет вызвана десять раз. го есть до устранения лребе зга кнопки. Затем после однократного перехода на мет ку «Loop» про- грамма опять будет переходить на метку «Press» до гех нор. пока функция устранения дребезги «button» не выполнится 125 раз, после чего cure один раз перейдет на метку «Loop», а затем будет ждать еще 125 раз. прежде чем нерейнг па «Loop» и т.д. Таким образом, программа будет выполняться лак. будто производится нажатие нескольких тысяч кнопок, каждое из которых вызывает переход к метке «Press». Хотя на самом деле эго совсем не так. «Button» действительно очень сложная функция, и. как г сворилось выше, не надо расстраиваться. если после первого пли даже второго чтения этою раздела вы не совсем разберетесь, как опа работает. Я настоятельно реко- мендую поэкспериментировать с этой функцией до гех пор. пока вы не пой- мете, как она реали зустся.
384 Часть 6. Контроллер Basic Stamp фирмы Parallax Функция «count» позволяет контроллеру BS2 работать в качестве тахомет- ра, считая количество событий за интервал времени (команда 42.18). Функ- ция имеет три входных параметра: номер вывода, который принимает вход- ной сигнал, 16-разрядный период в миллисекундах и 16-разрядная переменная для хранения значения счетчика. Входной сигнал должен оставаться в одном состоянии (высоком или низком) по меньшей мере, 4 мкс для того, чтобы он мог быть считан. Это означает, что максимальная частота входного сигна- ла составляет 125 кГц при скважности 50%. Эта функция делает некоторые приложения весьма простыми. Например, если вы - авиамоделист хотел бы посылать на свой компьютер текущее значение скорости вращения пропеллера для регистрации, то программа могла бы быть такой: “Приложение, измеряющее скорость вращения двухлопастного “ пропеллера RPM var word ‘ Подсчет скорости пропеллера Loop count 0, 1000, RPM “Подсчет количества оборотов в секунду serout 16, 84 + $8000,0,(«Current speed is», dec RPM*60/2, cr) goto Loop В этой программе функция «count» считает количество раз, которое про- пеллер проходит перед датчиком за секунду, и помещает это число в каче- стве переменной RPM. Данные посылаются на компьютер в оборотах в ми- нуту. для чего я умножаю скорость в секунду на 60 и делю на количество лопастей в пропеллере. Команда: “Output Pin” Код операции: Не определено Дешифратог лексемы .~Т..... EEPROM АЛУ :ez Программ- ный счет- лик (ЕС) Линии Изменение содержимого TRIS ввода- вывода Регистры переменных Вход Выполнение: TRIS.Pin <- 1 Пример: Pins = 0 Output 4 Выдать «0» на линию 4 Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Команда 42.9. Команда BS1/BS2 "Output pin
Глава 42. Функции языка PBASIC для STAMP 385 Команда: “Input Pin” Код операции: Не опредепено TRIS.Pin <- О циклов: Не определено Микроконтроллеры: BS1/BS2 Выполнение: Пример: Pins = О Dirs = $FF Input 7 Все линии работают в режиме вывода данных Линия 7 является входом Команда 42.10. Команда BS1/BS2 «input pin» Код операции: Не опредепено Команда: “Reverse Pin” Выполнение: TRIS.Pin <- TRIS.PinA1 Изменение содержимого TRIS Число командных Пример: Pins = О циклов: Не определено Микроконтроллеры: BS1/BS2 Dirs = $FF ‘ Все линии работают в режиме вывода данных Reverse 7 ‘ Линия 7 является входом Команда 42.11. Команда BS1/BS2 «reverse pin» 25 Зак. 2025.
386 Часть 6. Контроллер Basic Stamp фирмы Parallax Команда: “High Pin” Код операции: Не определено Выполнение: Pin е- 1 Циклов: Не опредепено Пример: Микроконтроллеры: BS1/BS2 Pins = О Dirs = $FF ‘ Все линии работают в режиме вывода данных High 5 ‘ На линию 5 выдается «1» Команда 42.12. Команда BS1/BS2 «high pin» Команда: “Low Pin” Код операции: Не определено Pin <- 0 циклов: He определено Микроконтроллеры: BS1/BS2 Выполнение: Пример: Pins = О Dirs = $FF High 5 Low 3 Все линии работают в режиме вывода данных На линию 5 выдается «1» На линию 3 выдается «О» Команда 42.13. Команда BS1/BS2 «low pin
Глава 42. Функции языка PBASIC для STAMP 387 Команда: “Toggle Pin” Код операции: Не определено Выполнение: Pin Pin-1 Чиклов: Не определено Пример: Pins = О Dirs = $FF Toggle 5 Микроконтроллеры: BS1/BS2 Все пинии работают в режиме вывода данных На линию 5 выдается «1» Команда 42.14. Команда BS1/BS2 “toggle pin» Команда: “Pulsin Pin, state, var” Код операции: He определено Выполнение: var = О while Pin ! = State while Pin == State var = var + 1 Пример: Pulsin 4, 1, W2 debug “Pulse Width is”, W2 Число командных циклов: He опредепено Микроконтроллеры: BS1/BS2 Комментарий: Для BS1 дискретность времени равна Юмкс, для BS2 - 2мкс. Величина времени ожидания равна 65535-кратному значению дискретности Команда 42.15. Команда BS1/BS2 “pulsin pin, state, var»
388 Часть 6. Контроллер Basic Stamp фирмы Parallax Выполнение: Pin = PinA1 Dlay = 0 while Dlay < time Dlay - Dlay + 1 Pm = PinA1 Число командных циклов: He определено Микроконтроллеры: BS1/BS2 Пример: Loop Pulseout 4, Pos pause 18000 goto Loop Выход управления RC- сервомотором Переменная “Pos" - позиция сервомотора Комментарий: Для BS1 дискретность времени равна Юмкс, для BS2 - 2мкс. Команда 42.16. Команда BS1/BS2 «pulsout pin. time» Команда: “Button Pin, down, delay, rate, bytevar, target, label” Код операции: He опредепено Дэшифратор лексемы ZZfZZ EEPROM Регистры переменных ввода- вывода > Состояние линии с кнопкой ♦ Изменение содержимого РС Я Число командных циклов: Не определено Выполнение:' it pm = Target Микроконтроллеры: BS1/BS2 bytevar = bytevar + 1 if (bytevar == delay) И (bytevar == rate) PC Label else Пример: bytevar = 0 bO = 0 Loop button 0, 0, 10, 125, bO, 1, Press goto Loop Press Команда 42.17. Команда BS1/BS2 «button»
Глава 42. Функции языка PBASIC для STAMP 389 Команда: “count, pin, period, var” Код операции: Не определено Выполнение:' if Pin = Target Микроконтроллеры: BS1/BS2 bytevar = bytevar + 1 if (bytevar == delay) II (bytevar == rate) PC Label else bytevar = 0 Пример: count In5, 1000, RPS ‘ Измерить число оборотов в секунду Команда 42.18. Команда BS1/BS2 «count pin, period, var» Последовательный ввод-вывод Возможность связываться с другими устройствами является очень важной для любого компьютера. Контроллер Stamp имеет несколько встроенных функций, которые позволяют реализовать как синхронный, так и асинхрон- ный последовательный обмен. В конце этого раздела будет дан пример про- стого приложения, который покажет, как можно использовать эти команды для связи двух контроллеров Stamp. Первый способ последовательного обмена, реализуемый в контроллерах Stamp - это асинхронная передача 8-битных данных в формате 8-N-1 с по- мощью команд Serin и Serout (команды 42.19, 42.20, 42.2I и 42.22). Для контроллеров BSI скорость передачи данных (бит/с), которая опреде- ляется режимом обмена («mode» или «batidmode») указывается в символь- ной или числовой форме в соответствии с приведенной ниже таблицей. Номер Символ Скорость Обмена, б/с Serin Serout Полярность сигнала и режим вывода 0 Т2400 2400 X X Положительная, КМОП-вывод I Т1200 1200 X X Положительная, КМОП-вывод
390 Часть 6. Контроллер Basic Stamp фирмы Parallax Номер Символ Скорость Обмена, б/с Serin Serout Полярность сигнала и режим вывода 2 Т600 600 X X Положительная. К МОП-вывод 3 тзоо 300 X X Положительная, К МОП-вы вод 4 N2400 2400 X X Отрицательная, К МОП-вывод 5 N 1200 1200 X X Отрицательная. К МОП - вывод 6 N600 600 X X Отрицательная. КМОП-вывод 7 N300 300 X X Отрицательная. К МОП - вывод 8 ОТ2400 2400 X Положительная. «открытый» коллектор 9 ОТ 1200 1200 X Положительная. «открытый» коллектор 10 ОТ600 600 X Положится ьная. «открытый» коллектор И отзоо 300 X Положительная. «открытый» коллектор 12 ON 2400 2400 X Отрицательна я. «открытый» коллектор 13 ON 1200 1200 X Отрицательная. «открытый» коллектор 14 ON 600 600 X Отрицательная, «открытый» коллектор 15 ON 300 300 X Отрицательная. «открытый» коллектор Обратите внимание, что данные могут передаваться либо через выводы КМОП-типа, либо через выводы с «открытым» коллектором («открытым» стоком). Эго значит, что несколько устройств подключаются к общей линии, «подтянутой» через резистор к напряжению питания, реализуя таким обра- зом соединение, выполняющее функцию «монтажное И». При этом могут приниматься данные как положительной, гак и отрицательной полярности. Такая возможность позволяет непосредственно реализовать локальную сеть или интерфейс с уровнями RS-232. При использовании контроллера BS2 режим обмена определяет не только скорость передачи, но и режим функционирования 16-битного последова- тельного порта.
Глава 42. Функции языка PBASIC для STAMP 391 Бит (ы) Функция Комментарии 0-12 Скорость данных См. приведенную ниже формулу для вычисления скорости передачи данных 13 Размер пакета «0» — 8 бит без контроля четное!и. «1» — 7 битс кошролем четносш 14 Значение данных «0» - положительная логика. *1» — отрицательная логик;! 15 Тип (выхода Только для вывода данных («Serout»): «0» — КМОП -вывод. «1» - «открьи виз» коллектор Скоросн, перелаян данных вычисляется с помощью следующей формулы: Bits 0-12 = (10Л6 / Data Rate) - 20 Это шалит, чго можно реализовать большое количество различных ско- ростей передачи данных, вплоть до 76800 бит/с, с очень маленькой ошибкой (для 38400 бит/с погрешность составит 0,16%). Например, если вы хотите реализовать передачу 8-битных данных с отрицательной полярношью через вывод с «закрытым» коллектором со скоростью 1200 бит/с, то можно ис- пользовать следующую команду: Serout Bit, 813 + $С000, (“Watch me Transmit!”] KoHipo.iaep BS2 при выполнении команды «serout» может реализовать определенное время ожидания между передачей символов. По умолчанию очередной символ посылается сразу после передачи стоп-бита предыдущего символа, но в случае необходимости можно указать величину времени задер- жки передачи. Если вы собираетесь реализовать интерфейс RS-232, то убедитесь в нали- чии токоограничивающих резисторов, включенных на линиях Rx и Тх. кото- рые связывают Stamp и внешнее устройство. Как уже было отмечено в этой книге, простая передача строки данных от контроллера к приемнику, ис- пользующему стандарт RS-232. с помощью инвертирования уровня потен- циала + 5В может оказаться нереализуемой. Кроме асинхронной передачи, контроллер BS2 обеспечивает также воз- можность синхронной передачи (команды 42.23 и 42.24). Хотя эти функции можно использовать для взаимодействия с устройствами. реализующими протоколы SPI или Microwire, я предпочитаю рассматривать их как расшире- ние функций ввода-вывода. На рис. 42.2 показана схема, которая преобразует данные, последова- тельно поступающие на вход сдвигового регистра, в 8-разрядное число, вы- даваемое на восемь выходных линий. Я часто использую эту схему для преоб- разования последовательных данных в параллельные. На рис.42.2 не показано подключение сигнала к линии разрешения вывода данных ОЕ («output enable»). При выводе данных из регистра (команда «shiftout») эта линия дол-
392 Часть 6. Контроллер Basic Stamp фирмы Parallax жна быть подключена к «земле» (вывод 10). При вводе данных is регистр (ко- манда «shiftin») линия 8Q должна быть соединена с I D, а на вывод ОЕ необходимо подать высокий потенциал, чтобы загрузить 8 бит, а затем этот вывод подключается к низкому потенциалу, чтобы обеспечить выдачу дан- ных. Рис. 42.2. Включение микросхемы 74чхх374 в качестве преобразователя последовательного кода в параллельный В команде последовательного ввода «shiftin» параметр «mode» определяет, когда и в каком порядке выбираются данные, то есть, посылается первым старший или младший бит. Приведенная ниже таблица определяет значения этого параметра и соответствующие символические обозначения. Символ Значение Комментарии MSBPRE 0 Первым принимать старший бит с выборкой до тактового импульса LSBPRE 1 Первым принимать младший бит с выборкой до тактового импульса MSBPOST 2 Первым принимать старший бит с выборкой после тактового импульса LSBPOST 3 Первым принимать младший бит с выборкой после тактового импульса
Глава 42. Функции языка PBASIC для STAMP 393 При выполнении последовательного вывода (команда «shiftout•) данные могуг передаваться, начиная со старшего бита (чю соогвегсгвхег значению 1 параметра «inode», которое имеет символическое обозначение MSBFIRST) пли с младшего бита ( значение LSBFIRST. что соответствует 0). Для схемы на рис. 42.2 надо укатать значение MSBFIRST. чтобы обеспечить загрч зк\ битов в правильном порядке. В разделах, посвященных других) микроконтроллерам, я описывал реали- зуемые на их основе приложения в специальной главе. Однако, чтобы вы получили представление о том. как работают функции, реализующие после- довательный интерфейс, я хочу здесь рассмотреть в качеснзе примера не- большое приложение. В этом приложении используются два контроллера BASIC Stamp (BS1 и BS2). которые посылают данные др\ i другу. На рис. 42.3 приведена схема, реали зованная на кошроллере BS1. где восемь линий ввода-вывода служат для управления ЖКИ и реали зации пос- ледовательного ввода-вы вода данных. Программа сначала выводит на ЖКИ сообщение «Waiting» («Ожидание») и начинает принимаг ь данные по после- довательному ишерфейсу ог контроллера BS2 (со скоростью 1200 би г/с), они оюбражаюгся на дисплее, символ инкрементируется и посылавiся об- рати на BS2. Vcc Рис. 42.3. Схема, испопьзуемая дня тестирования работы поспедоватепьного интерфейса в BS1 Программа на PBASIC для BSI будет иметь вид: ‘ BS1STEST - тест/демонстрация работы последовательного ‘ интерфейса для BS1 Эта программа выводит предварительное сообщение на экран, затем ждет, когда другой Stamp передаст данные по последовательному интерфейсу со скоростью 1200 бит/с. Когда данные приняты, они отображаются на дисплее, затем
394 Часть 6. Контроллер Basic Stamp фирмы Parallax производится их инкремент и обратная посылка со скоростью 1200 бит/с Муке Predko ‘ 07.09.97. symbol Е =3 1 Биты управления ЖКИ symbol RS = 2 symbol Sin = 0 symbol SOut = 1 ‘ Последовательный ввод ‘ Последовательный вывод symbol i = bO symbol j = Ы symbol к = b2 symbol n = b3 ‘ Счетчики Инициализация портов ввода-вывода Pins = $02 ‘ Обеспечить низкий уровень на всех линиях ‘ кроме выхода последовательного порта Dirs = $FE ‘ Только бит 0 является входом j = 0 ‘ Использовать «j» для RS Инициализация ЖКИ pause 200 ‘ Ждать 15мс для инициализации ЖКИ Pins = $30 pulsout Е, 1 pause 10 PulsOut E, 1 pause 10 PulsOut E, 1 pause 10 ‘ Инициализация ЖКИ Pins = $20 ‘ Включить 4-разрядный режим PulsOut Е, 1 PulsOut Е, 1 PulsOut Е, 1 i = $28 gosub LCDOut ‘ «Установить длину интерфейса
Глава 42. Функции языка PBASIC для STAMP 395 i = $0С gosub LCDOut i = $01 gosub LCDOut i = $06 gosub LCDOut ‘ Вывести начальное сообщение j = $04 ‘ Теперь посыпаем символы for п = 0 to 6 lookup n, («Waiting»), i gosub LCDOut next Loop: Serin Sin, T1200, n j = 0 ‘ Вывод на чистый экран i = 1 gosub LCDOut pause 10 j = $04 ‘ Вывод символа i = n gosub LCDOut n = n + 1 Serout SOut, T1200, (n) goto Loop ‘ Подпрограммы LCDOut: ‘ Послать команду Pins = i & $F0 + 2 + j k = 0 pulsout E, 1 Pins = i * 16 & $F0 + 2 + j k = 0 pulsout E, 1 return
396 Часть 6. Контроллер Basic Stamp фирмы Parallax В контроллерах BS2 все выполняется почти аналогично. за исключением одного важного отличия: команда «serin» реализует задержку длительностью одна секунда, при которой на ЖКИ выводится сообщение «waiting», если от контроллера BS1 ничего не принимается, а затем посылается символ «А», с которого начинается процесс инкремента и повторной посылки. Когда установлена связь между схема- ми, реализованными на BSI и BS2, контроллер BS2 инициирует передачу данных, а при разрыве соединения производит постоянный опрос состояния линии связи с BS1. Схема включения контроллера BS2 приведена на рис. 42.4. пульсы Рис. 42.4. Схема, используемая для тестирования работы последовательного интерфейса в BS2 Программный код для BS2 имеет следующий вид BS2STEST - тест/демонстрация работы последовательного интерфейса для BS2 Эта программа выводит предварительное сообщение на экран, затем ждет, когда другой Stamp передаст данные по последовательному интерфейсу со скоростью 1200 бит/с. Когда данные приняты, они отображаются на дисплее, затем производится их инкремент и обратная посылка со скоростью 1200 бит/с Эта программа отличается от “BS1STEST” использованием функции “shiftout” для связи с ЖКИ, а также тем, что она использует язык PBASIC для BS2, и контролирует максимальное время ожидания при выполнении функции “serin” и, если оно превышено, на ЖКИ выводится сообщение “Waiting” и посылается символ “А” в BS1 Муке Predko 07.09.97.
Глава 42. Функции языка PBASIC для STAMP 397 E RS DataOut Clock con 6 con 7 con 1 con 0 ‘ Биты управления ЖКИ ‘ Сдвиг данных для ЖКИ Seln con 3 ‘ Биты последовательного ввода-вывода SeOut con 2 i var byte ‘ Счетчики j var byte k var byte n var byte ‘ ### - Повторить то, что было сделано для BS1 ‘ Инициализация портов ввода-вывода Outl = 0 ‘ Обеспечить низкий уровень на всех пиниях ‘ кроме выхода последовательного порта Dirl = %11000111 ‘ Линии 0, 1, 6, 7, 2 реализуют вывод данных j = 0 ‘ Использовать «j» для RS ‘ Инициализация ЖКИ pause 200 ‘ Ждать 15 мс для инициализации ЖКИ Shiftout DataOut, Clock, 1, [$30] pulsout Е, 1 pause 10 Pulsout E, 1 pause 10 Pulsout E, 1 pause 10 Shiftout DataOut, Clock, 1, [$38] ‘Установить длину интерфейса pulsout E, 1 Shiftout DataOut, Clock, 1, [$0C] pulsout E, 1 Shiftout DataOut, Clock, 1, [$01] pulsout E, 1 Shiftout DataOut, Clock, 1, [$06] pulsout E, 1
398 Часть 6. Контроллер Basic Stamp фирмы Parallax ‘ Вывести начальное сообщение NothingLoop: ‘ Переход сюда, когда данные не принимаются Low RS ‘ Очистить экран Shiftout DataOut, Clock, 1, [1] Pulsout E, 1 pause 10 High RS ‘ Вывод символов данных for п = 0 to 6 lookup n, [“Waiting”], i Shiftout DataOut, Clock, 1, [i] Pulsout E, 1 next j = “A” ' Послать на выход новое значение SerOut SeOut, 813, [j] Loop: Serin Seln, 813, 1000, NothingLoop, [j] Low RS Shiftout DataOut, Clock, 1, [1] Pulsout E, 1 pause 10 ‘ Сбросить/очистить экран High RS Shiftout DataOut, Clock, 1, [j] Pulsout E, 1 SerOut SeOut, 813, [j + 1] goto Loop Есть некоторые особенности в реализации этих двух приложений, на ко- торые следует обратить внимание. Первая особенность состоит в том. что программирование портов является частью прикладной программы. Это очень важно, так как дает возможность корректировать приложения в процессе от- ладки. Вторая особенность, которая характерна для данной прикладной про- граммы, состоит в том, что я не использовал функцию «End» в исходном коде программ для обоих контроллеров Stamp. Это сделано потому, что обе программы работают в бесконечном цикле, и программа не может выйти за пределы текущей рабочей области.
Глава 42. Функции языка PBASIC для STAMP 399 Команда: “Serin Bit,mode,{(Qual,{#}Var,...” Код операции: He определено Дешифрато) лексемы ZTZ EEPROM Пересылка вводимых данных в переменную Последовательный ввод данных Выполнение: do Var = RX (Pin, Mode) While Var 1= Qual if “#Var" do Var = (Var*10)+RX(Pin, Mode) while‘0‘<Var<‘9‘ else Var = RX(Pin, Mode) Пример: Serin Bit,N2400,i ‘ Получить символ Число командных циклов: Не определено Микроконтроллеры: BS1 Комментарии: Описание параметра “mode» дается в тексте книги. Команда 42.19. Команда BS1 «serin pin,mode,{data.} Команда: “Serout Bit,mode,({#}Data,...)’ Код операции: He определено Z7IZ EEPROM Дешифратц) лексемы Программ- ный счет- аикцес).. Регистры переменных Линии ввода- вывода * Пересылка вводимых данных в переменную Последовательный вывод данных Выполнение: for Count = 0 to varCount TX(Bit, mode, var[count]) Число командных циклов: Не определено Пример: Serout Bit, QT1200, “Data",i,$00 ‘ Послать строку с индексом ‘ вывода с открытым коллектором Комментарии: Описание параметра «mode» дается в тексте книги. Микроконтроллеры: BS1 на линию Команда 42.20. Команда BS1 «serout pin,mode,{data.}
400 Часть 6. Контроллер Basic Stamp фирмы Parallax Команда: “Serin Bit,mode,{to, tolabel,}[Parms]" Код операции: He определено Выполнение: do Var = RX (Pin, mode) while Var != "WaitParms” do Var = RX(pin, mode) Пример: Serin Bit, 813 + $4000, 1000, TOLabel, [i, j] Комментарии: Описание параметра '<mode>> Пересылка вводимых данных в переменную - Последовательный ввод данных Число командных циклов: Не определено Микроконтроллеры: BS2 ' Ждать прихода 2-х байт на скорости 1200 бит/с в течение 1с дается в тексте книги. Команда 42.21. Команда BS2 «serin pin,mode,{label}, [data]» Команда: “Serout Bit,mode,{pace,}[Parms]" Код операции: He определено Последовательный вывод данных Выполнение: for Count = 0 to varCount TX(Bit, mode, Var[count]) if pace Dlay pace msecs next Число командных циклов: He определено Микроконтроллеры: BS2 Пример: Serout Bit, 813 + $4000, 100, [i, j, cr] ' Послать два байта на скорости 1200 бит/с ‘ с паузой 0,1с между символами, ‘ а затем передать $0D Комментарии: Описание параметра «mode” дается в тексте книги. Команда 42.22. Команда BS2 «seriout pin,mode,[data]»
Глава 42. Функции языка PBASIC для STAMP 401 Команда: “Shiftin dBit,cBit,mode,[Parms]” Код операции: Не определено Выполнение: for Count = О to Bits while Clock == 0 Var = (Var«1) + dBit while Clock != 0 next Число командных циклов: He определено Микроконтроллеры: BS2 Пример: Shiftin dBit, eBit, MSBPRE, [Var] ‘ Получить ‘ уровне 8 бит, выборка при низком сигнала синхронизации Комментарии: Описание параметра “mode» дается в тексте книги. Число разрядов сдвига определяется параметром “Farms" Команда 42.23. Команда BS2 «shiftin dBit,eBit,mode,[Parms]» Команда: “Shiftout dBit,eBit,mode,[Parms]” Код операции: He определено Последовательный вывод данных Выполнение: for Count = О to Bits dBit = Var & 1 CBit = 1 CBit = 0 Var = Var»1 next Пример: Shiftout dBit, eBit, MSBFIRST, [Var] Число командных циклов: He определено Микроконтроллеры: BS2 ‘ Вывести 8 бит, первым - старший бит Комментарии: Описание параметра «mode» дается в тексте книги. Число разрядов сдвига определяется параметром “Parms" Команда 42.24. Команда BS2 «shiftout dpin, cpin, mode, [data.]» 26 Зак. 2025.
402 Часть 6. Контроллер Basic Stamp фирмы Parallax Аналоговый ввод-вывод Вы. мнможно. удивитесь, о каких возможностях аналогового ввода-вывода в контроллерах Stamp может идти речь, учитывая, что они реализотзаны на бате младших моделей PICMicro. в которых аналоговый ввод-вывод вообще отсутствует. Действительно, возможности аналогового ввода-вывода в Stamp весьма отраничены, но они могут быть полезны .тля некоторых применений. В режиме аналогового ввода данных Stamp может определять потинттю по- тенциометр;,, а в режиме вывода выдавать необходимы,) уровень напряжения с помощью использования ШИМ и фильтра низких частот. Определение позиции потенциометра можно довольно лет ко произвести каке использованием В81,таки BS2 (команды 42.25 и 42.26). В контроллере BSI конденсатор заряжается при подаче на выходную линию высокого уров- ня потенциала, затем разряжается до ниткою уровня на этот) линии и тнме- ряется время разряда конденсатора через потенциометр. В команде «Pot» для BSI время, в течение которою Stamp ждет, пока кон- денсатор разрядится. определяется параметром масштабирования "scale». Пол- ная величина внугретптей задержки составляет 65536. а ее текущий отсчет бу- дет произведен, когда конденсатор ратрядится до уровня порогового напряжения, который для микроконтрол теров PIC составляет приблизите.ть- но 1.4 В. Параметр «scale» позволяет «настроить» команду «Рот» на определение полною диапазона сопротивлений потенциометра при любых значениях сю сопротивления и емкости конденсатора с учетом их отклонения от номинала. Определение оптимальною значения параметра «scale» может бт.цт. вы - полнено путем нажатия комбинации клавиш «Ctrl-Р» при использовании си- стемы разработки для контроллеров Stamp (фант Siamp.exe), котла Stamp с потенциометром присоединен к нрот раммиру кинему ттерсоналт.ноуту компь- ютеру. Если это будет сделано, то на экране появится окошко, в котором вас попросят выбрать номер линии, затем можно менян, масштабный коэффи- циент. а на экране будет показываться текущее значение сопротивления но тснииометра. Имейте в виду, что при этом в Stamp затружается специальная программа. Поэтому после определения подходящего значения коэффициен- та «scale» необходимо снова затрузить в контроллер прикладную программу. Контроллер BS2 работает несколько иначе, что можно увидеть, посмот- рев на команду 42.26. Конденсатор заряжается кон гро.т.тером Stamp, a загсут цикл его разряда кон тролируегся микроконтроллером PIC. имеющимся в Stamp. Преимуществом данного метода является то. чю нелинейность выход- ного сопротивления PIC не оказывает влияния на цикл разряда, оттределя- мыи RC-иепью. Токоограничитзаюший резистор сопротивлением 100 Ом хтежду RC-неттью и выводом Stamp служит для того, чтобы в случае короткого за- мыкания выходной ток не вызвал повреждения этого вывода. Коутанда «retime» выполняет измерение длительности цикла разряда, ко- торый может достигать значения 65536. тле одна единица раина 2уткс (пара- метр «scale» при этом не используется). Это означает, чго надо подбирать величину постоянной времени RC так. чтобы не возникало переполнения
Глава 42. Функции языка PBASIC для STAMP 403 счетчика. Если это случится, то есть конденсатор не успеет разрядиться до 1.4 В за 130 мс, то счетчик сбрасывается в нуль. Рассматривая эти две операции, вы должны обрати, внимание на одну существенную проблему, которая возникает если разработанное на основе Stamp приложение предполагается выпускать серийно. Каждый экземпляр будет требовать отдельной настройки на реальную пару резистор - конденса- тор, которая будет подключена к Stamp. Это приводит к неоправданно высо- ким затратам рабочего времени. Вместо этого следует спроектировать прило- жение таким образом, чтобы оно не требовало включения потенциометра для ввода данных или использовало отдельный АЦП. который будет управ- ляться при помощи Stamp. Вывод аналогового напряжения осуществляется контроллером Stamp при помощи команды «PWM». Эта функция выдаег последовательность импуль- сов с определенной скважностью (команды 42.27 и 42.2S). Основной целью реализации этих функций является выдача заданного значения аналогового напряжения, но они могут использоваться также для различных примене- ний. требующих формирования ШИМ-сигналов. Важно заметить, чго период ШИМ-сигнала меняется в зависимости ог заданной скважности, чтобы обеспечить значения скважности, необходимые для различных случаев применения. Этим Stamp отличается от многих дру- гих микроконтроллеров, в которых период ШИМ-сигналов остается посто- янным. Однако это не оказывает существенного влияния на полезность фун- кции I’WM. Наиболее очевидным из неаналоговых применений данной функции яв- ляется реализация автоподстройки в радиоприемниках. Команда «PWM» в BSI можег использоваться для выдачи импульсов дли зольностью 1-20 мс (ко- торые должны иметь скважноегь 50-100, чтобы обеспечить полный диапазон для системы автоиодстройки) с задержкой в 15 мс перед выводом следующе- го импульса. Хотя достаточно сложно обеспечить с помощью Stamp период между импульсами ровно в 20 мс, большинство систем автоподстройки не слишком требовательны к этому параметру и могут работать при различных значениях периода. Интересно отметить, что контроллер BS2. выдающий ШИМ-сигналы с периодом в 1мс. не может управлять системой авгоподст- ройки (разве что при помощи функци11 <• Pulse»). ШИМ-сшпал можно также использовать для управлениями электромо- торами, хотя я не рекомендую этого делать. Низкая частота импульсов может вызвать зудение при работе моторов. Чтобы избежать зудения, частота ШИМ- сигналов должна превышать 20 кГц. Когда я исследовал выполнение команды «PVVM» при подготовке этого раздела книги, то написал следующую программу: ‘ PWMTest - демонстрирует работу функции PWM ‘ Простая программа для испытания и посылки ШИМ-сигнала на ‘ светодиод, чтобы менять яркость его свечения
404 Часть 6. Контроллер Basic Stamp фирмы Parallax ‘ Муке Predko ‘ 02.09.97 symbol i = Ь0 ‘ Использовать i в качестве счетчика output 0 ‘ Светодиод, который тускнеет и снова загорается output 4 ‘ Светодиод на этом выводе горит все время low 0 low 4 Loop: ‘ Точка возврата цикл для реализации ШИМ for i = 0 to 255 step 1 PWM 0, i, 1 next ‘ Послать группу ШИМ-сигналов for i = 255 to 0 step -1 PWM 0, i, 1 next goto Loop end Эта программа обеспечивает свечение двух светодиодов, один из которых горит то ярче, то слабее из-за изменения скважности ШИМ-сигнала. «Туск- неющий» светодиод выглядит очень привлекательно. Способность Stamp ре- ализовать функцию PWM позволяет разрабатывать некоторые устройства, доставляющие большое удовольствие. Как я говорил в начале этого раздела, возможности аналогового ввода- вывода в Stamp довольно ограничены и, что еще более важно, они зависят от параметров устройства. Если вы хотите использовать Stamp в серийно вы- пускаемой продукции, где требуется реализация аналогового ввода-вывода, то я настоятельно рекомендую использовать внешние АЦП и ЦАП.
Глава 42. Функции языка PBASIC для STAMP 405 Команда: “РОТ Bit, Scale, Dest” Код операции: Не определено Число командных циклов: Не определено Микроконтроллеры: BS1 0,1 мкФ Выполнение: Pin <- Output Pin <- 1 for Count = 0 to Dlay next Pin <— 0 for Count = 0 to Scale if Pin == 0 goto POTStop next POTStop Dest = Count Комментарии: Комбинация клавиш»С1г1-Р>’ Пример: РОТ 0, 128, i ‘ Считать позицию ' потенциометра используется для калибровки приложения Команда 42.25. Команда BS1 «pot pin, scale, dest» Команда: “RCTIME Pin, state, Dest" Код операции: He определено Pin 4— 1 for Count = 0 to Dlay next Pin <— Input for Count 0 to 65536 if pin == 0 goto RCEnd Dlay 2us Пример: retime 0, t, i ‘Считать позицию потенциометра next PCEnd Dest = Count Команда 42.26. Команда BS2 «retime pin, scale, dest-
406 Часть 6. Контроллер Basic Stamp фирмы Parallax Команда: “PWM Bit, duty, Cycles" Дешифрато) лексемы ZZEZ EEPROM Выполнение: for CCount = 0 to Cycles Pin <- 1 for Count = 0 to duty next Pin <— 0 for Count = Count to 255 next next Код операции: He определено Число командных циклов: Не определено Микроконтроллеры: BS2 ЮК —— Выход ШИМ + __ ——— 10мкФ Пример: PWM 0, 128, 256 ‘Выдать прямоугольные импульсы Комментарий: В BS1 период ШИМ-сигналов равен 5 мс Команда 42.27. Команда BS1 "pwm pin, duty, cycles» Команда: “PWM Pin, duty, Cycles” Код операции: He определено Выполнение: for CCount = 0 to Cycles Pin <- 1 for Count = next Pin <- 0 for Count = 0 to duty Count to 255 next Пример: PWM 0, 128, 256 Выдать прямоугольные импульсы next Комментарий: В BS2 период ШИМ-сигналов равен 1 мс Команда 42.28. Команда BS2 “ pwm pin, duty, cycles»
Глава 42. Функции языка PBASIC для STAMP 407 Звук Контроллеры Stamp имеют возможность выводить звук несколькими раз- личными способами. Хотя в некоторых случаях может пока tai вся. что BS1 обеспечивает большую гибкость при выводе различных звуков. чем BS2. но я уверен, что вы придете к выводу, что BS1 имеет весьма oiраниченные спо- собности точно носпрои мюли гь определенные ноты. При исследовании пусковых возможностей Stamp я применял схему, по- каянную на рис. 42.5. чтобы слушать, какие звуки реально выдаются. В этой схеме использовался обычный пьезодинамик и конденсатор для фильтрации сигнала. Можно подключить любой динамик с достаточно высоким входным сопротивлением — 15 Ом и выше. Эта схема можег также использоваться и с другими устройствами для воспроизведения звука. Пьезо- динамик Рис. 42.5. Подключение BASIC Stamp к пьезодинамику Функция «sound» ,пя контроллера BS1 (команда 42.29) можег ноеледона- te.ibHo выдавать звуки разных гонов, то есть воспроизводить мелодию. Время «time» задается с шагом 12мс. го есть заданное значение 42 вызовет звучание ноты в течение приблизительно 500 мс (полсекунды). Для определения зна- чения частоты (параметр «note»), используется следующая формула: note = 127 - (((1 / частота) - 95(10л-6)) / 83(10л-6)) Чтобы избавить вас ог необходимости вычисления частоты для ног is му- зыкальной мелодии и пересчета этой частоты в параметр «note» функции «sound», я сделал следующую таблицу хая нот первой октавы. Нота Частота Параметр «note» для Sound Фактическая частота Погрешность А 440 Гц l()l 443. S 5 Гц 0.9 <7 A# 466 102 460. S3 1.1 П В 494 104 499.00 1.07 С 5^ 105 520.56 0.57
408 Часть 6. Контроллер Basic Stamp фирмы Parallax Нота Частота Параметр «note» для Sound Фактическая частота Погрешность C# 554 106 544.07 1.8^ D 587 108 598.09 1.9% D# 622 109 629,33 1,2% Е 659 110 664,01 0,8% F 698 III 702,74 0,7% F# 740 1 12 746.27 0,8% G 784 113 795,54 1,5% G# 831 1 14 851,79 2.5% А(Н) 880 115 916,59 4,2% На первый взгляд может показаться, что контроллер BSI хорошо подхо- дит для обращения с различными нотами (для большинства из них шачение параметра «note» отличается от следующего значения только на единицу). Но всегда будет иметься некоторая погрешность (особенно, учитывая разброс частот керамического резонатора в Stamp), которая может привести к тому, что нота будет выбиваться из музыкального ряда. Иногда бывает очень трудно распознать реальную ноту (несмотря на малые значения погрешностей), так как некоторые ноты могут оказаться и частотном диапазоне соседней ноты. Например, для ноты 1) (значение параметра «note»= 108) отличие от ладон- ной частоты составляет 1.9%. однако ее частота всего на 3,8% отличается от эталонной частоты для D#. Этот эффект особенно проявляется на более вы- соких нотах. Я понимаю, что указанные в таблице тначения потрешносгей кажутся маленькими, но реально они покажутся достаточно значительными, когда вы попытаетесь воспроизвести знакомую мелодию. Функция «Freqoiit» шт я BS2 (команда 42.30) позволяет одновременно выдавать одну или две частоты. Частота указывается непосредственно в Гер- цах, поэтому не требуется производить ее пересчет ио формуле, чтобы полу- чить действительное значение. Контроллер BS2 может использоваться для управления устройствами, подключенными к двухтональным мультичастотным декодерам (DTMF). при помощи функции «DTFMOut» (команда 42.31). Во время экспериментов с ней я обнаружил, что выходной DTMF-сигнал был очень слабым и практи- чески полностью отфильтровывался схемой конденсатор - иьезодинамик. приведенной на рис. 42.5. Это значит, что выходной сигнал должен быть пра- вильно отфильтрован и усилен, прежде чем использовать его для управления внешними DTMF-устройствами.
Глава 42. Функции языка PBASIC для STAMP 409 Команда: “Sound Bit. (Note, Time Код операции: Не определено Дешифратор лексемы г~т~ EEPROM Выход аудио-сигнала Выполнение: for Count = 0 to NoteCount if Note[Count] == 0 pause TimefCount] else for DCount = 0 to Time Pin <— Note[Count] next Число командных циклов: He определено Микроконтроллеры: BS1 next Пример: Sound 7, (А, 20, В, 20, С, 20) Вывод последовательности звуков повышающейся частоты Команда 42.29. Команда BS1 «sound pin, (note, time {...})» Команда: “FREQout Bit, Time, freg {,freg2}” Код операции: He определено Выполнение: for Count = 0 to Time Число командных Bit <- freg (+freg2) циклов: He определено next >1 „„„ Микроконтроллеры: BS2 Пример: FREQout 7, 500, 1000 ‘ Вывод сигнала частотой 1кГц в течение 0,5 с Комментарии: При выдаче двух частот одновременно используйте усилитель и фильтр для выходного сигнала Команда 42.30. Команда BS2 «freqout pin, time, freq {.freq}
Выполнение: for Count = 0 to KeyCount Bit Key[Count].Freqs next Пример: DTMFout 7, 500, 100, [1,2,1,2.5.5,5,1.2,1.21 Выход аудио-сигнала Число командных циклов: Не определено Микроконтроллеры: BS2 ' Набрать номер справочной ' службы Нью-Йорка Комментарии: При Выдаче двух частот одновременно используйте усилитель и фильтр для выходного сигнала Команда 42.31. Команда BS2 "dtmf pin, {on. off,}[key]» Таблицы данных В я пике [’BASIC есть несколько функций, которые делают процесс обработки данных более простым и эффективным. Эти функции обрабатывают байт и в зависимости oi его значения выдают определенный результат. В их числе есть функция рандомизации, которую можно испольювать для генерации псевдо- случайного числа, основываясь на заданном нач;гн.ном значении. Функция «random» включена в этот список, так как ее можно рассматривать в качестве 1абл11чной операции - единензенное значение возвращается для указанного числа. В описании языка PBASIC. которое дается фирмой Parallax, табличные операции и функция random называются «числовыми» функциями. Функция «lookdowit» (команды 42.32 и 42,33) выбирает значение и t таб- лицы чисел. Такую функцию хотелось бы иметь в каждом языке. Мне прихо- дилось писать ее вручную, когда требовалось обеспечить реакцию устройства на поступление определенного ASCII-символа. Пример реализации этой фун- кции для BSI показывает, как можно использовать один ASCII-символ для указания адреса перехода при помощи всего двух команд. В контроллере BS2 возможности функции «lookdown» расширены путем введения в нее различных типов сравнений. Это делает ее очень полезной во
Глава 42. Функции языка PBASIC для STAMP 411 многих случаях. В описании функции (команда 43..23) я дал c-.ie.ixюшии ком- ментарий к приведенному примеру: «Найти диапазон, в котором находи зся <)»». Но посмозрите, что же происходит на самом деле'.’ В лом примере «з» делится на 5, а результат помещается в «j». Функция «lookup» (команды 42.34 и 42.35) в качсснзе ре зу.iьгаiа выдаем значение заданного числа. В примере, приведенном ,ия конipo.i.iepa BSI. ла функция используется для симуляции обращения к массиву данных, пред- назначенных только для чтения. Как показано при описании ион функции в разделе «Выполнение», формирование смешения производизея как при вы- борке заданною значения, зо есть при чтении массива. Команда «random», помешенная и данную группу, можем пока зап,ся нред- сзаззлезнзой не на своем месте. Назначением лозз функции (команда 42.36) является выдача случайного числа. Фуззкция «random» формируег «псевдо- случайное» число, которое вычисляется но определенному а.поризму зз сооз- ветствии с заданным начальным значением. Фактически, функция random» принимает начальное значение, вычисляет на его основе 16-ра зря.зное слу- чайное число и загем записывает ею на место заданною начальною значе- ния. Чтобы объяснить, почему ла функция попала празден зазбличных опе- раций. можно рассматривать ее выполнение как обращение к очези. бо зыпому массиву (заблипе) данных, из которого выбираемся определенное число зз зависимости от заданною зз команде смещения, зз качестве которою служит указанное зз команде начальное значение «seed». На рисунке, иллкзезрирузозцем выполнение команды -lookup» для BS2 (команд:! 42.35), показано, как можно реализовазi> зенерапик)случайных чисел с помощью таблзпня (одномерною массива данных), i де команда «lookup» залаем исходное смещение, а затем выбирает случайное значение. Однако числа, полученные с использованием заданною начальною зна- чения «seed» или смещения «offset», на самом .теле можно счизазз. с.iучайпi>i- ми только условзго. Проблема с получением случайных чисел е помощью контроллера Stamp или любой другой iцзфровозз системы заключается зз зю- ззеке случайного начальною значения. Чтобы полу чиз ь действительно слу- чайное число, надо чтобы начальное значение также было случайным. Эю означает, что оно должно 6i>iti» получено из внешнего источник;!. Таким «внешним источником» может быть запрос к пользователю ввести случайное число, или подсчет «шумовых сигналов» на образпосмешенном диоде за определенный промежуток времени, или какое-го друзое внешнее событие, которое обеспечит выдачу случайного числа. Есн> мною различных способозз получения заких чисел, по если вы хозиге имен, деисзвизельно случайные числа, то згачальное значение должно был, получено оз недемер- минироззанною (непредсказуемою) внешнего источника.
412 Часть 6. Контроллер Basic Stamp фирмы Parallax Команда: “Lookdown Source, (value,...),Dest” Код операции: He определено Выполнение: for Count = 0 to ValueSize if Source == Value[Count] Dest = Count Count = ValueSize next Число командных циклов: He определено Микроконтроллеры: BS1 Пример: gosub GetCommand ‘ Получить команду lookdown S, (“RST”),C branch С, (Run. Stop, Step) Преобразовать ее в адрес Команда 42.32. Команда BS1 "lookdown source, (value, ...), dest" Команда: “Lookdown Src, Cond, (value..), Dst" Код операции: He определено Выполнение: for Count = 0 to ValueSize if Src Cond Value[Count] Dest = Count Count = ValueSize next Число командных циклов: He определено Микроконтроллеры: BS2 Пример: lookdown i, <, (5, 10, 15), j ‘ Найти диапазон, в котором находится переменная !•> Комментарий: В качестве «Cond» можно использовать условия •+». «<>». «>», <<», <><=>, «=>». Условие “=>> используется по умолчанию. Команда 42.33. Команда BS2 «lookdown source, condition, (value, ...). dest»
Глава 42. Функции языка PBASIC для STAMP 413 Команда: “Lookup Offset,(value,...),Dest” Код операции: Не определено Дешифратор лексемы ~~г~ EEPROM Выполнение: Dest «— Value[ Offset ] Пример: for i = 0 to 5 lookup I, (“Hello”), j gosub Output next ‘ Вывести сообщение Число командных циклов: Не определено Микроконтроллеры: BS1 Команда 42.34. Команда BS1 «lookup offset, (value, ...), dest» Команда: “Lookup Offset, (value,..), Dest” Код операции: He определено Пример: for I = 0 to 7 Дешифратор лексемы ~г~ EEPROM Выполнение: Dest <— Value[ Offset ] lookup i, (5, 7, 2, 3, 1, 6, 4, ), j gosub Output ‘ Выдать псевдослучайное число Число командных циклов: Не определено Микроконтроллеры: BS2 next Команда 42.35. Команда BS2 «lookup offset, (value, ...), dest»
414 Часть 6. Контроллер Basic Stamp фирмы Parallax Код операции: Не определено Команда: “Random Seed" Выполнение: Seed <— Random[ Seed ] Число командных циклов: Не определено Микроконтроллеры: BS2 Пример: Loop Seed = Seed + 1 if BitO == 1 then Loop Random Seed Рандомизировать исходную величину Команда 42.36. Команда BS1/BS2 «random seed» Обращение к EEPROM Одной ит хороших особенностей контроллеров Stamp является их способ- ность сохранять данные в памяти EEPROM. Память EEPROM может не толь- ко испольюва i ься в качестве дополнительной оперативной памяти, содер- жимое которой сохраняется при отключении питания и может использоваться в качестве массива данных, но также служить для хранения сообщений и таблиц непосредственно в исходном программном коде. Иснолыованпе EEPROM может сделать вашу программу гораздо более эффективной. Перед тем, как приступить к обсуждению выполнения команды «EEPROM», я должен описать, как хранятся данные и программы it кон- троллерах Stamp. Память EEPROM в Stamp разбита па дне области, между которыми имеется неиспользуемое пространство. Начиная с нулевого адреса и ниже (рис. 42.6) в памяти EEPROM размешается область хранения данных. Начиная с последнего адреса и выше в EEPROM хранятся программные лексемы. Основной принцип организации памяти EEPROM в контроллерах Stamp состоит в том, что объем памяти, доступной для хранения данных, зависит от размера программы — чем больше объем программы, тем меньше остается места для хранения данных. Определить, сколько места имеется в памяти для хранения программ и данных не очень сложно. Для BSI есть только один способ найти объем дос- тупного пространства в EEPROM — во время загрузки в нее программы. На приведенном ниже рисунке показано окно загрузки для BSI (рис. 42.7).
416 Часть 6. Контроллер Basic Stamp фирмы Parallax четыре окрашены в красный цвет. Это говорит о том, что программа исполь- зует 32 байта памяти, а для хранения данных доступны оставшиеся 224 байта. Для контроллеров BS2 после нажатия комбинации клавиш «Alt-R» про- грамма будет откомпилирована, и лексемы загружена н память Stamp. Затем можно нажать комбинацию «Alt-М», которая вызовет появление нового эк- рана, где вам будет показано использование памяти EEPROM и RAM. Определив, какой объем памяти EEPROM доступен для хранения дан- ных, вы можете начать их размещение. Как и следовало ожидать, поиск опти- мального распределения памяти между программой и данными является ите- рационным процессом. Основным методом использования памяти EEPROM является обращение к ней, как к массиву данных. Это осуществляется при помощи функций «read» и «write» (команды 42.37 и 42.38). Обе эти команды обращаются к EEPROM, используя арифметический адрес, который можно вычислить с номошью соответствующих операций. Например, если вы хотите измерить ускорение раксш с использованием Stamp и памяти EEPROM для хранения данных, то можно использовать следующую программу: LaunchLoop ‘ Ждать сигнала о начале запуска if bitO = 0 then LaunchLoop BlastOff ‘ BitO = 1, начало запуска for i = 0 to 20 ‘ Измеряем ускорение для первых 2с полета gosub AccMeasure ‘ Получить текущее ускорение write i, А ‘ Сохранить текущее ускорение в EEPROM pause 90 ‘ Пауза 100 мс для одной выборки каждые 0,1с next ‘ (предполагается, что операторы “for”, ‘ “gosub”, “write” и “next” выполняются 10 мс) DumpWait ‘ Полет завершен, ждем выдачи данных if bit1 = 1 then DumpWait Dump for I = 0 to 20 read i, A gosub SendData next ‘ Выдать содержимое EEPROM ‘ Получить содержимое EEPROM ‘ Вывод данных В контроллерах BSI функция «EEPROM» (команда 42.39) используется для сохранения групп байтов в указанном месте памяти EEPROM. Функция «EEPROM» более эффективна, чем использование нескольких операторов «write» потому, что сохранение нескольких байт в памяти EEPROM реализу- ется с помощью одной лексемы. Функция «data» для контроллеров BS2 (команда 42.40) является очень гибким способом размещения данных в EEPROM во время компиляции. Фун- кция «Data» очень похожа на инструкцию «var», при выполнении которой
Глава 42. Функции языка PBASIC для STAMP 417 ресурсы могут распределяться компилятором или размещаться программис- том. Типичный формат функции «data» имеет вид: Label Data «Something to be Stored» где метка «Label» является константой, назначенной компилятором. Эта мет- ка идентифицирует начальный адрес, по которому is памяти EEPROM будут размещаться данные «Something to be Stored». Размещение компилятором данных в памяти EEPROM может быть аннулировано путем указания адреса с предшествующим ему символом «@». При этом использование метки не обязательно. Поэтому, если требуется раз- местить в EEPROM данные «Something to be Stored» по адресу I0, то можно использовать следующий оператор: Data @10, “Something to be Stored" Команда: “Read Addr, Variable” Код операции: He определено Выполнение: Variable EEPROM. Addr Пример: for i = 0 to 4 ‘ Чтение данных read Addr + i,A ‘ из памяти EEPROM gosub LCDOut next Выдать содержимое EEPROM Число командных циклов: He определено Микроконтроллеры: BS2 Комментарий: Максимальное значение адреса EEPROM для функции «Read» равно 255 для BS1. Для BS2 максимальное значение адреса EEPROM равно 2047. Обратите внимание на правильное определение адреса EEPROM. Команда 42.37. Команда BS1/BS2 «read addr, variable» . 7 Зак. 2025.
418 Часть 6. Контроппер Basic Stamp фирмы Parallax Код операции: He определено Команда: “write Addr, Variable” Выполнение: EEPROM. Addr <- Variable Пример: gosub Sample write Addr + i, A > Данные, записываемые в EEPROM Сохранить выбранное значение в EEPROM Число командных циклов: Не определено Микроконтроллеры: BS2 Комментарий: Максимальное значение адреса EEPROM для функции -Read” равно 255 для BS1. Для BS2 максимальное значение адреса EEPROM равно 2047 Обратите внимание на правильное определение адреса EEPROM Команда 42.38. Команда BS1/BS2 •write addr, variable" Команда: “EEPROM Addr, (Byte[,Byte...])” Код операции: He определено > Данные, вводимые в EEPROM Число командных циклов: Не определено Микроконтроллеры: BS1 Выполнение: for Count = 0 to SBytes EEPROM. Addr + Count <- Byte[ Count ] next Пример: EEPROM O.f'myke") Поместить мое имя в EEPROM Команда 42.39. Команда BS1 “EEPROM addr, (data..)"
Глава 42. Функции языка PBASIC для STAMP 419 Команда: “(Label) DATA Data[, Код операции: Не определено Дешифраю з лексемы ZZEZ EEPROM Выполнение: Не определено Число командных циклов: Не определено Микроконтроллеры: BS1 Пример: My Name data “myke” ' Сохранить мое имя в EEPROM Комментарий: Контроллер BS2 рассматривает инструкцию “Data» НЕ как функцию языка, а как байты данных, заданные в исходном коде Команда 42.40. Команда BS2 “{label} data value{, value..}" Реализация задержки Команда «pause» используется для введения определенного времени задерж- ки, заданного в миллисекундах, в программу, написанную на PBASIC (ко- манда 42.41). Когда время задержки закапчивается, выполнение программы продолжается со следующей команды. Если вы будете читать документацию на Stamp, то увидите, что компания Parallax указывает достаточно высокую точность выполнения функций «pause» и «sleep»: до +/- I %. Однако реально время задержки трудно рассчитать, из- за влияния множества команд, окружающих команду «pause». Рашичные ко- манды с разными параметрами имеют разную длину и время выполнения. Это означает, что для того, чтобы получить точное время выполнения функ- ций в Stamp, вы должны сначала измерить время выполнения программы с какой-нибудь номинальной величиной задержки в функции «pause» и затем при помощи изменения этого значения (и ничего кроме него) можно полу- чить желаемое время. Функция «sleep» (команда 42.42) позволяет реализовывать гораздо боль- шие значения задержки — до 65 535 с или примерно до IS с половиной часов. Интервалы времени для функции «sleep» составляют 2,3 с (это время, кото- рое требуется, чтобы сторожевой таймер переключил в рабочий режим мик- роконтроллер PICMicro в Stamp), хотя задержки указываются с шагом в Ic. Преимущество использования команды «sleep» для PICMicro заключается в значительном уменьшении потребления энергии. Из-за того, что команда «sleep» в PICMicro использует сторожевой тай- мер WDT, то каждые 2,3с в течение приблизительно I8 мс выходные линии
420 Часть 6. Контроппер Basic Stamp фирмы Parallax микроконтроллера будут переведены в отключенное (высокоимпедансное) состояние, так как WDT производит перезапуск PlCMicro, отключая все его выходные линии. Это означает, что при разработке приложения вам, воз- можно, придется «подтягивать» линии, используемые для вывода данных, к «земле» или напряжению питания, чтобы гарантировать, что внешние уст- ройства не изменят свое состояние за 18 мс, в течение которых эти линии будут находиться в состоянии с высоким импедансом. Код операции: Не определено Команда: “Pause millseconds” Выполнение: Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Пример: Pause 1000 ' Задержка в 1с Команда 42.41. Команда BS1/BS2 «pause delay" Код операции: Не определено Команда: “Sleep seconds" Выполнение: Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Пример: Sleep 60 ‘ Задержка в 1мин Комментарий: Дискретность функции равна 2,3с с интервалом в 18мс после каждых 2,3с, в течение которого выходы будут находиться в высокоимпедансном состоянии Команда 42.42. Команда BS1/BS2 «sleep delay"
Глава 42. Функции языка PBASIC для STAMP 421 Управление питанием/ функционированием Расширением функций задержек являются функции управления питанием/ функционированием. На самом деле, граница между задержкой и управлени- ем питанием/функционированием выполнением довольно размыта, и функ- ции, которые я определил как «задержки», могут рассматриваться, как «уп- равление питанием/функционированием» и наоборот. В командах управления питанием/функционированием контроллер Stamp (г.е. входящий в его со- став PICMicro) переводится в режим ожидания. Чтобы полностью понять, что происходит при выполнении этих команд, вы можете вернуться назад и посмотреть, что я писал о команде PICMicro «sleep» и работе его сторожевого таймера. За исключением команды «pause» остальные команды задержек и управления питанием/функционированием в Stamp действительно переводят входящий в его состав PICMicro в режим ожидания, когда он управляется сторожевым таймером WDT, имеющимся в PICMicro. Когда WDT срабатывает и выводит PICMicro в Stamp из спящего режима, имеется период времени примерно в 18мс, во время которого вы- ходные линии отключаются, и производится запуск генератора тактовых сиг- налов PICMicro. Как сказано в предыдущем подразделе, все основные липни вывода данных должны быть «подтянуты» к «земле» или напряжению ниia- ния, чтобы гарантировать, что их состояние не изменится в течение этого интервала. Команда «пар» (команда 42.43) переводит PICMicro в Stamp в режим ожидания на время, длительность которого определяется коэффициентом предварительного деления частоты сторожевого таймера. Эlot переменный период времени обеспечивается при помощи регистра «OPTION» в Stamp. Задержка равняется 18мс, умноженным на степень двойки, которая указыва- ется в трех младших битах регистра OPTION. Значения задержки получаются следующими: Значение параметра в команде “пар” Время ожидания 0 1 18мс Збмс 2 72мс 3 144мс 4 288мс 5 576мс 6 1,15с 7 2,3с
422 Часть 6. Контроллер Basic Stamp фирмы Parallax В течение времени, когда функция «пар» активна, все выводы Stamp со- храняют свое состояние до окончания времени ожидания, а затем на 18мс выходные линии переходят в режим ввода данных е высоким входным импе- дансом, пока не запустится снова синхронизация, после чею их состояние восстановится. Это означает, что команда «Nap 0» будем занимать на самом деле Збмс, a «Nap I» — 54мс и т.д., так как время выполнения команды складываеюя из периода, когда контроллер находится в спящем режиме, и 18мс на ею перезапуск. Команда «End» должна использоваться в тех случаях, когда прикладная программа Stamp не должна выполняться в бесконечном цикле. Данная ко- манда переводит PICMicro в Stamp в режим ожидания, из которого он каж- дые 2,3 с выводится WDT, после чего PICMicro снова понадасн в лот режим. Работа команды «End» может быть прервана только подачей сигнала на ли- нию сброса Stamp. Причиной, по которой в конце программы должна помещаться команда «end» (команда 42.44), является то, что неизвестно, какие следующие ко- манды будут выбираться контроллером из EEPROM. Если вы отвлекли Stamp от выполнения другого приложения, которое используют большое количе- ство команд, то, как только новая программа закончится, контроллер будет выбирать оставшиеся в EEPROM команды, то есть прозрамма не заканчива- ется автоматически. Это означает, что Stamp может продолжить выполнение команд, а вы не будете понимать, что же происходит. Код операции: Не определено Команда: “Nap Value” Выполнение: PIC.OPTION <- Value PIC <- Sleep Пример: Nap 6 ' Задержка примерно 1с Число командных циклов: Не определено Микроконтроллеры: BS1/BS2 Комментарии: Длительность команды Nap равна 18мс ' 2 " Value Команда 42.43. Команда BS1/BS2 << пар delay
Глава 42. Функции языка PBASIC для STAMP 423 Код операции: Не определено Команда: “End” Выполнение: PIC OPTION 7 PIC « Sleep Пример: End ' Программа заканчивается здесь Чиспо командных циклов: Не определено Микроконтроллеры: BS1/BS2 Комментарии: Каждые 2,3 с (приблизительно), выходы Stamp становятся входами в течение 18 мс Команда 42.44. Команда BS1/BS2 « end» Отладка Функция «debug» в Stamp является методом вывода данных па управляющий ПК во время выполнения программы. Эта функция позволяет выводить про- стые сообшения и шачения переменных на экране компьютера в окне «debug window», которое появляется при выполнении операюра «debug» на кон- троллере Stamp, подключенном к управляющему ПК. Несмотря на кажущую- ся простоту использования, эта функция имеет несколько особенностей, которые надо хорошо понять, прежде чем вы сможете нспольювагь ее для вывода данных так, как вы от нее ожидаете. Функция BSI «debug» (команд;! 42.45) имеет ряд особенностей. которые вам следует учи гывагь. Оператор «debug» имеет форму: debug data [, data ..] которая ошачаег. чго информация вида: debug “Last А = #А выведет сообщение, где будет указано содержимое регистра, на который укалы- вает «Л». Использование префикса «я» исключает в отладочном сообщении вы- вод символов «Л = ». Если 6i.i в приведенной выше строке перед «Л» не было бы префикса «#», го отладочное сообщение имело бы вид (если «Л» содержал 37): Last А = А = 37 Есть и другие префиксы-модификаторы, которые указывают, как должны выводигься данные. Модификатор «$» указывает, чго надо выводигь данные в шестнадцатеричном виде, «%» — it двоичном и «<<?» — в виде ASCH-символа.
424 Часть 6. Контроппер Basic Stamp фирмы Parallax Символы «сг» и «cis» начинают новую строку и очищают окно отладки соответственно. Если модификатор «#» отсутствует, то символ новой строки (перевод ка- ретки и сдвиг строки) посылается в окно отладки управляющего компьютера перед именем переменной и ее значением. Это может привести к неожидан- ному форматированию окна. Никакой команды перехода на новую строку после вывода значения не посылается кроме случая, когда непосредственно задан символ «сг». Разработанный мной эмулятор BS1, который описан в главе «Примеры приложений для Stamp», выполняет команду PBASIC BSI «debug» правиль- но. Вы можете «поиграть» с ним, чтобы посмотреть, как функция «debug» реализуется в различных случаях. Функция «debug» в контроллерах BS2 (команда 42.46) реализуется так же, как в BSI, но выводимые данные производи гея по-друюму из-за различий в организации памяти и обращении к ней. Вместо простых префиксов, исполь- зуемых командой «debug» ;ня BSI, в BS2 используются описательные пре- фиксы перед именем переменной: Префикс Параметр Описание asc? Byte Показывать ASCII символ переменной вместе с ее именем str Byte[\n| Вывести строку до символа нуля или «п» символов rep Valuc\n Вывести значение «н» раз dec| 1 -5| Value Вывести десятичное значение или конкретный десятичный разряд sdec|1-5| Value Вывести десятичное значение или конкретный десятичный разряд со знаком hex|1-5| Value Распечатать шестнадцатеричное значение или разряд. shex| 1 -5 ] Value Распечатать шестнадцатеричное значение или разряд со знаком. i | s| hex| 1 -5] Value Распечатать «$» перед шестнадцатеричным числом или разрядом. bin|1-4| value Распечатать двоичное число или разряд. sbin| 1 -16| value Распечатать двоичное число или разряд со знаком. i|s|bin| 1-161 value Распечатать «%» перед двоичным числом или разрядом. Если перед префиксом помещен символ «?», то в сообщение будет вклю- чено так же имя переменной, если оно имеется. Оператор «debug» для BS2 может содержать вместо отдельных переменных операторные выражения, например, «а + b / с», что может сделать вывод данных более удобным для пользователя.
Глава 42. Функции языка PBASIC для STAMP 425 В операторе «debug» для BS2 имеются также специальные управляющие символы: Строка Значение Описание cis 0 Очистить окно отладки home I Вернуть курсор в начальную позицию bell 7 Дагь звуковой сигнал из динамика ПК bksp S Стереть предыдущий символ tab 9 Перейти к следующей восьмисимвольной колонке c r I3 Новая строка Оператор «debug» не является способом общения е ПК или другим сипом терминала в процессе выполнения программы. Он не дает возможности по- сылать данные в работающий Stamp, поэтому все входящие данные могут быть только прочитаны редактором/компилятором/загрузчиком. Если кон- троллер Stamp должен связываться с управляющим им устройством, то надо использовать команды «Serin» и «Serout». Код операции: Не определено Команда: Debug var[,var...] Вывод на управляющий ПК Число командных циклов: Не определено Микроконтроллеры: BS1 Выполнение: Управляющий ПК < Сообщение Пример: Debug а Debug #а Debug #$а Debug #%а Debug #@а ; Вывести “А=", Значение ; Вывод без “А=” ; Вывод шестнадцатеричного числа ; Вывод двоичного числа ; Вывод ASCII-символа Комментарии: При выводе переменной вместе с меткой первым посылается символ новой строки Команда 42.45. Команда BS1 «debug var [, var..]»
426 Часть 6. Контроллер Basic Stamp фирмы Parallax Код операции: Не определено Команда: debug data[,data...] Вывод на управляющий ПК Число командных циклов: Не определено Микроконтроллеры: BS2 Выполнение: Управляющий ПК <- Сообщение Пример: Debug dec?a ; “А=" Значение Debug “А=”, Hex а ; “А=" Шестнадцатеричное значение Команда 42.46. Команда BS2 «debug var[, var..]»
глава 43 ПРИМЕРЫ ПРИМЕНЕНИЯ STAMP Краткое содержание Первое приложение для Stamp Приложение «часы/термометр» Эмулятор BS1 Для разраб»!ки приложений для BASIC Stamp, приведенных в этой книге, использовался набор для программирования «BASIC Stamp Programming Package» (Parallax P/N 27200) (рис. 43.1). Этот набор состоит из кабеля для программирования контроллера BSIC, кабеля для программирования контрол- лера BS2C и дискеты, содержащей программное обеспечение для программи- рования BSI (версия 2.0) и BS2 (версия 2.1), а также программное обеспече- ние для программирования PIC I6C58 на языке PBASIC. Для облегчения программирования я приобрел также несущие платы BSI-IC и BS2-IC Первое приложение для Stamp. Как и для других микроконтроллеров, в первом приложении я пытался зас- тавить мигать светодиод. Это можно легко сделать при помощи контроллера BSI и следующей программы на BASIC для Stamp. ' Первая программа для Stamp ' 10.05.97 - Мигание светодиода Dirs = %00000001 ' Только бит 0 работает на вывод Loop: Возврат в эту точку через каждую секунду
428 Часть 6. Контроллер Basic Stamp фирмы Parallax Pins = 1 PAUSE 500 Ждем 1/2 секунды до включения Pins = 0 PAUSE 500 Ждем 1/2 секунды до выключения светодиода goto Loop Вечный цикл Рис.43.1. Набор для программирования BASIC Stamp. Как видно, это программное обеспечение очень простое и может быть слегка улучшено, но оно является хорошим началом. Программа выключает светодиод, ждет полсскунды (PAUSE 500). включает светодиод и ждет дру- гие полсскунды, после чего возвращается к началу цикла и повторяет весь процесс сначала. На вывод 5 подается напряжение питания +5В (в обход ста- билизатора напряжения, встроенного в Stamp), шина «.земля» подключена к выводу 2. Комбинация резистора 220 Ом и светодиода подсоединена к выводу 7 (бит 0 порта ввода-вывода) и напряжению питания Vcc. Я обратил внимание на то, что поместив на макетную плату трехвывод- ной коннектор с шагом выводов 0,1 дюйма, подключенный к контактам 2,3 и 4 контроллера, я мог бы вполне обойтись без несущей платы. Изучив спе- цификацию на программирование контроллера BS2, я понял, что такой же результат можно получить, припаяв к нему вручную разъем D-9F. Как я уже говорил, в большинстве приложений вы действительно можете обойтись без макетных плат для Stamp, если включите в схему приложения 3-контак- тный I DC-разъем для BSI и 9-контактный D-разъем для BS2. С их помощью
Глава 43. Примеры применения Stamp 429 вы сможете программировать контроллеры Stamp непосредственно в систе- ме и исключить тем самым необходимость их удаления из макетной платы дл я и рограм м и рован и я. Когда эта программа заработала, я продолжил работать над «первым при- ложением», в котором светодиод мигал один раз в секунду: полсекунды вык- лючен и полсскунды включен. Используемая схема показана на рис 43.2. где светодиоды и кнопка подключены возможно дальше друг от друга, чго более удобно для выполнения монтажа. Vcc Vcc BS1C 1 14 I I I I I I "I I l“ | lilt Интерфейс программирования LED2 Рис. 43.2. Схема первого приложения для BASIC Stamp 1 В других микроконтроллерах задержка в 0.5 с .тая включения светодиода реализуется в обработчике прерывания. Так как в контроллерах Stamp вооб- ще нет прерываний, была использована переменная-счетчик е учетом того, что выполнение каждой строки программы занимает приблизительно 0.5 мс. Это значит, что для задержки в полсекунды должно быть выполнено I000 строк. На основе этого я написал программу: ‘ Вторая программа для Stamp ‘ 10.05.97 - Реализует мигание светодиода без команды Pause ‘ - Опрашивает состояние кнопки и использует его для ‘ зажигания второго светодиода Dirs = %00010001 ‘ Выводы 0 и 4 являются выходами symbol LED1 = PinO ‘ Работа с отдельным битом symbol LED2 = Pin4
430 Часть 6. Контроллер Basic Stamp фирмы Parallax symbol SW = Pin7 symbol i = W1 i = 0 Входной переключатель Определение счетчика Loop: ' Возврат в эту точку через каждую секунду LED2 = SW ' Передача состояния переключателя на ' светодиод i = i + 1 ' Инкремент счетчика IF i < 333 THEN Loop ' Цикл, пока не пройдет полсекунды LED1 = LED1 Л1 ' После ожидания 1/2с переключить светодиод i = 0 ' Сбросить счетчик goto Loop ' Вечный цикл Основной цикл «Loop:» содержит 3 команды. Поэтому цикл надо выпол- нить 333 раза, прежде чем мы получим необходимое количество повторений для изменения состояния вывода с подключенным светодиодом LEDI. Обра- тите внимание на то, чго я нс определял точно скорость работы этой про- граммы, просто такая задержка показалось мне нормальной, когда я первый раз тестировал это приложение. Когда кнопка нажата, входная линия (вывод 7) в этой схеме подключается к «земле», что непосредственно передается на светодиод LED2. Это наиболее простой способ передачи сигнала с входа на выход, Если сигнал должен быть проинвертирован, то в программный код можно ввести строку: LED2 = SW Л1. Приложение часы/термометр Реализация при помощи BASIC Stamp цифровых часов/термометра с ис- пользованием в качестве аппаратных средств ЖКИ и термодатчика DSI820 оказывается довольно сложной как для контроллеров BSI, так и для BS2. Хотя у меня не было возможности закончить это приложение, я все же опи- шу проблемы, которые при этом возникли, и приведу некоторые мысли по поводу их решения. Мне следов;по бы сказать, что моей первоначальной це- лью было создание этого приложения для BSI. Хотя я не смог выйти на уровень рс;п1>но работающего приложения, но мне все же удалось получить некоторые работающие фрагменты. Самой большой проблемой в этом приложении была связь с цифровым термометром DSI82O. Однопроводной интерфейс, используемый в DSI82O,
Глава 43. Примеры применения Stamp 431 вызвал некоторые проблемы при попытке соединить его со Stamp BSI или BS2. Это происходило из-за того, что требовалась сравнительно высокая ско- рость передачи данных. Чтобы передать единицу, нужен импульс длительностью меньше I5 мкс, а для передачи нуля ~ длительностью примерно ЗОмкс. Реализация импуль- сов такой длительности не является проблемой при соединении Stamp с DSI820, так как функция «pulsout» в BSI может формировать импульсы дли- тельностью от I0 мкс до 65 с. Проблема возникает, когда Stamp собирает- ся прочитать данные, поступающие от DSI820. Нет команды, выполняющей выдачу импульса одновременно с чтением данных, а реализация этой проце- дуры в виде отдельных команд не может быть выполнена менее чем за Юмкс, как требуется при работе с DSI820. Но я реализовал такой интерфейс при помощи схемы, показанной на рис.43.3. Рис. 43.3. Схема соединения Stamp с DS1820 Во время инициализации этой схемы команда «PinOut» устанавливает линию связи на работу в режиме вывода «О», а команда <. Pin In» просто остав- ляет ее в режиме ввода. После выдачи импульса длительностью I0 мкс D- триггер в этой схеме сохраняет значение сигнала, которое было на линии 20 мкс назад. Итак, если на этой линии термодатчик DSI820 поддерживает низ- кий уровень, он будет сохранен в D-триггере. Задержка в 20 мкс реализуется при помощи 6 последовательно соединенных инверторов 74НС04, которые задерживают сигнал, поступающий от Stamp. Для вывода данных я написал следующую подпрограмму: DSSend: Поспать байт на DS1820 Count = 8 ' Поспать 8 бит DSS Loop: Temp = А & 1 Возврат сюда для каждого бита Получить младший бит
432 Часть 6. Контроллер Basic Stamp фирмы Parallax А = А / 2 Разделить “А» на 2, чтобы if Temp = 0 then DSS Zero pulsout PinOut, 10 goto DSS_Skip DSSZero: pulsout PinOut, 30 получить следующий бит Если ноль - послать ноль 1 - посылаем импульс в 10мкс ' Послать нуль ' 0 - послать импульс в ЗОмкс DSS Skip: Count = Count - 1 if Count > 0 then DSS Loop ' Повторить цикл 8 раз return ' Возврат к месту вызова Для того чтобы прочитать байт, исполыустся похожий, но более простой код: DSRead: Count = 8 DSR_Loop: А = А / 2 pulsout PinOut, 10 А = Pinln * $80 + А Прочитать 8 бит с DS1820 Читать 8 бит А = 0 Очистить регистр приема ' Возврат сюда для каждого бита ' Сдвинуть биты вниз ' Инициировать чтение бита ' Сохранить прочитанный бит на месте старшего Count = Count - 1 if Count > 0 then DSR Loop ' Читать 8 бит return ' Возврат к месту вызова В этом коде используется то преимущество порядка выполнения операций в PBASIC, что все операции выполняются слева направо. При написании программы DSRead на другом языке я бы использовал при чтении бита сле- дующее выражение: А = А + (Pinln * $80) так как его легко понять с первого взгляда. В этой строке поступивший бит Pin In записывается на место бита 7, прежде чем добавить его к прочитанно- му значению переменной. Сигнал сброса через каждые 500 мкс может быть получен при данной аппаратной реализации при помощи команды: pulsout PinOut, 500 Такая программа приводит к возникновению проблем в контроллерах BSI, использующих значительное число вызовов подпрограмм «gosub», так как допускается не более I6 таких операторов. В основной программе для чтения
Глава 43. Примеры применения Stamp 433 значения температуры будет использоваться по меньшей мере 6 операторов «gosub» — для посылки $СС $44 и затем $СС $ВЕ перед чтением регистров SP0 и SP1. Если поискать, то можно найти в Интернет другие варианты интерфейса DS1820 со Stamp. Следующая проблема, которую приходится решать заключается в интер- фейсе с ЖКИ. Хотя я мог бы использовать 3-, 6- или 10-контактные интер- фейсы (для 10-контактного пришлось бы использовать BS2), лучше работать с ЖКИ, имеющими последовательный интерфейс, которые будут занимать только одну линию ввода-вывода Stamp. На рынке сейчас представлено дос- таточно много таких ЖКИ. Можно, например, посмотреть ЖКИ с последо- вательным интерфейсом фирмы Wirz Electronics на сайте http://www/wirz.com — это одни из самых недорогих и полнофункциональных устройств такого типа из имеющихся на рынке. Последняя проблема была связана с определением времени. Как я нео- днократно отмечал, контроллер Stamp не может использоваться для реали- зации точных временных задержек. Это значит, что к нему необходимо под- ключать внешние часы реального времени, например, я пытался использовать микросхему DS1307. Если проблемы были определены, и варианты кода написаны, то почему же не было реализовано все приложение целиком? Причина состояла в юм, что я не смог заставить все это работать вместе на BS1, а затем мне не удалось адаптировать приложение для работы на BS2. Хотя мне не удалось получить работающее приложение, я пришел к ново- му взгляду на перспективы применения Stamp. Но моему мнению, контрол- лер Stamp не является игрушкой или инструментом обучения. Он может очень эффективно использоваться как инструмент исследования при разрабозке приложений. Если вы испытываете новое приложение или хотите ревизо- вать интерфейс с новым устройством, то я рекомендую использовать BASIC Stamp. Простота программирования, быстрая компиляция и загрузка явля- ются настоящей находкой для разработчика. Если вы собираетесь использо- вать Stamp как инструмент исследования, го никозда не забывайте включать схему для его программирования как часть приложения. Это необходимо, чтобы иметз> (возможность быстро обновлять прозрамму. не удаляя Stamp из схемы приложения каждый раз. когда вы захотите попробовать новый вари- ант кода. Эмулятор BS1 Для меня одним из наиболее интересных проектозз для любого микроконт- роллера является создание его эмулятора (рис. 43.4). Я смог создать езо для микроконтроллер;! PIC, и хотел сделать что-нибудь похожее для этой книги. Когда я занимался описанием BASIC Stamp, то понял, что BSI может быть отличным устройством для создания его эмулятора. Имелся ряд особенностей is контроллере BS1, которые мне хотелось лучше понять, н создание эмуля- тора показалось мне отличным способом для этого. 28 Зак. 2025.
434 Часть 6. Контроппер Basic Stamp фирмы Parallax Рис. 43.4. Плата эмулятора BS1 (с контроллером BS2 на плате). Рис. 43.5. Схема эмулятора для контроллера BASIC Stamp 1. В качестве эмулирующего устройства я выбрал контроллер BS2 и создал схему эмулятора, показанную на рис. 43.5. Эта схема предоставляет интер- фейс RS-232 для программирования контроллера и обеспечения его работы с управляющим ПК. Данное решение представляется хорошим способом ре- шения этих задач, так как контроллер BS2, используемый как эмулятор, может репрограммироваться непосредственно в схеме без его удаления из нее. Включение светодиода реализовано таким образом, чтобы обеспечить его мигание, когда эмулятор не работает с управляющей программой ПК. Я
Глава 43. Примеры применения Stamp 435 разработал простую печатную плату, на которой была смонтирована схема эмулятора (см. рис. 43.4). Эта схема может быть легко соединена с вашей мон- тажной платой для выполнения макетирования. Управляющий ПК выполняет программу эмуляции иг командной строки DOS и загружает команды ввода-вывода для контроллера BS2, включенного в схему эмулятора. Вместе с выводом текста программы и предоставлением вам окна с содержимым регистров на экране может быть показан результа! текущей функции отладки «debug». В настоящий момент программа эмулято- ра «BSEMU.EXE» поддерживает только пошаговое выполнение программы (рис. 43.6). Рис. 43.6. Вид экрана эмулятора BSEML) Эмулятор BSEMU поддерживает операторы присваивания, не использу- ющие обращения к отдельным линиям ввода-вывода, хотя побайтовый ввод- вывод реализуется, а также полностью поддерживает функции BS) «debug», «end», «goto», «gosub», «return», «if», «branch», «for» и «next». Я использовал эмулятор как средство изучения работы этих функции. Когда я понял, как выполняются основные функции, освоение остальных операций не вызвало ка ких-л ибо затруднен и й. Устройство, которое здесь описано, на самом деле является симулято- ром PBASIC с аппаратным интерфейсом ввода-вывода. Этот аппаратный ин- терфейс работает, как работает адаптер J1CS для микроконтроллера 68HC05J1A. Интересные аспекты приложения связаны с интерфейсом управ- ляющего ПК с контроллером BS2. Мне хотелось иметь, как можно более быстрый и устойчивый интерфейс, который позволял бы определять нару- шение соединения контроллера с ПК и разрешать эмулятору BSEML) про- должать работу при восстановлении соединения. В целом я достиг этой цели.
436 Часть 6. Контроллер Basic Stamp фирмы Parallax Однако если вы запустите программу BSEMU.EXE в то время, когда в BS2 не загружено соответствующее программное обеспечение, то не сможете получить доступ к эмулятору, и на некоторых ПК. работающих под Windows/ 95, выполнение программы блокируется, если эмулятор отсутствует при за пуске программы. Интерфейс между ПК и BS2 я считаю настоящей «изюминкой» приложе- ния. Вернув(((пс!> на гад к странице, где приведена схема BS2. вы увидите, что в ней используется интерфейс RS-232. выполненный на одном транзисторе с двумя резисторами, в котором отрицательный уровень поступающего вход- ного сигнала используется в качестве отрицательного уровня для выходного сигнала. В этой схеме все. чго передаезся компьютером, возвращается к нему как «эхо». Когда я вызываю BS2. то посылаю ему символ S0FF на скорости 9600 опт/ с и смотрю, что возвращается (если вообще возвращается). Если BS2 рабогаез праззильно. то он будет опрашзпзать сззой ззывод 16 (последовательный порт) с частотой 76800 бит/с. Если через этот порт передается данный символ, то кон- троллер BS2 отвечает компьютеру, «подтягивая» выходной сигнал к «0». что меняет значение зхо-ешнала. возвращаемого на ПК (рис. 43.7). "Подтягивается" к “земле" эмулятором Уровенз, цифрового сигнала при последователь- ном обмене Обработка символа Отклик Старт- бит контроллером BS2 Стоп-бит Рис. 43.7. Процедура вызова эмупятора BASIC Stamp 1 Эго похоже на подключение последовательно!ч> приемника управляюще- го ПК к шине с использованием «монтажною И». Если BS2 подключен к шине и нормально работает, го ПК будез получазз. символы, озличающпеея оз того, который он посылал. Эго позволяет ПК определять, подсоединен ли BS2 к последовательной линии и находится ли он во включенном и рабозаю- щем сосзояиии. В эзом ||рнложе1знз1 я вызываю BS2 каждые IS.2 мс по прерыванию таймера часов реальною времени ПК. Программа, загруженная в BS2. по- стоянно ожидает прихода данных по носледовазельному порту и отвечает на лих подключением линии к «земле». Если программное обеспечение ПК не обнаружит этою ответа. оно выводит зз нравом верхнем углу экрана символ «X» красною цвета. Если все работает ззравн.зьно. го показывается белая стрел- ка. направленная вверх. Используя такой протокол, я могу читан, и писан, в BS2 в зечезнзе примерно 5 мс, чго несколько медленнее гоп скорое из. на которой способен
Главе 43. Примеры применения Stamp 437 работать BS). Но это не очень существенно для большинства приложений, а высокая скорость ПК при обработке данных с лихвой компенсирует эту за- держку. Файл «SERIAL.ASM» в поддиректории «\Stamp\BSM EN U» на прилагае- мом CD-ROM — это ассемблерный код для микроконтроллера 8086, который используется, чтобы обеспечить связь ПК с BS2. Это типичный пример моего программирования на Ассемблере для 8086, и я приношу извинения, если он сложен ;ыя понимания. При записи и чтении данных с линий ввода-выво- да я должен был ввести некоторые задержки, которые реализуются путем посылки символов при работе последовательного порта в режиме «loop», чтобы гарантировать, что BS2 имеет достаточно времени для обработки информа- ции, необходимой для выполнения команды. В настоящее время, разработанное программное обеспечение находится на начальном уровне: как я говорил, это приложение на самом деле исполь- зовалось ;гтя того, чтобы помочь мне понять и описать, как реализуются функции PBASIC в контроллере BS). Пока у меня нет планов по развитию этого программного обеспечения, но если появятся какие-либо заказы на такие разработки, то я готов провести работу но расширению функциональ- ных возможностей эмулятора. В процессе развития эмуля гора «BSEM U» следует решить следующие воп- росы: 1. Рассмотреть возможное,ь замены BS2 на PIC. В этом случае эмулятор бу- дет aeiiieiuie, и будут реализованы некоторые функции (особенно функ- ция «pot»), которые не могут работать с BS2. 2. Найти причину, по которой код «BSEMU» на ПК блокируется при запус- ке из командной строки DOS в Windows/95, если контроллер BS2 не под- ключен. 3. Модернизировать программу ПК «BSEMU», чтобы дать возможность при- ложению работать на полной скорости, а также обеспечить возможность введения контрольных точек останова.
глава 44 ЗАКЛЮЧЕНИЕ ПО КОНТРОЛЛЕРАМ STAMP Краткое содержание Информационная поддержка контроллеров BASIC Stamp Web-еай i ы Ивформационвые серверы Компании-производители Koi11 роллеры BASIC Slump компании Parallax являются отличным средством д 1я первою знакомства е микроконтроллерами Учитывая простоту языка про, раммировапия и ;ici кость использования, я могу рекомендовать их для обучения студентов ВУЗов основам npoiраммировавия и opiann зании aoisi- ческого интерфейса. Множество доступных приложении и средеiв по.цержки проектирования, доступных для Stamp. предоставляют по.лыовалелям ши- рокий диапазон исходных решений и примеров iipoi рамм. Тремя наиболее серьезными всдоскиками. коюрые проявляются при использовании Stamp для реализации сложных приложении. являкнся нео- пределенное время выполнения команд, oicyiciBiie приоригетосги при про- । раммировапии операций и oicyrciime прерывании. Как показано в приме- рах. екоростз> выполнения команд равна в среднем 2000 строк в секунду для Stamp I si 4000 строк в секунду для Stamp 2. но. как было сказано, время выполнения вашей программы может быть различной. Orcy i ci вне приориге- ia при 11 poi рам мирона вин операции може, с i a i в проблемой, если вы ранее npoiраммировали на традиционных языках, коюрые компилируют опера- ции в заранее определенном порядке. Ни одна из лих проблем не является серьезной, во ac.iaci заключи тельный лап работы более сложным. |ребую- П131М более |.1убокой отладки si «патронки» приложения. Я зык ।ipoi раммировапия может пока за, вся довольно примз, i ивпым по ряду причин: отсутствие массивов в качеензе возможных шпон данных для BSI.
Глава 44. Заключение по контроллерам Stamp 439 вычисление выражении ciena направо. oscytctissie символьной омадки и воi- можности поташною выполнения. Но он является хорошим средством .шя начальною знакомства с программированием микроконтроллеров и разрабог- кой приложений. Простога языка является определенным плюсом, ык как она позволяет довольно быстро и просто разрабатывать и проверягь свои идеи. Кои।роллеры Stamp имеют некоторые существенные преимущества для разрабзики приложений. Они спроецированы гакпм образом. чю явля- Ю1ся BityipucHcteMHo программируемыми и требуют только одною источни- ка пзнавия напряжением 15В, который можег быть реализован на батарей- ке, полому Moiyr легко вс граи ваться в приложение, fine одним преимуществом. о котором я не упоминал ранее, является высокая скорость рабопя компилятора PBASIC и скорость загрузки. У вас не возникветбеспо- койства и ।-за ioio, чю надо долю ждать, пока Stamp буде| загружен; про- [раммные средств;! разработки Parallax работают очень быстро и прсирамми- руюг Stamp за очень короткое время. Хотя по сравнению с другими микроконтроллерами, описанными в пои кише. Stamp имеет иекоюрые недостатки по части скорости рабопя и возмож- ностей ввода-вывода, он не яычяется просто игрушкой. Я был поражен большим количсспзом серьезных проектов, реализованных (за нем. чю действительно подтверждает возможность его использования в качестве рабочею инструмента. Ec.ni вы сомневаетесь в юм. чго Stamp не яюгяегся только игрушкой ii.hi сред- cibom ,ыя обучения, го вы можете посмотрен, <(’пипок приложений тля Siamp» («List of Stamp Applications L.O.S.A.») и увзыспь, чю уже редти зогзано на BASIC Stamp. Я думаю, вы будете удивлены тем. что он может сделан.. Информационная поддержка контроллеров BASIC Stamp Наравне с моими традиционными источниками информации no Stamp вы также можете проема г рива гз, ежемесячную колонку «Stamp Applications» в журнале «Nuts and Volts» (действительно. Stamp — единствеззныи микрокон- троллер. который имеет посвященную ему ежемесячную колонку). Руковод- ства no Stamp, в которых есть много заметок но применению (Application notes), показывающих, как организовать сопряжение Stamp с множеством различных устройств, гакже являются отличным источником идей по орга- низации ин । ерз|>ейса. которзяй вы можете испо.тьзова гь. WEB-сайты http://www/parallaxinc.com Руководства по Stamp и средства разработки Адреса дистрибьюторов и другие ссылки http://\vm\\ radioshack. com/sw/swb Страница BASIC Stamp на Radio Shack Примеры приложений
440 Часть 6. Контроллер Basic Stamp фирмы Parallax Некоторые вопросы и ответы h tip .//в’ ww.hth.c -om/los а. сот «Список приложений для Stamp» (L.O.S.A.) Описание того, что реализовано на Stamp другими разработчиками (с ука ганием их контактных адресов) Вотможность сообщить другим людям, что сделано нами http://www. alhany. net/ ~pjmac/st<imp Список приложений для Stamp, которые можно найш Информационные серверы Компания Parallax поддерживает очень активный информационным сервер по BASIC Stamp. Для того, чтобы подписаться на не, о. клише на WEB-сайт компании Parallax (http://wmv.par(ill(ixinc.comi. переидпге на стра- ницу < links» и следуйте представленной на ней информации для подписки на список. Компания - производитель Parallax. Inc. 3SO5 Atherton Road. Suite 102 Rocklin. CA 967651 (SSS)S I 2-1 204 или (9 16)624-5333 Tax.(916)624-5003 email inf'or «2 parallaxiiic.com j jwww para I lax inc. com
Часть ЗАКЛЮЧЕНИЕ
глава 45 ПОСЛЕСЛОВИЕ Я надеюсь, что эта книга может быть полезной при решении вопроса, какой микроконтроллер является наилучшим для реализации нашего приложения. В книге я постарался описать основные особенноеi и аппаратных средств и про- цессорной архитектуры, а также отметить преимущества и педосчагки каж- дого микроконтроллера. Я также постарался ука зать источники информации, которые помогут вам при разработке ваших приложений. Начиная писать эту книгу, я думал, что будет тнересно onucaib. каким мне представляется «идеальный» S-разрядныи микроконзроллер. Это пред- ставление я собирался использовать как стандарт для сравнения с друтими микроконтроллерами, описанными в этой книге. Я знал, чю мне придется провести сравни тельный анализ пяти существенно различных процессорных архитектур, имеющих множество разнообразных периферийных устройств для реализации ввода-вывода, и я хотел посмотреть, какая из этих архитектур наиболее близка к идеальной. Потратив несколько недель для решения этой проблемы, я пришел к некоторым интересным выводам. Я надеялся, что можно создать микроконтроллер, который будет легко программироваться на ассемблере и языках высокою уровня, иметь простую архитектуру, содержать быстродействующую память и периферийные рет Пе- тры ввода-вывода. Но по истечении трех недель работы я обнаружил, что для достижения определенных характеристик микроконтроллера приходится вво- дить ограничения на другие его параметры. Результатом проведенного анали- за были 30 страниц описания микроконтроллера, характеристики которого позволяли эффективно реализовать определенные приложения. Однако этот микроконтроллер может оказаться неэффективным для решения других за- дач. которые встречаются на практике. Я хочу отметить некоторые черты, которыми должен обладать высокоэф- фективный микроконтроллер: универсальный таймер, который может рабо- тать в различных режимах без существенного участия процессора: обеспече- ние маскирования прерывания с помощью одною бига команды; выполнение любой команды за один командный никл независимо от хода программы;
Глава 45. Послесловие 443 наличие области стека. иено.тьтуемои для быстрого переключения задач в гарнардскон архитектуре. Реализация всех этих идеи яв.тяося очень полет- ной. но oi раничивающим фактором является отсутствие процессорной ар- хитектуры. которая нотво.тяег при любых обстоятельствах от,тстро и сотласо- ванпо обращаться к периферийным регистрам, памяти про,рамм и данных. Завершая написание ттон книги, я мог вернуться обратно и оценить ре- туль।а 11.1 проведенною ана.нт та с учетом приобретенною oin.ua и шанпй. а также ука тать, какие характеристики рассмотрепных микрокошро т 1сровбы.то бы целесообра тио утучищт ь. Ока та.тось. что в каждом микроконтроллере можно выявить опреле.тенит,те особенноети. которые потволяют некоторым прило- жениям вы пол ня । вся очень бы с гро и бы гь лет кими .тля т трот рамм пронация. в то время как реал и та ни я других приложений будет менее тффек т ивнои. Все >то подтверждает таключение. сделанное в данной книге нет такою процессора или ттроцессорттой архитектуры, которые были бт.т паи тучтинмп .гтя любых приложении. В многочисленных примерах приложении и протрамм- ных кодов вы можете увидеть, чго различные фрат менты нрот рамм окатыва- ются исключительно тффективными .гтя одних микроконтроллеров и очень медленными и ipy.iHi.iMii для реализации надрутих микрокон троллерах. В моей кн ти с’ «Прот рам ми рован не и применение микроконт ро тлеров 1’1 С» я просил чнгате.'тен присылать своп вопросы и тамечаттия на соответствую- щий информационный сервер. В гтой кните я также прошу вас направлять вопросы и тамечання тта еоогвегентуютние информационные серверы. Ваши вопросы моту । помочь лрут им нольтователям. Я надеюсь услышать о ваших достижениях и увиден,, что нам уда тост, ре- а.ти тован. при ра тработке собственных микроконтроллерных приложении. Майк Предка ( 1/гАе Predka)
ПРИЛОЖЕНИЕ А СРАВНИТЕЛЬНАЯ ТАБЛИЦА ХАРАКТЕРИСТИК МИКРОКОНТРОЛЛЕРОВ Тип Семейство Произ- води- тель Память программ/ данных Тактовая частота Число вводов- выводов Дополнительные устройства 80С31 8051 Intel 0 K/128 0,5-12 МГц 14 ПР/ТМР/ пвв/вп 80С51 8051 Intel 4 K/128 3,5-20 МГц 32 ПР/ТМР/ПВВ/ВП AT89S2051 8051 Atmel 2 K/128 0-24 МГц 15 ПР/ТМР/ПВВ/АК/ФП DS80C310 8051/HSM Dal.Semi. 0 K/256 0-36 МГц 14 ПР/ТМР/ПВВ/ВП DS87C520 8051/HSM Dal.Semi. 16 K/256 0-33 МГц 32 ПР/ТМР/ПВВ/ВП DS500 8051/Secure Dal.Semi. 0 K/256 0-16 МГц 32 ПР/ТМР/ПВВ/ИВС 68HC05BD 68НС05 Motorola 3,75 К /128-256 0-4 МГц 24 ПР/ТМР/ПВВ/ИВС 68НС05Сх 68НС05 Motorola 0-16 К /176-512 0-4 МГц 18 - 29 ПР/ТМР/ПВВ 68НС05СС 68НС05 Motorola 16 К-31,5 К/544-928 0-4 МГц 31 ПР/ТМР/ИВС 68НС05Е 68НС05 Motorola 4 К-16 К/128-368 0-4 МГц 20 - 47 ПР/ТМР/ПВВ/СТЧ 68HC05G 68НС05 Motorola 8 К-32 К/176-1024 0-4 МГц 40 - 48 ПР/ТМР/ПВВ/ШИМ 68HC05J 68НС05 Motorola 0,5 К-2 К/3-128 0-4 МГц 10 - 14 ПР/ТМР 68HC05L 68НС05 Motorola 4 К-16 К/128-512 0-4 МГц 34 - 39 ПР/ТМР/ЖКИ 68НС05МС 68НС05 Motorola 3,5 К/176 0-4 МГц 22 ПР/ТМР/ШИМ 12С5хх PIC / L Microchip 512-1024 слов/25-41 0-4 МГц 3-6 ТМР/ВСП/КП 16С5х PIC / L Microchip 384-2 К слов/25-73 0-20 МГц 12 - 20 ТМР 16С55х PIC/ M Microchip 512-2 К слов/80-128 0-20 МГц 13 ТМР/ВСП/ПР 16С62х PIC/ M Microchip 512-2 К слов/80-128 0-20 МГц 13 ТМР/ВСП/ПР/АК
446 Приложение А Тип Семейство Произ- води- тель Память программ/ данных Тактовая частота Число вводов- выводов Дополнительные устройства 16С6х PIC/ М Microchip 2 K-8K слов/128-368 0-20 МГц 22 - 33 ТМР/ВСП/ПВВ/КП 16С7х PIC/ м Microchip 512-8 К слов/128-368 0-20 МГц 13 - 33 ТМР/ВСПДП, ПР, АЦП 16F84 PIC/ м Microchip 1К слов/68 0-20 МГц 13 ТМР/ВСП/ФП 16С9хх PIC/ м Microchip 4К слов/176 0-8 МГц 52 ТМР/ВСП/ПР. пвв/жки 17Схх PIC/ н Microchip 2 К-6 К слов/ 0-33 МГц 33 ТМР/ПР/ВП 1200 AVR / L Atmel 512 слов/32 0-16 МГц 15 ТМР/ВСП,Т1Р/ПВВ/АК,ФП 8515 AVR / F Atmel 4 К слов/544 0-16 МГц 32 ТМР/ВСП/ПР/ПВВ/АК/ ФП/ВП BS1 Basic Stamp Parallax 256/12 8 ТМР/ВСП'ПВВ,АЦП Использованные сокращения: P1C/L. Р1С/М. Р1С/Н — младшие, средние и старшие модели микроконт- роллеров PICinicro; AVR/L. AVR/F - младшие и старшие модели микроконтроллеров AVR; АЦП — аналого-цифровой преобразователь; КП контроль питания (отключение при пониженном напряжении пита- ния); АК — аиалоюный компаратор; ВП - возможность подключения внешней памяти: ФП — флэш-память программ / данных; ПР — обработка прерываний; ВСП — внутрисистемное программирование (1SP); ЖКИ — контроллер ЖКИ; СТЧ — синтезатор тактовой частоты (PLL); ШИМ - широтно-импульсный модулятор (PWM); ПВВ — последовательный ввод-вывод данных; ИВС — интерфейс видеосигналов: ТМР - laiiMcp.
ПРИЛОЖЕНИЕ в ИСТОЧНИКИ ИНФОРМАЦИИ По ходу изложения я дивил в лой книге указания на мои любимые Web — сайты но различной продукции, а также информацию для контакта с многочисленными про- и зводителями микроконтроллеров. Прежде чем закончить книгу, я хочу предоставил» сведения о ряде других сайтов, источниках информации и компаниях - производите- лях. которые могут вам помочь. Пожалуйста, имейте в виду, что ли адреса - почто- вые. электронные и Web. могут изменяться без уведомления. КОНТАКТ С АВТОРОМ Со мной можно свя заться. послав сообщение по адресу emailmeVmyke.com или посе- тив мой Web —сайт: http://www.myke.com Но, как я отмечал ранее, для обсуждения технических вопросов и предложений лучше коитактироззать со мной через соответствующий информационный сервер, чтобы эта информация была доступна для более широкой аулиюрии. ПЕРИОДИЧЕСКИЕ ИЗДАНИЯ Имеется ряд журналов, в которых даегея большое количешво ин(|х>рмании по микро- контроллерам. Ежемесячно зз каждом журнале с вероятностью йО'г можно найти опи- сание хотя бы одною применения микроконтроллеров. Circuit Cellar Ink Адрес подписки. P.O. Box 69/ Holmes. PA 1 (800)269-6301 Web-сайт: hilp://www.cireellar.com/ BBS: (860)871 -1988 Издательство Gernsback Publication Electronics Now Poptilai' Electronics Адрес подписки- Subseri pion Dcparlamenl
448 Приложение В P.O Box 55115 Boulder, CO 1(800)999-7139 Web-сайт: littp://www.gernsback.com Microcontroller Journal Web-сайт: http://mejournal.com/ Публикуется на Web. Niits&Volts Адрес подписки: 430 Princeland Court Corona. CA 91719 I (SOO) 7S.3-4624 Wcb-сай r: http://www7nutsvolts.com Everyday Practical Electronics Адрес подписки: FPF Subscription Department Allen House, East Borough Wimborne. Dorset BH2I 1PF United Kingdom 144 (0) 1202 SSI749 Web-сайт: http://www/epcmag.wimborne.eo.uk WEB-САЙТЫ И ИСТОЧНИКИ ПОЛЕЗНОЙ ИНФОРМАЦИИ Хотя mil источники имеют очень мало микроконтроллерной специфики, однако они содержат ряд идей, снедений и средств, которые делают paC'oty с микроконтроллера- ми легче и интереснее. HOWARD H.SAMS AND COMPANY INTERNET GUIDE TO THE ELECTRONICS INDUSTRY Wcb-евй r: http://pobox.com/ 'electronics/ Основной учебник по электронике для начинающих, представленный в Интер- нет. который содержит также растет. описывающий реали кшию раиичных элект- ронных устройств с применением микроконтроллеров PIC. SEATTLE ROBOTICS SOCIETY Web-сайт: http://www.hlihh.org/srs/ Компания Seattle Robotics Society нредос1ак1яег много информации no реали lattnn интерфейса цифровых систем с такими внешними устройствами, как моторы, датчи- ки, серводвигатели. 'Jia компания протводиг 1акже много очень интересных тделий. ADOBE PDE VIEWER Web-сайг: http://www.adobe.coni Формат pdf-файлоп компании Adobe iterio.it>iyeгея фирмами Microchip. Parallax и большинством других для представления справочных данных и примеров применения
Источники информации 449 «PKZIP» and «PKUNZIP» Web-сайт: http://www.pkwarc.coni Формат сжатых файлов «zip» компании PKWare является стандартным для объе- динения и сжатия данных при их передаче. HARDWARE FAQs Web-сайт: http://paranoja.coni/~fili pg/HTML/LlNK/Ll NK_IN.htm I Множество часто встречающихся вопросов (FAQs— frequently asked questions) по персональным компьютерам и другим аппаратным средствам, которые будут полезны при реализации интерфейса микроконтроллеров с управляющим ПК. HTTP://WWW.INNOVATUS.COM Компания Innovattis сделала доступным PICBots - интересный симулятор для PlCMicro, который позволяет писать программы для виртуальных роботов, которые борются между собой. TOWER HOBBIES Прекрасный источник информации по сервоприводам и RC-схемам, которые ис- пользуются при конструировании моделей роботов. Tower Hobbies P/О/ Box 9078 Champaign, IL 61826-9078 Бесплатный заказ в США и Канаде: 1(800)637-4989 Бесплатный факс в США и Канаде: 1(800)637-7303 Бесплатная поддержка в США и Канаде: 1(800)637-6050 Телефон: (217)398-3636 Факс: (217)356-6608 E-mail: orders@towe rhobbies.com http://www.towerhobbies.com/ MONDO-TRONICS ROBOTICS STORE Самая большая в мире коллекция миниатюрных роботов и деталей .ия них. Пре.ъзага- ется большой выбор сервоприводов, движущихся моделей и роботов-манипуляторов. Стол заказов: Mondo-Tronics Inc. 524 San Anselmo Ave# 107-13 San Anselmo, CA 94960 Бесплатно в США и Канаде: 1(800)374-5764 Факс: (415)455-9333 http://www.robotstore.coni/ КОНСУЛЬТАНТЫ И ПОСТАВЩИКИ ПРОДУКЦИИ Имеется ряд компаний, которые продают микроконтроллерную продукцию и обеспе- чивают консультационное обслуживание. Не описывая подробно представляемые ими 29 Зак. 2025.
450 Приложение В продукцию и услуги, я попытался подчеркнуть, на чем специализируется каждая ком- пания. Многие из этих компаний активно представлены на информационных серверах. Я думаю, вы будете удивлены, как широка география размещения этих компаний — мир действительно становится тесным. AWC Компания AWC предлагает не требующие пайки макетные платы, специально спро- ектированные на основе Basic Stamp. Р1С и других микроконтроллеров. Больше не требуется пайка и жгуты проводников! Обращайтесь скорее - обеспечивается практи- ческое изучение микроконтроллеров и предлагаются программаторы, которые имеют интерфейс с макетной платой. 310 IVY Glen Court League City. TX 77573 (281) 334-4341 Факс: (281) 334-4341 E-mail: stamps@al-will iams.com http://www.al-williams.com/awce.htm BYTE CRAFT LIMITED Компания Byte Craft производит программные средства для разработки систем на базе 8-разрядных микроконтроллеров. Эта компания является лидером в разработке и поставке средств проектирования для различных архитектур и создании новых реше- ний :ыя разработчиков, производителей и консультантов. В состав продукции компа- нии Byte Craft входят ассемблеры, С-компиляторы и предварительные процессоры (препроцессоры) .тля реализации нечеткой логики. 421 King Street North Waterloo, Ontario, Canada N2J 4E4 Телефон: (519)888-6911 Факс: (519)746-6751 E-mail: info@bytecraft.com http://www.bytecraft.com BROUHAHA COMPUTER MERCENARY SERVICES Консультации по проектированию встраиваемых систем. Несколько проектов на базе микроконтроллеров PIC доступны пользователям на их Web-сайте. 142 North Milpitas Boulevard. Suite 379 Milpitas. CA 95035 Телефон: (408)263-3894 http://www.brotihaha.com/~eric/pic/ CINEMATRONICS Консультанты, которые специализируются на разработке и производстве электрон- ных приборов для кино- и фотопромышленноети, индустрии развлечений. Заказное проектирование систем управления освещением, устройств управления движением и
Источники информации 451 электронных устройств дистанционного управления. Компания Cincmatronics разра- батывает также электронные устройства для бытовой электроники на базе микрокон- троллеров PIC. 344 Dupont st.. Suite 304 Toronto, Ontario, Canada M5R IV9 Телефон: (4I6) 927-7679 Факс: (4I6) 927-7679 E-mail: cinetron@passport.ca DECADE ENGINEERING (Контакт: Муке Hardwick) Компания Decade Engineering предлагает недорогие платы для систем принудительной синхронизации (наложения видеосимволов), платы для обработки изображений, и обеспечивает консультации по разработке небольших си- стем. Активно поддерживаются семейства микроконтроллеров PIC, AVR, 8051, ис- пользуя Ассемблер, языки Forth, BASIC и С. Компания осуществляет также проекти- рование аналоговых и цифровых устройств, программирование, разработку печатных плат и монтаж макетов устройств. 5504 Vai View Dr.SE Turner, OR 97392-9517 (503) 743 3I94 Факс: (503) 743 2095 E-mail: decade@worldnct att.net http://www.decadenet.com DONOTRONICS Набор DIY PCB содержит устройства, реализованные на базе микроконтроллеров PIC компании Microchip Technology, FED и MEL компиляторы с языка Basic для PIC, FED интерпретатор языка BASIC для PIC, С-компилятор CCS, руководство для начинающих «Square I Electronics Easy PIC», программатор для PIC DonTronics DT.00I, журнал «Nuts and Volts», книгу и диск Скотта Эдвардса «PIC Sourcebook», плата SimmStick компании SiStudio, интерфейс SLI-VCD компании Wirtz Electronics и эму- лятор для 18-выводных микроконтроллеров PIC типа Emu PIC. P.O. Box 595 Tullamarine 3043 Australia Телефон: 61319338-6286 Факс: 61319338-2935 E-mail: don@dontronics.com http://www/dontronics.com ENGENHARIA MESTRA DE SISTEMAS Продукция: коммутаторы телефонных линий - от обычных моделей, представленных на рынке, до устройств, спроектированных по специальному заказу. Представляется также продукция компании Linear Corporation, Бразилия.
452 Приложение В STX — система мониторинга сигнала (панель сигнализации и приемник для 10 000 панелей). ST1 — система мониторинга возгорания (аналогична предыдущей), SSD — коммуникационное устройство для связи панели DF-16 компании Linear с описанным выше приемником. ALARMPHONE — система мониторинга запроса (панель и приемник на 1 ООО 000 панелей). LGP — система коммуникации для компаний, доставляющих товары. Обслуживание: общие консультации по микропроцессорным усчройствам Заказное проектирование устройств на базе микроконтроллеров Atmel и BASIC Stamps. Опера- тивная разработка спецификаций и документации (управление обращением и др.) Rua Guaiauna. 439 - Penha Sao Paulo - SP - Brazil 04531-020 55-1 1-218.6610 Факс: 55-1 1-217.6610 E-mail: pdninnnond@ibni.net FAST FORWARD ENGINEERING Разработка заказных изделий на базе микроконтроллеров Р1С. специализация в обла- сти радиосистем, высококачественной бьповой техники, автомобильной электрони- ки, дистанционного управления и телеметрии. Обеспечивает создание программного обеспечения, а также полное выполнение проектов от начала до конца. Предоставляет услуги по обучению и консультации. Компания сертифицирована фирмой Microcltip как участник их консультацион- ной программы. Поддерживает также микроконтроллеры PIC. Motorola 68НС05/НС08 и 8051. 1984 Casablanka Court Vista, СА 92083-5043 Телефон: (760)598-0200 Факс: (760)598-2950 E-mail: fastfwd@ix.netcom.com It ttp://www. geoci tics.com/SiliconValley/2499 нтн Компания НТН распространяет продукцию компании Parallax Inc., которая выпуска- ется здесь же. в Скандинавии. Компания предшавляет модем Power Line для радио- любителей и разработчиков аппаратуры, который позволяет последовательно прини- мать и передавать данные со скоростью 2440 байт/с по шине питания. Компания также имеет общедоступную библиотеку файлов, которая содержит сотни примеров программ для BASIC Stamp (это «.List of Stamp Applications», упомянутая в части 7). Asbogatan 29 С Angelholm, Sweden S-262 51 +41 431-41 00 88
Источники информации 453 Факс +46 431-41 00 88 E-mail: infWhth.com http://www.hth.com INNOVATES Предлагает PICBots - свободно распространяемый симулятор, с помощью которого вы можете программировать роботы и наблюдать их смертельные биты Компания обеспечивает также выполнение разработок по контракту Baur и предложения можно направлять ito адресу: proposal^! nnovatiis.com E-mail: ags(“>imiovatus.com http://www.innovatns.com IAR SYSTEMS AB Продукция: ин гегрированныс средства разработки с использованием я зыка ANSI-C (компиляторы, ассемблеры, отладчики и др ), рабочие средства .тая программирова- ния встраиваемых систем. ANSI-С кросс-компилятор C-SPY на базе Windows. Публикации: PROgramming MICROS Р О Box 23051 Uppsala. Sweden S-75023 +46 IS 16 78 00 Факе: +46 18 16 78 38 E-mail: infoyTwww.iar.se INTERFACE PRODUCTS (PTY) LTD Поставщик средств разработки для микроконтроллерных систем, обеспечивает разра- ботку и производство заказных злекгронных устройств, дистанционное автоматичес- кое управление, мониторинг и управление торговыми сетями, позиционирование объектов в авиационных системах обнаружения, высокий уровень Интернет-обслу- живания для профессиональных разработчиков, дистрибьютор микроконтроллерной продукции, выпускаемой компаниями DonTronics. Silicon Studio и Wirz Electionics 2"'1 Floor. Quinor Court. 81 Beit Street New Doorfontein. Gauteng. South Africa P.O. Box 15775. DOORN FONTEIN. 292.8 South Africa Теле<|х>н: +27 (II) 402-7750 Факс: +27 (II) 402-7751 E-mail: intW’ip.co./a http://www.i p.co./a KROEKER BUILT ELECTRONICS Занимается npoi рамма юрами для микроконтроллеров фирмы Atmel В настоящее вре- мя имеют и pot рам маторы для всех 8-разрядных микроконтроллеров Atmel. а также промышленный групповой npoiраммагор для 2()-выво.тных микроконтроллеров Atmel )та линия продукции постоянно расширяется, включая новые типы микроконiper.i-
454 Приложение В леров. Компания также разрабатывает программаторы по заказу пользователей, удов- летворяя их специфические требования. 1219 SW 26’" #2 Corvallis, OR, 97333 (541) 766-8722 E-mail: tech@kroekerbuilt.com http://www.kroekerbuilt.com DR.CLAUS KUEHNEL CONSULTING & DISTRIBUTION Применение микроконтроллеров и цифровых процессоров сигналов (DSP). поставка аппаратных средств и программного обеспечения, технические публикации (более подробно смотрите на Web-сайте). Schlyffistrasse 14 CH-8806 Baech / SZ Switzerland +41-1-7850238 Факс: +41-1-7850275 E-mail: ckuehnel@access.ch http://www.access.ch/ckuehnel MANDENO GRAVILLE ELECTRONICS LTD. Производитель следующей продукции (приглашаются дистрибьюторы): 1сеР2051 — уникальный полнофункциональный схемный эмулятор и про- грамматор для Atmel 89С2051, 89С1051 и89С4451, усовершенствованный отладчик DbgX51 с оконным интерфейсом, интегрированная среда раз- работки, функционирование на частоте до 24 МГц. Тгасе-52 — схемный эмулятор для 89С51 и 52.55, универсальный схемный эмулятор для С51, работающий на частоте до 24 МГц, отладчик DbgX51. Asm51 — макроассемблер для процессорного ядра х51 / Mod51 — профессиональный оптимизирующий компилятор со структуриро- ванным текстом и контролем типов данных. Предназначен для выполнения серьезных проектов, где не допустим высокий уровень ошибок при компи- ляции с языка С. Идеально подходит для 89С1051 и более старших моделей. OptoPGM — оптоизолированный (безопасный) кабель для внутрисистем- ного программирования (ISP) микроконтроллеров AVR, 89S, АТ24х и АТ17х, программируемых по последовательному интерфейсу. Спроекти- рован для быстрой реализации цикла разработка-выпуск продукции. Средства CAN-интерфейса — CANPort и эмуляционная платформа Emul517C для CAN-контроллеров 80С517А и 81С90 компании Siemens. 128 Grange Rd Mt Eden, Auckland, New Zeland 03 +64 9 6300 558 Факс: +64 9 6301 720 E-mail: DesignTools@xtra.co.nz
Источники информации 455 MONTANA DESIGN Компания Montana Design выполняет разработку заказного электронного оборудова- ния и программно-аппаратных средств, поддержку приложений, реализованных на базе персональных компьютеров для различных отраслей промышленности, включая кабельное телевидение, радиоуправляемые модели, контроль и управление произ- водственными процессами, телефонная и радиосвязь. Продукция компании используется во всем мире, а основное производство сосре- доточено на Тайване, в Китае и США. Компания выполняет проекты в соответствии с требованиями пользователей - минимизировать стоимость разработки или мини- мизировать производственные затраты, а также обеспечивает полную поддержку для организации массового производства. Компания поддерживает: Microchip PlCMicro 12Схх, 14000, 1бСххх Intel 8051 (включая варианты, выпускаемые TI, Atmel и другими компа- ниями) Motorola 6805 Zilog Z-80, Z-I80 (и варианты, выпускаемые компанией Hitachi) Western Design 65СО2 409 S.Sixth Street Phillipsburg. NJ 08865-1925 (908) 454-4611 Факс (908)454- 7882 E-mail: montana@//www. users.fast.net/~montana/root.html http://www.montanadesign.com NELSON RESEADCH Эксперт по микроконтроллерам PlCMicro компании Microchip и проектированию встраиваемых систем, разработке программного обеспечения на языке ассемблера для встраиваемых систем. Выполняет проектирование аналоговых систем и субсистем, включая контрольно-измерительные приборы, наладку и анализ неисправностей для систем и процессов, проведит учебные курсы и семинары по заказам пользователей. В дополнение к вышесказанному, компания поддерживает процессоры семейства Intel 8051 и продукцию компании Parallax, а также упомянута в списке Z-World как консультант по продукции компании Zilog. 130 School Street, P.O. Box 416 Webster, MA Телефон: (508) 943-1075 Факс: (508)949-2914 E-mail: L.Nelson@ieee.org http://www.ultranet.com/~NR ORMIX LTD. Недорогие программаторы COMP1C-1 и COMPIC-5X для микроконтроллеров Microchip и памяти EEPROM с последовательным доступом, которые подключают-
456 Приложение В ся к последовательному порту ПК. Программатор COMPIC-I работает без внешнего источника питания, программатор СОМР1С-5Х имеет дна ZIF-рагьема (разъемы с нулевым усилием) и исключительно гибкое программное обеспечение. Новые микро- контроллеры могут быть добавлены пользователем в текст файла конфигурации. Очень простой и дружественный для пользователя интерфейс, встроенный редактор НЕХ- файлов, возможность последовательного программирования по частям. Низкая сто- имость. KR.Вагона, 136 Riga, Latvia LV-1012 Телефон: (371 )-7310660 Факс: (371 >-2292823 E-mail: avlacl@niail.orniix.riga.lv http://www.ormix.riga Iv/eng/index.litin PIPE-THOMSON TECHNOLOGIES INC Компания Pi pc-Tliompson является представителем фирмы Microchip в регионе То- ронто.Кроме предоставления технической информации для кдиен гов фирмы Microchip компания Pipc-Thompson обеспечивает также техническую помощь и поддержку. 4 Robert Speck Pkwy Suite 1170 Mississauga, Ontario, Canada L4Z 1SI Телефон: (905)281-8281 Факс: (905)281-8550 E-mail: pipethom@idirect.coin PRACTICAL MICRO DESIGN, INC. Компания инженерного обслуживания Practical Micro Design специализируется в об- ласти проектирования систем, использующих микроконтроллеры или логику цифро- вого управления. Компания основана в апреле 1984 года. Ес профиль деятельности включает этапы проектирования: от начальной постановки задачи к проектированию и изготовлению опытного образна, после чего обеспечивается переход к серийному производству по дополнительному контракту с компаниями-соисполнителями. Ком- пания обеспечивает различные виды обслуживания, включая разработку аппаратных средств и программного обеспечения, проектирование печатных плат и конструиро- вание корпусов. Список проектов, реализованных на микроконтроллерах PIC: тюнер для кабельного телевидения, контроллер ЭЛТ и транслятор кода для системы управ- ления с помощью инфра-красного излучения, считыватель кредитных карт, програм- матор для заказных изделий, выпускаемых на базе микроконтроллеров PIC 16С84/ F84. Список проектов, реализованных на микроконтроллерах 8051: симулятор теле- фонной линии с модемом для верификации терминалов, принимающих кредитные карточки, генератор сигналов прецизионной частоты, радиоуправляемые средства спутниковой связи, управление промышленным оборудованием (система питания для прессования пластмассовых изделий).
Источники информации 457 7432 Alban Blvrd.. А-105 Sprinfficki, VA 22150-2321 Телефон: (703)912-4991 Факс: (703)912-5849 E-mail; dcvclopmcnt@pmdinc.com http://www.pmdinc.com ROCHESTER MICROSYSTEMS, INC. Компания Rochester Microsystems, Inc. обеспечивает проектирование электронных устройств для промышленных и исследовательских организаций. Она разрабатывает специализированные и заказные изделия и контрольно-и змерительное оборудование. Компания использует микроконтроллеры PlCMicro во многих областях производ- ства, таких как специальное тестовое оборудование для коммерческих спутниковых систем передачи изображений, оборудования для медицинских исследовании, уст- ройства ввода данных в компьютер, системы управления .зля бытовой техники, обо- рудование для исследования поенных систем управления и другие. Они также являют- ся квалифицированными специалистами по интерфейсу микроконтроллеров и стандартных шин обмена с различными датчиками и другими устройствами, включая быстродействующие аналоговые и цифровые системы, микросхемы ТТЛ, ЭСЛ. КМОП, емкостные датчики оптоволоконные линии, лазерные диоды, фотодиоды и другие оптические датчики, микросхемы программируемой логики, цифровые процессоры сигналов и другие устройства. 200 Buell Road, Suite 9 Roc lister. NY 14624 (7)6)328-5850 Факс: (716)328-1 144 E-mail: rm i@www. front icrnet.net/~rnii RTN Компания RTN производит маленькие автономные микроконтроллерные модули, использующие BASIC Stamp и контроллеры Microchip серий 84/71. Компания вы- пускает также заказные платы для устройств управления двигателями и программиру- ет микросхемы Xilinx для высокоскоростных систем сбора данных, которые имеют простой интерфейс, особенно с модулями BASIC Stamp. 35 Woolart Street Victoria. Australia 3041 (61) (3) 9338-3306 Факс: (61 )(3)9338-3306 E-mail: nollct@mail.entcrnct.coin.aii http://people.entcrnet.com.ati/~nollct SOLUTION CUBED Компания Solution Cubed выполняет разработку встраиваемых систем, специализиру- ясь на применении микроконтроллеров фирмы Microchip Technology Кроме обеспе- чения услуг по проектированию и применению, эта компания выпускает серию нзас-
458 Приложение В лий Mini Mods Эли миниатюрные конструктивные модули идеально подходят для радиолюбителей и могут быть легко подключены к BASIC Stamps или другим подоб- ным модулям. 3029 Esplanade #F Chico. СА 9573 Телефон: (916)891-8045 Факс: (916)891-1643 E-mail: solenbe@sohitions-ciibed.com http //www.sohitions-ciibcd.com TELESYSTEMS 1. Программатор промышленного уровня для продукции Microchip: PICMicro, память EEPROM с последовательным доступом, память EEPROM с параллельным доступом, память EPROM. В ближайшем бу- дущем поддержка продукции Atmel: память EEPROM с последователь- ным доступом, микроконтроллеры. Программатор подключается к ПК через принтерный порт в «прозрачном» режиме, позволяющем принте- ру оставаться подключенным. Реализует также автономный режим рабо- ты с подсчетом количества запрограммированных микросхем. Програм- матор поддерживает гибкие, выбираемые пользователем алгоритмы программирования. Возможна свободная модификация рабочих программ с Web-сайта компании. 2. Программирование и разработка проектов на базе PICMicro по заказам. Компания имеет значительный опыт в этой области, разработав более 50 устройств на базе PICMicro. из которых около 30 находятся в производстве. 3. Компания опубликовала на русском языке книгу по применению PICMicro. В настоящее время готовится к выпуску книга на русском языке о совре- менных микроконтроллерах — краткое описание, применение, средства разработки. Р О. Box 232 Zelenograd Moscow 103575 Russia 7-095-531-0063 Факе: 7-095-531-4840 E-mail: ts^aha.rn http://www.ts.alia, in WIRZ ELECTRONICS Компания Wirz Electronics предлагает широкую номенклатуру пролу кипи для разра- ботки и моделирования устройств на микроконтроллерах, включая систему разработ- ки SimmStick. Выпускаемые в настоящее время внутрисхемные npoiрамматоры. ма- кетные платы, книги, компиляторы и симуляторы поддерживают микроконтроллеры Microchip Р1С. 8051 и Atmel AVR.Компания Wirz яктяется также лпегрибьютором в США универсального микропроцессорного программного симулятора UMPS. кого-
Источники информации 459 рый поддерживает все типы микроконтроллеров, представленных в данной книге, и многие другие. Компания Wirz поставляет несколько периферийных интерфейсных устройств, таких как схемы управления шаговыми двигателями и моторами постоянного тока, релейные и сигнальные платы, а также популярный последовательный интерфейс SLI для ЖКИ. Используя только одну линию ввода-вывода, интерфейс SLI является для встраиваемых микроконтроллеров мощным средством для отладки и вывода дан- ных на дисплей. Компания выделяется активной ценовой политикой, давая извеще- ния и обеспечивая поддержку пользователей через Интернет. Документация и спра- вочные данные на продукцию компании доступны на ее Web-странице и многих других источниках. P.O. Box 457 Littleton, МА 01460-0457 USA Телефон: 1-888-289-9479 E-mail: salcs@wirz.com http://wirz.com/
ПРИЛОЖЕНИЕ С ОБЩИЕ КОМАНДЫ АССЕМБЛЕРА Краткое содержание Условные команды (директивы) ассемблера Макрокоманды В большинстве ассемблеров его команды (директивы) могут вводиться в текст про- граммы. позволяя программисту определять, какой файл программы будет ассембли- рован. или какие результаты будут представлены на распечатке файла (листинге). В данном приложении дается информация, какие директивы ассемблера доступны для применения, и как они используются. Когда ранее в этой книге рассматривались различные типы команд, я отмечал, что эти команды имеют различный синтаксис, в зависимости от того, какой ассемблер используется, хотя основные функции реализуемые этими командами практически одинаковы. Например, команда «list» может быть представлена в следующих форматах: list ; “list” указывается не в первой позиции строки или .list ; перед командой ставится “точка" или $list ; символ $ указывает на выполнение команды ассемблера Прежде, чем использовать какую-либо команду, вы должны убедиться в правиль- ности используемого для нес синтаксиса. Ниже приведен список команд ассемблера.
Общие команды Ассемблера 461 который можно использовать как руководство по их применении! При >гом необхо- димо отметить, что не все ассемблеры используют все указанные команды, а архи- тектура некоторых микроконтроллеров нс обеспечивает их реализацию list/nolist Комады -<Iist/nolist» используются, чтобы разрешшь или запретить вывод файла на распечатку. Я применяю эти команды только в тохз случае, если соответствующий блок информации не влияет на работу приложения (не изменяет содержимое определенных pel петров) и не занимает слишкохз большое iipocipanciBo в файле распечатки. titlc/subtitlc Я считаю полезным иметь заюловок в верхней части каждой стра- ницы, чтобы при использовании в листинге ссылки на другую стра- ницу нс приходилось возвращаться к первой странице, чтобы по- смотреть, на какой странице мы находимся. Подзаголовки могут быть полезными, чтобы идеи инициировать подпрограммы, обра- ботчики прерываний, области определения переменных и I. д. page Команда «page» служит для перехода на новую страницу при распе- чатке файла. Эта команда может использоваться для размещения различных программ на отдельных страницах листинга. lines # Некоторые принтеры могут печатать на странице большее или мень- шее количество строк, чем это определено по умолчанию ассембле- ром. Команда «lines» позволяет изменить максимальное количество строк, размещаемых на странице. Если вы хотите уменьшить макси- мальное количество строк, размещаемых на странице (после ко- манды «lines»), то имейте в виду, что первая страница, на которой расположена эта команда, должна быть достаточно короткой, так как во многих ассемблерах команда «lines» активизируется, начиная со страницы, следующей за этой командой. dscg/cseg Эти команды используются, чтобы идентифицировать отдельные области команд/данных в памяти программ микроконтроллера. Обыч- но эти команды реализуются для микроконтроллеров с архитекту- рой фон-Неймана. org # Программы располагаются, начиная с адреса #. db/dw Эти команды служат для резервирования в памяти программ простран- ства для сохранения фрагментов программ или определенных блоков данных. Команда «db» обычно используется для размещения таблиц в памяти программ.При этом следует иметь в виду следующее. Если вы использовали эту команду в ассемблерной программе персонального компьютера (РС), чтобы обеспечить ра змещение переменных в сегмен- те данных, то можете случайно попытаться сделать то же самое в мик- роконтроллерах. В этом случае нельзя будет произ|зести инициализацию, так как негде разместить начальные значения (в объектном файле для РС они хранятся в части файла, которая загружается в память RAM). Если переменные должны быть инициализированы. то необходимо яв- ным образом загрузить их в память в начале прикладной программы.
462 Приложение С cqn/= define undefine device error# expand/hide $. * high low Команда для определения значений констант. Не следует пуган, ее с командой «define». Метка, которая используется командой «equate», будет просто замешена заданным значением константы. Эта команда ассоциирует строку с меткой. Это простейшая форма реализации макроопераций. Необходимо помнить, что строка заме- шает метку, когда выполняется команда «define». При работе с мик- роконтроллерами я часто использую определенную строку для иден- тификации бита в регистре (например, «clock define porta, 3»), При работе с командами условного ассемблирования, определен- ная командой «define» метка не должна быть связана с какой либо- строкой. В этом случае, заданное условие «ifdefoperation» будет иметь значение «истинно», если метка была ранее определена. Команда «undefine» удаляет определенную командой «define» метку и замещаемую строку из памяти. Если эта метка встретится далее в ассемблерной программе, то будет выдаваться сообщение об ошиб- ке. как в случае, когда эта метка не определена. Многие ассемблеры могут обрабатывать программы, написанные для нескольких моделей микроконтроллеров из данного семейства, хотя различные модели могут иметь разную емкость памяти, состав регистров и устройств ввода-вывода. Команда «device» указывает ас- семблеру. какие характеристики микроконтроллеров следует исполь- зовать при ассемблировании программы. Остановка ассемблирования программы и выдача файла листинга обыч- но инициализируется командами условного ассемблирования. Ошиб- ки в программе чаше всего возникают из-за того, что некоторые пара- метры условий в программе заданы неправильно. Такие команды обычно вызывают остановку ассемблирования, вывод строки в виде файла листинга (и, часто, на экран монитора). Могут также выдаваться пре- дупреждения и сообщения, которые содержат рекомендации, каким образом можно обеспечить продолжение ассемблирования. Эти команды используются, чтобы определить, следует ли предста- вить код, реализующий макрооперацию, в файле листинга («expand»), или его следует скрыть («hide»). Эта команда замешается при ассемблировании текущим значением содержимого программного счетчика Символы S и * обычно ис- пользуются в командах ассемблера для задания этой операции. Позволяет получить значение старшего байта 16-разрядной констан- ты. не требуя от программиста выполнения операции «(Constant AND 0x0FF00)»8» Позволяет получить значение младшего байта 16-разрядной кон- станты. не требуя от программиста выполнения операции «(Constant AND OxOFF)»
Общие команды Ассемблера 463 Команды условного ассемблирования Если вы являетесь новичком в программировании на языке ассемблера или програм- мировании микроконтроллеров на этом зыке, то, возможно, удивитесь, встретив в исходном тексте операторы «if», «else» или «while». Эти команды не компилируются и не не включаются в прикладные программы, а используются ассемблером или ком- пилятором при выполнении первого прохода в процессе трансляции исходного кода. Типичным примером использования команд условного ассемблирования для мик- роконтроллеров PIC может служить следующий программный код: Dlay ; Ожидание завершения операции ifdef Debug ; Если работа в режиме отладки (симулятор) movlw 1 ; Выполнение однократного цикла else ; В противном случае загрузка в PIC movlw 250 ; Реализация полной задержки endif movwf Count decfsz Count ; Цикл задержки goto $-1 return ; Возврат к вызывающей программе В данном примере, если метка «Debug» определена соответствующей командой «с1еПпе»(как отмечено выше, эта метка не должна быть связана с какой-либо стро- кой), то в регистр W будет введено значение 1. Этот условный оператор вводится, чтобы обеспечить малую задержку при отладке программы с помощью симулятора и ее пошаговом выполнении, если вы не хотите, чтобы каждый шаг выполнялся 250 раз с помощью команд «decfsz/goto». Команда условного ассемблирования «ifcief» используется, чтобы проверить опре- делена или нет соответствующая метка. Обычно имеется также команда, использующая инверсное значение условия, когда условие «истинно», если метка не определена. Если условие команды «if» истинно, то программный код, следующий за ней до первого оператора «else» или «endif», включается в исходный код программы. Если условие «ложно», то код, следующий за командой «if» до команд «else», «endif» игно- рируется. Когда в тексте программы встречается команда «else», то следующий за ней код включается в исходный текст программы. В приведенном ниже примере, если метка «Debug» не определена, то формируется следующий ассемблерный код: Dlay ; Ожидание завершения операции movlw 250 ; Реализация полной задержки movwf Count decfsz Count ; Цикл задержки goto $-1 return ; Возврат к вызывающей программе Во многих ассемблерах реализуется также условная команда «while». В этом случае программный код. находящийся в цикле команды «while», повторяется каждый при ее выполнении
464 Приложение С При обсуждении микроконтроллеров семейства S051 я отмечал, что если какая- либо неиспользуемая область памяти EPROM остается ^’запрограммированной, то кто-нибудь может разгадать содержимое закодированной области нутом чтения содер- жимого EPROM. Чтобы предотвратить зто. в неиспользуемой части EPROM можно разместить нсповторяюшисся комбинации символов. Для этого можно использовать следующий условный код: ProgEnd EQU $ while ( $ < DEVEND ) db (ProgEnd + (($ - ProgEnd) * 3) & OFFh) wend В этом случае, оставшаяся часть памяти программ независимо от ее размера будет заполнена последовательностью символов, значение каждого байта которых возрас- тает в гри ра за. 'Эти символы будут располагаться в памяти, начиная с адрес;! младше- го байта последней команды программы. Можно использовать и более сложные алго- ритмы шифрования, но и описанный выше значительно осложняет «пиратам» выязззение области памяти EPROM, в которой содержится программа работы микро- кои зроллера. а без этого невозможно расшифровать ее содержимое. Макросы Макросы (макроопсраини) являются всего кульминацией всего, что представлено в данном приложении. Макросы производят замещение Поспеловагельности команд и меток одной меткой с указанием возможных значений параметров. Например, проце- дура сложения 16-разрядных операндов в микроконтроллерах AVR можно предста- вить с помощью следующею макроса Macro Add16 A. В ; A = A + В Id R16, A : Загрузить A Id R17. A+1 Id R18, В ; Загрузить В Id R19, B+1 add R16, R18 : A = A + В add R17. R19 ; A+1 = A+1 + B+1 + ((A + B) » 8) st A. R16 ; Сохранить результат в A st A+1, R17 EndMacro )гог макрос может быгз> помещен в определенном месте программы, зле необхо- димо произвести сложение 16-разрядных операндов. Он представляет собой псевдо- операцию. которая расширяет набор команд микроконтроллеров AVR. Чтобы опреде- лить параметры А. В. их значения копируются в специальной строке, го-естьони не являются константами. Я обращаю ваше внимание на го. что в AVR макросы не используют метки для определения параметров. Вместо згою парамеры, указанные в строке, определяющей «Масю». игнорируются, и используются строки <.(з<'|» и <.ij'’». задающие значения первого и второго параметра для макроса. Следует обратит!, внимание на задание меток в макросах. Если в макросе опреде- ляется метка, го вы должны указать, язезяется ли она шкальной» для згою макроса.
Общие команды Ассемблера 465 Если метка определена как «локальная», то обращение к ней допускается только внутри данного макроса. В предыдущем разделе при обсуждении условно ассемблируемых программных кодов мы использовали подпрограмму для реализации задержки с помощью микроконтрол- леров Р1С, которую я модифицировал добавлением метки в начало цикла: Dlay ; Ожидание завершения операции movlw 250 ; Реализация полной задержки movwf Count Dlay_Loop ; Цикл задержки decfsz Count goto Dlay_Loop return ; Возврат к вызывающей программе Если необходимо выполнять эту подпрограмму несколько раз с различными зна- чениями задержки, то можно определить ее как макрос: Macro Dlay_Macro Delay local Dlay_Loop movlw Delay movwf Count Dlay_Loop decfsz Count goto Dlay_Loop return endm ; Цикл для реализации тактов задержки ; Реализация полной задержки ; Цикл задержки : Возврат к вызывающей программе Чтобы включить этот код в качестве подпрограммы, в текст основной программы следует вести следующий код: Dlay250 ; Задержка на 250 циклов Dlay_Macro 250 Просмотрев текст макроса, вы увидите, что, что я определил «Dlay Loop» как «локальную» метку. Если бы я не сделал этого, то метка «Dlay Loop» присутствовала бы при каждом вызове «Dlay Macro», что привело бы к ошибкам из-за повторения меток. Каждый раз при использовании макроса. Вы должны спросить себя можно ли обойтись подпрограммой. Этот вопрос возникает, потому что во многих случаях мак- росы замещают подпрограммы. Однако из-за того, что при этом код макроса включа- ется в основную программу, требуется больший объем памяти программ. Случаи, когда можно использовать только макросы, включают: критичные ко времени участ- ки кода, в которые нельзя ввести команды «call/return»; коды, которые повторяются много раз; программы, имеющие ресурсные ограничения (как, например ограничен- ный объем стека в программе «mykeRTOS»), которые исключают возможность ис- пользования подпрограмм. 30 Зак. 2025.
ПРИЛОЖЕНИЕ D УНИВЕРСАЛЬНЫЙ СИМУЛЯТОР UMPS В процессе подготовки этой книги мне посчастливилось найти настоящее сокровище в виде виде интегрированной среды проектирования UMPS (Universal Microprocessor Program Simulator). Эта программа способна обеспечить разработку приложений прак- тически для всех основных типов микроконтроллеров, включая все. рассмотренные в данной книге. Кроме наличия редактора и ассемблера UMPS обеспечивает возмож- ность моделирования работы микроконтроллера совместно с внешними устройства- ми, что выделяет UMPS среди других средств разработки и исключает необходимость разработки тестовых файлов. Возможность подключения с помощью UMPS «вирту- альных» устройств предоставляет вам возможность исследования работы вашего при- ложения в разнообразных вариантах (рис D). Рис. D. Вид экрана при входе в симупятор UMPS
Универсальный симулятор UMPS 467 Симулятор UMPS работает под управлением операционных систем Microsoft Windows (311. 95 или NT). Кроме наличия собственного внутреннего ассемблера UMPS может иницировать работу ассемблера Microchip PIC (MPASMWIN). а также ассем- блера и С-компилятора компании Cosmic и использовать их символический выход для UMPS-симулятора. Наиболее полезной и эффективной особенностью UMPS является графическая реализация процедуры «Resources», которая обеспечивает подключение к микрокон- троллеру различных внешних устройств. Во время написания данной книги симулятор UMPS обеспечивал подключение к микроконтроллерах! следующих «виртуальных» внешних устройств: светодиоды, переключатели. логические элементы И. ИЛИ, Исключающее ИЛИ. НЕ. 7-ссгментныс светоиндикаторы, генератор прямоугольных импульсов. цифровые устройства записи-воспроизведения. цифро-аналоговый преобразователь. аналого-цифровой преобразователь. а шитого-цифровой слайдер, память с интерфейсом I2C (RAM и EPROM). периферийные устройства с интерфейсом I2C (светодиодные дисплеи, часы ре- ального времени и другие), светодиоды, совместимые с HD44780, генераторы сигналов е фазовой автоподстройкой частоты. ШИМ — мониторы. ШИМ - генераторы. резисторы, «подтягивающие» к напряжению питания. последовательные аналого-цифровые преобразователи. модели ТТЛ-микросхем типа 74LSI38. 74LSI39, 74LS373. 74LS374. модели КМОП-микросхем типа CD4017 и CD4094. За прошедшее после этого время в данный список были добавлены модели многих других приборов, но и приведенная номенклатура устройств позволяет моделировать множество различных приложений. Представленный список моделируемых устройств, которые выбираются пользователем в окне «resources», является достаточно полным. Используя UMPS, я провел полное моделирование первого приложения для микро- контроллера 8051. а также большей части второго приложения (цифровые часы и термометр), при этом я смог разрешить многие проблемы. Когда вы задаете использу- емые в вашей схеме ресурсы, вы переносите их из окна «resource» и как бы реально подключаете выбранные устройства к вашему приложению. Вы также можете выбрать различные варианты этих устройств, например. I- или 2-строчные ЖК-индикаторы, представляющие от 8 до 29 символов, или при введении «подтягивающих» резисто- ров допускается их подключение к «земле» или напряжению питания. В части книги, посвященной микроконтроллерам 8051. в главе «Примеры приме- нения» я привел простой учебный пример применения UMPS для подключения двух светодиодов и переключателя, в котором производился опрос состояния определен-
468 Приложение D ных регистров. Вы можете вернуться назад и рассмотреть этот пример, чтобы получить представление о том, как работает UMPS, и выяснить, чем он может вам помочь при разработке ваших приложений. В настоящее время UMPS поддерживает следующие типы микроконтроллеров (этот список постоянно расширяется): Microchip Р1С12С5хх Р1С16С5хх PICI6C84, PICI6CF84, PICI6F83, PICI6C554, PICI6C556, PICI6C558 PIC16C671, PIC16C672 PICI6C7I, PICI6C7I0, PICI6C7I I Motorola 68НС705, 68HC705JIA, 68НС705Р9, 68HC705BI6. 68НС70В32 68HCII Intel 8031, 8032 8051 Atmel AT89CI05I, AT89C205I AT90CI200, AT90C85I5 Dallas Semiconductor DS87C320 SGS Thompson ST62I0, ST62I5, ST6220, ST6225 ST6252, ST6253 ST6260, ST6262, ST6263, ST6265 National Semiconductor COP820C Это достаточно полный перечень, а за время, пока вы читали эту книгу, в него были также добавлены микроконтроллеры AVR фирмы Atmel. Ассемблеры и симуляторы, используемые в UMPS, являются достаточно быстры- ми даже при сравнении с другими средствами, представленными в этой книге. Благо- даря удобному интерфейсу, постоянным усовершенствованиям, непрерывному вве- дению дополнительных микроконтроллеров и ресурсов (внешних устройств) UMPS следует считать удачным капиталовложением, которое вы будете использовать в тече- ние длительного времени. Копия UMPS, которая размещена на прилагаемом к книге CD-ROM, является его последней демоверсией. Это полнофункциональная версия UMPS, которая будет функционировать в течение трех месяцев после инсталляции. Ее единственным огра- ничением является то, что разработанные проекты нельзя сохранить, поэтому вы должны восстанавливать графическую модель вашего проекта при каждом запуске. Данная версия UMPS имеет такжз следующие особенности. 1. «Обратная» трассировка выполняется как один шаг Вы можете вернуться на 16 команд назад и посмотреть, что произошло.
Универсальный симулятор UMPS 469 2. Инкремент и декремент содержимого регистров производится путем их выбора и нажатия кнопок « + » или «-» на экране. 3. В исходном ассемблерном коде UMPS двоичные числа могут быть записаны в следующих форматах: %010010110 100101 ЮВ В’ 10010110' Для получения более полной информации об UMPS обашайтесь по атресу: Virtual Micro Design l.D.L.S Teclinopole Izarbel 64210 Bidart France 011-33(0)559.438.401 E-mail: p.techer@-idls.izarbel.tm.fr http://idls.izarbel.tm.fr/entp/techer/index.htm В Северной Америке UMPS распространяется фирмой Wirz Electrinics P.O. Box 457 Littleton. MA 01460-0457 E-mail: sales@wirz.com http://www.wirz.com
ПРИЛОЖЕНИЕ Е КОМПЛЕКТ ПЛАТ SIMMSTICK Одним из наиболее полезных средств для реализации быстродействующих приложе- ний как в радиолюбительской практике, так и в промышленном применении, явля- ется комплект плат SimmStick и соответствующая шина для них, поставляемые ком- панией SiStudio/Dontronics. Этот комплект плат обеспечит вам базу для электрического соединения микроконтроллера с вашим приложением (рис. Е-1). Когда я использовал SimmStick для реализации устройства с видеовыходом на основе AVR, я смог спаять свою схему на плате SimmStick, сделать соединительную плату и соединить видеомо- дулятор с микроконтроллером всего за один час. Рис.Е-1. Набор доступных ппат SimmStick
Комплект плат SIMMSTICK 471 Прототипом SimmStick была плата PICStic компании Micromint. В этом устройстве использовался микроконтроллер PIC I6C84, и оно реализовало функции контроллера BASIC Stamp, используя компилятор языка PBASIC компании microEngineering Lab. На его основе можно было создавать оригинальные разработки путем удаления или добавле- ния компонентов на различных платах. Плата PICStic была спроектирована только для микроконтроллера PIC 16С84, а комплект SimmStick первоначально проектировался, чтобы получить макетные платы для всех моделей PlCMicro. В настоящее время кроме PlCMicro платы SimmStick поддерживают также микроконтроллеры AVR (рис. Е-2). Рис. Е-2. Плата SimmStick со схемой видеогенератора на AVR Плата SimmStick может быть включена в стандартный 30-выводный разъем для модулей памяти SIMM. Шина SimmStick содержит следующие линии. Вывод Имя Описание (комментарий) I Al/Tx Линия передачи данных RS-232 из SimmStick 2 A2/Rx Линия приема данных RS-232 в SimmStick 3 АЗ Линия ввода-вывода общего назначения 4 PWR Вход нестабилизированного напряжения питания 5 Cl Линия подключения к выводу XTAL микроконтроллера 6 СО Линия подключения к выводу XTAL микроконтроллера 7 + 5В Стабилизированное напряжение +5 В 8 Reset Вход запуска микроконтроллера (активный низкий уровень) 9 Земля Системная «земля» I0 SCL Линия синхросигналов шины 12С/Линия ввода-вывода общего на- значения II SDA Линия данных шины 12С/ Линия ввода-вывода общего назначения I2 SI Линия последовательного ввода КМОП-логики/ Линия ввода-вы- вода общего назначения I3 SO Линия последовательного вывода КМОП-логики/Линия ввода-вы- вода общего назначения
472 Приложение Е Вывод Имя Описание (комментарий) 14 IO Лини я ввода-вывода общего назначения и вход таймера 15 D0 Линия ввода-вывода общего назначения 16 D1 Лини я ввода-вы вода общего назначения 17 D2 Л иния ввода-вывода общего назначения 18 D3 Л иния ввода-вывода общего назначения 19 D4 Линия в вода-вы вода общего назначения 20 1)5 Линия ввода-вывода об щего назначения 21 D6 Линия в вода-вы вода об ще го назначения 22 D7 Л иния ввода-вывода общего назначения 23 D8 Л иния ввода-вывода об щего назначения 24 D9 Лини я ввода-вы вода общего назначения 25 D10 Линия ввода-вы вода общего назначения 26 Dll Линия в вода-вы вода об щего назначения 27 D12 Лини я ввода-вывода общего назначения 28 D1.3 Л и н и я ввода-вывода общего назначения 29 DI4 Лини я ввода-вы вода общего назначения 30 DI 5 Линия ввода-вывода общего назначения Я хочу обсудить некоторые характеристики данной шины, в первую очередь коли- чество кошактов. доступных для цифрового ввода-вывода. В исходной спецификации определено 23 контакта, чтобы обеспечить возможности ввода-вывода данных для ряда типов микроконтроллеров. Если микроконтроллер, который вы используете, не требует 23 линий ввода-вывода, то оставшиеся контакты можно использовать для дру1их целей. Например, в генераторе видеосигналов на базе AVR на монтажной пла- те ра1мещен цифроаналоговый преобразователь е делителем напряжения, чтобы обес- печить смешанный видеосигнал. Для каждого типа микроконтроллера вы должны определить, какие линии ввода-вывода подключаются к шине SimmStick. Данные по последовательному интерфейсу могут передаваться и приниматься с уровнями сигналов ТТЛ (КМОП)-схем или уровнями стандарта RS-232. Интерфейс RS-232 реализуется с помощью микросхемы МАХ-232 фирмы Maxim, которая смонти- рована на плате SimmStick. Соответствующие выводы могут использоваться также для реализации параллельного вы вода-вы вода данных. Возможности связи плат по интер- фейсу RS-232 обеспечиваются с помощью специального кабеля с соответствующими разъемами, которые размещаются на макетной плате или плате шинного интерфейса. Все это открывает хорошие возможности применения плат. Обычно я использую для ввода-вывода только макетную плату, сигналы на которую подаются через мон- тажную плату. Такой способ соединения позволяет повторно использовать микрокон- троллер для новых приложений путем небольшого изменения макетной платы. На платы SimmStick можно подать нсстабилизироиаиное напряжение питания, ста- билизировать его, а затем подвести к другим устройствам в вашем приложении. Лично я не люблю делать так; вместо этого я использую готовые монтажные платы DT00I или DT00.3 для подачи питания и реализации интер<|>ейса RS-232. чтобы не заниматься раз- водкой монтажной платы самому (рис.Е-3).
Комплект плат SIMMSTICK 473 Рис.Е-3. Плата SimmStick с шиной и источником питания. Линии тактовых сигналов микроконтроллера также входят в состав шины. Кварце- вые или керамические резонаторы можно смонтировать на плате SimmStick, исполь- зуя имеющиеся монтажные отверстия и проводники. Линии XTAL для подключения резонатора также могут быть разведены на этой шине (кристалл монтируется на от- дельной плате и подключается к микроконтроллеру на плате SimmStick с помощью шины). Я просто обрезаю проводники, ведущие от шины к микроконтроллеру на плате SimmStick, если использую кристаллический резонатор, размешенный на плате. Эти про- водники вносят дополнительную емкость на линии подключения кристалла, что может вызвать проблемы при работе приложения. Если тактовые сигналы передаются по шине, то я рекомендую подавать сигнал с кристалла на SimmStick через буферный каскад. Запуск (reset) микроконтроллера производится сигналом с низким активным уров- нем. Если на плате DTI04 смонтирован 20-выводный микроконтроллер Atmel 8051, который имеет такое же расположение выводов, как 20-выводный микроконтроллер AVR, то достаточно разместить на плате простой однотранзисторный инвертор, что- бы обеспечить требуемый положительный активный уровень для этого сигнала. Текущий ассортимент выпускаемых плат SimmStick включает монтажные платы с шиной и системой развития, микроконтроллерные интерфейсные платы и ряд до- полнительных интерфейсных плат. Две из этих плат являются монтажными платами (backplane), обеспечивающими реализацию шины SimmStick. Как показано на рис. Е-4, плата DTQ0I является доста- точно сложной. 3 I - так. 2025
Рис.Е-4. Схема платы DT001. Можно использовать транзисторы типа 2N4403. Смотрите прилагаемые инструкции МАХ-232- KZ 1 С9 порт Стабил изатор 35 т RI ЮмкФ । век X 12 1N4884 Зел. Кр. IN4884 '.01мкФ^| ~ ЮООмкФ < 25В ф- 92 8C668 R9 1 88 Поел едовател ьн ый Вход RS-232 Вход постоянного/ переменного Г напряжения ~ Диодный мост •------- W02 7805 Стабилизатор 1 П7Т7—u'^' '71 з .01 мкФ * U 1 r> U в u t _£_ Принтерный порт ±1 RM1 5 by Разъем DB25 1----Т ? ? Т 1 1мкФ Jb А hevBB' vpppan з RBtfar J12 2.---I Sa C o разъем ZIF F?Ui№l»7 TTVpp BC558 VDDP6M Л2____________Lfl 50/ I 3 *t 8SIOMORH 18-ВЫВОДНЫЙ (с нулевым усилием) RITP8H1; ® И С07 " о (4 РОТ Переключатель) 55 Работа/Загрузк i R5B lf—1 L зел "* VDD ON DonTronlcs 1997 Copyright Зел” Кр. Выход »•— DI/16 ле --08/15 J9 Выход, «Л __Вход 474 Приложение Е tex El 7487 Кр. свето- диод mm (Возможный вариант) I 10-выводная К целевой системе головка PIC84 Я vrr.rsfl t DT001 Нем Number wDoftnciT
Комплект плат SIMMSTICK 475 Монтажные платы и системы развития Номер платы Характеристики DT001 Программатор для PICMicro/монтажная плата SimmStick DT003 Монтажная плата с источником питания и интерфейсом RS-232 Микроконтроллерные интерфейсные платы Номер платы Характеристики DT101 Плата SimmStick с 18-выводны.м микроконгроллером PICMicro, содержит RS-232 и интерфейс I2C/SPI для доступа и управле- ния памятью EEPROM DTI03 Плата SimmStick с 40-выводным микрокон гроллером Atmel AVR, содержит RS-232 DT104 Плата SimmStick с 20-выводным микроконтроллером Atmel, со- держит RS-232 и интерфейс I2C/SPI для доступа и управления памятью EEPROM Интерфейсные платы SimmStick Номер платы Характеристики DT2O3 Интерфейсная плата, 24 светодиода. 4/8 переключателя DT204 Плата расширения для шины SimmStick с 4-мя слотами DT205 Плата управления для 4-х реле с 4-мя светодиодами Платы SimmStick имеют одно преимущество, которое мне хочется отметить — они поддерживают четыре микроконтроллерные архитектуры, представленные в этой книге: PICMicro. AVR, 20-выводный 8051 компании Atmel и контроллер BSI компании Parallax. Это обеспечивает вам ряд интересных возможностей. Вы можете менять тип микроконтроллера в одном и том же приложении, чтобы оценить характеристики, которые при этом будут получены. Вот почему я предпочитаю располагать перифе- рийные устройства ввода-вывода на отдельных платах SimmStick. Когда я читал гранки этого приложения, то обнаружил, что данная выше инфор- мация содержит ошибку — платы SimmStick поддерживают не четыре, а пять микро- контроллерных архитектур. В 18-выводной разъем на плате вместо PICMicro можно включить 18-выводный микроконтроллер Z8. Содержание данного приложения является введением в SimmStick. Я настоятельно ре- комендую вам посетить Web-сайт компании DonTronics (http://www.dontronics.com). что- бы посмотреть возможные варианты SimmStick. Познакомьтесь также с докуметацией, что- бы понять, как SimmStick может помочь вам в реализации ваших следующих приложений. Для заказа плат SimmStick обращайтесь по адресу: DonTronics 011 1(613)9338-6286 P/О/Box 595 Fax: 011 1(613)9338-2935 Tullmarine 3043, Australia E-mail: don@dontronics.coni http://www.dontronics.com
ПРИЛОЖЕНИЕ F ИНФОРМАЦИОННЫЕ СЕРВЕРЫ (ЛИСТЫ РАССЫЛКИ) В этой книге я дал вам адреса нескольких информационных серверов (listserver), рас- пространяющих в Интернет листы рассылки, на которые можно подписаться Назна- чение этих информационных серверов —предоставить адрес, куда вы можете послать сообщение, которое будет передано другим подписчикам сервера. Это означает, что большой объем почтовых сообщений может быть отправлен и получен большим ко- личеством людей за короткий промежуток времени. Например, через сервер PIC Listserver Масачуссетского технологического института (М1Т) обычно проходят от 50 до 100 электронных сообщений в день, а число его подписчиков, получающих эти сообщения, на момент написания этой книги у сервера составляло около 1 500. Информационные серверы (листы рассылки) - прекрасное средство, позволяю- щее получать ответы на поставленные вопросы в течение нескольких минут, хотя последующий разбор информации часто длится часами. Среди подписчиков таких сер- веров — много знающих людей, которые могут дать ответы на широкий круг вопросов и имеют свои мнения не только по обсуждаемой проблеме. Большое количество людей, с которыми можно общаться, приводит к тому, что сервер объединяет людей с общими взглядами и интересами. Члены этого объедине- ния интересов находятся в различных уголках земного шара. Поэтому необходимо уважать чувства других людей и культуру других народов. Занимаясь этой проблемой, хочу дать несколько советов, касаюшихся использования этого вида серверов. Данные рекомендации возникли после того, как сервер PICList пережил сложный период, снова и снова сталкиваясь с подобной проблемой. Думаю, что мои советы пригодятся при пользовании любым информационным сер- вером (листом рассылки). Надеюсь, что вы будете как можно чаще следовать этим сове- там, чтобы избежать неприятных ситуаций, возникших благодаря вашей оплошности.
Информационные серверы (листы рассылки) 477 1. Подписавшись на лист рассылки, не торопитесь задавать вопросы. Подождите один- два дня, чтобы понять, как посылаются сообщения и ответы на них на этом сервере, почувствовать, каким образом лучше всего задать вопрос. 2. Некоторые листы рассылки возвращают отправленные сообщения, в то время как на других серверах такой возврат не выполняется. Если вы получили копию своего первого послания, не думайте что это обязательно означает, что адрес был не верен. Попробуйте отправить сообщение еще раз. В этом случае вы можете подож- дать день-два, чтобы посмотреть, поступят ли ответные сообщения, прежде чем повторять ваше послание. Поскольку ваше сообщение уже находится на сервере определенное время, вы получите представление о том. сколько надо времени, чтобы сообщение появилось на сервере, и как быстро можно получать ответы. 3. Если вы не получили ответа на запрос, не стоит расстраиваться и посылать по- вторные сообщения, требуя оказать вам помощь. Весьма возможно, что никто не знает, как можно решить вашу проблему. В этом случае попытайтесь разбить свою проблему на составные части (проанализировать ее) и по-другому задать вопрос. 4. Я говорил, что ответ на интересующий вас вопрос можно получить в считанные минуты, но не стоит рассчитывать, что так происходит всегда. Ни одному подпис- чику серверов, указанных мной в этой книге, не платят за то, чтобы он отвечал на ваши вопросы. Большинство из тех, кто отвечает вам, делает это исключитель- но из желания помочь. Прошу относиться к этому с уважением и не предъявлять каких-либо претензий. И, если можете, сами помогайте другим. 5. Если вы меняете тему сообщения в графе Тема (Subject), снабдите ее ссылкой на предыдущую тему (например, «была такая-то тема»). Это поможет остальным сле- дить за ходом дискуссии. 6. Отвечая на предыдущее сообщение, постарайтесь максимально сократить скопи- рованное в ваше письмо предыдущее послание, оставив ту часть, на которую вы непосредственно отвечаете. Это ни в коем случае не означает, что не следует ко- пировать предыдущее сообщение или ссылаться на него. Баланс между недостат- ком и избытком очень неустойчив. Письмо должно содержать обращение (по име- ни или Ф.И.О.) к получателю, на письмо которого вы отвечаете. Лично я полностью оставляю копию присланного мне сообщения в своем послании, если его объем не превышает десяти строк. Если же оно превышает этот порог, сокращаю его, пометив значком «...» то, что было пропущено, таким образом, чтобы остался вопрос, на который необходимо ответить, и относящаяся к нему информация в форме цитат. Большинство почтовых программ помечают цитируемым текст знач- ком «>» в начале строки. Советую следовать данному совету, чтобы вашим собе- седникам было легче читать ваши сообщения. 7. Если у Вас не работает программа, не копируйте весь ее исходный текст в сооб- щение, отправляемое на сервер. Если я получаю такое сообщение, я просто уда- ляю его и перехожу к следующему. Подозреваю, что я не единственный, кто так делает. Кроме того, некоторые информационные серверы имеют ограничения по размеру послания. Все. что превышает лимит, уничтожается, при этом г>ы не по- лучаете никакого предупреждения. Если вам необходимо отправить исходный код программы, делайте его как можно более кратким. Участники данных листов рас- сылки обычно предпочитают отвечать на конкретные вопросы. Поэтому копиро- вание полного текста исходного программного кода или постановка вопроса гипа
478 Приложение F «Почему мой жидкокристаллический дисплей нс может отобразить всего?» чаше всего бесполезно. Вместо этого попробуйте выделить ошибочный фрагмент кода и постарайтесь объяснить, что вы хотели получить, и что же происходит на самом деле. Если вы поступите таким образом, то есть вероятность получить полезную информацию достаточно быстро. Задавая вопрос о том. почему у вас что-то не работает, следует убедиться в том. что вы говорите о тех аппаратных средствах, которое реально используете. Если вы задаете вопрос об аппаратных средствах, поддерживающих разработку, например, о программаторе или эмуляторе, обяза- тельно охарактеризуйте настройки Вашего компьютера или рабочей станции. В случае если ваше приложение работает нс так. как вы ожидали, опишите аппа- ратные средства, которые вы использовали, а также то. что вы наблюдали на экране (например, колебания сигнала на линиях синхронизации или что ваше приложение начинает нормально работать при подключении к выводу пробника осциллографа). 8. Если Вы нашли подходящую страницу в Интернете и хотите поделиться ею е другими участниками листа рассылки, сделайте так. чтобы им было просто уда- лить или вставить ссылку на Web-страницу, поместив ее на отдельной строке полностью, в формате: http://www.awesoine-pic-pagc.com 9. Если вы хотите послать кому-либо из членов сервера новое приложение, графику или что-либо еще объемом более 1К. не отправляйте их на сервер в виде прило- жения (атачмента) к своему письму. Лучше заявите, что вы нашли нечто интерес- ное. и укажите, где это можно найти, либо непосредсизенно у вас. либо предос- тавив адрес определенного Интсрнет-сервера. Если приходит большой по объему файл, многие информационные серверы автоматически убирают его (помешают в «корзину»). При этом вы можете не получи и. сообщение о том. куда был направ- лен ваш файл. Если у вас нет собственной страницы в Интернет или страницы, к козорой вы имеете доступ, лучшим решением будет попросить кого-либо размес- ти. ваш файл на их Web-странице или FTI’-сервере 10. Многие ит информационных серверов делаются доступными, поддерживаются и обновляются компаниями — производителями микроконтроллеров. Помните об >гом. если Вы собрались рекламировать свою продукцию. Выясните, какой поли- тики придерживается компания в данной области прежде, чем рассылать рекламу. 11. Допускается размещение на информационных серверах предложений о работе, но. как и в предыдущем пункте, лучше посоветоваться с представителех) органи- зации. поддерживающей данный сервер. Как бы го ни было, не рекомендую упо- минать в сообщении уровень заработной платы и условия приема на работу, если вы нс хотите показаться скупым, чрезмерно завышающим или умаляющих) свои достоинства, требующим от работников слишком многого. 12. Время от времени на серверах появляется «почтовый мусор» или «спам». Советую не отвечать на подобные сообщения даже, если в них говорится, что. только ответив на «спам», вы можете or него ц|бавигься. поскольку ваш ответ будет раюслан всем участникам данного сервера Если же вы считаете необходимым выразить свое негодование по этому поводу, отправьте письмо распространителю «спама» (хотя посылка провайдеру услуг Интернета сообщения о распространите- лях «спама» может принести лучшие результаты)
Информационные серверы (листы рассылки) 479 Замечание: существует ряд компаний, которые рассылают фиктивный "спам", что- бы собрать адреса тех, что отвечает на подобные сообщения, с целью перепродать их другим компаниям или распространителям адресов на CD-ROM. Получив «спам», прежде чем ответить, посмотрите, был ли он послан лично вам или всем подпис- чикам листа рассылки. Однако отдавайте себе отчет в том. что. отвечая на «спам», вы. возможно, просто посылаете адрес своей электронной почты какой-либо ком- пании. которая перепродаст его настоящему распространителю «спама». Думаю, что вы. как и другие польвователи Интернет, хотели бы исключить распростране- ние «спама». Но. чтобы свести к минимуму беспокойство, которое «спам» может причинить в будущем, следует игнорировать любой «мусор», который к Вам попал. 13. Сообщения, не относящиеся к предмету обсуждения, могут доставить вам множе- ство проблем. Если вы считаете уместным послать сообщение не по теме, то неко- торые информационные серверы попросят вас поставить «ОТ (off-topic)» в графе Тема. Некоторые пользователи сервера ставят фильтры на свои почтовые ящики, которые автоматически позволяют им игнорировать сообщения, не касающиеся обсуждаемой темы. В результате (так обычно случается с дискуссиями не по теме), обсуждение сведется к спору между двумя оппонентами. В этом случае лучше вооб- ще прекратить дискуссию или перейти в раздел частных собшсний (private). Вы можете узнать адреса электронной почты других подписчиков листа рассылки из заголовка сообщения. Отправьте сообщение своему собеседнику лично, а не всему списку подписчиков, поскольку другие пользователи сервера могут давно поте- рять интерес к обсуждению или хотят, чтобы оно вообще прекратилась. Оставьте их в покое. 14. Сообщения, содержащие ссылки на пиратские сайты и ресурсы краденного или взломанного программного обеспечения ни в коем случае нс могут быть уместны или даже могут являться незаконными. Если Вы не уверены в том. что новейшее программное обеспечение, которое Вы нашли в Интернете, можно отправлять по почте, НЕ ДЕЛАЙТЕ этого, пока не проконсультируетесь с держателем этого программного обеспечения и не получите разрешения. Кроме того, было бы нс плохо указать в Вашем письме, что у Вас есть ра решение на распространение краденного программного обеспечения от самого его держателя. Большое количе- ство различных микроконтроллеров используется в смарт-картах (таких, которые используются для кодирования информации при ее передаче по кабелям и кана- лам спутниковой связи). На вопрос о том, как они работают. Вы скорее всего получите оскорбительный ответ или Ваш вопрос попросту проигнорируют. Если у Вас есть веские основания задавать этот вопрос о смарт-картах, не забудьте ука- зать на них в письме к остальным подписчикам листа рассылки. 15. Когда вы впервые подписываетесь на лист рассылки, то получаете очи:т, где со- держится объяснение того, как из него можно выйти. НЕ ТЕРЯЙТЕ ЭТО СООБ- ЩЕНИЕ. Были случаи, когда люди имели проблемы с выходом из листа рассыл- ки. посылали вопросы, спрашивая, как это сделать, и приходили в негодование, когда их вопросы оставались без внимания. Если вы хотите выйти из числа под- писчиков и вам необходима помощь других участников, объясните, что вы пыта- етесь сделать, как собираетесь выполнить эту задачу. 16. Если вы. как и я. подсоединяетесь к серверу рассылки раз-два в день, то прежде чем ответить, прочтите всю линейку ответов на сообщения по интересующей вас
480 Приложение F теме. Отвечая на вопрос, на который уже был дан ответ, подумайте, что вы може- те к нему добавить. Не повторяйте то, что уже было сказано. 17. И, наконец, постарайтесь быть вежливыми со всеми участниками листа рассылки. Некоторые из них могут не обладать таким объемом знаний и опытом, как вы, или они могут воспринимать некоторые вопросы слишком близко к сердцу. Но на всех информационных серверах уровень профессионализма участников очень вы- сок. Постарайтесь его поддерживать. Используя грубые или оскорбительные выра- жения, вы можете получить такое же обращение в ответ. Весьма вероятно, что ваши послания и обоснованные вопросы будут в будущем проигнорированы теми участниками листа, которые не захотят иметь с вами дело. Короче говоря: «Не ведите себя вызывающе и сами не обижайтесь по пустякам».
ПРИЛОЖЕНИЕ G СОДЕРЖАНИЕ CD-ROM Краткое содержание Каталог «8051» Раздел «DATASHT» Раздел «DS87000» Раздел «APPS» Каталог «£8НС05» Раздел <.DATASHT» Раздел «APPS» Раздел «RAPID» Каталог «68НС05» Раздел «DATASHT» Раздел «MPLAB» Раздел «PCLITE» Раздел «APPS» Каталог «AVR» Раздел «DATASHT» Раздел «APPS» Раздел «AVRTOOLS» Каталог «Stamp» Раздел «MANUALS» Раздел «DEVTOOLS» Раздел «APPS» Раздел «BSEMU» Каталог «UMPS» Каталог «Devices» Я очень доволен тем, что смог приложить к этой книге CD-ROM, который включает справочные данные по микросхемам и средства разработки, ссылки на которые со- держатся в тексте, а также файлы с исходными текстами многочисленных приклад- ных программ, представленных в книге. CD-ROM разбит на отдельные каталоги для каждого микроконтроллера. В этом приложении даются ссылки на разделы, содержащиеся в каждом каталоге, с указа- нием размещенных в них файлов. Чтобы посмотреть справочные данные, которые помечены расширением .pdf, вам потребуется Adobe Reader («Акробат») в версииЗ.О или более поздней, который можно загрузить со следующего адреса: http://www.adobe.coni
482 Приложение G Многие файлы архивированы («зипованы») с помощью программы-упаковщика (архиватора) pkzip 2.04G компании PKWare. Эта программа, а также програ.мма- распаковшик доступны по адресу: http://www.pkware.coni Пожалуйста, не рассматриваете эти файлы как окончательные версии. Вы можете обратиться на Web-сайт производителя, чтобы посмотреть, имеются ли более по- здние версии справочных данных или прикладных программ. Каталог «8051» Раздел «DATASHT» В этом разделе содержатся справочные данные на следующие микроконтроллеры, представленные в книге: Doc0368.pdf- 20-выводный Atmel 8051 с флеш-памятью 2 Кбайт 8OC3lO.pdf — справочные данные на микроконтроллеры HSM Dallas Semiconductor 80C330.pdf 8OC52O.pdf 5000FP.pdf - справочные данные на микроконтроллер DS5000FP с шифрованием программного кода. 5000.pdf 2250t.pdf Раздел «DS87000» Программа ад я DS87000 запускается из командной строки MS-DOS DS87000.exe — программное обеспечение для программатора DS87000 Раздел «APPS» 51 API.asm — Первое приложение (2 мигающих светодиода) 5IAP2.asm — Второе приложение (цифровые часы-термометр) 51 AP2V2.asm 5lAP2V3.asm 5lAP2V4.asm 51AP3.ASM - Исходный программный код ад я «говорящей» клавиатуры 5IAP3V2.ASM 51AP3V3.ASM 51AP3V4.ASM 51AP3V5.ASM 51AP3V6.ASM 51AP3V7.ASM Каталог «68НС05» Раздел «DATASHT» 7c8arl.pdf - Справочные данные для 68НС705С8А c9ar4.pdf- Справочные данные для 68НС05С9А J IA.pdf — Справочные данные для 68HC05JIA
Содержание CD-ROM 483 P9A.pdf- Справочные данные для 68НС05Р9А Раздел «APPS» API .asm - Первое приложение (2 мигающих светодиода) RTOS4.asm- Первая версия ОСРВ «mykeRTOS» MYKERTOS.asm - Описанная в книге ОСРВ. RTOSAP.asm - Цифровые часы-термометр, написанное для «mykeRTOS» RTOSAPA.asm RTOSAPB.asm RTOSAPC.asm RTOSAPD.asm RTOSAPE.asm RTOSAPF.asm Раздел «RAPID» Программа RAPIR запускается из командной строки MS-DOS RAPID.hip — Справочная информация по ассемблеру и симулятору RAPID CASM6JlA.hlp ICS05JI A.hlp l\ST DOC.exe - Программа помощи для инсталляции RAPID RAPID DOC.ехс - Программа с документацией на RAPID RAPID.exe - Интегрированная среда RAPID RINSTALL.exe — Программа инсталляции RAPID CASM5JlA.exe — Ассемблер для 68HC705J1A ICS05JlA.exe - Программное обеспечение симулятора-программатора для 68НС705 Каталог «PICMicro» Раздел «DATASHT» 4OI39A.pdf— Справочные данные для Р1С12С5хх 3OO15N.pdf — Справочные данные для младших моделей PICMicro 30236C.pdf - Дополненные справочные данные дтя младших моделей PICMicro 40143A.pdf — Справочные данные для средних моделей PICMicro с ограниченными функциями 30234D.pdf— Справочные данные для Р1С16С6х 3O39OD.pdf- Справочные данные для PIC16C7X (PICMicro с АЦП) 30445B.pdf— Справочные данные для PIC16C84 30430B.pdf - Справочные данные для PIC16F84 (PICMicro с флеш-памятью про- грамм) 30444D.pdf ~ Справочные данные для Р1С16С9хх (содержит контроллер ЖКИ) 304l2C.pdf— Справочные данные для старших моделей PICMicro 30557B.pdf — Спецификация для программирования 12С5хх 30190F.pdf— Спецификация для программирования м.ыдших моделей PICMicro 3O228F.pdf — Спецификация для программирования средних моделей PICMicro 30262A.pdf— Спецификация для программирования PIC 16F84 30139l.pdf— Спецификация для программирования старших моделей PICMicro 30238A.pdf- Руководство по нечеткой логике 51044A.pdf— Руководство по использованию комплекта разработчика KEELOQ HCS300
484 Приложение G Раздел «MPLAB» MPLAB работает под управлением Windows 3.11. Windows/NT или совместимых с Windows эмуляторов 5IO25A.pdf- Руководство по использованию MPLAB 330l4E.pdf — Руководство по использованию ассемблера MPASM 51028A.pdf - Руководство по использованию системы разработки PICStart Plus Mp4l200.EXE- Программа установки MPLAB v 4.12 Mp41200.W02 Mp41200.W03 Mp41200.W04 Mp4l200.W05 Mp41200.W06 Mp4l200.W07 Раздел «PICLite» PlCLlTE.zip - Компилятор PICLite версия 2.07a THERMO5.pic - Приложение «Цифровые часы-термометр», написанное на PICLite Раздел «APPS» apl.asm - Первое приложение (2 мигающих светодиода) 2Thermo 1 .asm - Второе приложение (цифровые часы-термометр) 2Tlienno2.asm — 2Tltermo3.asm - 2Tltermo4.asm - 2Thermo5.asm - Каталог «AVR» Раздел «DATASHT» 1200.pdf- Справочные данные для AVR 1200 85l5.pdf- Справочные данные для AVR 8515 DOC0856.pdf- Набор команд AVR Раздел «APPS» APl.asm - Приложение с мигающими светодиодами AP2.asm - Приложение «Цифровые часы-термометр» AP2V2.asm - AP2V3.asin - AP2V4.asm - AP2V4a.asm - AP2V5.asm - AP3.ASM - Тестовый код для видеосигнала с АЦП AP3V2.ASM - Вывод на экран вертикальной полоски при передаче видеосигнала AP3V3.ASM - Вывод на телевизионный экран «пятна», определяющего положение потенциометра
Содержание CD-ROM 485 Раздел «AVRTOOLS» Средства разработки программного обеспечения дзя AVR работают под управлением Windows 3.11, Windows/NT или совместимых с Windows эмуляторов AVR.exe — Ассемблер и симулятор для AVR ASTUDIO.exe - AVR Studio Каталог «Stamp» Раздел «MANUALS» MANUAL.pdf— Версия 1.8 руководства для использования BS1 и BS2 с примерами применения Раздел «DEVTOOLS» Программное обеспечение для разработки приложений на базе BASIC Stamp запус- кается из командной строки MS-DOS STAMP.zip — Средства разработки программного обеспечения для Stamp Раздел «APPS» BASPGMI.bas — Программный код для первого приложения (мигающие светодиоды) BASPGM2.bas - PWMTEST.BAS - «Гаснущий» светодиод BSlSTEST.bas — Пример реализации последовательного обмена с помощью BASICStamp BS2STEST.bs2 Раздел «BSEMU» Эмулятор для BS 1 запускается из командной строки MS-DOS BSEMU.exe — Программное обеспечение эмулятора BS 1 *.bas — Дополнительные программы тестирования и примеры приложений для BSEMU на языке PBASIC Каталог «UMPS» UMPS работает под управлением Windows 3.11, Windows/NT или совместимых с Windows эмуляторов INSTALL.exe - Запуск инсталляции UMPS INSTMPS.SSS - Файлы программ/данных MPINST.000 MPINST.00I MPINST.002 MPINST.003 Каталог «Devices» 1820.pdf — Справочные данные для цифрового термометра DSI820 l307.pdf- Справочные данные для часов реального времени DSI307
СПИСОК СОКРАЩЕНИИ ADC, «Analog-to-Digital Converter» - АЦП. аналого-цифровой преобразователь, вы- полняющий преобразование постоянного напряжения в цифровое представление ASCII, «American Standard Character Interchange Interface» — стандартное двоичное представление символов, чаще всего используемое в компьютерах (российский ана- лог - код КОИ-7). BCD, «Binary Code Decimal* — двоично-десятичный код. в котором используются четыре бита для представления десятичных чисел от 0 до 9. BGA, «Bail Grid Array* — микросхемы с шариковыми выводами, технология монтажа которых обеспечивает соединение корпуса микросхемы с печатной платой с помо- щью двумерной сетки шариков из припоя (типичный размер между центрами шари- козз 1.27 мм). CISC, «Complex Instruction Set Computer* - архитектура процессоров, при которой реализуется большой набор достаточно сложных команд (в отличие от RISC-архитек- туры. где процессор реализует относительно небольшое количество простых команд). DAC. «Digital-to-Analog Convertor* — ЦАП. цифро-аналоговый преобразователь, вы- полняющий преобразование двоичного числа в соответствующий уровень постоянно- го напряжения. EEPROM, «Electrically Eraseable Programmable Read-Only Memory* - память, сохраня- ющая содержимое при отключении питания. Содержимое памяти может быть стерто злекгрическими сигналами без использования ультафиолетового света и снова запи- сано (электрически репрограммируемая память). EPROM, «Eraseable Programmable Read-Only Memory* - память, сохраняющая содержи- мое при отключении питания. содержимое которой может быть стерто с помощью осве- щения ультрафиолетовым еззетом и затем снова записано (репрограммируемая память) FIFO, «First In — First Out* — память, извлечение данных из которой производится в порядке, соответствующем следованию при записи. Используется для организации «очереди» данных или команд. Flash Memory - флэш-память, память типа EEPROM. в которой электрическое сти- рание содержимого производится не побитно, а сразу во всей микросхеме или круп- ными блоками. ISP, «In-System Programming* - метод программирования внутренней памяти программ микроконтроллера, при котором изменение се содержимого производится без удаления микроконтроллера из устройства. в котором он используется. I2C, «Inter-Inter Computer* — протокол синхронного последовательного обмена, ко- торый используется для связи микроконтроллер;! с периферийными устройствами или для соединения между микроконтроллерами. LIFO, «Last In — First Out* — память магазинного типа, извлечение данных из кото- рой прои вводится в порядке, обратном их записи, то есть первыми считываются дан- ные. записанные последними. Используется для организации стекой, обеспечиваю- щих вложение подпрограмм и ряд других процедур. OTP, «One-Time Programmable* — микроконтроллеры с однократно программируемой памятью программ. которая не допускает етираниз! и повторной записи. Обычно реа-
Список сокращений 487 лизуется путем размещения микроконтроллеров с EPROM памятью в пластмассовый корпус без кварцевого окошка, которое позволяет производить стирание содержимо- го памяти при освещении ультрафиолетовым светом. РСВ, «Printed Circuit Board» - печатная плата с металлическими соединениями и контактными площдками для монтажа микросхем и других компонентов. PROM, «Programmable Read-Only Memory» - первоначально этот термин использо- вался для обозначения постоянной памяти, запись содержимого в которую произво- дилась электрическими сигналами, вызывающими расплавление специальных пере- мычек из легкоплавких материалов. В настоящее время данный термин часто служит для обозначения однократно программируемой памяти (ОТР). РТН, «Pin Through Hole» - технология монтажа компонентов, при которой их выводы вставляются в специальные облуженные отверстия на печатной плате, после чего призводится их припайка. PWM, «Pulse Width Modulation» — широтно-импульсная модуляция (ШИМ) сигна- лов, при которой изменяется длительность передаваемых импульсных сигналов. RAM, «Random Access Memory» — оперативная память, содержимое которой может считываться и записываться в процесс работы цифровой системы. В микроконтролле- рах обычно используется память RAM со статическим хранением информации (SRAM. Static RAM), содержимое которой сохраняется сколь угодно долго, если включено напряжение питания. RISC, «Reduced Instruction Set Computer» — архитектура процессоров, при которой реализуется относительно небольшое количество простых команд (в отличие от CISC- архитектуры, где процессор реализует большой набор достаточно сложных команд). ROM, «Read-Only Memory» - постоянная память, допускающая только считывание ранее записанной информации. Обычно, таким образом, обозначается «масочно- программируемая» память, в которую предварительная запись информации произво- дится в процессе изготовления микросхем с помощью использования соответствую- щих фотошаблонов — «масок». SMT, «Surface Mount Technology» — технология монтажа, при которой микросхемы размешаются на поверхности печатной платы, а их выводы припаиваются непосред- ственно к металлическим проводникам на плате без использования монтажных от- верстий (см. РТН). UART, «Universal Asynhronous Receiver/Transmitter» - периферийное устройство, кото- рое реализует асинхронный последовательный обмен данными с внешними устрой- ствами. USART, «Universal Synhronous/Asynhronous Receiver/Transmitter» — периферийное уст- ройство, которое реализует синхронный (с использованием синхросигнала, форми- руемого микроконтроллером или внешним устройством) или асинхронный последо- вательный обмен данными с внешними устройствами. ZIF, «Zero Insertion Force» — разъем с «нулевым» усилием соединения, который обес- печивает электрический контакт с выводами микросхемы с минимальным усилием, не вызывающим деформацию выводов.