Текст
                    В.С.Яценков
МИКРОКОНТРОЛЛЕРЫ
Microchip
ПРАКТИЧЕСКОЕ
РУКОВОДСТВО
СХЕМЫ
ПРИМЕРЫ ПРОГРАММ
ОПИСАНИЯ
РЕСУРСЫ INTERNET
Москва
Горячая линия - Телеком
2002

ББК 32.97 Я 92 УДК 681.325.5 Яценков В. С. Я 92 Микроконтроллеры Microchip®. Практическое руководство — Москва: Горячая линия-Телеком, 2002. — 296 с. ил. ISBN 5-93517-061-2 Приведена справочная информация по наиболее популярным микро- контроллерам Microchip®. Подробно описано начало работы с микрокон- троллерами компании Microchip® на примере микроконтроллера PIC16F84 Даны практические схемы и описания программатора, интег- рированной среды разработчика MPLAB-IDE, иллюстрировано примера- ми простейших npoi рамм, подборкой практических примеров устройств на основе микроконтроллеров PIC. Рассмотрены принципиальные схемы и исходные тексты программ, тексты часто применяемых подпрограмм, таких, как конвертация чисел, работа с шиной 12С и т.д. Отдельное вни- мание уделено подборке ссылок на русско- и англоязычные ресурсы в Интернет с их краткой аннотацией. Предназначена разработчикам и радиолюбителям, занимающимся проектированием различных устройств. ББК 32.97 Яценков Валерий Станиславович МИКРОКОНТРОЛЛЕРЫ MICROCHIP® ПРАКТИЧЕСКОЕ РУКОВОДСТВО Редактор Петкин А. Ю. Подготовка оригинал-макета Рыськов Ю. Н. Подписано в печать 28.08.2001. Формат 60x88/16. Бумага офсетная. Усл. печ. л. 18,5. Уч. изд. л. 22. Тираж 5 000 экз. Заказ №4879. ISBN 5-93517-061-2 © Яценков В.С. 2002 Отпечатано в полном соответствии с качеством предоставленных диапозитивов в Тульской типографии. 300600, г. Тула, пр. Ленина, 109.
Предисловие Эта книга не является классическим справочником, содержащим только техническое описание некоторых микросхем. Автор предлагает вашему вниманию настольную книгу, имея которую можно, что называ- ется, "с нуля" начать работу с микроконтроллерами серии PIC и научиться их программировать. В этом поможет подборка примеров схем и программ с подробными комментариями. Разумеется, в ней при- сутствует и необходимая справочная информация. Содержание разделе- но на три основные части. В первой части приведена справочная инфор- мация по наиболее популярным микроконтроллерам Microchip®. За ос- нову взято описание микроконтроллеров PIC16F84/CR84 и PIC12C5XX. Знание устройства и особенностей применения контрол- леров семейств Р1С12ххх и Р1С16ххх позволит без затруднений перей- ти к применению более сложных и мощных микроконтроллеров фирм Microchip® и Scenix®. Начинающему разработчику, не имеющему опыта работы с мик- роконтроллерами рекомендуется в общих чертах ознакомиться с опи- саниями, получить представление о возможностях и структуре микро- контроллеров и перейти ко второй и третьей частям. В дальнейшем, по мере приобретения опыта, разработчик будет вынужден неодно- кратно обращаться к описаниям. Именно по этой причине, для удоб- ства работы, они вынесены в начало книги. Не секрет, что большинство начинающих разработчиков совер- шают одни и те же ошибки, от которых не спасает применение фир- менной документации. Опираясь на собственный опыт, автор снабдил описания подробными комментариями, они выделены курсивом. Во второй части подробно, по шагам, описано начало работы с микроконтроллерами компании Microchip® на примере микроконт- роллера PIC16F84. Приведены схемы и описания программатора, ин- тегрированной среды разработчика MPLAB-IDE, примеры простей- ших программ. Третья часть книги содержит подборку практических примеров устройств на основе микроконтроллеров PIC. Приведены принципи- альные схемы и исходные тексты программ. Также опубликованы тексты часто применяемых подпрограмм, таких, как конвертация чисел, работа с шиной PC и т.д. Завершает книгу подборка ссылок на русско- и англоязычные ресурсы в Интернет с их краткой аннотацией. 3
Введение В настоящее время более тридцати зарубежных фирм выпускают микроконтроллеры массового применения с разрядностью 8 бит, не- дорогие и пригодные для использования в самых разнообразных при- ложениях. Однако именно микроконтроллеры серии PIC фирмы Microchip® Technology Inc. переживают последние три-четыре года в России поистине взрывной рост популярности Эти микроконтролле- ры также крайне популярны во всем мире, как у производителей элек- тронной техники, так и среди радиолюбителей. В чем же причина такой популярности? Конечно, не последнюю роль сыграли правильная маркетинговая политика, мощная и проду- манная поддержка разработчиков со стороны фирмы и низкая стои- мость микросхем. Кроме этого, сам продукт обладает целым рядом неоспоримых достоинств. Микроконтроллеры PIC фирмы Microchip® объединили в себе все передовые технологии, применяемые в произ- водстве микроконтроллеров, развитую RISC-архитектуру, мини- мальное энергопотребление при высоком быстродействии, ППЗУ, программируемое пользователем, функциональную законченность. Четкая и продуманная внутренняя структура контроллеров и не- большая, но мощная система команд с интуитивно понятной мнемо- никой значительно облегчают процесс изучения контроллеров PIC и написание для них программ. Для производителей электронной аппаратуры микроконтроллеры PIC интересны обширным и законченным функциональным рядом, возможностью заказа дешевых масочно-программируемых кристал- лов при наличии отладочных кристаллов с флэш-памятью и УФ- стиранием. Микроконтроллеры серии PIC идеально подходят для организа- ции и развития малого и среднего бизнеса в области производства электронной аппаратуры. При минимальных затратах рабочего вре- мени и денежных средств можно легко наладить производство мини- АТС, телефонных блокираторов, "интеллектуальных" датчиков сиг- нализации, систем контроля доступа, автомобильной электроники и т п Причем в таких изделиях от 30 до 90 процентов функциональной 4
Введение нагрузки несет на себе программное обеспечение, которое может быть легко модифицировано и приспособлено к нуждам потребителя. Немаловажное значение имеет возможность защиты кода про- граммы от несанкционированного копирования или изменения На- личие этой опции эффективно защищает права разработчика и про- изводителя, и особенно важно в России, где эти права систематически нарушаются. (Известны методы снятия бита защиты при помощи специального программатора, но почти во всех последних версиях кристаллов PIC фирма Microchip® устранила возможность нелегаль- ного снятия бита защиты от считывания.) Для радиолюбителей микроконтроллеры PIC также интересны до- ступностью цены и простотой в освоении и применении, а также тем, что открывают для них новые, ранее невиданные области творчества. Радиолюбитель освобождается от непроизводительного труда, на- правленного на подбор и поиск подходящих компонентов, разработ- ку сложной схемотехники, реализованной на микросхемах жесткой логики Значительно упрощается сама конструкция устройства и по- вышается надежность. В сети Интернет помещено огромное количество сайтов и конфе- ренций, посвященных микроконтроллерам серии PIC. Такое ко- личество разнообразной информации, большей частью на англий- ском языке, способно вызвать растерянность у начинающего разра- ботчика или радиолюбителя. В данной книге предпринята попытка объединить основополага- ющие материалы по микроконтроллерам фирмы Microchip® таким образом, чтобы начинающий их применять разработчик, будь то лю- битель или профессионал-радиоинженер, нашел для себя ответ на во- прос "С чего начать?" и получил стартовые навыки, а более подго- товленный специалист приобрел полезную справочную информацию, которая всегда будет под рукой. Объем книги ограничен и за более полными сведениями читателю неизбежно придется обратиться в Интернет. В конце книги приведена подборка адресов официальных и любительских сайтов, на которых размещена различная информация о применении микроконтроллеров производства Microchip® Technology Inc. Внимание! Схемы, описания и листинги программ, помещенные в книге, предо- ставлены по принципу "as is” ("как есть"), являются свободно распро- страняемыми для ознакомления и любительского применения, но не под- пежат коммерческому использованию в составе изделий или разрабо- ток без согласия авторов 5
Введение Все упомянутые в данном издании товарные знаки и зарегистрирован- ные товарные знаки принадлежат их законным владельцам Благодарности. Автор искренне благодарит за огромное количество любезно пре- доставленной полезной информации, помощь и советы своего друга и коллегу Андрея Худоногова и рад отметить его незаменимую роль в подготовке некоторых подпрограмм и схемных решений, использо- ванных в данной книге. Автор чрезвычайно признателен руководству и персоналу фирмы "АТОС", www.atos.ru. за предоставленную техническую информацию и образцы микросхем Dallas Semiconductor для испытаний и отладки. 6
Часть 1 ОБЗОР МИКРОКОНТРОЛЛЕРОВ PIC ФИРМЫ MICROCHIP Все микроконтроллеры серии PIC (Peripheral Interface Controller - пе- риферийный контроллер интерфейса) построены по так называемой Гарвардской архитектуре, когда используются раздельные области па- мяти и шины для данных и для команд. Это позволяет одновременно, за один цикл, получать доступ как к памяти команд, так и к данным. Кроме того, существует двухступенчатый конвейер, который обеспечивает од- новременное исполнение команды и выборку следующей. Все команды, кроме команд перехода, выполняются за один машинный цикл. Перехо- ды, включая возврат из подпрограмм, выполняются за два цикла. Система команд высокосимметрична, то есть позволяет выполнять любую операцию над любым регистром с применением любого спосо- ба адресации. Такая система команд значительно упрощает процесс программирования, сокращает объем программы и увеличивает про- изводительность. Память программ располагается на кристалле и снабжается битом защиты. Микроконтроллеры выпускаются в отладочном, однократно программируемом и масочном вариантах. Отладочные кристаллы бывают как с электрически стираемой FLASH-памятью, так и с ультрафиолетовым стиранием. Наиболее удобны для отладки микроконтроллеры с FLASH-памятью, позво- ляющие быстро и многократно перепрограммировать контроллер, внося изменения в программу. Но далеко не все контроллеры PIC имеют FLASH-версию. По сравнению с остальными вариантами производства, отладочные версии имеют наибольшую стоимость. Впрочем, наиболее популярный у радиолюбителей многократно пе- репрограммируемый контроллер PIC16F84 в корпусе DIP-18 стоит в России, как правило, не более 4-х долларов. Однократно программируемые контроллеры дешевле отладочных и позволяют пользователю самому записать в них окончательную версию программы, что удобно при мелкосерийном производстве. Кроме того, некоторые однократно программируемые контроллеры дополнительно имеют EEPROM (электрически перепрограммируе- мое ПЗУ) памяти данных, что позволяет, даже после записи про- 7
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip граммы в кристалл, изменять константы программы, например, код доступа к сигнализации, частоты передатчика/приемника, частоту вращения двигателя и т.д. Таким образом, осуществляется индивиду- альная настройка устройства. Масочно программируемые кристаллы имеют самую низкую сто- имость и программируются при изготовлении крупных партий на заводе фирмы Microchip. Некоторые микроконтроллеры обладают специальными функциями: встроенный драйвер ЖКИ, до 16-ти каналов АЦП, ШИМ, поддержка протоколов ГС™ и SPI™, контроль за напряжением питания и т. д. ПОПУЛЯРНЫЕ МИКРОКОНТРОЛЛЕРЫ PIC Чтобы избежать неоправданного дублирования информации, ос- новное внимание при описании популярных микроконтроллеров PIC будет уделено семейству PIC16F8x/PIC16CR8x. Во-первых, они обла- дают основным набором опций и на их примере можно легко и на- глядно рассмотреть все общие принципы построения микроконтрол- леров PIC. Во-вторых, именно это семейство очень популярно у ра- диолюбителей всего мира и профессиональных разработчиков уст- ройств малой и средней степени сложности. Наличие флэш-версии в большинстве случаев позволяет обойтись при отладке устройства без дорогих внутрисхемных эмуляторов, причем программировать эти контроллеры можно непосредственно в собранной схеме, используя всего пять проводов. Отладочные версии с ультрафиолетовым стира- нием менее удобны, т.к. требуют для надежного стирания 45 - 60 ми- нут облучения, причем стабильность работы устройства при малых питающих напряжениях тем выше, чем дольше длилось стирание. Набор команд для PIC16F8x сегодня фактически можно рассмат- ривать как базовый, а в дальнейшем лишь заострять внимание на отличиях в перечне команд других контроллеров PIC. Как правило, наиболее часто происходит перенос ранее написанных программ на более новые семейства, близкие по параметрам. Обычно для адапта- ции программы достаточно краткого перечня различий и рекоменда- ций, как, например, при переносе программ с Р1С16С5х на PIC16F8x. Затруднения может вызвать перенос программ между семействами, имеющими значительные аппаратные различия. Например, некото- рые контроллеры имеют встроенный модуль ШИМ. При переносе программ, использующих этот модуль, на другие контроллеры, по- надобится программная эмуляция ШИМ. Для программ, критичных по времени исполнения, это далеко не всегда возможно. Фрагменты текста, в которых рассматриваются распространенные ошибки или даются практические рекомендации, выделены курсивом. 8
Микроконтроллеры PIC16F8x и PIC16CR8x Также выделены курсивом фрагменты описания, на которые надо об- ратить особое внимание. Следует внимательно отнестись к изучению особенностей програм- мирования портов, подключения источников тактовой частоты и сов- местимости модификаций. Так, например, некоторые контроллеры имеют на входе двунаправленного 'порта программно подключаемые подтягивающие резисторы нагрузки (pull-up resistors). Наличие этих резисторов позволяет обойтись без дополнительных внешних деталей. Но если в результате недосмотра при написании программы разра- ботчик забудет установить бит слова состояния, включающий эти ре- зисторы или после исполнения некорректной логической операции с реги- стром бит будет сброшен, то устройство может работать со сбоями, либо вообще не заработает. Причем может случиться так, что эта ошибка проявит себя только при стечении определенных обстоятельств. Но, как известно, если неприятность возможна, то она случится в самое неподходящее время и с максимальным ущербом. Для написания и отладки программ удобно использовать фирменный пакет - интегрированную среду разработчика MPLAB-IDE, включающую в себя редактор, ассемблер и программный симулятор с возможностью пошаговой отладки. Также поддерживается фирменный программатор и внутрисхемный эмулятор. MPLAB-IDE распространяется бесплатно и мо- жет быть загружен с сайта производителя www.microchip.сот или с сайта российского дистрибьютора www.microchip.ru МИКРОКОНТРОЛЛЕРЫ СЕРИИ PIC16F8X И PIC16CR8X PIC16F8x является подгруппой в семействе Р1С16Сххх - недорогих, высокопроизводительных, 8-битных CMOS микроконтроллеров. В этой главе приводится описание следующих контроллеров: PIC16F83, PIC16F84, PIC16CR83, PIC16CR84 В тексте для краткости обычно будет упоминаться PlC16F8x, за исключением случаев, когда необходимо выделить особенности раз- личных модификаций Описание также пригодно для контроллеров с расширенным диапазоном питающих напряжений, таких как PIC16LF8x, PIC16LCR8X. Описание контроллеров Р1С16С8х отдельно не приводится, так как для них, за некоторым исключением, подходит описание PIC16F8x и PIC16CR8x. В конце этой главы приведено Приложение 1, в котором описаны отличия этих контроллеров друг от друга Пользователи, хорошо знакомые с семейством Р1С16С5х могут легко перенести свои программы на семейство PIC16F8x, пользуясь Приложением 2 в конце главы 9
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Разработка приложений для семейства PIC16Fxx/PIC16Cxxx под- держивается наличием полнофункционального макроассемблера, про- граммного симулятора, внутрисхемного эмулятора, простейших и полнофункциональных программаторов Также имеются компилятор С и поддержка нечеткой логики Контроллеры PIC16F8x, как и все микроконтроллеры с торговой маркой PICmicro™ основаны на развитой RISC-архитектуре. Они имеют расширенные опции ядра, восьмиуровневый стек и различные внутрен- ние и внешние прерывания. 14-битные слова команд и 8-битные данные передаются независимо, по разделенным шинам памяти и данных. Боль- шинство команд исполняется за один машинный цикл, длительностью 400 нс при тактовой частоте 10 МГц (исключая команды переходов, ко- торые исполняются за два цикла, 800 нс при 10МГц). Набор команд со- стоит из 35 инструкций с интуитивно понятной мнемоникой. Микроконтроллеры PIC16F8x обычно позволяют достичь умень- шения объема программы в соотношении 2:1 и увеличения скорости ее исполнения в соотношении 4:1 по сравнению с большинством дру- гих 8-битных микроконтроллеров этого класса. На кристалле расположены 64 байта EEPROM памяти констант с гарантированным сроком хранения данных более 40 лет при от- ключенном питании, до 68 байт памяти данных (рабочие регистры для хранения переменных). Кристаллы выпускаются с максимальны- ми тактовыми частотами 4МГц и 10МГц, имеют 13 портов вво- да/вывода, встроенный таймер/счетчик TMR0, сторожевой таймер WDT, экономичный режим засыпания SLEEP. Параметр PIC16F83 PIC16CR83 PIC16F84 PIC16CR84 Макс, тактовая частота, МГц 10 10 10 10 Флэш-память программ 512 — 1К — EEPROM па- мять программ — — — — ROM память программ — 512 — 512 Память дан- ных, байт 36 36 68 68 EEPROM па- мять данных, байт 64 64 64 64 Модуль таймера TMR0 TMR0 TMR0 TMR0 Источники прерываний 4 4 4 4 10
Микроконтроллеры PIC16F8x и PIC16CR8x Параметр PIC16F83 PIC16CR83 PIC16F84 PIC16CR84 Линии вво- да/вывода 13 13 13 13 Диапазон пи- тающих на- пряжений 2.0-6.0 2.0-6.0 2.0-6.0 2.0-6.0 Тактовую частоту можно задавать при помощи RC-цепочки, не- дорогого керамического резонатора или кварцевого резонатора. Может быть подключен также внешний генератор тактовой частоты. Встроенного тактового генератора, тактирующего процессор, нет. От встроенного на кристалл RC-генератора могут тактироваться только таймер/счетчик TMR0 или сторожевой таймер, по выбору. Микроконтроллеры PIC16F8x могут программироваться непосред- ственно на плате устройства, что позволяет отлаживать программу либо записывать константы и калибровочные данные. Для програм- мирования на плате необходимо максимум пять проводов: питание 5 В, напряжение программирования, последовательные данные, тактирую- щие импульсы и общий. Память программ только встроенная. РАСПОЛОЖЕНИЕ И НАЗНАЧЕНИЕ ВЫВОДОВ Расположение выводов описываемых контроллеров показано на рисунке 1-1. Варианты корпуса 18-pin DIP, SOIC. RA2-*H ►[Т -► RA1 RA3-0H ►|~2~ ~17~[< -► RA0 PIC16F8X ^А4/Т0СККН ►1 3 PIC16CR8X 16 — OSC1/CLKIN MCLR — 4 ~15~[— -►OSC2/CLKOUT Vss^ ►|~5~ ^оо RB0/INT ►[~6~ ~1з}< *-RB7 RB1* »|~7~ ~12~[< ► RB6 RB2-*I -►RB5 RB3-*H »4~э~ ~ib}< RB4 Рис. 1-1. Расположение выводов PlC16F8x, PlC16CR8x Назначение выводов кратко описано в таблице 1-1. II
Таблица 1-1. Назначение выводов PIC16F8x / PIC16CR8x Обозначение № Тип (I/O/P) Тип буфера Назначение OSC1/CLKIN 16 I ST/CMOSW Вход для подключения кварцевого ре- зонатора, либо RC-цепочки, либо вход для внешнего тактового генератора OSC2/CLKOUT 15 О — Выход для под ключения кварцевого резо- натора в режиме работы с кварцем, в ре- жиме RC-генератора на выходе присутст- вуют импульсы с частотой 1/4otOSC1 MCLR 4 I/P ST Сброс по низкому уровню на входе. При программировании кристалла - вход напряжения программирования RA0 17 I/O TTL Выводы двунаправленного порта А RA1 18 I/O TTL RA2 1 I/O TTL RA3 2 I/O TTL RA4/T0CKI 3 I/O ST RA4/T0CKI может быть настроен как вход импульсов для таймера-счетчика TMR0. Выход с открытым стоком Часть 1. Обзор микроконтроллеров PIC фирмы Microchip
Обозначение № Тип (I/O/P) Тип буфера Назначение RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 6 7 8 9 10 11 12 13 I/O I/O I/O I/O I/O I/O I/O I/O TTL/STO TTL TTL TTL TTL TTL TTL/ST<2> TTL/ST<2) Выводы двунаправленного порта В К выводам порта могут быть программно подключены внутренние подтягиваю- щие резисторы с Vdd. RB0/INT может быть также программно настроен как вход внешнего прерывания. RB4...RB7 могут быть также программно настроены как входы прерывания по из- менению уровня на любом из этих вхо- дов. Направление изменения задается программно. При программировании кристалла RB6 используется как тактовый, RB7 как вход/выход данных. Vss 5 р — Общий провод Vdd 14 р — Положительное напряжение питания Обозначения I - Вход, О - Выход, I/O - Вход/Выход, Р - вывод питания, TTL - стандартный TTL вход, ST - вход с триггером Шмитта Примечания. 1. Триггер Шмитта на входе применяется, только если вывод сконфигурирован, как вход внешнего прерывания 2. Триггер Шмитта на входе применяется только в режиме последовательного программирования кристалла. 3 Триггер Шмитта на входе применяется только если включен режим RC-генератора, в остальных □ случаях как CMOS вход. Микроконтроллеры PIC16F8x и PIC16CR8x
Часть 1. Обзор микроконтроллеров PICb фирмы Microchip ЭЛЕКТРИЧЕСКИЕ ПАРАМЕТРЫ Основные параметры, которые обычно необходимо знать при разработке и эксплуатации устройств на базе PIC16F8X таковы: Параметр Значение Примечание Рабочая температура Та, °C 0 ... +40 -40 ... +85 Коммерческое исполнение. Индустриальное исполнение Максимальная такто- вая частота Fosc, МГц 4 10 PIC16F83/84-4 PIC16F83/84-10 Напряжение питания Vdd, В 2,0 ... 6,0 4,0 ... 6,0 PIC16LF83/84 PIC16F83/84 Потребляемый ток в стандартном режиме Idd, мА для PIC16F83/84 1,8 ... 4,5 5... 10 Fosc=4 МГц, Vdd=5.5 В Fosc=10 МГц, Vdd=5.5 В Потребляемый ток в стандартном режиме Idd, мА для PIC16LF83/84 1 ... 4 15... 45 Fosc=2 МГц, Vdd=5.5 В Fosc=32 кГц, Vdd=2.0 В, WDT отключен Потребляемый ток в режиме SLEEP Ipd, мкА для PIC16F83/84 7 ... 28 1 ... 16 1 ... 14 Vdd=4 В, WDT вкл., инд. Vdd=4 В, WDT выкл., инд. Vdd=4 В, WDT выкл., комм. Потребляемый ток в режиме SLEEP Ipd, мкА для PIC 16LF83/84 3 ... 16 0,4... 9 0,4... 7 Vdd=2 В, WDT вкл., инд. Vdd=2 В, WDT выкл., инд. Vdd=2 В, WDT выкл., инд. Максимальный вте- кающий ток для лю- бого вывода, мА 25 Управление светодиодами без дополнительного бу- фера (но с резистором!) Максимальный выте- кающий ток для лю- бого вывода, мА 20 Управление светодиодами без дополнительного бу- фера (но с резистором1) Количество циклов стирание/запись для флэш-памяти про- грамм, не менее 1000 Количество циклов стирание/запись для памяти данных EEPROM, не менее 10.000.000 14
Микроконтроллеры PIC16F8x и PIC16CR8x ОРГАНИЗАЦИЯ ПАМЯТИ В микроконтроллерах PIC16F8x существует два блока памяти - лмять программ и память данных. Каждый блок имеет собствен- ю шину, таким образом, доступ к блокам может происходить од- । 'временно. Память данных, в свою очередь, разделена на специальные реги- стры и регистры общего применения (ОЗУ пользователя). Специ- альный регистры применяются для хранения битов состояния, опре- деляющих работу портов вода/вывода, таймеров и других перифе- рийных модулей контроллера. Подробно каждый специальный ре- гистр описан при рассмотрении соответствующего модуля. Кроме специальных регистров и ОЗУ, пространство памяти дан- ных содержит ячейки EEPROM. Эта область памяти не может быть адресована непосредственно, и доступ к ней получают через специ- альный регистр косвенной адресации EEADR, в который записы- вают порядковый номер ячейки. 64 байта EEPROM имеют номера с 00h по 3Fh. Обычно EEPROM используется для хранения констант, значения которых не должны пропадать при отключении питания, например кодов управления, индивидуальных номеров и т.п. Важ- ным достоинством EEPROM является то, что данные в ней могут быть изменены даже после занесения программы в однократно про- граммируемый кристалл. Несмотря на то, что EEPROM гарантированно допускает 10,000,000 циклов стирания-записи, изготовитель не рекомендует исполь- зовать ее ячейки для хранения часто изменяемых значений, поскольку при этом может быстро исчерпаться ее ресурс Для хранения программных переменных следует использовать ОЗУ (регистры общего применения) ПАМЯТЬ ПРОГРАММ Микроконтроллеры группы PIC16Fxx имеют 13-битный про- граммный счетчик, позволяющий адресовать до 8К х 14 памяти про- грамм. В микроконтроллерах PIC16F83 и PIC16CR83 физически адресуются только первые 512 (OOOOh-OlFFh) ячеек памяти. В PIC16F84 и PIC16CR84 доступны первые 1024 (0000h-03FFh) ячеек памяти. Обращение к старшим адресам, лежащим за пределами ука- занного диапазона физически равносильно обращению к соответст- вующим адресам внутри диапазона, например, для PIC16F84 адреса 30h, 430h, 830h, C30h, 1030h, 1430h, 1830h и lC30h равносильны и адресуют одну и ту же команду. Старт по сбросу происходит с адреса OOOOh, вектор прерывания один и расположен по адресу 0004h. Обычно по адресу 0004h распо- лагают подпрограмма распознавания и обработки прерываний, а по 15
Часть 1. Обзор микроконтроллеров Р1С фирмы Microchip адресу OOOOh команду перехода на метку, расположенную за под- программой обработки прерывания. ПАМЯТЬ ДАННЫХ В микроконтроллерах PIC16F8x память данных разбита на две части - специальные регистры и регистры общего применения (ОЗУ пользователя). Кроме этого, память данных разделена на два банка. Организация памяти данных графически показана на рис. 1-2. PIC16F83/CR83 Адрес Адрес 00h Косвенный адрес Косвенный адрес 80h Olh TMRO OPTION 81h 02h PCL PCL 82h 03h STATUS STATUS 83h 04h FSR FSR 84h 05h PORTA TRISA 85h 06h PORTB TRISB 86h 07h Недоступен Недоступен 87h 08h EEDATA EECON1 88h 09h EEADR EECON2 89h OAh PCLATH PCLATH 8Ah OBh INTCON INTCON 8Bh OCh 36 регистров обще- го применения (SRAM) Отображается на пространство бан- ка 0 8Ch 2Fh AFh 30h BOh 7Fh FFh Банк 0 Банк 1 16
Микроконтроллеры PIC16F8x и PIC16CR8x PIC16F84/CR84 Адрес Адрес OOh Косвенный адрес Косвенный адрес 80b Olh TMRO OPTION 81h 02h PCL PCL 82h 03h STATUS STATUS 83h 04h FSR FSR 84h 05h PORTA TRISA 85h 06h PORTB TRISB 86h 07h Недоступен Недоступен 87h 08h EEDATA EEC0N1 88h 09h EEADR EEC0N2 89h OAh PCLATH PCLATH 8Ah OBh INTCON INTCON 8Bh OCh 68 регистров обще- го применения (SRAM) Отображается на пространство банка 0 8Ch 4Fh CFh 50h DOh 7Fh FFh Банк 0 Банк 1 Рис. 1-2. Организация памяти данных Переключение банков происходит при помощи задания 5-го бита в регистре STATUS. Если бит установлен в 0, адресуется нулевой банк, если в 1, соответственно, первый. Некоторые специальные регистры адресуют- ся независимо от включенного банка. Например, обращение по адресу 03h при включенном банке 0 или по адресу 83h при включенном банке 1 равнозначно дает доступ к специальному регистру STATUS. Регистры общего применения представляют собой статическое ОЗУ и могут быть 17
Часть 1. Обзор микроконтроллеров Р1С фирмы Microchip адресованы непосредственно или косвенно, с применением регистра кос- венной адресации FSR. Адресация не зависит от банка. Так, например, адреса OEh и 8Eh адресуют одну и ту же ячейку ОЗУ СПЕЦИАЛЬНЫЕ РЕГИСТРЫ Специальные регистры представляют собой статическое ОЗУ, в котором некоторые биты устанавливаются по умолчанию при сбро- се (см. таблицу 1-2). РЕГИСТР STATUS (АДРЕС ОЗН, 81Н) Регистр STATUS хранит арифметические флаги АЛУ, информа- цию о сбросе и бит выбора банка памяти данных. Как и любой дру- гой регистр, STATUS может являться регистром назначения для лю- бой операции. Но если над регистром STATUS выполняют операцию, которая может изменить состояние битов Z, DC и С, то запись в эти три бита блокируется. Их состояние изменяется только аппаратно, в зависимости от состояния АЛУ. Более того, биты ТО и PD также не- доступны для записи. Следовательно, результат операции с регистром STATUS в качестве приемника может оказаться совсем не таким, как ожидалось. Например, команда CLRF STATUS (очистить полностью регистр STATUS) на самом деле очистит только три старших бита и установит в 1 бит Z. Поэтому к регистру STATUS следует применять только команды BCF, BSF, SWAPF и MOVWF, потому что они не изменяют другие биты состояния. Рассмотрим подробно назначение битов регистра STATUS: bit7 IRP - регистр выбора банка памяти, применяемый при кос- венной адресации. Это бит не применяется в PIC16F8X и должен всегда оставаться сброшенным. Чтобы обеспечить совместимость вашей программы с более новыми контрол- лерами, никогда не используйте это бит в своей программе. О - bank 0,1 (00h-FFh) 1 = bank 2,3 (100h-lFFh) bit6-5 RP1, RPO - регистр выбора банка памяти, применяемый при прямой адресации. 00 = bank 0 (00h-7Fh) 01 = bank 1 (80h-FFh) 10 = bank 2 (100h-17Fh) 11 = bank 3(180h-lFFh) Каждый банк содержит 128 байт. Поскольку в PIC16F8x использу- ется только два банка, 0 и 1, то бит RP1 должен быть всегда сброшен, а для выбора банка используется бит RP0. 18
Таблица 1-2. Специальные регистры и их назначение Адрес Название bit? bit6 bitS bit4 bit3 bit2 bitl bitO Значение после включе- ния пи- тания Значение после осталь- ных ва- риантов сброса*3) Банк 0 00h INDF Для косвенной адресации через FSR — Olh TMRO 8-битный таймер реального времени/счетчик хххх хххх UUUU UUUU 02h PCL Младшие 8 бит программного счетчика 0000 0000 0000 0000 03h STATUS® IRP RP1 RPO TO PD Z DC C 0001 1ххх 000q quuu 04 FSR Указатель косвенной адресации памяти данных ХХХХ хххх UUUU UUUU 05h PORTA — — — RA4/ TOCK RA3 RA2 RAI RAO —X хххх —U UUUU 06h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RBI RBO хххх хххх UUUU UUUU 07h Запрещенный адрес, читается как "0" 08h EEDATA Регистр данных для записи в EEPROM хххх хххх UUUU UUUU 09h EEADR Регистр адреса для записи в EEPROM хххх хххх UUUU UUUU Часть 1. Обзор микроконтроллеров PICb фирмы Microchip
Адрес Название bit7 bit6 bit5 bit4 bit3 bit2 bitl bitO Значение после включе- ния пи- тания Значение после осталь- ных ва- риантов сброса<3> OAh PCLATCH — — — Буфер запи- си старших 5 бит РСО) —0 0000 —0 0000 OBh INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000Х 0000 000и Банк 1 80h INDF Для косвенной адресации через FSR -------- ........ 81h OPTION. REG RBPU INT EDG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111 82h PCL Младшие 8 бит программного счетчика 0000 0000 0000 0000 83h STATUS® IRP RP1 RPO TO PD Z DC С 0001 1ххх OOOqquuu 84h FSR Указатель косвенной адресации памяти данных хххх хххх ииии ииии 85h TRISA — — — Направление данных через порт А —11111 —1 1111 Часть 1. Обзор микроконтроллеров PIC фирмы Microchip
Адрес Название bit? bit6 bit5 bit4 bit3 bit2 bitl bitO Значение после включе- ния пи- тания Значение после осталь- ных ва- риантов сброса^3) 86h TRISB Направление данных через порт В 1111 1111 1111 1111 87h Запрещенный адрес, читается как "0" — 88h EECON1 — — — EEIF WR ERR WR EN WR RD —0 хООО —0 q000 89h EECON2 Контрольный регистр №2 EEPROM (физически недоступен) — 8Ah I; PCLATCH — —- — Буфер запи- си старших 5 бит РС<‘) —0 0000 —0 0000 8B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000Х 0000 000х Обозначения-, х - неизвестно, и - не изменяется, - - аппаратно всегда читается как "О", q - значение' определяется контекстом. Примечание 1. Старший байт программного счетчика недоступен напрямую. Содержимое PCLATCH может быть перенесено в старший байт программного счетчика, но содержимое программ- ного счетчика никогда не переносится в PCLATCH. Примечание 2 Биты ТО и PD регистра STATUS не изменяются при сбросе по сигналу MCLR. Примечание 3. К остальным вариантам сброса относятся внешний сброс через MCLR и сброс по пе- реполнению сторожевого таймера. Микроконтроллеры PIC16F8X и PIC16CR8X
Часть 1. Обзор микроконтроллеров PICb фирмы Microchip bit4 ТО - флаг срабатывания сторожевого таймера. Устанавлива- ется в 1 при включении питания и командами CLRWDT и SLEEP. Сбрасывается в 0 по завершении выдержки стороже- вого таймера. bit3 PD - режим хранения данных. Устанавливается в 1 при включении питания или выполнении команды CLRWDT. Сбрасывается в 0 командой SLEEP. bit2 Z - флаг нулевого результата. Устанавливается в 1, если ре- зультат арифметической или логической операции равен ну- лю. Сохраняет свое значение до следующей операции. bitl DC - флаг десятичного переноса. Используется для команд ADDWF, ADDLW, SUBWF и SUBLW. Отслеживает перенос из четвертого разряда результата. 1 = Произошел перенос при сложении О = Не произошел перенос при сложении Вычитание в АЛУ выполняется сложением кода первого операнда с дополнительным кодом второго операнда. Значение бита контекстно зависит от того, какая операция выполнялась. Для операции вычитания значения бита инвер- тированы. bitO С - флаг переноса. Используется для команд ADDWF, ADDLW, SUBWF и SUBLW. Отслеживает перенос из старше- го разряда в бит переноса при сложении. 1 = произошел перенос при сложении О = не произошел перенос при сложении Вычитание в АЛУ выполняется сложением кода первого операнда с дополнительным кодом второго операнда. Значение бита контекстно зависит от того, какая операция выполнялась. Для операции вычитания значения бита инвертированы. Так, например, выполнив операцию вычитания 00h - Olh получаем FFh и бит С, установленный в 1. Следовательно результат опе- рации отрицательный (бит С здесь выступает как знаковый разряд и число FFh с установленным знаковым разрядом по законам двоичной алгебры является минус единицей). При вычитании Olh - 00h получаем Olh и бит С = 0. Результат по- ложительный. При сложении FFh + 02h получаем Olh и бит С=1. Произошел перенос, значит реальный результат 10 lh. При выполнении команд сдвига RRF и RLF в этот бит за- гружается соответственно младший или старший бит регист- ра-источника. Используя флаги ТО и PD можно определить, чем был вызван сброс. 22
Микроконтроллеры PIC16F8x и PIC16CR8x ТО PD Событие, вызвавшее состояние "сброс" 1 1 Сброс по включению питания 0 1 Сработал сторожевой таймер (не в режиме SLEEP) 1 0 Сброс по входу MCLR в режиме SLEEP или вы- ход из SLEEP по внешнему прерыванию 0 0 Выход из SLEEP по сигналу сторожевого тай- мера X X Сброс по входу MCLR в обычном режиме х - состояние битов не изменилось. Сброс по входу MCLR в обычном режиме не меняет текущие значения битов ТО и PD. РЕГИСТР OPTION_REG (АДРЕС 81Н) Специальный регистр OPTION_REG представляет собой полно- стью доступный для записи и чтения регистр, в котором находятся биты, управляющие работой предварительного делителя, ис- точниками внешних прерываний, встроенным таймером TMR0 и под- тягивающими резисторами для порта В. Назначение битов регистра OPTION_REG: bit7 RBPU - включение встроенной нагрузки порта В 1 = нагрузка отключена О = нагрузка включена bit6 INTEDG - выбор фронта прерывающего сигнала 1 = прерывание по нарастанию сигнала на выводе RB0/INT О = прерывание по спаду сигнала на выводе RB0/INT bit5 TOCS - выбор источника тактирования для таймера TMR0 1 = импульсы со входа RA4/T0CKI О = внутренняя тактовая частота (CLKOUT) bit4 T0SE - выбор фронта сигнала для таймера TMR0, если в качестве источника выбран вход RA4/T0CKI (TOCS=1) 1 = инкремент по спаду на выводе RA4/T0CKI О = инкремент по нарастанию на выводе RA4/T0CKI bit3 PSA - бит, управляющий подключением предварительного делителя 1 = предварительный делитель подключен к WDT О = предварительный делитель подключен к TMR0 bit2-0 PS2-PS0 - управление коэффициентом деления предваритель- ного делителя в зависимости от подключения 2Э
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Биты для TMR0 для WDT ООО 1:2 1.1 001 1:4 1:2 010 1:8 1:4 он 1:16 1-8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 РЕГИСТР INTCON (АДРЕС ОВН, 8ВН) Регистр INTCON - это полностью доступный для чтения и записи регистр, в котором хранятся биты, управляющие различными ис- точниками прерываний. bit7 GIE - бит глобального запрета прерываний 1 = разрешены все немаскируемые прерывания О = запрещены все прерывания bit6 EEIE - разрешение прерывания по окончанию записи в EEPROM 1 = прерывание по окончанию записи разрешено О = прерывание по окончанию записи запрещено bit5 T0IE - разрешение прерывания по переполнению TMR0 1 = прерывание разрешено О = прерывание запрещено bit4 INTE - разрешение прерывания по входу RB0/INT 1 = прерывание разрешено О = прерывание запрещено bit3 RBIE - разрешение прерывания по изменению состояния на входах порта В, линии RB7-RB4 1 = прерывание разрешено О = прерывание запрещено bit2 T0IF - флаг прерывания по переполнению таймера/счетчика TMR0 1 = TMR0 был переполнен (следует сбросить программно!) О = TMR0 не был переполнен Флаг используется для определения источника прерывания bitl INTF - флаг прерывания по входу RB0/INT 1 = произошло прерывание по входу RB0/INT (следует сбро- сить программно!) О = не происходило прерывания по входу RB0/INT Флаг используется для определения источника прерывания. 24
Микроконтроллеры PIC16F8x и PIC16CR8x bitO RBIF - флаг прерывания по изменению состояния на входах RB7-RB4 1 = на одном из выводов RB7-RB4 произошло изменение уровня (следует сбросить программно!) О = не происходило прерывание по изменению уровня Флаг используется для определения источника прерывания. ПРОГРАММНЫЙ СЧЕТЧИК Программный счетчик микроконтроллера (PC) содержит 13 раз- рядов. Младший байт счетчика является полностью доступным для чтения и записи регистром PCL (адрес 02h, 82h). Старшие пять байтов счетчика непосредственно не доступны для чтения и записи. Обраще- ние к ним происходит через регистр PCLATCH (адрес OAh, 8Ah), яв- ляющийся буфером-защелкой для старших битов счетчика. Содержи- мое PCLATCH переносится в старшие биты PC, когда происходит запись нового значения в программный счетчик. Это случается, когда выполняются команды CALL, GOTO или регистр PCL является реги- стром назначения для результата арифметической операции. Возможность выполнять арифметические операции непосредст- венно над программным счетчиком позволяет очень просто и эффек- тивно, всего двумя командами, выполнять табличную перекодировку значений. Следует только контролировать исходное значение, чтобы программный счетчик не вышел за пределы таблицы, если в ней при- менено менее 256 записей. Подробно пример подпрограммы переко- дировки рассмотрен далее, в разделе "Примеры прикладных подпро- грамм". Микроконтроллеры PIC16F83 и PIC16CR83 имеют 512 слов про- граммной памяти, PIC16F84 и PIC16CR84 имеют 1К программной памяти. Команды CALL и GOTO используют 11 бит для указания адреса, что позволяет использовать 2К адресного пространства. Для предстоящего расширения программной памяти PIC16F8x понадо- бятся еще два бита, определяющие ее страницы. В качестве этих битов будут использоваться разряды 4 и 3 регистра PCLATCH. При исполь- зовании в программе команд CALL и GOTO надо быть уверенным, что биты 4 и 3 в PCLATCH запрограммированы правильно и про- изойдет переход на нужную страницу памяти. Сейчас биты 4 и 3 не используются, однако для обеспечения совместимости "снизу вверх" использовать их в своих программах в качестве битов общего на- значения (например, для хранения флагов) не рекомендуется 25
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip СТЕК Микроконтроллеры PIC16Fxx имеют 8-уровневый 13-битный ап- паратный стек. Стек не является частью памяти данных или программ и указатель стека не доступен для чтения или записи. Содержимое 13-битного программного счетчика загружается в стек при выполнении команды CALL или переходе в подпрограмму прерывания. При выполнении команд RETURN, RETLW и RETFIE содержимое программного счетчика восстанавливается. Стек организован как циклический буфер. Это означает, что после того, как в стек записано восьмое значение, вновь поступившее девя- тое значение будет записано на место первого, десятое на место вто- рого и т.д. И наоборот, если происходило восстановление программ- ного счетчика восемь раз, то в девятый раз в него будет выгружено первое значение. Стек не имеет флаг-бита, показывающего переполнение или избы- точную выгрузку, поэтому пользователь должен самостоятельно сле- дить, чтобы уровень вложения подпрограмм в любой ситуации не превышал восьми. КОСВЕННАЯ АДРЕСАЦИЯ: РЕГИСТРЫ INDF И ESR Регистр INDF не является физическим регистром. При обращении к этому регистру на самом деле адресуется регистр, адрес которого указан в регистре FSR (т.е. FSR является указателем). Такая адреса- ция является косвенной. Пример косвенной адресации: - регистр общего назначения по адресу ОСЬ содержит значение Olh - регистр общего назначения по адресу ODh содержит значение B8h - загружаем в регистр FSR значение ОСЬ - читаем значение из регистра INDF и получаем значение Olh - инкрементируем на единицу значение FSR (FSR=0Dh) - читаем значение из регистра INDF и получаем значение B8h При попытке прочитать косвенным образом значение самого ре- гистра INDF (FSR=0) всегда возвращается значение 00h. Попытка косвенной записи в INDF исполняется как пустая операция (несмотря на то, что биты регистра STATUS могут измениться). Приведенный далее фрагмент программы, используя косвенную адресацию, очищает регистры общего назначения (RAM), располо- женные по адресам 20h-2Fh: 26
Микроконтроллеры PIC16F8x и PIC16CR8x NEXT MOVLW 0x20 MOVWF FSR CLRF INDF INCF FSR BTFSS FSR, 4 GOTO NEXT устанавливаем указатель ,на стартовый адрес RAM .очищаем регистр INDF .инкрементируем указатель Закончили очистку? ;нет, очистить следующую ячейку ;если да, продолжить программу ПОРТЫ ВВОДА-ВЫВОДА Контроллеры PIC16F8x имеют два порта ввода-вывода, PORTA и PORTB. Каждый вывод порта может быть запрограммирован на ввод или на вывод установкой соответствующего бита в регистрах TRISA и TRISB. Выводимые значения фиксируются в регистрах-защелках PORTA и PORTB. Направление ввода-вывода может быть изменено в произвольный момент времени. Кроме этого, некоторым выводам присвоены дополнительные функции. ДВУНАПРАВЛЕННЫЙ ПОРТ А, РЕГИСТРЫ PORTA И TRISA Регистр PORTA представляет собой 5-битную защелку. Линия RA4 имеет триггер Шмитта на входе в режиме ввода и открытый сток в режиме вывода. Остальные линии порта А по входу работают со стандартными уровнями TTL, выходы подключаются к компле- ментарным выходным CMOS драйверам. Линия RA4 используется также как вход внешних тактовых импульсов для таймера TMR0. Направление передачи данных для каждой линии программирует- ся отдельно, установкой или сбросом битов bit0...bit4 регистра TRISA. Установка бита в 1 настраивает соответствующую линию на ввод. Выходной драйвер при этом переходит в высокоимпедансное состояние. Установка бита в 0 настраивает линию порта на вывод и выводит на нее содержимое соответствующего бита защелки PORTA. По умолчанию при включении питания все линии настроены на ввод. При чтении порта А всегда считываются действительные логические уровни на выводах, независимо от того, запрограммированы отдель- ные разряды как входы или как выходы Все операции записи в порт внутренне исполняются как чтение- модификация-запись. Например, когда исполняется команда BSF PORTA, 3 (установить в единицу бит 3 порта А), то со всех линий 27
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip порта А считываются реальные значения, присутствующие на выво- дах в этот момент, модифицируется третий бит и все полученные значения записываются в регистр-защелку PORTA. Таким образом, некоторые биты защелки PORTA могут иметь непредсказуемые значения. Если в процессе исполнения программы линии порта А по- сле чтения будут перенастроены на вывод, на некоторых из них будут выставлены непредсказуемые уровни, что может привести к неожи- данным результатам в работе устройства. В процессе написания про- граммы, перед изменением настройки линий порта, рекомендуется явно задавать значения в защелке PORTA для критичных линий. Также следует учитывать инерционность внешних цепей при изме- нении сигнала на линиях порта. Например, одна из линий порта была настроена на вывод, и на ней присутствовал уровень логического но- ля. Затем эту линию перенастроили на ввод, и, в соответствии со схе- мой устройства, извне на линию поступает сигнал высокого уровня от резистора, подключенного к питающей шине. Из-за паразитной емко- сти монтажа и собственных емкостей других компонентов высокий уровень на линии будет выставлен с некоторой задержкой, и при чтении может быть получено непредсказуемое значение. Выходные драйверы порта также обладают некоторой инерционностью. Поэто- му нежелательно, чтобы команда чтения порта шла сразу за командой перенастройки порта с вывода на ввод. Рекомендуется пропустить несколько командных циклов для установления уровней. Можно исполь- зовать команду NOP. Ниже приведен пример инициализации порта А: CLRF BSF MOVLW PORTA ;обнуляем все биты в защелке STATUS, RP0 ;выбираем банк 1 0х1Е значение, побитно определяющее направление ввода/вывода для ;каждой линии: RA0 - вывод, ;RA1...RA4 - ввод MOVWF TRISA ;запись значения в управляющий ;регистр (адрес 85h, Bank 1) BCF STATUS, RP0 ;выбираем банк 0 Блок-схемы порта А для линий RA0...RA3 и RA4 изображены на рисунке 1-3. 28
Микроконтроллеры PIC16F8x и PIC16CR8x (b) Рис. 1-3. Блок-схема порта А, линии RA4 (а) и RA0-RA3 (Ь) 29
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ДВУНАПРАВЛЕННЫЙ ПОРТ В, РЕГИСТРЫ PORTB И TRISB Порт В представляет собой 8-битный двунаправленный порт. Структурная схема порта представлена на рисунке 1-4. Выходные значения записываются в регистр-защелку PORTB. Направление вво- да-вывода определяется установкой или сбросом битов регистра TRISB. Установка бита в 1 настраивает соответствующую линию на ввод, переводя выходной драйвер в высокоимпедансное состояние, а-0 - на вывод. При включении питания все линии по умолчанию настро- ены на ввод. Как и для порта А, чтение порта В всегда возвращает действительные значения на выводах, независимо от направления пе- редачи данных для каждого вывода. Все выводы порта В имеют встроенную отключаемую нагрузку в виде резисторов, подключенных к шине питания (подтягивающие ре- зисторы). Нагрузка включается и отключается одновременно для всех выводов при помощи бита 7 RBPU регистра OPTION_REG. При включении питания RBPU=1 и нагрузка отключена. Программное обнуление бита RBPU подключает нагрузку, но для линий, настроен- ных на вывод нагрузка автоматически отключается. Линии RB4...RB7 могут использоваться как входы прерывания по изменению уровня. В этом качестве используются только линии, наст- роенные на ввод. В каждом командном цикле происходит сравнение текущих значений на выводах с предыдущими, зафиксированными в специальной защелке. Если хотя бы на одном из этих выводов про- изошло изменение уровня, формируется прерывание. Длительность импульса, который распознается как изменение уровня, должна быть не менее 4-х периодов тактовой частоты. Программно распознать, по какой из линий RB4...RB7 произошло прерывание, невозможно. Это прерывание выводит контроллер из состояния SLEEP. В под- программе обработке прерывания пользователь должен сбросить прерывание одним из двух способов: - обратиться для чтения или записи к порту В, при этом флаг-бит RBIF регистра INTCON будет обнулен, - непосредственно обнулить флаг-бит RBIF Если не обнулить бит RBIF, то, после выхода из подпрограммы обработки прерывания, контроллер вновь обнаружит прерывание и уйдет на подпрограмму его обработки. Программа зациклится. Прерывание по изменению уровня обычно используют для вывода контроллера из режима SLEEP по нажатию кнопок клавиатуры. Ког- да разрешено прерывание по изменению уровня, не рекомендуется наст- раивать линии порта В RB4.. .RB7 на вывод и изменять на них уровень, так как подобное изменение также может быть распознано как за- прос прерывания. 30
Микроконтроллеры PIC16F8x и PIC16CR8x (а) (b) Рис. 1-4. Блок-схема порта В, линии RB7-RB4 (л) и RB3-RB0 (А) 31
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Вывод RB0/INT используется как вход внешнего прерывания. Ес- ли бит INTEDG регистра OPTION_REG установлен в 1, то происхо- дит прерывание по нарастанию уровня на входе RB0/INT, а если INTEDG=0 то по спаду. Флаг-битом для этого прерывания является бит INTF регистра INTCON. Этот бит не требуется сбрасывать при- нудительно. МОДУЛЬ TIMER0 И РЕГИСТР TMR0 Структурная схема внутреннего модуля TIMER0 и его взаимо- связь с регистрами TMR0 и OPTION_REG показаны на рисунке 1-5. TIMER0 является программируемым модулем таймера/счетчика. Он имеет в своем составе: - 8-битный таймер/счетчик TMR0, доступный для чтения и записи как регистр, - программируемый предварительный делитель (предделитель) мультиплексор входного сигнала - генератор прерывания по переполнению регистра TMR0 с FFh в 00h. Рис. 1-5. Структурная схема модуля TIMER0 Режим таймера задается сбросом бита TOCS регистра OPTION_REG. В этом режиме инкрементирование TMR0 происходит от внутреннего источника тактовой частоты. Если не подключен предделитель, инкрементирование происходит каждый командный цикл. Если производилась запись в регистр TMR0, его инкрементиро- вание начнется спустя два командных цикла, поэтому записываемая переменная должна быть соответственно скорректирована. Режим счетчика задается установкой в 1 бита TOCS. В этом случае инкрементирование TMR0 происходит от внешнего источника, под- ключенного к выводу RA4/T0CK. Активный фронт входных импуль- сов можно задавать программно. Если бит T0SE регистра OPTION_REG сброшен, активным является нарастание сигнала. 32
Микроконтроллеры PIC16F8x и PIC16CR8x ПРЕДДЕЛИТЕЛЬ Предделитель является 8-битным счетчиком, который также может быть использован, как выходной делитель (постделитель) сторожево- го таймера. Если предделитель подключен к модулю T1MER0, то он не может использоваться со сторожевым таймером, и наоборот Бит PSA регистра OPTIONJREG определяет подключение предделителя Если PSA=0, предделитель подключен к таймеру/счетчику TMR0 Би- ты PS0...PS2 определяют коэффициент деления, таблица приведена в описании регистра OPTION_REG. Когда предделитель подключен к таймеру/счетчику, все команды, использующие запись в регистр TMR0, обнуляют предделитель. Если предделитель подключен к сторожевому таймеру, они обнуляются совместно, командой CLRWDT. Предделитель недоступен для пря- мой записи или чтения. Подключение предделителя может быть изменено "на лету", то есть во время выполнения программы. Чтобы избежать непреднаме- ренного сброса контроллера, который может при этом произойти, изготовитель рекомендует производить переключение предделителя строго определенной последовательностью команд 1 Переключение предделителя от TIMEROk WDT BCF STATUS, RP0 ,банк О CLRF TMR0 ;очистка счетчика TMR0 и щредделителя BSF STATUS, RP0 ;банк 1 CLRWDT ;очистка сторожевого таймера MOVLW b’xxxxlxxx' установка значения щредделителя, ,биты PS0...PS2 MOVWF OPTIONJREG ;и подключение к WDT BCF STATUS, RP0 ;банк О 2 Переключение предделителя от WD Т к TIMER0 CLRWDT ;очистка сторожевого таймера ;и предделителя BSF STATUS, RP0 ;банк 1 MOVLW Ь'ххххОххх' щодключение к TIMER0, установка битов предделителя MOVWF OPTION_REG ;и источника тактирования BCF STATUS, RP0 ,банк О Здесь символ "х" означает биты, задаваемые программистом кон- текстно, в зависимости от конкретной ситуации. 2 Зак № 4879 Яценков 33
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ОСОБЕННОСТИ ТАКТИРОВАНИЯ ОТ ВНЕШНЕГО ИСТОЧНИКА Инкрементирование от внешнего источника имеет ряд особеннос- тей. Внешний сигнал стробируется внутренними импульсами синхро- низации. Возникает некоторая задержка между фронтом входного сигнала, и фронтом, по которому реально инкрементируется счетчик TMR0. Эта задержка варьируется в пределах от 3 до 7 периодов коле- баний тактового генератора. Например, при тактировании контрол- лера от кварцевого генератора 10МГц задержка составит от 300 до 700 нс. Соответственно, погрешность измерения временного интерва- ла между внешними событиями составит ±400 нс. Стробирование происходит на выходе предделителя, дважды в течение каждого командного цикла, чтобы определить нарастание и спад тактирующего импульса. Следовательно, длительность состоя- ний высокого уровня (Тв) и низкого уровня (Тн) на выходе преддели- теля должна быть не менее двух периодов синхронизации, плюс 20нс на установление. Если предделитель не подключен, входной сигнал поступает на- прямую и должен иметь следующие параметры: Th>=2*Tusc+20hc Tl>=2*Tosc+20нс Если предделитель подключен, сигнал на его выходе всегда имеет форму меандра. Длительности высокого и низкого уровня сигнала на входе предделителя должны быть не менее 10 нс. Следовательно, входной сигнал на выводе RA4/T0CK при подключенном пределителе должен иметь параметры: Тн>=10нс Tl>=10hc. РАБОТА С EEPROM Память данных EEPROM доступна для чтения и записи во всем рабочем диапазоне питающих напряжений и предназначена для хра- нения 8-битных значений Перед записью нового значения предыду- щее стирается. Микроконтроллеры PIC16F8x имеют 64 байта EEPROM с адресами от 00h до 3Fh, но эти ячейки недоступны путем прямой адресации в адресном пространстве микроконтроллера. Для доступа к ним используется косвенная регистровая адресация через специальные регистры. Всего при работе с EEPROM используется четыре специальных регистра: 34
Микроконтроллеры PIC16F8x и PIC16CR8x • EECON1 • EECON2 • EEDATA • EEADR Регистр обмена EEDATA содержит 8-битные данные чтения/записи. EEADR хранит адрес ячейки, к которой происходит обращение. Несмотря на то, что в PIC16F8x физически существует только 64 байта EEPROM, декодируются все биты адреса. Поэтому необходимо следить за значением в EEADR, чтобы не выйти за пределы адресного пространства Два старших бита адреса всегда должны быть равны нулю Возможно, они будут использованы в последующих модификациях, с увеличенным объемом памяти При записи в EEPROM требуется строго выдерживать временной интервал, который контролируется встроенным таймером. Время за- писи может варьироваться от кристалла к кристаллу, а также в зави- симости от питающего напряжения и температуры. Когда у микроконтроллера установлен бит защиты кода, процес- сор может читать и записывать EEPROM, но для программатора эта память становится недоступна. У однократно программируемых ми- кроконтроллеров существует два бита защиты - один защищает па- мять программ, второй память данных EEPROM. Подобный подход позволяет запрограммировать заранее некоторое количество кон- троллеров и защитить программный код, не внося константы в EEPROM. Затем, непосредственно перед монтажом на плату, в каж- дый кристалл заносят необходимые индивидуальные константы и устанавливают второй бит защиты. РЕГИСТРЫ EECON1 И EECON2 Регистр EECON1 является контрольным регистром, у которого физически доступны младшие пять бит. Старшие три недействитель- ны и всегда читаются как "О". Назначение битов регистра приведено ниже: bit 7-5 Физически недоступны, всегда читаются как "О" bit 4 EEIF - флаг прерывания по окончанию записи 1 = запись завершена (должен быть сброшен программно) О - запись не завершена или не начиналась bit 3 WRERR - флаг ошибки записи в EEPROM 1 = запись преждевременно прервана О = запись прошла успешно bit 2 WREN - разрешение записи в EEPROM 1 = разрешен цикл записи 35
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip О = запрещена запись bit 1 WR - бит управления записью 1 = начать цикл записи. Программная установка бита явля- ется командой начать цикл записи. Сбрасывается этот бит только аппаратно, когда цикл записи окончен. О = цикл записи данных завершен bit О RD - бит управления чтением 1 - начать чтение данных из EEPROM. Чтение занимает один командный цикл. Программная установка бита являет- ся командой начать чтение. Бит сбрасывается только аппа- ратно. О = чтение не начато Невозможность программно сбросить бит WR предохраняет от случайного преждевременного прерывания цикла записи, поскольку этот цикл занимает несколько машинных тактов. Бит WREN при включении питания сброшен, что предохраняет от случайной записи. Бит WRERR устанавливается, когда операция за- писи прервана сбросом по входу MCLR или сбросом по переполне- нию сторожевого таймера. В этом случае, при повторном старте, пользователь может проверить бит WRERR и, при необходимости, повторить запись. Данные и адрес в регистрах EEDATA и EEADR при сбросе не теряются. Регистр EECON2 не является физическим регистром и использует- ся исключительно в качестве служебного регистра при записи. Чтение этого регистра всегда возвращает значение "О". ЧТЕНИЕ ДАННЫХ ИЗ EEPROM Для чтения данных необходимо записать адрес в регистр EEADR и установить бит RD регистра EECON1. В следующем цикле данные уже доступны для чтения из регистра EEDATA. Прочитанные данные хранятся в этом регистре, пока не будут прочитаны новые данные или пока в него не будут занесены данные для записи. Далее приведен пример чтения данных, прочитанные данные из EEDATA записыва- ются в аккумулятор для дальнейших операций. BCF STATUS, RPO ;банк 0 MOVLW CONFIG_ADDR ;некий адрес CONFIG_ADR MOVWF EEADR Записываем, как адрес для чтения BSF STATUS, RPO ;банк 1 BSF EECON1,RD ;читаем EEPROM BCF STATUS, RPO ;банк 0 MOVF EEDATA, W ; переписываем данные в W 36
Микроконтроллеры PIC16F8x и PIC16CR8x ЗАПИСЬ ДАННЫХ В EEPROM Для записи данных в EEPROM необходимо сначала записать ад- рес в регистр EEADR и данные для записи в регистр EEDATA, а за- тем выполнить обязательную последовательность команд, рекомендо- ванных изготовителем (выделены жирным шрифтом): BSF BCF BSF STATUS, RP0 ;банк 1 INTCON, GIE ;запрет всех прерываний EECON1, WREN разрешение записи MOVLW 55h ; MOVWF EECON2 .записываем 55h MOVLW AAh MOVWF EECON2 Записываем AAh BSF EECON1, WR ;Старт записи данных BSF INTCON1,GIE разрешение прерываний Процесс записи не будет инициирован, если не будет выполнена поочередная запись 55h и AAh в регистр EECON2, перед тем, как уста- новить бит WR. Изготовитель настоятельно рекомендует запрещать все прерывания на момент исполнения этого фрагмента программы. Если прерывания в работе устройства вообще не используются, то нет надобности в запрете и последующем разрешении прерываний, так как по включению питания все прерывания запрещены. Бит WREN не сбрасывается аппаратно, поэтому его необходимо сбросить программно после окончания записи всех данных. Этот бит предохраняет от записи случайных данных в EEPROM, например, при сбое программы. Необходимо тщательно следить, чтобы этот бит был сброшен всегда, когда не производится запись данных. Сброс бита WREN во время начатого цикла записи не повлияет на его ус- пешное завершение. Распространенной ошибкой программирования является попытка начать запись в новую ячейку EEPROM до того, как закончена запись в предыдущую. Следующее значение просто не будет записано. Необхо- димо сначала удостовериться, что предыдущий цикл окончен. Когда цикл записи завершается, аппаратно сбрасывается бит WR и выстав- ляется флаг прерывания EEIF. Пользователь может использовать лю- бой из этих битов для определения момента окончания записи. Впослед- ствии бит EEIF необходимо программно сбросить. 37
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Иногда, в зависимости от приложения, может потребоваться про- верка правильности записи данных в EEPROM. Например, если вы ввели в сигнализацию новый код доступа, а он записался неправильно, то после перехода в рабочий режим сигнализация навсегда останется недоступной для управления, поскольку вместо вашего кода будет со- хранено случайное число. Чаще всего происходит так называемая утечка бита, когда бит, записываемый как "1", впоследствии читается как "О". Для проверки, сразу после записи читают проверяемую ячейку и сравнивают содержимое регистра EEDATA с правильным значением. Если значения не совпали, либо предпринимают определенное число попыток записи, либо сразу выдают сообщение об ошибке. СЛОВО КОНФИГУРАЦИИ CPU Слово конфигурации расположено по адресу 2007h. Этот адрес находится за пределами пользовательской памяти программ и входит в состав специального адресного пространства (2000h - 3FFFh), ко- торое доступно только для программатора во время программирова- ния. Слово конфигурации содержит 14 бит. СЛОВО КОНФИГУРАЦИИ ДЛЯ PIC16CR83 И PIC16CR84 bit 13-8 СР - бит защиты программного кода 1 = защита отключена О = защита установлена bit 7 DP - бит защиты памяти данных (EEPROM) 1 = защита отключена О = защита установлена bit 6-4 СР - бит защиты программного кода 1 = защита отключена О = защита установлена bit 3 PWRTE - бит разрешения задержки при включении питания 1 = задержка отключена О = задержка включена bit 2 WDTE - бит включения сторожевого таймера 1 = сторожевой таймер включен О = сторожевой таймер выключен bit 1-0 FOSC1-FOSCO - бит выбора режима тактового генератора 11 = RC-генератор 10 = HS резонатор 01 = XT резонатор 00 = LP резонатор 38
Микроконтроллеры PIC16F8x и PIC16CR8x СЛОВО КОНФИГУРАЦИИ ДЛЯ PIC16F83 И PIC16CF84 bit 13-4 СР - бит защиты программного кода 1 = защита отключена О = защита установлена bit 3 PWRTE - бит разрешения задержки при включении питания 1 = задержка отключена О - задержка включена bit 2 WDTE - бит включения сторожевого таймера 1 = сторожевой таймер включен О = сторожевой таймер выключен bit 1-0 FOSC1-FOSC6 - бит выбора режима тактового генератора 11 - RC-i енератор 10 = HS резонатор 01 = XT резонатор 00 = LP резонатор Обозначения резонаторов в данном случае следующие: XT - стан- дартный кварцевый или керамический резонатор 4МГц, LP - низ- кочастотный (обычно часовой, 32768Гц) резонатор для экономичных приложений, HS -- высокочастотный кварцевый резонатор 10МГц, RC - генератор на основе внешней RC-цепочки. Изготовитель не рекомендует устанавливать биты защиты кода на незапрограммированном контроллере. ИДЕНТИФИКАТОРЫ По адресам 2000h-2003h расположены четыре слова, предназ- наченные для хранения индивидуального идентификационного кода кристалла, контрольной суммы протраммы и другой информации. Они могут быть считаны и записаны только при помощи программа- тора. Когда бит защиты программного кода установлен, то младшие семь бит каждого слова остаются доступными, а старшие читаются как 0, поэтому рекомендуется использовать семибитные идентифика- торы, которые можно прочесть в защищенном варианте. ВНЕШНИЕ ИСТОЧНИКИ ТАКТОВОЙ ЧАСТОТЫ Микроконтроллеры PIC16F8x не имеют встроенного тактового генератора, работающего без внешних элементов. Для тактирования 39
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip необходим либо резонатор, кварцевый или керамический, либо неза- висимый тактовый генератор. Генератор, построенный на основе кварцевого или керамического резонатора, требует некоторого времени на установление колебаний. Во время установления режима генератора процессор не должен ра- ботать. Для этой цели имеется встроенный таймер запуска, который после появления уровня логической единицы на выводе MCLR и ис- течения задержки таймера включения питания в течение 1024 тактов внешнего генератора удерживает процессор в состоянии сброса. Этой задержки достаточно для стабилизации тактового генератора. За- держка запуска не генерируется для режима RC-цепочки. Для нормальной работы собственного генератора требуется кварц, работающий на частоте параллельного резонанса. Схема подключения показана на рисунке 1-6. 1 Номиналы конденсаторов С1 и С2 см в таблица 2 Последовательный резистор RS может понадобиться при использовании кристалла со срезом типа АТ 3 Внутреннее сопротивление RF приблизительно равно ЮМ Ом Рнс. 1-6. Схема поключення кварцевого резонатора Резистор Rs может понадобиться для гашения гармоник при рабо- те в режиме HS, а также в режиме XT при использовании и кристалла со срезом типа АТ. Конденсаторы С1 и С2 увеличивают стабильность работы кварцевого генератора, но при этом несколько увеличивают время его запуска. Для керамических резонаторов применение этих конденсаторов обязательно, а кварцевые резонаторы в большинстве своем надежно работают и без них, особенно при комнатной темпе- ратуре и стандартном питающем напряжении. Но если предполагает- ся эксплуатировать устройство при отрицательных температурах или 40
Микроконтроллеры PIC16F8x и PIC16CR8x пониженном напряжении питания, конденсаторы С1 и С2 обязатель- но следует установить: Значения емкостей С1 и С2 для керамических резонаторов Режим Частота Cl, С2 XT 455 кГц 2.0 МГц 4.0 МГц 47 - 100 пФ 15-33 пФ 15-33 пФ HS 8.0 МГц 10.0 МГц 15-33 пФ 15-33 пФ Значения емкостей С1 и С2 для кварцевых резонаторов: Режим Частота Cl, С2 LP 32 кГц 200 кГц 68-100 пФ 15-33 пФ XT 100 кГц 2.0 МГц 4.0 МГц 100- 150 пФ 15-33 пФ 15-33 пФ HS 8.0 МГц 10. 0 МГц 15-33 пФ 15-33 пФ При напряжении питания больше 4,5 В изготовитель рекомендует применять конденсаторы со значениями Cl = С2 = 30 пФ. Рис. 1-7. Схема подключения внешнего генератора При использовании независимого внешнего генератора, его схема может быть любой. Выход генератора подключается к выводу OSC1, как показано на рисунке 1-7, вывод OSC2 обязательно должен остать- ся свободным, в противном случае контроллер может выйти из строя. Контроллер в этом случае настраивается в режим XT, LP или HS. Примеры схем простейших тактовых генераторов приведены на ри- сунках 1-8 и 1-9. 41
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Если приложение некритично к величине и стабильности тактовой частоты, можно применить недорогой RC-генератор. Резистор и кон- денсатор являются внешними элементами и подключаются, как пока- зано на рисунке 1-10. Рекомендуемый номинал резистора лежит в пределах от 5 кОм до 100 кОм. При использовании резистора менее 4 кОм генерация может быть нестабильной или вообще не возникнет. Рис. 1-8. Схема внешнего генератора, работающего на частоте параллельного резонанса кварца. Рис. 1-9. Схема внешнего генератора, работающего на частоте последовательного резонанса кварца 42
Микроконтроллеры PIC16F8x и PIC16CR8x При слишком большом номинале, порядка 1 МОм и выше, на ра- боту генератора начинают влиять внешние наводки и шумы схемы, а также монтажная емкость и влажность платы Несмотря на то, что генератор может работать вообще без внешнего конденсатора, реко- мендуется применять конденсатор с емкостью порядка 20 пФ для уве- личения стабильности и помехоустойчивости генератора. Рис. 1-10. Схема внешнего RC-генератора Частота тактового генератора зависит от питающего напряжения, номиналов резистора и конденсатора и варьируется от кристалла к кристаллу. В режиме RC с вывода OSC2/CLKOUT можно снимать импульсы с частотой одна четвертая от тактовой и использовать эти импульсы для тактирования или синхронизации остальной схемы. Когда контроллер настроен в режим RC, на его вывод OSC1/CLKIN нельзя подавать импульсы от внешнего генератора, так как можно вывести кристалл из строя ОРГАНИЗАЦИЯ СБРОСА Для PIC16F8X доступны следующие пять вариантов сброса: • Сброс по включению питания • Сброс по входу MCLR во время нормальной работы • Сброс по входу MCLR в режиме SLEEP • Сброс по переполнению сторожевого таймера (WDT) во время нормальной работы 43
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip • Сброс по переполнению сторожевого таймера (WDT) в режиме SLEEP На входе MCLR имеется триггер Шмитта, предохраняющий от случайных кратковременных импульсов, вызванных шумами схемы или внешними наводками. На некоторые регистры состояние сброса не влияет. Их содержи- мое не определено при включении питания и не изменяется при ос- тальных вариантах сброса. Большинство остальных регистров уста- навливается в определенное состояние при включении питания, сбро- се по входу MCLR и WDT в нормальном режиме и сбросе по входу MCLR в режиме SLEEP. На их состояние не влияет сброс по WDT в режиме SLEEP, поскольку этот сброс рассматривается как восстанов- ление нормального режима (пробуждение). Используя флаги ТО и PD регистра STATUS, можно определить, чем был вызван сброс. Подробно этот вопрос рассмотрен в описании регистра. Если питающее напряжение при включении устанавливается до- статочно быстро, не дольше, чем за 70мс, то можно обойтись без внешней цепи сброса и подключить вывод MCLR непосредственно к плюсовой шине питания. При достижении питающим напряжением уровня 1.2-1.7V сформируется внутренний сигнал сброса и начнется отсчет времени задержки сброса специальным внутренним таймером PWRT (Power-up timer). За это время питающее напряжение должно подняться до нормального рабочего уровня. Таймер PWRT работает от независимого встроенного RC-генератора, время задержки равня- ется примерно 72мс и может несколько изменяться от кристалла к кристаллу, а также в зависимости от температуры. После окончания задержки таймера PWRT включается таймер запуска основного так- тового генератора, но он тактируется непосредственно.от этого гене- ратора и отсчитывает 1024 импульса. Таймер PWRT может быть включен или выключен изменением би- та PWRTE в слове конфигурации. Если питающее напряжение нарастает медленно, может понадо- биться внешняя цепь сброса, показанная на рис. 1-11. Если возможна ситуация когда питающее напряжение плавно сни- жается ниже рабочего уровня, но не достигает ноля, а затем восста- навливается, для надежного формирования уровня сброса необходи- мо применить другую схему. На рис. 1-12 показана схема со стабили- троном. Сброс формируется, когда питающее напряжение снижается до уровня Vd+0.7, где Vd - напряжение стабилизации стабилитрона. 44
Микроконтроллеры PIC16F8x и PIC16CR8x Рис. 1-11. Внешняя цепь сброса Рис. 1-12. Схема формирования сигнала "сброс" при снижении напряжения питания, с применени- ем стабилитрона На рис. 1-13 приведена аналогичная схема, но без стабилитрона, обладающая меньшей точностью реакции на снижение питающего напряжения. Транзистор закрывается, когда напряжение питания снижается до уровня, вычисляемого по формуле R1/(R1 + R2) = 0,7 Можно применить также специальную микросхему - супервайзер пи- тания, формирующую импульс сброса при снижении напряжения пи- тания. Рис. 1-13. Схема формирования сигнала "сброс" при снижении напряжения питания, без стабили- трона 45
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ОРГАНИЗАЦИЯ ПРЕРЫВАНИЙ Микроконтроллеры PIC16F8X имеют четыре источника пре- рываний (а) Внешнее по входу RB0/INT (Ь) Внешнее по изменению состояния одной из линий RB4-RB7 порта В (с) Внутреннее по переполнению таймера/счетчика TMR0 (d) Внутреннее по окончанию записи в EEPROM. Для каждого из прерываний (а), (Ь) и (с) существует свой флаг-бит в регистре INTCON, сигнализирующий о поступлении конкретного вида запроса Для прерывания (d) флаг-бит хранится в регистре EECON1 Анализируя эти биты подпрограмма обработки прерыва- ний, начинающаяся с адреса 0004h, определяет источник прерывания. Кроме этого, в регистре INTCON содержится бит глобального запре- та прерываний GIE и биты индивидуального запрета каждого преры- вания. Когда бит GIE сброшен, все прерывания запрещены. При включении питания бит GIE по умолчанию сброшен. Когда поступает прерывание, бит GIE сбрасывается, чтобы не до- пустить возникновения нового прерывания (поскольку у микроконт- роллера PIC16F8X существует только один вектор прерывания), адрес возврата загружается в стек, а в программный счетчик загружается адрес-вектор 0004h. Инструкция возврата из подпрограммы обработ- ки прерывания RETFIE устанавливает бит GIE в единицу, тем самым разрешая прерывания. Обработка запроса внешнего прерывания может занимать три или четыре командных цикла процессора, в зависимости от того, в какой момент времени обнаружен запрос. Все флаг-биты прерываний должны быть сброшены программно до того, как прерывания вновь будут разрешены установкой бита GIE В противном случае может произойти повторный вход в прерывание и за- цикливание программы Также следует помнить, что флаг-биты преры- ваний устанавливаются в соответствии с прерывающими событиями независимо от того, замаскированы эти прерывания, или нет Игнориро- вание этих фактов приводит к достаточно распространенным ошибкам программирования, которые могут проявить себя не сразу Например, запланировано, что прерывание по входу RB0/INT разре- шено всегда, а прерывание по изменению состояния на входах RB4-RB7 разрешается периодически, в зависимости от алгоритма программы Но в результате ошибки программирования подпрограмма обработки преры- 46
Микроконтроллеры PIC16F8x и PIC16CR8x вания не учитывает текущий контекст работы программы, не анализи- рует, разрешены ли в данный момент прерывания по RB4-RB7, а просто тестирует флаг-биты Представим, что во время работы программы произошло изменение уровня на одном из выводов RB4-RB7 Несмотря на то, что это прерывание было замаскировано, флаг-бит RBIF будет ус- тановлен Если подпрограмма обработки прерывания первым тестирует бит RBIF, то даже при входе в прерывание по сигналу на RB0/INT будет принято ошибочное решение о том, что произошло прерывание по входам RB4-RB7 И наоборот, если сначала тестируется флаг-бит INTF, то может быть принято ошибочное решение о прерывании по RB0/INT, ког- да реально прерывание вызвано изменением состояния входов RB4-RB7 Чтобы избежать этой ошибки, нужно тестировать не только флаг- бит, но и соответствующий маскирующий бит С другой стороны, иногда бывает удобно использовать флаг-биты для программного обнаружения событий, не требующих прерывания в момент их совершения. В этом случае прерывание маскируют и пе- риодически, в нужный момент, тестируют флаг-бит Прерывание по входу RB0/INT может происходить по нарастанию входного сигнала если бит INTEDG регистра OPTION_REG уста- новлен или по спаду, если бит INTEDG сброшен Когда происходит заданный переход уровня, устанавливается флаг-бит INTF регистра INTCON Прерывание можно замаскировать, сбросиз бит INTE. Данное прерывание может вывести контроллер из режима SLEEP, если перед входом в этот режим бит INTE был установлен в 1 Состо- яние бита GIE определяет, уйдет ли процессор на адрес-вектор 0004h после пробуждения, или выполнение программы продолжится с теку- щего адреса Для обнаружения изменения уровня на одном из выводов RB4-RB7 и формирования запроса на прерывание необходимо, чтобы длитель- ность импульса была не менее одного командного цикла процессора. Микроконтроллеры PIC16F8X не имеют специальных команд PUSH и POP для сохранения содержимого аккумулятора и специальных регист- ров во время обработки прерывания с последующим их восстановлением. Автоматически сохраняется только значение программного счетчика для возврата из подпрограммы. Поэтому пользователь должен программно сохранять значения аккумулятора (рабочего регистра W) и регистра STATUS. Пример программы приведен ниже: PUSH MOVWF SWAPF MOVWF W_TEMP ,Сохранили значение W в W_TEMP STATUS, W Загрузили значение per. STATUS в ST_TEMP ;W и сохранили W в регистре ST_TEMP 47
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip INTR ;3десь располагается тело Вашей подпрограммы обработки преры- вания. Если надо, можете изменить ;текущий банк памяти POP SWAPF ST_TEMP,W Загрузили сохраненное значение MOVWF STATUS ;и восстановили его в per. STATUS ;При этом восстановлен прежний банк SWAPF W_TEMP,f восстановили значение регистра W SWAPF W_TEMP,W Использование команды SWAPF для загрузки и выгрузки значений обусловлено тем, что эта команда не изменяет состояние флаг-бита нуле- вого результата Z регистра STATUS. Применение команды MOVF со- кратило бы программный код, но тогда при сохранении значения акку- мулятора может быть изменено состояние бита Z, что в общем случае недопустимо. Корректное программирование требует, чтобы при воз- вращении из подпрограммы прерывания значения регистров W и STATUS были восстановлены абсолютно точно. СТОРОЖЕВОЙ ТАЙМЕР Сторожевой таймер представляет собой комбинацию встроенного RC-генератора и счетчика, при переполнении которого формируется сброс процессора. Встроенный генератор не требует внешних цепей и работает даже когда тактовый генератор процессора остановлен в режи- ме SLEEP. Между генератором и счетчиком может быть включен предде- литель, параметры которого задаются битами регистра OPTION_REG. Время выдержки сторожевого таймера зависит от температуры, напряжения питания и коэффициента деления предделителя. С под- ключенным предделителем и максимальным коэффициентом деления 1:128 выдержка может достигнуть 2,5 сек. Номинальная выдержка без предделителя составляет около 18 мс. Когда срабатывает сторожевой таймер, он не переводит вывод MCLR в низкий уровень Сброс осуществляется только по внутренним цепям микроконтроллера Главным назначением сторожевого таймера является борьба с аппа- ратными сбоями устройства. В устройствах, подверженных большому 48
Микроконтроллеры PIC16F8x и PIC16CR8x уровню импульсных помех и высокочастотных наводок, наиболее часто страдает содержимое регистра OPTION_REG Кроме этого, возможны непредсказуемые сбои в работе остальных модулей микроконтроллера и периферийной части устройства. В результате может возникнуть "зависание" программы. Если сторожевой таймер включен, то нормально работающая программа должна периодически обнулять счетчик сторо- жевого таймера, не допуская сброса процессора. Когда происходит сбой, сторожевой таймер перестает программно обнуляться, после его пере- полнения происходит сброс процессора и повторная инициализация уст- ройства. Для достижения максимальной защищенности от сбоев реко- мендуется выполнять следующие условия: - выбирать возможно меньший интервал сторожевого таймера и сбрасывать его в разных местах программы; - аппаратная часть устройства должна полностью инициализиро- ваться при любом сбросе процессора, а не только при включении пи- тания или нажатии кнопки "RESET". Команды CLRWDT и SLEEP обнуляют счетчик сторожевого тай- мера и счетчик предделителя, если он подключен к сторожевому тай- меру. Таким образом предотвращается сброс процессора и начинается формирование нового временного интервала. Сторожевой таймер также может вывести процессор из режима SLEEP. При этом произойдет не сброс, а продолжение нормального исполнения программы. Работа сторожевого таймера может быть разрешена или запреще- на только при помощи программатора, установкой или сбросом бита конфигурации WDTE. ЭНЕРГОСБЕРЕГАЮЩИЙ РЕЖИМ SLEEP Микроконтроллер переводится в режим SLEEP при выполнении специальной команды SLEEP. Если сторожевой таймер включен, то он обнуляется и начинает отсчет задержки заново. В регистре STATUS сбрасывается бит PD и устанавливается бит ТО. Тактовый генератор отключается. Выводы портов сохраняют состояние, кото- рое было непосредственно перед исполнением команды SLEEP. Чтобы потребляемый в этом режиме ток был минимальным, наст- роенные на вывод порты должны иметь значения, при которых через них не будет протекать ток от внешних источников. Линии портов, настроенные на ввод и имеющие высокое входное сопротивление, Должны быть соединены через внешние резисторы порядка 10 кОм с шиной питания или общим проводом, чтобы исключить внутренние токи переключения, вызванные хаотичными наводками на входы Так же следует поступить и с входом RA4/T0CKI. На выводе MCLR дол- жен быть высокий уровень. 49
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ПРОБУЖДЕНИЕ ИЗ РЕЖИМА SLEEP Процессор может быть выведен из режима SLEEP тремя раз- личными способами: (а) внешним сбросом по входу MCLR; (б) при переполнении сторожевого таймера (если он включен), (в) прерыванием по входу RB0/INT, по изменению состояния вхо- дов RB4-RB7 или по окончанию записи в EEPROM. Событие (а) приводит к сбросу процессора и исполнению про- граммы с начального адреса. Два остальных события приводят к продолжению исполнения программы. Во время исполнения команды SLEEP процессор загружает в буфер команд следующую команду (РС+1). Чтобы контроллер вышел из режима SLEEP по прерыванию, оно должно быть разрешено соответствующими битами. Порядок пробуждения по прерыванию зависит от состояния бита GIE. Если этот бит сброшен, то после пробуждения выполняется команда, следующая за командой SLEEP (и уже загруженная в буфер) и далее по порядку Если бит GIE установлен в 1, то сначала исполня- ется команда, загруженная в буфер, а затем процессор переходит на адрес-вектор прерывания 0004h. Если исполнение команды, следующей за SLEEP, при выходе по прерыванию нежелательно, то сразу после команды SLEEP должна следовать команда NOP. Когда бит GIE глобального разрешения прерываний сброшен и возникает ситуация, при которой для любого из прерываний одно- временно установлены бит разрешения и флаг-бит, происходит одно из следующих событий: Если событие прерывания произошло до исполнения команды SLEEP, то эта команда исполняется как NOP. Сторожевой таймер и предделитель не очищаются, бит ТО не устанавливается и бит PD не сбрасывается. Если событие прерывания произошло во время или после исполнения команды SLEEP, то устройство немедленно пробуждается из режима SLEEP. Команда SLEEP отрабатывается полностью, даже если прерыва- ние произошло в момент ее действия. Сторожевой таймер и предделитель очищаются, устанавливается бит ТО и сбрасывается бит PD. Даже если протестировать флаг-биты перед началом исполнения команды SLEEP, возможна ситуация, когда некий флаг-бит будет уста- новлен до того, как команда SLEEP будет завершена. Чтобы убедиться, исполнялась ли команда SLEEP, протестируйте бит PD. Если бит PD установлен, значит, команда SLEEP была исполнена, как NOP. 50
Микроконтроллеры PIC16F8x и PIC16CR8x СИСТЕМА КОМАНД Каждая команда контроллера PIC16Fxx представляет собой 14-битное слово, состоящее из кода кбманды (OPCODE) и одного или нескольких операндов. При описании команд использованы следующие обозначения полей команды, обычно применяемые изготовителем: Поле Расшифровка обозначения f Адрес специального регистра или регистра пользователя. Диапазон значений от 0x00 до 0x7F. Фирменный ассемб- лер допускает применять вместо цифровых значений непо- средственно имена регистров, определенные ранее. W Рабочий регистр (аккумулятор) ь Битовый адрес, используемый с 8-битным регистром, и указывающий внутри регистра на бит, с которым выпол- няется битовая операция. В ассемблерном тексте обо- значает константу, представленную в двоичном счислении. к Литерал, константа или метка. d Указатель приемника результата операции. Если d=0, ре- зультат сохраняется в W, если d= 1, результат сохраняется в регистре, объявленном в команде. По умолчанию d= 1. Никакой другой регистр, кроме используемого в операции, не может быть назначен приемником. Фирменный ассем- блер для большей наглядности допускает применять вме- сто значений 0 и 1 соответственно символы w и f. label Имя метки. TOS Top Of Stack - вершина стека. PC Программный счетчик. PCLAT CH Регистр-защелка старших значений программного счетчика. GIE Бит глобального запрета/разрешения прерываний. WDT WatchDog Timer - сторожевой таймер. TO Флаг-бит переполнения таймера. PD Флаг-бит режима пониженного энергопотребления SLEEP. dest Приемник. Регистр W или иной, указанный в команде, регистр. [] Допустимые значения. 0 Содержимое. 51
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Поле Расшифровка обозначения Передача значения. < > Порядковый номер бита в 8-битном регистре, от 0 до 7. е "Включает в себя значения..." italic Значения или условия, определяемые пользователем. Весь перечень команд контроллера включает в себя байтовые, би- товые, литеральные команды и команды перехода. Байтовые коман- ды включают в себя код команды, адресный указатель на регистр- источник "Г и указатель приемника "d": 13 876 О OPCODE d f (адрес регистра) Например, MYREG EQU OxlD ADDWF MYREG, f В данном случае, регистр пользователя MYREG, определенный по адресу 1D, прибавляется к содержимому аккумулятора и результат помещается в регистр MYREG. Битовые команды изменяют или проверяют значение конкретно заданного бита в регистре. При помощи трех битов "Ь" в команде указывают один из восьми битов регистра "Г: 13 109 7 6 0 OPCODE b f (адрес регистра) Например, MYREG EQU OxlD CLRF MYREG BSF MYREG, 5 В этом примере регистр пользователя MYREG сначала очищается (все биты устанавливаются в 0) командой CLRF, затем пятый бит этого регистра устанавливается в 1 командой BSF. Литеральные команды и команды перехода включают в себя код команды и 8- или 11-битную константу "к": 13_______________ 8 7 0 OPCODE k 52
Микроконтроллеры PIC16F8x и PIC16CR8x Например, MOVLW OxBFh Команда MOVLW (MOV Literal to W) загружает шестнадцате- ричное значение BFh в аккумулятор. Для команд CALL и GOTO используется иной формат команды: 13__________11 10__________________________0 I OPCODE к В этом случае к обозначает 11-битное значение программного ад- реса, которое загружается в программный счетчик при исполнении команды. В ассемблерном тексте адрес перехода обозначается меткой, и значение к вычисляется ассемблером. Большинство команд исполняется за один машинный цикл, ис- ключая команды перехода и вызова подпрограммы, требующие изме- нения значения программного счетчика. Эти команды выполняются за два машинных цикла. Один машинный цикл по длительности ра- вен четырем периодам колебаний тактового генератора. Так, напри- мер, при стандартной частоте кварцевого резонатора 4МГц длитель- ность машинного цикла составляет 1 микросекунду. Команды пере- хода исполняются за 2 мкс. При вычислении времени исполнения отдельных участков програм- мы, особенно критичных по времени, следует помнить, что команды перехода по условию могут исполняться за один или два цикла, в зави- симости от того, выполняется ли условие. Например, в следующем фрагменте BTFSC MYREG, 5 DECF MYREG, ADDWF MYREG, f команда BTFSC (Bit Test F, Skip if Clear) проверяет значение пятого бита регистра MYREG и, если бит равен 1, сразу за этой командой исполняется следующая, DECF MYREG. Команда тестирования бита исполнена за один машинный цикл. Если же пятый бит регистра MYREG очищен, происходит перескакивание через одну команду, на команду ADDWF MYREG. В этом случае команда тестирования бита исполняется за два машинных цикла. Если программы тестирования многократно исполняются в цикле, то при разных условиях могут на- капливаться значительные погрешности в вычислении ожидаемого вре- мени исполнения фрагмента программы. 53
Краткий перечень команд 1аОлица 1-з. Мнемоника операнды Расшифровка мнемоники Количество циклов Изменяемые регистры Примечание БАЙТОВЫЕ операции С РЕГИСТРАМИ ADDWF f, d Add W and F 1 C,DC,Z 1,2 AND WF f, d AND W with F 1 Z 1,2 CLRFf Clear F 1 Z 2 CLRW Clear W 1 Z COMF f, d Complement F 1 Z 1,2 DECF f, d Decrement F 1 Z 1,2 DECFSZ f, d Decrement F, Skip if Zero 1(2) 1,2,3 INCF f, d Increment F 1 Z 1,2 INCFSZ f, d Increment F, Skip if Zero 1(2) 1,2,3 IORWF f, d Inclusive OR W with F 1 Z 1,2 MOVF f, d Move F 1 Z 1,2 MOVWF f Move W to F 1 NOP No Operation 1 RLF f, d Rotate Left F through carry 1 с 1,2 RRF f, d Rotate Right through carry 1 с 1,2 SUBWF f, d Subtract W from F 1 C,DC,Z 1,2 SWAPF f, d Swap nibbles in F 1 1,2 XORWF f, d Exclusive OR W with F 1 Z 1,2 БИТОВЫЕ ОПЕРАЦИИ С РЕГИСТРАМИ BCF f, b Bit Clear F 1 1,2 BSF f, b Bit Set F 1 1,2 BTFSC f, b Bit Test F, Skip if Clear 1(2) 3 BTFSS f, b Bit Test F, Skip if Set 1(2) 3 Часть 1. Обзор микроконтроллеров PICb фирмы Microchip
Мнемоника, операнды Расшифровка мнемоники Количество циклов Изменяемые регистры Примечание ОПЕРАЦИИ С ЛИТЕРАЛАМИ И ПЕРЕХОДЫ ADDLW к Add Literal and W 1 C,DC,Z ANDLWk AND Literal with W 1 Z CALL к Call subroutine 2 CLRWDT Clear Watchdog Timer 1 TO,PD GOTO к Go To address 2 lORLWk Inclusive OR Literal with W 1 Z MOVLWk Move Literal to W 1 RETFIE Return From Interrupt 2 RETLWk Return with Literal in W 2 RETURN Return from subroutine 2 SLEEP Sleep into standby mode 1 TO,PD SUBLW к Subtract W from Literal 1 C,DC/ XORLWk Exclusive OR Literal with W 1 Z Примечания: 1) Когда происходит чтение-модификация-запись портов ввода-вывода, то всегда считывается ре- альные значения напряжений на выводах, независимо от того, как настроены линии порта и что запи- сано в триггер-защелку. Операция производится над считанным реальным значением и результат запи- сывается в защелку. 2) Когда эта инструкция выполняется над регистром TMR0 и d=l, предделитель сбрасывается, если подключен к модулю TimerO. 3) Если программный счетчик модифицируется или проверка на условие возвращает истинный ре- зультат, инструкция требует два машинных цикла. Второй цикл исполняется процессором как NOP. Микроконтроллеры PIC16F8x и PIC16CR8x
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ADDLW ОПИСАНИЕ ИНСТРУКЦИЙ Add Literal and W Синтакс [label] ADDLW k Операнды 0?k?255 Действие (W) + k A (W) Влияет на флаги: C, DC, Z Описание Содержимое рабочего регистра W прибавляет- ся к восьмибитной константе к и результат по- мещается в регистр W. Пример ADDLW 0x15 ADDWF Add W and F Синтакс [label] ADDWF f, d Операнды 0<f<127 de [0,1] Действие (W) + (f) A (dest) Влияет на флаги: C,DC,Z Описание Содержимое регистра W суммируется с содер- жимым регистра f и результат помещается в регистр f если d=l и в аккумулятор W если d=0. Вместо значений 0 и 1 можно применять, соот- ветственно, символы W и f. Пример ADDWF MY_REG, 0 ANDLW AND Literal with W Синтакс [label] ANDLW k Операнды 0<k<255 Действие (W) .AND. (k) A (W) Влияет на флаги: Z Описание Между содержимым регистра W и 8-битной константой к выполняется операция "логическое И". Результат помещается в регистр W. Пример ANDLW ОхЗА ANDWF AND W with F Синтакс [label] ANDWF f, d Операнды 0<f<127 de[0, 1] Действие (W) .AND. (f) -» (dest) Влияет на флаги: Z 56
Микроконтроллеры PIC16F8x и PIC16CR8x Описание Между содержимыми регистров W и f выпол- няется операция "логическое И". Результат по- мещается в регистр f, если d= 1 и в регистр W, если d=0. Вместо значений 0 и 1 можно приме- нять, соответственно, символы W и f. Пример ANDWF MY_REG, 1 BCF Bit Clear F Синтакс Операнды [label] BCF f, b 0<f<127 0<b<7 Действие Влияет на флаги: 0 -» (f<b>) Нет Описание Пример Устанавливает в "0" бит номер b в регистре f. BCF MY_REG, 3 установить в 0 бит 3 регис- тра MY_REG BCF PORTA, 4 установить в 0 линию RA4 порта А BSF Bit Set F Синтакс Операнды [label] BSF f, d 0<f<127 0<b<7 Действие Влияет на флаги: 1 -»(f<b>) Нет Описание Пример Устанавливает в " 1" бит номер b в регистре f. BSF MY_REG, 3 установить в 1 бит 3 регист- ра MY_REG BSF PORTA, 4 установить в 1 линию RA4 порта А BTFSC Bit Test F Skip if Clear । Синтакс Операнды [label] BTFSC f, b 0<f<127 0<b<7 Действие skip next command if (f<b>)=0 57
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Влияет на флаги: Нет Описание Если бит b регистра f равен 1, выполняется сле- дующая по порядку команда. Если бит b регистра f равен 0, следующая команда пропускается, про- граммный счетчик инкрементируется В этом случае выполнение занимает 2 машинных цикла. Пример BTFSC MY_REG, 2 тестируем бит 2 регистра MY_REG GOTO LABEL_ONE ;если 1, переход на метку LABEL_ONE ADDWF MYREG ;если 0, выполняется сло- жение с W BTFSS Bit Test F Skip if Set Синтакс Операнды [label] BTFSS f, d 0<f<127 0<b<7 Действие Влияет на флаги: skip next command if (f<b>)= 1 Нет Описание Если бит b регистра f равен 0, выполняется следующая по порядку команда. Если бит b ре- гистра f равен 1, следующая команда пропуска- ется, программный счетчик инкрементируется. В этом случае выполнение занимает 2 машин- ных цикла. Пример BTFSC MY REG, 2 тестируем бит 2 регистра MY_REG GOTO LABEL_ONE ,если 0, переход на метку LABEL_ONE ADDWF MYREG ;если 1, выполняется сло- жение с W CALL Call subroutine Синтакс Операнды Действие [label] CALL k 0sk<2047 (PC) + 1 -» TOS k -»PC<10:0> (PCLATCH<4:3>) -» (PC< 12:11>) 58
Микроконтроллеры PIC16F8x и PIC16CR8x Влияет на флаги: Нет Описание Адрес следующей команды загружается в стек в качестве адреса возврата Происходит пере- ход на адрес подпрограммы, указанный в кон- станте к. В ассемблере вместо константы ис- пользуется текстовая метка. Пример CALL LOADER ;текст основной программы LOADER ... ;текст подпрограммы RETURN CLRF Clear F Синтакс [label] CLRF f Операнды 0<f<127 Действие OOh (f) 1 -> Z Влияет на флаги: Z Описание Содержимое регистра f полностью очищается, устанавливается флаг Z регистра STATUS. Пример CLRF MY_REG CLRW Clear W Синтакс [label] CLRW Операнды Нет Действие OOh A (W) 1 -> Z Влияет на флаги: Z Описание Содержимое регистра W полностью очищается, устанавливается флаг Z регистра STATUS. Пример CLRW CLRWDT Clear WatchDog Timer Синтакс [label] CLRWDT Операнды Нет Действие OOh A WDT 0 -> (предделитель WDT) 1 -»TO 1 -> PD Влияет на флаги: IQ,PD 59
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Описание Сбрасывает сторожевой таймер и очищает предделитель, если он подключен к сторожево- му таймеру. Пример CLRWDT COMF Complement F Синтакс [label] COMF f, d Операнды 0<f<127 de[0, 1] Действие (f) -»(dest) Влияет на флаги: Z Описание Инверсия содержимого регистра f. Если d=0, результат сохраняется в W, если d=l, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, соответственно, символы W и f. Пример COMF MY.REG, W диверсия MY_REG, ре- зультат в W DECF Decrement F Синтакс [label] DECF f, d Операнды 0<f<127 de[0, 1] Действие (f) ~ 1 -> (dest) Влияет на флаги: Z Описание Из содержимого регистра f вычитается едини- ца. Если d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, соответст- венно, символы W и f. Пример DECF MY_REG DECFSZ Decrement F, Skip if Zero ' Синтакс [label] DECFSZ f, d Операнды 0<f<127 de[0, 1] Действие (f)- 1 -> (dest) skip if result = 0 Влияет на флага: Нет 60
Микроконтроллеры PIC16F8x и PIC16CR8x w* Описание Из содержимого регистра f вычитается едини- ца. Если d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, соответст- венно, символы W и f. Если результат не равен 0, выполняется следующая по порядку коман- да. Если результат равен 0, следующая команда пропускается, программный счетчик инкре- ментируется. В этом случае выполнение зани- мает 2 машинных цикла. Пример DECFSZ MY_REG, 0 GOTO RES_ZERO .перейти если 0 RES_ZERO ... GOTO Goto label (unconditional branch) Синтакс Операнды Действие [labels GOTO k 0<k<2047 k -»(PC<10:0>) (PCLATCH<4:3>) -»(PC< 12:11>) Влияет на флаги: Нет Описание Безусловный переход на адрес к. В ассемблере вместо константы используется текстовая метка. Пример GOTO NEW_ADDR NEW_ADDR ... INCF Increment F Синтакс Операнды [&MINCFf,d 0<f<127 de[0, 1] Действие Влияет на флаги: (f) + 1 -> (dest) Z Описание К содержимому регистра f прибавляется 1. Ес- ли d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, соответст- венно, символы W и f. 61
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Пример INCF MY_REG, 0 INCFSZ Increment F, Skip if Zero Синтакс Операнды [label] INCFSZ f, d 0<f<127 de[0, 1] Действие (f) + 1 -> (dest) skip if result = 0 Влияет на флаги: Нет Описание К содержимому регистра f прибавляется еди- ница. Если d=0, результат сохраняется в W, ес- ли d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, соот- ветственно, символы W и f. Если результат не равен 0, выполняется следующая по порядку команда. Если результат равен 0, следующая команда пропускается, программный счетчик инкрементируется. В этом случае выполнение занимает 2 машинных цикла. Пример INCFSZ MY_REG, 0 GOTO RES_ZERO ;перейти если 0 RES_ZERO ... IORLW Inclusive OR Literal with W Синтакс Операнды Действие Влияет на флаги: [label] IORLW k 0<k<255 (W) .OR k -> (W) Z Описание Выполняется операция "логическое ИЛИ" между содержимым регистра W и восьмибит- ной константой к. Результат помещается в ре- гистр W. Пример IORLW 0x15 IORWF Inclusive OR W with F Синтакс Операнды [label] IORWF f, d 0<f<127 de[0, 1]
Микроконтроллеры PIC16F8x и PIC16CR8x Действие Влияет на флаги: (W) .OR. (f) -» (dest) Z Описание Выполняется операция "логическое ИЛИ" между содержимым регистра W и содержимым регистра f. Если d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, со- ответственно, символы W и f. Пример IORWF MY_REG, 0 MOVLW Mov Literal to W Синтакс Операнды Действие Влияет на флаги: \label\ MOVLW k 0<k<255 k -> (W) Нет Описание Восьмибитная константа k помещается в ре- гистр W. Если значение к не указано, оно ас- семблируется, как 0. Пример MOVLW 0x15 MOVF Move F Синтакс Операнды [label\ MOVF f, d 0<f<127 de[0, 1] Действие Влияет на флаги: (f) -> (dest) Z Описание Значение из регистра f переносится в приемник, определяемый значением d. Если d=0, резуль- тат сохраняется в W, если d- 1, результат со- храняется в регистре f. Вместо значений 0 и 1 можно применять, соответственно, символы W и f. Значение d=l используется для тестирова- ния на ноль содержимого регистра f, поскольку в этом случае содержимое регистра не изменя- ется, но флаг Z выставляется в соответствии со значением регистра. Пример MOVF MY_REG, 0 щеренос содержимого MY_REG в W. MOVF MY_REG, 1 тестирование содержи- мого MY_REG. 63
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip MOVWF Move W to F Синтакс [label] MOVWF f Операнды 0<f<127 Действие (W) -> (f) Влияет на флаги: Нет Описание Содержимое регистра W прерносится в регистр F Пример MOVWF MY_REG NOP No Operation Синтакс [label] NOP Операнды Нет Действие Нет Влияет на флаги: Нет Описание Арифметико-логическое устройство процессо- ра не выполняет никакую операцию. Через четыре такта тактовй частоты (один машин- ный цикл) процессор переходит к исполнению следующей команды. Пример NOP RETFIE Return From Interrupt Синтакс [label] RETFIE Операнды Нет Действие (TOS) (PC) 1 ^GIE Влияет на флаги: Нет Описание Возврат из подпрограммы обработки преры- вания. Адрес возврата загружается в про- граммный счетчик. Бит глобального управле- ния прерываниями GIE устанавливается в 1. Пример RETFIE RETLW Return with Literal in W Синтакс [label] RETLW k Операнды 0<k<255 Действие k^(W) (TOS) (PC) Влияет на флаги: Нет 64
Микроконтроллеры PIC16F8x и PIC16CR8x Описание Возврат из подпрограммы с константой в ак- кумуляторе. В регистр W загружается восьми- битный литерал к. В программный счетчик за- гружается адрес возврата из стека. Пример RETLW OxFE RETURN Return from subroutine Синтакс Операнды Действие Влияет на флаги: [label] RETURN Нет (TOS) A (PC) Нет Описание Возврат из подпрограммы. Адрес возврата за- гружается в программный счетчик из стека. Пример RETURN RLF Rotate Left F through carry Синтакс Операнды [label] RLF f, d 0<f<127 de[0, 1] Действие ' <- (C) <- (register) <- j. 4 Влияет на флаги: c Описание Содержимое регистра f побитно сдвигается влево через флаг переноса С. Если d=0, резуль- тат сохраняется в W, если d= 1, результат со- храняется в регистре f. Вместо значений 0 и 1 можно применять, соответственно, символы W и f Пример RLF MY_REG, 0 RRF Rotate Right F through carry Синтакс Операнды [label] RRF f, d 0<f<127 de[0, 1] Действие -^•(C) ->(register) -> [ Влияет на флаги: c 65
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Описание Содержимое регистра f побитно сдвигается вправо через флаг переноса С. Если d=0, резуль- тат сохраняется в W, если d= 1, результат сохра- няется в регистре f Вместо значений 0 и 1 можно применять, соответственно, символы W и f. Пример RRF MY_REG, 0 SLEEP SLEEP into standby mode Синтакс Операнды Действие [label] SLEEP Нет OOh (WDT) 0 -> (WDT prescaler) 1 ^TQ 0 -> PD Влияет на флаги: TO, PD Описание Переводит процессор в энергосберегающий режим SLEEP и останавливает тактовый гене- ратор. Пример SLEEP SUBLW Subtract W from Literal Синтакс Операнды Действие Влияет на флаги: [label] SUBLW k 0<k<255 k - (W) -> (W) C, DC,Z Описание Содержимое регистра W вычитается из вось- мибитного литерала к Результат помещается в регистр W Примеры SUBLW 0x02 , из константы 2 вычесть содер- жимое регистра W Пример 1. До выполнения W=0x01, С=?, Z=? После выполнения W=0x01, C=l, Z=0 - резуль- тат положительный. Пример 2. До выполнения W=0x02, С=?, Z=? После выполнения W=0x00, С= 1, Z= 1 - резуль- тат равен нулю Пример 3. До выполнения W=0x03, С=?, Z=? После выполнения W=0xFF, С=0, Z=0 - ре- зультат отрицательный. 66
Микроконтроллеры PIC16F8x и PIC16CR8x SUBWF Subtract W from F Синтакс Операнды [label\ SUBWF f, d 0<f<127 de[0, 1] Действие Влияет на флаги: (f) - (W) (dest) C, DC,Z Описание Значение регистра W вычитается из значения в регистре f. Если d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно применять, со- ответственно, символы W и f. Примеры SUBWF MY_REG, 1 Пример 1. До выполнения MY_REG=3, W=2, C=?rZ=? После выполнения MY_REG= 1, W=2, С= 1, Z=0 Результат положительный. Пример 2, До выполнения MY_REG=2, W=2, С=?, Z=? После выполнения MY_REG=0, W=2, С= 1, Z=1 Результат равен нулю. Пример 3. До выполнения MY_REG= 1, W=2, С=?, Z=? После выполнения MY_REG=OxFF, W=2, С=0, Z=0 Результат отрицательный SWAPF Swap nibbles in F Синтакс Операнды [label] SWAPF f, d 0<f<l 27 d6[0, 1] Действие (f<3:0>) (dest<7:4>) (f<7:4>) (dest<3:0>) Влияет на флаги: Нет 67
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Описание Старший и младший полубайты значения в ре- гистре f меняются местами Результат помеща- ется в приемник, определяемый значением d Если d=0, результат сохраняется в W, если d= 1, результат сохраняется в регистре f Вместо значений 0 и 1 можно применять, coo i ветст- венно, символы W и f Пример XORLW Exclusive OR Literal with W Синтакс [label\ XORLW k Операнды 0<k<255 Действие (W) .XOR. k (W) Влияет на флаги: Z Описание Между содержимым регистра W и восьмибит- ной константой к выполняется логическая опе- рация "исключающее ИЛИ". Результат поме- щается в регистр W. Пример XORLW ОхСВ XORWF Exclusive OR W with F Синтакс \label\ XORWF f, d “ bUb* ° Операнды 0<f<127 de[0,l] Действие (W) .XOR. (f) (dest) Влияет на флаги: Z Описание Между содержимым регистра W и регистра f выполняется логическая операция "исключающее ИЛИ". Если d=0, результат со- храняется в W, если d= 1, результат сохраняется в регистре f. Вместо значений 0 и 1 можно при- менять, соответственно, символы W и f. Пример XORWF MY_REG, 0 Следующие две команды, OPTION и TRIS пока применяются в кон- троллерах PIC16Fxx и обслуживаются ассемблером с выдачей преду- преждающего сообщения Но в дальнейших разработках фирмы Microchip® они применяться не будут Для обеспечения совместимости "вверх" с более поздними версиями контроллеров не следует использо- вать эти команды в своих программах При переносе ранее написанных программ и испочьзовании готовых библиотек необходимо проверить 68
Микроконтроллеры PIC16F8x и PIC16CR8x их текст и заменить команды OPTION и TRIS на эквивалентные по- следовательности команд, в соответствии с контекстом OPTION Load Option Register Синтакс Операнды Действие Влияет на флаги: [label\ OPTION Нет (W) OPTION register Нет Описание Содержимое регистра W загружается в регистр OPTION. Инструкция поддерживается для со- здания кодов, совместимых с контроллерами PIC16C5X. Поскольку регистр OPTION досту- пен для чтения и записи, возможна его прямая адресация. TRIS Синтакс Load TRIS Register [label\ TRIS f Операнды Действие Влияет на флаги: 5<f<7 (W) -> TRIS register f Нет Описание Инструкция поддерживается для создания ко- дов, совместимых с контроллерами PIC16C5X. Поскольку регистры TRIS доступны для чтения и записи, возможна их прямая адреса- ция. Приложение 1 ОТЛИЧИЯ МИКРОКОНТРОЛЛЕРА PIC16C84 ОТ PIC16F83/84 И PIC16CR83/84 В таблице приведены отличия PIC16C84 от PIC16F84. Данные также пригодны для перехода от PIC16C84 к PIC16F83 (с учетом раз- ного объема памяти программ и памяти данных) и PIC16CR83/CR84 (ROM-версия). Программная среда разработчика поддерживает все упомянутые версии приборов. 69
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Отличие PIC16C84 PIC16F84 Полярность бита PWRTE изменена Удостоверьтесь, что бит задан правиль- но, перед тем, как начать программи- рование кристалла. PWRTE PWRTE PIC16F84H PIC16CR84 имеют больший объем па- мяти данных RAM. RAM = 36 байт RAM - 68 байт Вход внешнего сброса MCLF те- перь имеет встроен- ный фильтр подав- ления случайных импульсов. Длительность им- пульса низкого уровня не менее: 350ns;2.0V Vdd 3.0 V 150 ns; 3.0V Vdd 6.0 V Длительность им- пульса низкого уровня не менее: 1000ns; 2.0V<Vdd< 6.0 V Значительно снижен ток, потребляемый в режиме SLEEP. Ipd (typ @ 2V) = 26 A Ipd (max @ 4V, WDT выкл.) = 100 pA(PIC16C84) = 100 A(PIC16LC84) Ipd (typ @ 2V) = 1 A Ipd (max @ 4V, WDT выкл.) = 14 A(PIC16F84) = 7 A(PIC16LF84) Частота кварцевого резонатора может быть меньше 500КГц. При частоте резона- тора меньше 500КГц может происходит случайный самопро- извольный сбой ра- боты тактового ге- нератора в момент переключения состо- яния на выводе RA0. Явление отсутст- вует. Вход RB0/INT TTL TTL/ST (Добавлен триггер Шмитта по входу, когда он конфигурирован как вход внешнего прерывания.) 70
Микроконтроллеры PIC16F8x и PIC16CR8x Отличие PIC16C84 PIC16F84 Биты 7:6 регистра EEADR и потребля- емый ток Рекомендуется обну- лять биты 7 и 6 реги- стра EEADR, т.к. ес- ли один из этих би- тов установлен, по- требляемый ток Idd становится больше. Явление отсутст- вует. Биты защиты кода 1 бит защиты 9 битов защиты Рекомендованное значение внешнего резистора Rext в режиме RC- генератора Rext = = 3 кОм - 100 кОм Rext = = 5кОм - ЮОкОм Самопроизвольная установка бита GIE Если прерывание по- ступает, когда бит глобального запрета прерываний GIE сброшен, возможна его самопроизвольная установка в момент исполнения подпро- граммы обработки прерывания. Явление отсут- ствует. Приложение 2 УЛУЧШЕННЫЕ ХАРАКТЕРИСТИКИ PIC16F8X И СОВМЕСТИМОСТЬ ПРОГРАММНЫХ КОДОВ МЕЖДУ PIC16C5X И PIC16F8X По сравнению с контроллерами семейства Р1С16С5х, у контролле- ров PIC16F8x улучшены или добавлены следующие опции: 1. Длина слова команды увеличена до 14 бит. Это позволило увеличить память программ (с 512 до 2К слов) и адресуемых рабочих регистров (с 32 до 128). Сейчас реально используется 68 рабочих регистров в PIC16F84 и 36 регистров в PIC16F83. 71
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip 2. Добавлен регистр PCLATCH для управления страницами про- граммной памяти. 3. Несколько изменено распределение памяти данных и модифи- цирован регистр STATUS. 4. Добавлены четыре новых команды: RETURN, RETFIE, ADDLW и SUBLW. Команды OPTION и TRIS оставлены как переходные для совместимости с Р1С16С5х. 5. Регистры OPTION и TRIS сделаны адресуемыми. 6. Добавлена обработка прерываний. Адрес-вектор прерывания 0004h. 7. Стек расширен до 8 уровней. 8. Адрес-вектор сброса изменен на OOOOh. 9. Система сброса всех регистров пересмотрена. Можно про- граммно различить пять типов сброса и пробуждение из ре- жима SLEEP. Все регистры реагируют на сброс по-разному. 10. Добавлено пробуждение из режима SLEEP по прерыванию. 11. Для более надежного старта при включении питания добавле- ны два таймера: таймер запуска тактового генератора (OST) и таймер задержки при включении питания (PWRT). Эти тайме- ры могут быть использованы по выбору пользователя, чтобы избежать ненужных задержек при включении питания или пробуждении из режима SLEEP. 12. PORTB имеет встроенную маломощную нагрузку и может ге- нерировать прерывание по изменению уровня на входах. 13. Вход T0CKI может использоваться и как полноценный вывод порта (RA4/T0CKI). 14. Регистр FSR является полноценным 8-битным регистром. 15. Поддерживается внутрисхемное программирование контрол- лера: конроллер можно запрограммировать на собранной пла- те, используя пять выводов: Vdd, Vss, Vpp, RB6 и RB7. Чтобы адаптировать программу, ранее написанную для Р1С16С5х, к применению на PIC16F8x, необходимо выполнить сле- дующие действия: 1 Удалить определение страниц памяти (биты РА2, РА1, РАО) для команд CALL и GOTO. 2. Проверить все операции управляемого перехода (запись в программный счетчик, суммирование с программным счетчиком и т.д.) чтобы быть уверенным, что адрес будет за- дан правильно при новой схеме адресации. 72
Микроконтроллеры PIC16F8x и PIC16CR8x 3. Аннулировать все действия по переключению страниц памяти данных. Переопределить расположение переменных (присвоить им новые адреса рабочих регистров). 4. Проверить все операции с регистрами STATUS. OPTION и FSR, в результате которых их содержимое может быть изме- нено. Удостовериться, что результат будет соответствовать ожидаемому значению. 5. Измените адрес-вектор сброса на OOOOh. МИКРОКОНТРОЛЛЕРЫ СЕМЕЙСТВА PIC12C5XX Микроконтроллеры семейства PIC12C5XX можно, пожалуй, считать вторыми по популярности в радиолюбительской практике контроллерами фирмы Microchip®. Они также очень популярны у разработчиков различных портативных устройств типа брелков сиг- нализаций, автоматов прогрева двигателя, пультов дистанционного управления, приемников сигналов ДУ и множества других приложе- ний, требующих применения недорогого и экономичною контролле- ра. К сожалению, семейство PIC12C5XX не имеет варианта с FLASH- памятью программ, но выпускаются отладочные кристаллы с ультра- фиолетовым стиранием Они достаточно дороги (в России до 7 - 8 долларов против цены в 1,5 - 2 доллара за обычный корпус). Кроме этого, кристаллы с ультрафиолетовым стиранием весьма капризны и чувствительны к времени стирания и питающему напряжению. В радиолюбительской практике и при разработке не очень слож- ных приложений вполне можно обойтись программной симуляцией с помощью MPLAB. Некоторые фрагменты можно отладить и при по- мощи PIC16F84, но надо учитывать разницу во внутреннем устройст- ве и отсутствие у PIC16F84 внутреннего RC-генератора, работающего без навесных элементов. Микроконтроллеры семейства PIC12C5XX поддерживают про- граммирование в готовом устройстве при помощи последовательного канала. В большинстве случаев для этого достаточно соединить через разъем выводы контроллера в готовом устройстве с соответствую- щими выводами панельки программатора. Для получения более по- дробной информации следует обратиться к фирменному описанию стандартов программирования микроконтроллеров PIC Мы рассмотрим контроллеры, перечень которых приведен в таб- лице да
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Контроллер Память ППЗУ программ ПЗУ программ ОЗУ данных EEPROM данных PIC12C508 512x12 — 25 — PIC12C508A 512x12 — 25 — PIC12C509 1024x12 — 41 — PIC12C509A 1024x12 — 41 — PIC12CE518 512x12 — 25 16 PIC12CE519 1024x12 — 41 16 PIC12CR509A — 1024x12 41 — Возможности ядра. Система команд RISC-ядра контроллеров PIC12C5XX состоит из 33 команд, большинство из которых выполняется за 1 машинный цикл. Команды перехода выполняются за два цикла При тактовой частоте 4МГц длительность машинного цикла 1 мкс Процессор опе- рирует с 12-битными словами команд и 8-битными данными. Имеется 2-уровневый аппаратный стек, семь регистров специального на- значения. На кристалле встроен внутренний тактовый RC-генератор 4МГц с возможностью программной калибровки Поддерживается прямая, косвенная и относительная адресация. Допускается програм- мирование в готовом устройстве по последовательному каналу. Функциональные возможности периферийных модулей: 8-битный таймер/счетчик с программируемым 8-битным предде- лителем Сброс по питанию без применения внешних элементов (Power-On Reset, POR) Таймер сброса устройства (Device Reset Timer, DRT) Сторожевой таймер со встроенным на кристалл собственным ге- нератором для повышения надежности Программируемый бит защиты программы от считывания 1 000 000 циклов чтения/записи во встроенную электрически сти- раемую память EEPROM (для PIC 12СЕ518/519) Гарантированная сохранность данных в EEPROM более 40 лет (для PIC 12СЕ518/519) Энергосберегающий режим SLEEP Выход из режима SLEEP по изменению уровня на одном из входов Встроенные подтягивающие резисторы на входах Встроенный подтягивающий резистор на входе сброса MCLR Выборочный тип тактового генератора: 74
Микроконтроллеры PIC12C5xx - INTRC - встроенный RC генератор 4МГц - EXTRC - внешний RC генератор - XT - обычный кварцевый/керамический резонатор - LP - энергосберегающий низкочастотный кварцевый резонатор ОСНОВНЫЕ ЭЛЕКТРИЧЕСКИЕ ПАРАМЕТРЫ Параметр / Значение Примечание Рабочая темцбратура Та, °C 0 ... +70 -40... +85 -40... +125 Коммерческое исполнение Индустриальное исполнение Расширенное исполнение Максимальная такто- вая частота Fosc, МГц 4 Потребляемый ток в стандартном режиме IpD < 2 мА 15 мкА Fosc=4 МГц, Vdd=5,0V Fosc=32 кГц, Vdd=3,0 V Истребляемый ток в режиме SLEEP Ipd, цА < 1 Максимальный втека- ющий ток для любого вывода, мА 25 Управление светодиодами без дополнительного бу- фера (но с резистором') Максимальный выте- кающий ток для любо- го вывода, мА 25 Управление светодиодами без дополнительного бу- фера (но с резистором') Количество циклов стирание/запись для памяти данных EEPROM, не менее 10.000.000 НАПРЯЖЕНИЕ ПИТАНИЯ И КАЛИБРОВОЧНЫЕ БИТЫ Контроллер Диапазон напряжений Калибровочные биты PIC12C508A 3.0-5.5 6 PIC12LC508A 2.5-5.5 6 PIC12C508 2.5-5.5 4 PIC12C509A 3.0-5.5 6 PIC12LC509A 2.5-5.5 6 PIC12C509 2.5-5.5 4 75
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Контроллер Диапазон напряжений Калибровочные биты PIC12CR509A 2.5-5.5 6 PIC12CE518 3.0-5.5 6 PIC12LCE518 2.5-5.5 6 PIC12CE519 3.0-5.5 6 PIC12LCE519 2.5-5.5 6 Примечание. Если вы переносите программу с PIC12C50X на PIC12C50XA или на PIC12CR50XA, проверьте параметры тактового генератора в вашем приложении. РАСПОЛОЖЕНИЕ И НАЗНАЧЕНИЕ ВЫВОДОВ V ► 1 *00 ” 1 GP5/OSC1/CLKIN GP4/OSC2 GP3/MCLR/Vpp — PIC12C508 Р1С12С509 PIC12C508A PIC12C509A PIC12CR509A PIC12CE518 PIC12CE519 j}*—Vss GPO GP1 GP2/T0CKI Рис. 1-14. Расположение и назначение выводов PIC12CXXX Назначение выводов приведено в таблице на стр. 77-78 (разводка выводов для корпусов типа DIP и SOIC полностью совпадает). ВАРИАНТЫ КРИСТАЛЛОВ PIC12C5XX Кристаллы с ультрафиолетовым стиранием Версия кристалла с ультрафиолетовым стиранием производится в керамическом паяном корпусе с окном. Используется для отладки программ и прототипирования устройств. После стирания контрол- лер может быть вновь настроен на любую конфигурацию. Самый до- рогой по стоимости. Следует помнить, что при стирании кристалла также стираются предварительно установленные внутренние калибровочные константы для коррекции частоты встроенного тактового генератора. Значения калибровочных констант должны быть сохранены перед стиранием. 76
Расположение и назначение выводов Р1С12С5хх Название Номер Тип Буфер Описание GP0 7 I/O TTL/ST Двунаправленный порт или вход данных для после- довательного программирования. Имеет программ- но подключаемый подтягивающий резистор и про- граммно задаваемый выход из режима SLEEP при изменении входного уровня. В режиме программи- рования вход подключается через внутренний триг- гер Шмитта GP1 6 I/O TTL/ST Двунаправленный порт или вход тактовых импульсов для последовательного программирования. Имеет программно подключаемый подтягивающий резистор и программно задаваемый выход из режима SLEEP при изменении входного уровня. В режиме програм- мирования вход подключается через внутренний триг- гер Шмитта GP2/T0CKI 5 I/O ST Двунаправленный порт. Может быть сконфигуриро- ван, как вход тактовых импульсов T0CKI для тай- мера TMR0 Микроконтроллеры Р1С12С5хх
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Название Номер Тип Буфер Описание GP3/MCLR/Vnn 4 I TTL/ST Входной порт, вход напряжения программирования. В обычном режиме напряжение на выводе не должно превышать питающее. Может быть настроен, как вход сброса MCLR. при этом всегда подключается внутренний вытягивающий резистор и триггер Шмитта. Сброс производится низким уровнем на входе. Может быть программно подключен вытяги- вающий резистор и установлен режим выхода из SLEEP при изменении уровня на входе GP4/OSC2 3 I/O TTL Двунаправленный порт, в режиме работы с внешним резонатором (XT или LP) используется как выход для поключения к кристаллу GP5/OSC1/ CLKIN 2 I/O TTL/ST Двунаправленный порт, в режиме работы от незави- симого внешнего тактового генератора используется как вход тактовых импульсов, при этом под- ключается триггер Шмитта. При работе с внешним резонатором используется как вывод для под- ключения резонатора Vdd 1 Р — Положительный вывод питания VpP 8 Р — Общий провод (земля) Сокращения: 1=вход, О=выход, 1/О=вход/выход, Р=питание, —=не присутствует, ТТЬ=вход с уров- нями TTL, 8Т=вход с триггером Шмитта. со
Микроконтроллеры PIC12C5xx Однократно программируемые кристаллы (ОТР) Выпускаются в пластиковом корпусе и позволяют однократно за- писать программу и биты конфигурации. Предназначены для мелко- серийного производства, мелких опытных партий и индивидуально настраиваемых устройств. Кристаллы в быстро исполняемых товарных партиях (QTP) Компания Microchip® предоставляет сервис по быстрому про- граммированию товарных партий промышленного масштаба. Этот сервис предназначен для тех заказчиков, которые не хотят приобре- тать средние или большие товарные партии за один раз, но делают регулярные заказы и имеют один стабильный программный код, ко- торый не изменяется длительное время. На фабрике Microchip® хра- нится код программы и данные о настройках. По заказу клиента пар- тия контроллеров программируется прямо на фабрике, перед отправ- кой производится верификация для большей надежности. QTP с сериализацией То же самое, что и предыдущий пункт, только каждому кристаллу присваивается уникальный серийный номер, который предоставляет- ся заказчику вместе с кристаллами. Масочно запрограммированные кристаллы Изготавливаются методом масочного программирования для больших (сотни тысяч штук) товарных партий и имеют самую низкую стоимость в пересчете на единицу изделия. ОРГАНИЗАЦИЯ ПАМЯТИ Память PIC12C5XX организована в виде двух независимых бло- ков: память программ и память данных. Для кристаллов, имеющих более 512 байт программной памяти, применяется разбиение памяти на страницы. Выбор страниц осуществляется при помощи одного би- та регистра STATUS. Для кристаллов PIC12C509, PIC12C509A, PIC12CR509A и PIC12CE519, память данных у которых превышает 32 бита, также применяется разбиение на страницы. Банки данных переключаются при помощи регистра выбора ячеек FSR (File Select Register). ПАМЯТЬ ПРОГРАММ Программный счетчик контроллеров PIC12C5XX имеет разряд- ность 12 бит и позволяет адресовать до 2К х 12 адресного простран- ства. Для различных вариантов контроллера физически доступны 79
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip только 512 х 12 или 1К х 12 адресного пространства. При попытке обратиться за пределы этих адресов старшие биты адресного регистра игнорируются и реально происходит обращение к соответствующим адресам доступного адресного поля. Вектор сброса находится по адресу OOOOh, а в самой последней ад- ресуемой ячейке программной памяти, по адресу OlFFh или 03FFh хранится калибровочная константа для внутреннего RC-генератора. Рис. 1-15. Организация программной памяти и стека в PIC12C5XX 80
Микроконтроллеры PIC12C5xx ПАМЯТЬ ДАННЫХ Как и в других микроконтроллерах PIC, память данных делится на регистры специального назначения и регистры общего применения. 00h INDF11’ 01h TMRO 02h PCL 03h STATUS 04h FSR 05h OSCCAL 06h GPIO 07h Регистры общего применения 1Fh Примечание. INDF не является физическим регистром. Рис. 1-16. Распределение регистров в PIC12C508, PIC12C508A и PIC12CE518 Банк 0 Банк 1 OOh INDF11’ 20h Адресуется зеркально банку 0 01 h TMRO 02h PCL 03h STATUS 04h FSR 05h OSCCAL 06h GPIO 07h Регистры общего применения OFh 2Fh 10h Регистры общего применения 1 Fh 30h Регистры общего применения 3Fh Примечание. INDF не является физическим регистром Рис. 1-17. Распределение регистров в PIC12C509, PIC12C509A, PIC12CR509A и PIC12CE519 81
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Как наглядно показано на рисунках 1-16 и 1-17, контроллеры PIC12C5XX имеют 7 регистров специального назначения по адре- сам OOh - 06h. Если контроллер имеет два банка данных, как пока- зано на рис. 1-17, то обращение к адресам диапазона 20h - 2Fh дает зеркальный доступ к адресам OOh - OFh. Например, обращения по адресам 03h и 23h одинаково адресуют регистр специального на- значения STATUS, а обращения по адресам 09h и 29h адресуют один и тот же регистр общего применения. Но по адресам 1 Oh - IFh и 30h - 3Fh расположены разные банки, Банк1 и Банк 0. Адресация к регистрам общего применения в этих банках происходит при участии специального регистра FSR. Если биты 6 и 5 FSR имеют значения 00, то адресуется Банк 0, если 01, то адресуется Банк 1. СПЕЦИАЛЬНЫЕ РЕГИСТРЫ Специальные регистры представляют собой статическое ОЗУ, в котором некоторые биты устанавливаются по умолчанию при сбросе (см. таблицу 1-4). РЕГИСТР STATUS (АДРЕС ОЗН) Регистр STATUS хранит арифметические флаги АЛУ, информа- цию о сбросе и бит выбора страницы программной памяти, если она превышает 512 слов. Как и большинство регистров, STATUS может являться регистром назначения для любой операции. Но если над регистром STATUS выполняют операцию, которая может изменить состояние битов Z, DC и С, то запись в эти три бита блокируется. Их состояние изменяется только аппаратно, в зависимости от состояния АЛУ. Более того, биты ТО и PD также недоступны для записи. Сле- довательно, результат операции с регистром STATUS в качестве приемника может оказаться совсем не таким, как ожидалось. Напри- мер, команда CLRF STATUS (очистить полностью регистр STATUS) на самом деле очистит только три старших бита и установит в 1 бит Z. Поэтому к регистру STATUS следует применять только команды BCF, BSF и MOVWF, потому что они не изменяют другие биты со- стояния. Рассмотрим подробно назначение битов регистра STATUS: bit7 GPWUF - бит сброса регистра GPIO 1 = сброс по выходу из SLEEP при изменении уровня на выводе 0 = после включения питания или по любому другому сбросу bit6 Не используется 82
Таблица 1-4. Специальные регистры семейства PIC12C5XX Addr. Name Bit7 Bit 6 Bits Bit 4 Bit 3 Bit 2 Bitl BitO Value on Power-On Reset Value on All Other Resets<2> N/A TRIS — — --11 1111 --11 1111 N/A OPTION . Содержит управляющие биты дляжонфигуриро- вания TimerO, предделителя TimerO/WDT, выхода из SLEEP и подтягивающих регистров 1111 1111 11111111 00h INDF Использует содержимое FSR для адресации памя- ти данных (не является физическим регистром) xxxx xxxx UUUU UUUU Olh TMR0 8-битный таймер-счетчик xxxxxxxx UUUU UUUU 02h(l) PCL Младшие 8 бит PC 1111 1111 1111 1111 03h STATUS GPW UF — РАО ТО PD Z DC C 0001 Ixxx qOOq quuu*3> 04h FSR (PIC 12С508/ Р1С12С508А/ PIC12C518) Указатель косвенного адреса памяти данных 11 lx xxxx 11 lu UUUU 04h FSR (Р1С12С509/ Р1С12С509А/ PIC12CR509A/ PIC12CE519) Указатель косвенного адреса памяти данных 11 Ox xxxx 1 luu UUUU Микроконтроллеры Р1С12С5хх
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Addr. Name Bit7 Bit 6 Bits Bit 4 Bit 3 Bit 2 Bit 1 BitO Value on Power-On Reset Value on All Other Resets® 05h OSCCAL (Р1С12С508/ PIC12C509) CAL3 CAL2 CALI CALO — — -- — 0111 ---- uuuu O5h OSCCAL (Р1С12С508А/ Р1С12С509А/ Р1С12СЕ518/ Р1С12СЕ519/ PIC12CR509A) CAL5 CAL4 CAL3 CAL2 CALI CALO 1000 00 -- uuuu uu - - 06 h GPIO (Р1С12С508/ Р1С12С509/ Р1С12С508А/ Р1С12С509А/ PIC12CR509A) GP5 GP4 GP3 GP2 GP1 GPO - - XX xxxx - - uu uuuu 06h GPIO (Р1С12СЕ518/ PIC12CE519) SCL SDA GP5 GP4 GP3 GP2 GP1 GPO 11XX xxxx 1 luu uuuu Обозначения, и = не изменяется, х = произвольное, - = недоступно, читается как "О", ' q = значение зависит от условий. Примечание 1. Старшие байты программного счетчика недоступны для прямого обращения. Примечание 2. Другие (не по питанию) варианты сброса, включая сброс через MCLR, сторожевой таймер и выход из SLEEP по изменению уровня на входе. 3 Примечание 3. Если сброс вызван изменением уровня на выводе, то бит 7= 1. Во всех других случаях бит 7=0.
Микроконтроллеры PIC12C5xx bit5 РАО - бит выбора страницы программной памяти 1 = страница 1 (200h - 3FFh) - PIC12C(R)509(A), PIC12CE519 О = страница 0 (OOOh - IFFh) - PIC12C5XX bit4 ТО - бит тайм-аута сторожевого таймера 1 = после выполнения сброса по включению питания, команд CLRWDT или SLEEP. О = означает, что произошло переполнение сторожевого таймера bit3 PD - бит включения питания 1 = после включения питания или команд CLRWDT и SLEEP О = после команды SLEEP bit2 Z - бит нулевого результата 1 = результат арифметической или логической операции равен О О = результат арифметической или логической операции не равен О bit 1 DC - бит десятичного переноса/заема (для ADDWF и SUBWF) после применения команды ADDWF 1 - был перенос из младшего полубайта результата О - не было переноса из младшего полубайта результата после применения команды SUBWF 1 - не было заема из младшего полубайта результата О = был заем из младшего полубайта результата bitO С - бит переноса/заема (для ADDWF, SUBWF, RRF и RLF) после применения команды ADDWF 1 = был перенос О = не было переноса после применения команды SUBWF 1 = не было заема О = был заем после применения команд RRF и RLF в бит С загружается соответственно младший или старший бит регистра-источника. РЕГИСТР OPTION Регистр OPTION -является 8-битным регистром, предназначенным только для записи, и содержит различные управляющие биты для конфигурирования предделителя и таймера. Этот регистр не отобра- жается в адресном пространстве, данные в этот регистр заносятся при помощи специальной команды OPTION, пересылающей байт из аккумулятора W. bit7 GPWU - разрешение выхода из режима SLEEP при изменении уровня на выводах GPO, GP1, GP3. 1 = выход запрещен 85
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip О = выход разрешен bit6 GPPU - включение встроенных подтягивающих резисторов на входы GPO, GP1, GP3. 1 - отключены О = подключены Примечание если бит регистра TRIS установлен в "О" и соответст- вующая линия порта настроена на вывод, то подтягивающий резис- тор и функция выхода из SLEEP для этого вывода отключены. bit5 TOCS - бит выбора источника тактового сигнала для TMR0 1 = тактовый сигнал со входа T0CKI О = тактирование синхронно с машинными циклами (F0Sc/4) Примечание', если TOCS=1, то линия GP2 работает на ввод, незави- симо от состояния бита 2 регистра TRIS. bit4 TOSE - выбор активного фронта для TMR0 на выводе T0CKI 1 = инкремент по спаду О = инкремент по нарастанию ЬпЗ PSA - бит, управляющий подключением предделителя 1 = предделитель подключен к WDT О = предделитель подключен к TMR0 bit2-0 PS2:PS0 - установка коэффициента деления предделителя в за- висимости от подключения Биты для TMR0 для WDT ООО 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1-64 1:32 110 1:128 1:64 111 1:256 1.128 РЕГИСТР OSCCAL (05Н) Регистр калибровки генератора OSCCAL предназначен для кали- бровки частоты встроенного генератора 4МГц. Увеличение значения в регистре увеличивает тактовую частоту. Более подробно об этом сказано в описании внутреннего генератора. В регистре OSCCAL для PIC12C508 и PIC12C509 задействовано 4 старших рабочих бита, с 7 по 4. Для калибровки PIC12C508A, PIC12C509A, PIC12CR509A, PIC12CE518, PIC12CE519 задействовано 6 старших бит, с 7 по 2. Незадействованные биты читаются как "О". 86
Микроконтроллеры PIC12C5xx ПРОГРАММНЫЙ СЧЕТЧИК Когда выполняется команда программы, программный счетчик уже содержит адрес команды, которая будет выполняться следующей. Таким образом реализован конвейер команд, позволяющий значительно увеличить быстродействие. В каждом машинном цикле значение программного счетчика увеличивается на единицу. Ис- ключение составляют команды, модифицирующие значение про- граммного счетчика. Когда выполняется переход по команде GOTO, в биты 0...8 пере- носится значение операнда из командного слова, а в бит 9 записыва- ется значение бита выбора страницы из регистра STATUS. Когда выполняется команда CALL или любая команда, исполь- зующая программный счетчик в качестве получателя, в биты 0...7 записывается значение из командного слова, в бит 8 записывается ноль, а в бит 9 значение бита выбора страницы из регистра STATUS. К командам, которые используют программный счетчик в качестве получателя значения, относятся MOVWF PC, ADDWF PC, BSF PC, 5. Так как бит 8 всегда устанавливается в ноль при вызове подпро- грамм или модификации счетчика, все команды вызова подпрограмм или вычисляемые переходы выполняются только в пределах первых 256 ад- ресов любой страницы. При программировании перехода или вызове подпрограммы следует быть уверенным, что в регистре STATUS, бит РАО, заранее указана нужная страница. Можно воспользоваться директивами ассемблера для автоматической вставки кода выбора страницы в момент компо- новки ДЕЙСТВИЯ ПРИ СБРОСЕ После сброса микроконтроллера программный счетчик устанав- ливается на последнюю ячейку памяти программ на последней стра- нице и считывает находящуюся там команду MOVLW хх, где хх - ка- либровочная константа встроенного RC генератора. После выполне- ния команды программный счетчик переходит на адрес OOOOh, а значение калибровочной константы оказывается в аккумуляторе W. Пользователь может переписать калибровочную константу в регистр OSCCAL или проигнорировать ее. 87
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip СТЕК Контроллеры PIC12C5XX имеют 12-битный стек типа LIFO (последнее записанное значение вызывается первым) При выполне- нии команды CALL значение из первой ячейки стека смещается во вторую, а в первую ячейку записывается адрес возврата из текущей подпрограммы. Если подпрограммы вызывались более двух раз под- ряд, то сохраняются только последние два адреса возврата Микроконтроллеры PIC12CXXX не имеют бит-флага, сообщающе- го о переполнении стека или его избыточной выгрузке, поэтому про- граммист должен самостоятельно следить за корректностью своей программы и не допускать более одного вложения подпрограмм Для PIC12C5XX не существует специальных команд PUSH или POP При необходимости сохранения значения аккумулятора, программист должен записывать значение W в регистр общего применения перед вызо- вом подпрограммы и извлекать обратно после возвращения из нее При выполнении команды RETLW содержимое первой ячейки стека загружается в командный счетчик, а значение из второй ячейки переходит в первую Если выполнено более двух команд RETLW, то стек заполняется значением из второй ячейки. После сброса содержи- мое стека не изменяется, но программный счетчик всегда обнуляется. При выполнении команды RETLW в аккумулятор записывается значение константы, которая является операндом команды. Это очень удобно при реализации табличной перекодировки данных. КОСВЕННАЯ АДРЕСАЦИЯ: РЕГИСТРЫ INDF И FSR Регистр INDF не является физическим регистром. При обращении к этому регистру на самом деле адресуется регистр, адрес которого указан в регистре FSR (т.е. FSR является указателем). Такая адреса- ция является косвенной. Регистр FSR имеет разрядность 5 бит и при помощи битов 0...4 позволяет адресовать память данных в диапазоне OOh - IFh. Если память данных не разбита на банки, то биты 5...7 не используются и читаются как "1". Если память данных разбита на два банка (PIC12C509, PIC12C509A, PIC12CR509A, PIC12CE519), то бит 5 используется для указания банка, биты 6...7 не используются и все- гда читаются как " 1". Пример косвенной адресации: - регистр общего назначения по адресу 07h содержит значение 01 h, -регистр общего назначения по адресу 08h содержит значение B5h; - загружаем в регистр FSR значение 07h, - читаем значение из регистра INDF и получаем значение 01 h; 88
Микроконтроллеры PIC12C5xx - инкрементируем на единицу значение FSR (FSR=08h); - читаем значение из регистра INDF и получаем значение B5h; При попытке прочитать косвенным образом значение самого ре- гистра INDF (FSR=0) всегда возвращается значение 00h. Попытка косвенной записи в INDF исполняется как пустая операция (несмотря на то, что биты регистра STATUS могут измениться). Приведенный далее фрагмент программы, используя косвенную адресацию, очищает регистры общего назначения (RAM), располо- женные по адресам 10h-lFh: MOVLW MOVWF 0x10 FSR •.устанавливаем указатель ;на стартовый адрес RAM NEXT CLRF INDF ;очищаем регистр INDF INCF FSR, F щнкрементируем указатель BTFSS FSR, 4 закончили очистку? GOTO NEXT ;нет, очистить следующую ячейку ;если да, продолжить программу ПОРТЫ ВВОДА-ВЫВОДА Как и у для всех остальных регистров, значение регистра вво- да/вывода может быть программно прочитано или записано. Инст- рукции чтения данных из регистра портов (например, MOVF GPIO, W) всегда считывают с выводов реально присутствующие уровни, не- зависимо от того настроена ли линия порта на ввод или вывод. Если, например, линия настроена на вывод и высокий выходной уровень, но внешнее воздействие удерживает низкий уровень, то с этой линии будет читаться "О". По сбросу все линии порта настраиваются на ввод и имеют высокоимпедансное состояние. РЕГИСТР GPIO GPIO - это восьмиразрядный регистр ввода/вывода. Используются только младшие 6 бит GP0...GP5. Биты 6 и 7 недоступны и всегда читаются как "О". Не забывайте, что линия GP3 (4) работает только на ввод Слово конфигурации может присвоить линиям различные функции независимо друг от друга. Если выводы исполняют альтер- нативные функции, не относящиеся к вводу-выводу, то при чтении значений с этих выводов всегда возвращается значение "О". Выводы GPO, GP1 и GP3 могут быть настроены на подключение внутренних 89
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip подтягивающих резисторов и на вывод из режима SLEEP по измене- нию входного уровня Имейте в виду, что функция выхода из SLEEP по изменению уровня не различает эти три вывода между собой Если вывод (4) сконфигурирован, как вход сброса MCLR. то к этому выво- ду всегда подключен подтягивающий резистор и выход из режима SLEEP по изменению уровня для этого вывода не задействован (что, впрочем, неудивительно ©). РЕГИСТР TRIS Регистр TRIS управляет режимом ввода/вывода каждой линии порта. Управляющие биты записывают в регистр TRIS из аккумуля- тора W командой TRIS f. Установка бита в "1" настраивает соответ- ствующую линию на ввод, а "О" на вывод. Исключение составляют линия GP3, работающаа только на ввод, и GP2, которая может уп- равляться регистром OPTION. Прочтите примечания, приведенные в описании регистра OPTION. ОБМЕН ДАННЫМИ С ПОРТОМ ВВОДА/ВЫВОДА Эквивалентная схема порта ввода /вывода приведена на рис. 1-18. Все выводы порта, исключая GP3, могут быть использованы как для ввода, так и для вывода. На схеме не показаны защитные диоды, под- ключенные от вывода порта к Vcc и Vdd. Входные значения на выводах нигде не защелкиваются. Значение должно непрерывно присутствовать на выводе, пока выполняется команда чтения, например, MOVF GPIO, W. Выходные значения за- щелкиваются в триггере и сохраняются до тех пор, пока не будут из- менены следующей командой. Все операции записи в порт внутренне исполняются как чтение- модификация-запись. Например, когда исполняется команда BSF или BCF, то со всех линий порта считываются реальные значения, при- сутствующие на выводах в этот момент, модифицируется указанный бит и все полученные значения записываются в выходную защелку. Таким образом, некоторые биты выходной защелки могут иметь непредсказуемые значения Если в процессе исполнения программы линии порта после чтения будут перенастроены на вывод, на некото- рых из них будут выставлены непредсказуемые уровни, что может привести к неожиданным результатам в работе устройства. В процессе написания программы, перед изменением настройки линий порта, реко- мендуется явно задавать значения в выходной защелке для критичных линий. 90
Микроконтроллеры PIC12C5xx Рис. 1-18. Эквивалентная схема порта для отдельной лвнвв Рассмотрим пример ошибки при написании программы. Кстати, в фирменной документации DS40139E[page 22], в примере этой про- граммы допущена опечатка, которая тиражируется в российской справочной литературе. Будьте внимательны. ; начальные настройки порт ввода/вывода. ; линии 5... 3 на ввод ; линии 2...0 на вывод Защелка GPIO Выводы GPIO BCF GPIO, 5 ;-01 -ppp -11 pppp BCF GPIO, 4 MOVLW 007h ; -io-ppp -11 PPPP TRIS GPIO ; -io-ppp -io pppp Обратите внимание: пользователь ожидал, что получит выходные значения -00 рррр. Но вторая команда BCF считала высокий уровень на входе GP5 и перенесла его в выходную защелку Когда командой TRIS GPIO мы настроили линию GP5 на выход, на ней появился вы- сокий уровень, считанный раньше. Паразитный "сквозной бит" выде- лен жирным шрифтом Ошибки, подобные этой, страшны тем, что могут проявляться только при определенном стечении обстоятельств, иногда очень ред- 91
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip ко. Например, у автомобиля, оснащенного сигнализацией, после трех пинков по колесу иногда будут самопроизвольно открываться замки дверей ©. Также следует учитывать инерционность внешних цепей при изме- нении сигнала на линиях порта Например, одна из линий порта бы- ла настроена на вывод, и на ней присутствовал уровень логического ноля Затем эту линию перенастроили на ввод, и, в соответствии со схемой устройства, извне на линию поступает сигнал высокого уров- ня от резистора, подключенного к питающей шине. Из-за паразитной емкости монтажа и собственных емкостей других компонентов высо- кий уровень на линии будет выставлен с некоторой задержкой, и при чтении может быть получено непредсказуемое значение. Выходные драйверы порта также обладают некоторой инерционностью. Поэто- му нежелательно, чтобы команда чтения порта шла сразу за коман- дой перенастройки порта с вывода на ввод. Рекомендуется пропус- тить несколько командных циклов для установления уровней. Можно использовать команду NOP. МОДУЛЬ TIMERO И РЕГИСТР TMRO Модуль TimerO имеет следующие характеристики: • 8-разрядный, доступный для чтения и записи регистр TMRO. • 8-разрядный программно настраиваемый предделитель. • Выбор источника тактирования. • Выбор активного фронта при внешнем тактировании. На рис. 1-19 показана структурная схема модуля TimerO. Режим таймера включается обнулением бита TOCS регистра OPTION. Когда включен режим таймера, регистр TMRO инкременти- руется с каждым машинным циклом (без предделителя). Если в ре- гистр TMRO записано новое значение, то следующие два машинных цикла инкремент запрещен При проведении точных измерений вре- менных интервалов пользователь должен учитывать этот факт и со- ответственно корректировать записываемое начальное значение. Режим работы от внешнего тактового сигнала, называемый также режимом счетчика, выбирается установкой в "1" бита TOCS. В этом режиме инкремент происходит по каждому нарастанию или спаду входного сигнала на входе ТОСКЕ Активный фронт сигнала выби- рают битом T0SE регистра OPTION Предделитель может быть подключен либо к модулю таймера, ли- бо к сторожевому таймеру WDT, но никогда к обоим одновременно Подключение предделителя задается битом PSA регистра OPTION Биты PS2 . PS0 устанавливают коэффициент деления.
PS2, PS1, PSO PSA Рис. 1-19. Структурная схема модуля TimerO Микроконтроллеры Р1С12С5хх
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Внешнее тактирование таймера Когда используется внешнее тактирование таймера, следует по- мнить, что из-за необходимости синхронизации внешнего сигнала с Внутренними тактовыми импульсами Tosc к входному сигналу предъ- являются некоторые особые требования и существует задержка между появлением активного фронта и фактическим инкрементом TMR0. Если TMR0 настроен на работу от внешнего источника тактовой частоты, то линия GP2 работает на ввод независимо от значения бита 2 регистра TRIS. Синхронизация с внешним сигналом Когда предделитель не используется, входной тактовый сигнал поступает прямо на вход синхронизатора. Распознавание перепа- дов входных тактовых импульсов осложняется тем, что состояние на входе синхронизатора опрашивается только дважды за машин- ный цикл, во время тактов Q2 и Q4. Поэтому длительность надеж- но распознаваемого высокого или низкого уровня входного сиг- нала не может быть меньше 2Tosc+20 нс, с учетом небольшой па- разитной задержки в RC цепях, а полный такт соответственно не менее 4Tosc+40 нс. Когда используется предделитель, внешние тактовые импульсы делятся ассиметричным счетчиком и на выходе предделителя по- лучается меандр. Длительность высокого или низкого уровня им- пульса не должна быть меньше 10 нс из-за небольшой инерционности входных цепей. Суммарная длительность такта внешней частоты на входе T0CKI должна быть не менее (4Tosc+40 нс)/К, где К - коэффи- циент деления предделителя. Задержка инкремента Поскольку выход предделителя синхронизируется с внутренней тактовой частотой, существует небольшая задержка между моментом появления активного фронта на входе предделителя и моментом ин- кремента регистра TMR0. Задержка может составлять от 3Tosc до 7Tosc. Таким образом, максимальная погрешность измерения вре- менных интервалов между внешними событиями составляет ± 4Tosc. ПРЕДДЕЛИТЕЛЬ Счетчик 8-разрядный используется, как предделитель для таймера TimerO и постделитель для сторожевого таймера WDT, но для простоты мы будем называть его в этом описании предделителем. Еще раз на- помним, что предделитель не может быть подключен одновременнно к 94
Микроконтроллеры PIC12C5xx сторожевому таймеру и таймеру/счетчику. По сбросу предделитель подключается к WDT и имеет максимальный коэффициент деления. Когда предделитель подключен к TMR0, любая команда записи в этот регистр будет обнулять предделйтель. Когда предделитель под- ключен к сторожевому таймеру, команда CLRWDT будет очищать предделитель вместе со сторожевым таймером. Предделитель недо- ступен для программного чтения или записи. При сбросе преддели- тель сбрасывается в "0". Переключение предделителя Подключение предделителя полностью управляется программно, его можно переключить "на лету", во время исполнения программы. Для предотвращения неожиданного сброса процессора при пере- ключении предделителя с TMR0 на WDT обязательно следует выпол- нять специальную последовательность команд: CLRWDT CLRF TMRO MOVLW 'OOxxl 111'b OPTION CLRWDT MOVLW 'OOxxlxxxЪ; OPTION Для переключения c WDT на TMRO следует выполнить другую по- следовательность команд. Эти команды должны быть выполнены, даже если сторожевой таймер отключен. CLRWDT ; Очистка WDT и предделителя. MOVLW'ххххОххх'Ь ; Выбор TMR0, нового коэффициента OPTION ; предделителя и источника тактиро- вания. ; Очистка WDT. ; Очистка TMRO и предделителя. ; Следующие три линии (курсив) ; вставляются только при необходимости ; задать значения PS2.. .PS0 = ООО или 001. Установка требуемого значения ; предделителя. РАБОТА С EEPROM (ТОЛЬКО ДЛЯ PIC12CE518 И PIC12CE519) Микроконтроллеры PIC12CE518 и PIC12CE519 имеют 16 байт электрически стираемой/программируемой постоянной памяти (EEPROM). Эти ячейки допускают до одного миллиона циклов сти- рания/записи и могут хранить данные без перезаписи и внешнего пи- тания более 40 лет. Физически EEPROM представляет собой отдель- ную технологическую структуру на кристалле, подключаемую к про- цессору при помощи двунаправленной двухпроводной шины. Эта шина состоит из линии последовательной передачи данных (SDA) и 95
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip линии тактирования (SCL). Эти линии увязаны соответственно с би- тами bit6 и bit7 регистра GPIO (SFR 06h). К сожалению, только линии GP0-GP5 разведены на внешние вы- воды микросхемы, поэтому линии SDA и SCL подключены ис- ключительно к внутренней периферийной EEPROM. Для работы со встроенной EEPROM существуют специальные подпрограммы, до- ступные на сервере www microchip.com. Этих подпрограмм достаточно для абсолютного большинства приложений. Мы не будем приводить здесь полный текст подпрограмм, а лишь перечислим их: 1. Подпрограмма записи байта Имя: Byte_Write Входные значения (имена переменных): адрес для записи - EEADDR; байт для записи - EEDATA; Выходное значение: Если запись прошла успешно, 01 в аккумуляторе W, иначе воз- вращает значение 00. 2. Чтение текущего байта по адресу, защелкнутому в собственном указателе EEPROM на данный момент Имя: Read_Current Входные значения: нет. Выходные значения: прочитанный байт - EEDATA; если чтение прошло успешно, 01 в аккумуляторе W, иначе возвра- щается значение 00. 3. Чтение байта по произвольно указанному доступному адресу: Имя: Read_Random Входные значения (имена переменных): адрес для чтения байта - EEADDR. Выходные значения: прочитанный байт - EEDATA; если чтение прошло успешно, 01 в аккумуляторе W, иначе возвра- щается значение 00. Эти подпрограммы будут доступны для вызова, если вы скачаете по указанному адресу и включите в свой исходный файл текст из фай- ла FL51XINC.ASM или подключите для компоновки файл FLASH51X.ASM. Если предлагаемые фирмой Microchip® подпро- граммы по каким-либо причинам вас не устраивают, обратитесь к фирменному описанию протокола работы со внутренней EEPROM в руководстве для микроконтроллеров серии PIC 12С5ХХ - документ № DS40139E, стр. 29-34. Разумеется, вы можете подключить к контрол- леру и внешнюю FLASH-память, но для этого придется использовать 96
Микроконтроллеры Р1С12С5хх две линии порта ввода/вывода, а их доступно максимум шесть. Если вы используете внешнюю память, то используйте подпрограммы, на- писанные в соответствии с требованиями производителя микросхем памяти. При написании прикладных программ, обращающихся к EEPROM, очень важно проверить возвращаемый в аккумуляторе код, чтобы убе- диться, что операция чтения или записи прошла успешно Будьте готовы при необходимости повторить операцию несколько раз в случае неудачи и предусмотрите аварийный выход (особый режим или сообщение) в случае, если при заданном числе попыток запись или чтение не удались Помните, что следующую попытку записи следует предпринимать не ранее, чем через 4 миллисекунды после неудачного завершения СЛОВО КОНФИГУРАЦИИ CPU Слово конфигурации расположено по адресу FFFh. Этот адрес на- ходится за пределами пользовательской памяти программ и доступен только для программатора во время программирования или считывания. Слово конфигурации содержит 12 бит, из которых ис- пользуются только первые пять. bit5-bitll Не используются bit 4 MCLRE - бит включения входа сброса MCLR 1 = вывод 4 используется, как вход MCLR О = MCLR внутренне подключен к выводу питания Vdd bit 3 СР - бит защиты кода 1 = защита отключена О = защита включена bit 2 WDTE - бит включения сторожевого таймера 1 = сторожевой таймер включен О = сторожевой таймер выключен bit 1-0 FOSC1-FOSCO - бит выбора режима тактового генера- тора 11 = EXTRC - внешний RC-генератор 10 = INTRC - внутренний RC-резонатор 4МГц 01 = XT резонатор 00 = LP резонатор Обозначения резонаторов в данном случае следующие: XT - стан- дартный кварцевый или керамический резонатор 4МГц, LP - низ- 97
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip кочастотный (обычно часовой, 32768Гц) резонатор для экономичных приложений. В однократно программируемых кристаллах тип генератора уста- навливается на фабрике. ЗАЩИТА КОДА ПРОГРАММЫ Если бит защиты кода не установлен, программа может быть считана из программной памяти микроконтроллера для верифика- ции. Если бит защиты установлен, то у микроконтроллеров семейства PIC12C5XX могут быть считаны только первые 64 ячейки. Последний адрес программной памяти не может быть считан в заблокированных PIC12C508/509, но может быть прочитан у остальных кристаллов се- мейства PIC12C5XX. ИДЕНТИФИКАТОРЫ Четыре специальные ячейки памяти предназначаются для хранения идентификационного номера или контрольной суммы. Эти ячейки доступны для чтения и записи только при помощи программатора. Используйте только 4 младших бита каждой ячейки, остальные 8 бит каждой ячейки следует программировать значением "О". ИСТОЧНИКИ ТАКТОВОЙ ЧАСТОТЫ Микроконтроллеры PIC12C5XX можно тактировать от генерато- ра на кварцевом резонаторе, независимого внешнего генератора, внешнего генератора на RC-цепочке и внутреннего RC-генератора. Генератор, построенный на основе кварцевого или керамического резонатора, требует некоторого времени на установление колебаний. Во время установления режима генератора процессор не должен ра- ботать. Для этой цели имеется встроенный таймер запуска (DRT), который после появления уровня логической единицы на выводе MCLR и истечения задержки таймера включения питания в течение 1024 тактов внешнего генератора удерживает процессор в состоянии сброса. Этой задержки достаточно для стабилизации тактового гене- ратора. Задержка запуска не генерируется для режима RC-цепочки. Для нормальной работы генератора требуется кварц, работающий на частоте параллельного резонанса. 98
Микроконтроллеры PIC12C5xx 1 Номиналы конденсаторов С1 и С2 см в таблице 2 Последовательный резистор RS может понадобиться при использовании кристалла со срезом типа ДТ 3 Внутреннее сопротивление RF приблизительно равно ЮМ Ом Рис. 1-20. Схема подключения кварцевого резонатора Схема подключения показана на рис. 1 -20. Резистор Rs может пона- добиться в режиме XT при использованиии кристалла со срезом типа АТ. Конденсаторы С1 и С2 увеличивают стабильность работы кварце- вого генератора, но при этом несколько увеличивают время его запус- ка. Для керамических резонаторов применение этих конденсаторов обязательно, а кварцевые резонаторы в большинстве своем надежно работают и без них, особенно при комнатной температуре и стандарт- ном питающем напряжении. Но если предполагается эксплуатировать устройство при отрицательных температурах или пониженном напря- жении питания, конденсаторы С1 и С2 обязательно следует установить. Значения емкостей С1 и С2 для керамических резонаторов Режим Частота С1,С2 XT 455 кГц 2.0 МГц 4.0 МГц 68- 100 пФ 15-33 пФ 10-22 пФ Значения емкостей С1 и С2 для кварцевых резонаторов Режим Частота Cl, С2 LP 32 кГц 15 пФ XT 200 КГц 1.0 МГц 4.0 МГц 47 - 68 пФ 15-30 пФ 15-30 пФ 99
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip При напряжении питания больше 4,5 V изготовитель рекомендует применять конденсаторы со значениями Cl = С2 = 30 пФ Значения емкостей приведены приблизительно Они могут быть изменены в соответствии с рекомендациями производителей кварцевых или кера- мических резонаторов При использовании независимого внешнего генератора, его схема может быть любой Выход генератора подключается к выводу >SC 1, как показано на рис 1-21, вывод OSC2 обязательно должен остаться свобод- ным, в противном случае контроллер может выйти из строя Контроллер в этом случае настраивается в режим XT или LP Примеры схем про- стейших тактовых генераторов приведены на рис 1-22 и рис 1-23 Рис. 1-21. Схема подключения внешнего генератора Рис. 1-22. Схема внешнего генератора, работающего на частоте параллельного резонанса кварца 100
Микроконтроллеры PIC12C5xx Рис. 1-23. Схема внешнего генератора, работающего на частоте последовательного резонанса кварца Если приложение некритично к величине и стабильности тактовой частоты, можно применить недорогой RC-генератор. Резистор и кон- денсатор являются внешними элементами и подключаются, как пока- зано на рис 1-24. Рис. 1-24. Схема внешнего RC-генератора. Рекомендуемый номинал резистора Rext лежит в пределах от 3 кОм до 100 кОм. При использовании резистора менее 2,2 кОм генерация может быть нестабильной или вообще не возникнет При слишком большом номинале, порядка 1 МОм и выше, на работу генератора 101
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip начинают влиять внешние наводки и шумы схемы, а также монтажная емкость и влажность платы. Несмотря на то, что генератор может работать вообще без внеш- него конденсатора, рекомендуется применять конденсатор Cext с ем- костью порядка 20 пФ для увеличения стабильности и помехоус- тойчивости генератора. Частота тактового генератора зависит от пи- тающего напряжения, номиналов резистора и конденсатора и варьи- руется от кристалла к кристаллу. ВСТРОЕННЫЙ RC-ГЕНЕРАТОР 4 МГЦ Встроенный RC-генератор обходится вообще без внешних элемен- тов и позволяет дополнительно снизить стоимость готового устрой- ства. Он генерирует тактовые импульсы с частотой 4МГц при напря- жении питания Vdd=5B и температуре кристалла 25°С. Как уже было ранее упомянуто, в самом конце программной памяти располагается инструкция считывания калибровочной константы для внутреннего генератора. Эта ячейка никогда не защищается от считывания, неза- висимо от того, установлен ли бит защиты программного кода. После сброса микроконтроллера программный счетчик устанав- ливается на последнюю ячейку памяти программ на последней стра- нице и считывает находящуюся там команду MOVLW хх, где хх - ка- либровочная константа встроенного RC генератора. После выполне- ния команды программный счетчик переходит на адрес OOOOh, а значение калибровочной константы оказывается в аккумуляторе W. Пользователь может переписать калибровочную константу в регистр OSCCAL или проигнорировать ее. Следует помнить, что при УФ-стирании кристалла также стира- ются предварительно установленные внутренние калибровочные кон- станты для коррекции частоты встроенного тактового генератора Значения калибровочных констант должны быть сохранены перед сти- ранием. Впоследствии вы можете восстановить значение В микроконтроллерах PIC12C508A, PIC12C509A, PIC12CE518, PIC 12СЕ519 и PIC 12CR509A для калибровки используются биты 7... 2 специального регистра OSCCAL, которые именуются, соответствен- но, как CAL5...CAL0. Изменение значений CAL5-CAL0 в переделах от 000000 до 111111 приводит к пропорциональному увеличению так- товой частоты. Имейте в виду, что биты 0 и 1 регистра OSCCAL не используются, и при модификации регистра OSCCAL в них следует записывать нули для обеспечения совместимости с более современ- ными кристаллами. 102
Микроконтроллеры PIC12C5xx В микроконтроллерах PIC12C508 и PIC12C509 используются четыре старших бита регистра OSCCAL. Запись большего значения в этот полубайт приводит к увеличению тактовой частоты. ОРГАНИЗАЦИЯ СБРОСА Микроконтроллеры PIC12C5XXX поддерживают несколько вари- антов сброса: • сброс по включению питания; • по вводу MCLR во время нормальной работы; • сброс по входу MCLR в режиме SLEEP; • сброс по переполнению сторожевого таймера в нормальном ре- жиме; • сброс по переполнению сторожевого таймера в режиме SLEEP; • выход из режима SLEEP по изменению уровня на выводе. Некоторые регистры контроллера не сбрасываются произвольным способом; они имеют неопределенное значение при сбросе по пита- нию и не изменяются при других вариантах сброса. Большинство ос- тальных регистров устанавливаются в фиксированное состояние при включении питания, сбросу по MCLR, переполнению WDT или вы- ходу из SLEEP по изменению входного уровня в режиме обычной ра- боты. Эти регистры не изменяются, когда происходит переполнение WDT или сброс по MCLR в режиме SLEEP, поскольку такие вариан- ты сброса рассматриваются, как продолжение нормальной работы. Исключение составляют биты ТО, PD и GPWUF. Они устанавлива- ются и сбрасываются по-разному в зависимости от ситуации. В таб- лице показаны состояния регистров при разных вариантах сброса. Register Address Power-on Reset MCLR Reset WDT time-out Wake-up on Pin Change W (PIC12C508/509) — qqqq xxxx 0) qqqq uuuu 0) W(PIC12C508A/509A/ PIC 12СЕ518/519/ PIC12CE509A) — qqqq qqxx 0) qqqq qquu (l) INDF OOh xxxx xxxx uuuu uuuu TMRO Olh xxxx xxxx uuuu uuuu PC 02h 1111 1111 1111 1111 STATUS 03h 0001 Ixxx qOOq quuu (2 3> 103
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Register Address Power-on Reset MCLR Reset WDT time-out Wake-up on Pin Change FSR (Р1С12С508/ Р1С12С508А/ PIC12CE518) 04h 1 1 1 X xxxx 111 u uuuu FSR (Р1С12С509/ Р1С12С509А/ Р1С12СЕ519/ PIC12CR509A) 04h 11 Ox xxxx 1 luu uuuu OSCCAL (PIC12C508/509) 05h 0111 ---- uuuu OSCCAL (Р1С12С508А/509А/ PIC 12CE518/512/ PIC12CR509A) 05h 1000 00-- uuuu uu - - GPIO (PIC12C508/PIC12C5 09/Р1С12С508А/ Р1С12С509А/ PIC12CR509A) 06h - - XX xxxx - -uu uuuu GPIO (Р1С12СЕ518/ PIC12CE519) 06h 1 1 XX xxxx 11 uu uuuu OPTION — 1111 1111 1111 1111 TRIS — --11 1111 --11 nil Обозначения: и = не изменяется, х = произвольное, - = недоступно, читается как "О", q = значение зависит от условий. Примечание 1. Биты 7...2 регистра W содержат калибровочную константу после выполнения команды MOVLW хх в старшей ячейке памяти. Примечание 2.: См. таблицу в разделе "Определение источника сброса". Примечание 3. Если сброс вызван изменением уровня на выводе, то| бит 7 = 1. Во всех других случаях бит 7 = 0. СБРОС ПО ПИТАНИЮ Семейство микроконтроллеров PIC12C5XXX снабжено встроен-^ ной системой сброса, позволяющей сформировать внутренний сигнал- сброса в большинстве случаев включения питания. Схема сброса по 104
Микроконтроллеры PIC12C5xx питанию удерживает кристалл в состоянии сброса до тех пор, пока питающее напряжение не достигнет величины, достаточной для нор- мальной работы. Если вывод GP3/MCLR/Vрр используется, как линия порта, то внутренняя линия MCLR подключается к плюсовому пита- ющему проводу через встроенный подтягивающий резистор. Это поз- воляет в большинстве случаев организовать сброс по включению пи- тания вообще без навесных элементов. Время нарастания питающего напряжения не должно превышать 0,05 В/с. К моменту, когда устройство переходит в режим нормальной ра- боты, все основные внешние параметры (напряжение питания, такто- вая частота, температура и т.п.) должны гарантированно иметь уста- новившиеся нормальные значения. В противном случае устройство должно удерживаться в состоянии сброса до момента, пока внешние параметры не установятся. При включении питания требуется неко- торое время, чтобы установился стабильный режим работы тактового генератора, во время установления режима процессор контроллера должен быть в состоянии сброса. Встроенный в кристалл таймер сброса DRT тесно связан со схемой сброса по питанию. Таймер сброса устройства работает от встроен- ного RC-генератора. При включении питания устройство переходит в состояние сброса и DRT также сбрасывается. Когда напряжение на внутренней линии MCLR достигает высокого уровня, таймер сброса отсчитывает типовой интервал 18 миллисекунд и снимает сигнал сброса процессора. Этого защитного интервала достаточно для уста- новления режима тактового генератора. На величину задержки может незначительно влиять питающее напряжение и температура. DRT также переключается при сбросе по переполнению сторожевого тай- мера. Этот факт особенно важен для приложений, использующих пе- реполнение сторожевого таймера для автоматического выхода из ре- жима SLEEP. Если есть риск того, что питающее напряжение будет нарастать слишком медленно, необходимо установить на внешний вывод MCLR дополнительную времязадающую цепочку из резистора и конденса- тора, чтобы обеспечить надежный сброс по включению питания. Если возможна ситуация когда питающее напряжение плавно снижается ниже рабочего уровня, но не достигает ноля, а затем восстанавлива- ется, для надежного формирования уровня сброса необходимо при- менить другую схему. Во всех названных случаях подойдут схемы сброса, приведенные ранее для микроконтроллеров PIC16FXX. 105
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip СТОРОЖЕВОЙ ТАЙМЕР Главным назначением сторожевого таймера является борьба с аппаратными сбоями устройства, в результате которых может воз- никнуть "зависание" программы. Если сторожевой таймер включен, то нормально работающая программа должна периодически обну- лять счетчик сторожевого таймера, не допуская сброса процессора. Когда происходит сбой, сторожевой таймер перестает программно обнуляться, после его переполнения происходит сброс процессора и повторная инициализация устройства. Для достижения максималь- ной защищенности от сбоев рекомендуется выполнять следующие условия: - выбирать возможно меньший интервал сторожевого таймера и сбрасывать его в разных местах программы; - внешняя аппаратная часть устройства должна полностью иници- ализироваться при любом сбросе микроконтроллера, а не только при включении питания или нажатии кнопки "RESET". Сторожевой таймер работает от полностью автономного внутрен- него RC-генератора. Это позволяет сторожевому таймеру продол- жать работать в режиме SLEEP, когда внутренний тактовый генера- тор процессора остановлен, и выводить контроллер в нормальный режим. Когда происходит переполнение счетчика сторожевого тайме- ра, он генерирует либо сигнал сброса, либо сигнал сброса для выхода из режима SLEEP. Когда срабатывает сторожевой таймер, обнуляется бит ТО регистра STATUS. Сторожевой таймер может быть полно- стью отключен установкой в "О" бита WDTE слова состояния только при помощи программатора. Когда срабатывает сторожевой таймер, он не переводит вывод MCLR в низкий уровень. Сброс осуществляется только по внутренним цепям микроконтроллера. Номинальный период срабатывания сторожевого таймера состав- ляет 18 мс. Применяя предделитель с коэффициентом деления до 1:128 можно реализовать интервал величиной до 2,3 с. Это интервал не- значительно изменяется от кристалла к кристаллу, зависит от темпе- ратуры и напряжения питания. В исключительных ситуациях, когда присутствует минимально возможное питающее напряжение и высокая температура, период сра- батывания сторожевого таймера с предделитечем может достигать нескольких секунд 106
Микроконтроллеры PIC12C5xx Команда CLRWDT очищает сторожевой таймер и предделитель, если он подключен к WDT и предотвращает сброс устройства. Команда SLEEP также очищает сторожевой таймер и предделитель, если он подключен к WDT, что позволяет достичь максимального пребывания в режиме SLEEP до момента пробуждения по сбросу от WDT ОПРЕДЕЛЕНИЕ ИСТОЧНИКА СБРОСА Тестируя биты ТО, PD и GPWUF регистра STATUS можно опре- делить, каким событием был вызван сброс: GPWUF то PD Причина, вызвавшая сброс 0 0 0 Переполнение WDT в режиме SLEEP 0 0 и Переполнение WDT в обычном режиме 0 1 0 Сброс по MCLR в режиме SLEEP 0 1 1 Включение питания 0 U и Сброс по MCLR в обычном режиме 1 1 0 Выход из SLEEP по изменению уровня на выводе Примечание: и - значение не изменилось; биты ТО, PD и GPWUF сохраняют свое состояние, пока не произойдет сброс (низкий уровень на входе MCLR не изменяет значения этих битов). ЭНЕРГОСБЕРЕГАЮЩИЙ РЕЖИМ SLEEP Микроконтроллер переводится в режим SLEEP при выполнении специальной команды SLEEP. Если сторожевой таймер включен, то он обнуляется и начинает отсчет задержки заново. В регистре STATUS сбрасывается бит PD и устанавливается бит ТО. Внутренний тактовый генератор отключается. Выводы портов сохраняют состоя- ние, которое было непосредственно перед исполнением команды SLEEP. Чтобы потребляемый в этом режиме ток был минимальным, мож- но соединить вывод T0CKI с Vdd или Vss. Другие выводы, имеющие в режиме SLEEP высокоимпедансное состояние (входы), через резисто- ры порядка 10 кОм можно соединить с плюсовой шиной питания. На выводе MCLR должен быть высокий уровень, если вывод настроен, как вход внешнего сигнала сброса.
Часть 1. Обзор микроконтроллеров PIC фирмы Microchip Выход из режима SLEEP Устройство выходит из режима SLEEP по одной из следующих причин: • Внешний сброс по входу MCLR, если он соответственно сконфи- гурирован. • Переполнение WDT, если он включен. • Изменение уровня на одном из входов GPO, GP1 или GP3/MCLR, если режим пробуждения при изменении уровня включен. Все перечисленные события вызывают сброс устройства. Причина сброса определяется, как было описано выше. Сторожевой таймер всегда обнуляется при выходе из SLEEP. Перед вхождением в режим SLEEP следует прочитать состояние входов. Выход из SLEEP по изменению уровня происходит, когда уро- вень на одном из входов изменяется по отношению к результатам по- следнего считывания. Если произошло пробуждение из режима SLEEP по изменению входного уровня, но перед повторным входом в SLEEP порты не были прочитаны, то сохранится активное состояние внут- ренней защелки-индикатора и контроллер выйдет из режима SLEEP сразу после вхождения в этот режим. СИСТЕМА КОМАНД (ТОЛЬКО ОТЛИЧИЯ ОТ PIC16F8X) В отличие от микропроцессоров семейства PIC16FXX, поддержи- вающих 35 команд, семейство PIC12C5XX поддерживает 33 команды, и их состав несколько иной. Чтобы напрасно не повторять описания одинаковых команд, мы рассмотрим только отличия набора команд для PIC 12С5ХХ от набора команд для PIC 16FXX. Следует помнить о том, что у микроконтроллеров PIC16XXXX 14- разрядные команды, а у PIC12XXXX 12-разрядные. Но при програм- мировании на ассемблере, когда применяются мнемоники, это не име- ет никакого значения. Ассемблер все сделает за вас, если вы правиль- но укажете тип процессора в исходном тексте. Для программиста- пользователя разница состоит лишь в величине максимальных дости- жимых адресов памяти и в количестве регистров общего применения (ОЗУ). Не поддерживаются команды, применяемые в PIC16FXX: ADDLW - сложить литерал и аккумулятор, результат поместить в аккумулятор. RETFIE - возврат из прерывания. 108
Микроконтроллеры PIC12C5xx RETURN - возврат команда RETLW - возв] ным в аккумулятор. SUBLW - вычесть зна результат в аккумулятор. Следующие две коман стью поддерживаются се OPTION из подпрограммы. Поддерживается только эат из подпрограммы с литералом, записан- чение аккумулятора из литерала и поместить |ды в отличие от семейства PIC16FXX полно- мейством PIC12C5XX. Load Option Register Синтакс Операнды Действие Влияет на флаги: [label] OPTION Нет (W) -> OPTION register Нет Описание Содержимое регистра W за- гружается в регистр OPTION. Пример OPTION TRIS Load TRIS Register Синтакс Операнды Действие Влияет на флаги: [label] TRIS f 5<f<7 (W) -> TRIS register f Нет Описание Содержимое аккумулятора за- гружается в регистр TRIS f (f=6) Пример Примечание TRIS GPIO f=6 только для PIC 12C5XX Как уже было сказано в описании PIC16FXX, сейчас ассемблер MPASM допускает применение команд OPTION и TRIS для PIC16FXX с выдачей предупреждающего сообщения, но эти команды считаются устаревшими и их применение в исходных текстах про- грамм для PIC16FXX крайне нежелательно. Вполне вероятно, что в дальнейшем эти команды в семействах выше PIC12XXXX поддержи- ваться не будут.
Часть 2 РУКОВОДСТВО ДЛЯ НАЧИНАЮЩИХ. ПЕРВЫЕ ШАГИ Все, кто начинает работу с микроконтроллерами PIC, имеют раз- ную квалификацию, опыт и технические возможности, поэтому не- возможно дать универсальное и всеобъемлющее руководство, одина- ково полезное любому разработчику. Мы постараемся дать в этой книге ответы на наиболее частые вопросы и указать источники более полной информации для дальнейшего использования. Развитие и приобретение опыта в работе с микроконтроллерами неизбежно по- требует самостоятельного поиска и сортировки информации в соот- ветствии с индивидуальными задачами. В данном случае главным носителем информации является Интернет. В конце книги приведена подборка ссылок по тематике, связанной с PIC. В целом, для пользователя, начинающего работу "с нуля", можно выделить такие этапы подготовки: 1. Приобретение собственно микроконтроллера. 2. Приобретение или изготовление программатора. 3. Приобретение и освоение среды разработки/отладки программ. 4. Изучение приемов программирования. 5. Изготовление простейшей схемы. Для изучения и большинства радиолюбительских и мелкосерийных применений идеально подходят микроконтроллеры с флэш-памятью про- грамм семейства PIC16F83/84. Приобретите себе микроконтроллер PIC16F84 - у него больше объем памяти программ и его проще купить. Для большинства применений достаточно кристалла с тактовой частотой до 4МГц (PIC 16F84-04) в обычном исполнении. Для критичных по вре- мени приложений может понадобиться кристалл с тактовой частотой до 10МГЦ (PIC16F84-10). Существуют также кристаллы в индустриальном исполнении, с расширенным диапазоном температур и малогабаритном плоском корпусе SOIC. 110
Простой программатор Р16РО ПРОСТОЙ ПРОГРАММАТОР P16PRO СХЕМА И ПЕЧАТНАЯ ПЛАТА Для записи программ в микроконтроллер можно приобрести го- товый программатор или изготовить его самому. Существует множе- ство различных схем программаторов, однако одним из самых попу- лярных во всем мире является программатор, который разработан Bojan Dobaj из Словении. Им разработаны несколько вариантов про- грамматора, в том числе и для профессионального применения. Мы рассмотрим любительский программатор, простой и очень надежный. Схема программатора и упрощенное программное обеспечение рас- пространяются свободно для некоммерческого применения. Подроб- ную информацию об этом и других программаторах можно получить по адресам в Интернет: www.geocities com/bdobaj/ или www.big foot com/-bojan dobaj/ (подборка адресов). Там же можно загрузить необходимое программное обеспечение, как бесплатное, так и shareware. Бесплатная программа версии "Light", поддерживает работу только с контроллерами PIC16F84/ PIC16C84. Схема программатора показана на рис. 2-1 и 2-2. Номиналы некоторых элементов, как это показано на схеме, могут иметь значительный разброс. Если вы используете материнскую пла- ту с процессором 486 или Pentium, со встроенным на плату портом принтера, установите керамический конденсатор С4 емкостью 330...470 пФ. Возможно, также понадобится установить дополни- тельный резистор R8 номиналом 4,7... 10 кОм. В качестве буфера с открытым коллектором можно применить как инвертирующие эле- менты 74LS05, 74LS06 (КР1533ЛН2), так и неинвертирующий 74LS07. Эта опция устанавливается в программе "P16PRO Light". По умолчанию программа настроена на применение инвертирующего буфера. Микросхемы устаревших серий К155, К133, 74S... не подой- дут, поскольку, во-первых, вызывают сильный нагрев стабилизатора 78L05 потребляемым током и, во-вторых, с компьютерами, имеющи- ми процессор Pentium и встроенный быстродействующий порт прин- тера, программатор на таких микросхемах работает со сбоями. Чертеж печатной платы показан на рис. 2-3. По замыслу разра- ботчика, в плату впаиваются проводники длиной не более 2-х метров, припаянные вторым концом к стандартному 25-контактному разъе- му, подключенному к разъему параллельного порта компьютера Ес- ли к этому разъему подключен принтер, то его приходится постоянно отключать от компьютера, что весьма неудобно. 111
Часть 2. Руководство для начинающих. Первые шаги 112
Рис. 2-1. Схема программатора P16PRO Простой программатор Р16РО
Часть 2. Руководство для начинающих. Первые шаги Автор предлагает поступить следующим образом. Надо немного увеличить размеры платы и установить на нее угловую розетку типа "CERN36F", такую же, как в принтере. Короткими отрезками прово- да МГТФ соединяют его выводы с контактными площадками платы. Разъем "CERN36F" имеет 36 выводов и его нумерация не полно- стью совпадает с нумерацией 25-контактного разъема порта LPT. Нумерация для разъема "CERN36F" на схеме показана в квадратных скобках. При работе с программатором стандартный принтерный кабель отключают от разъема принтера и подключают к программа- тору. Принтер обычно находится в заведомо доступном месте и его разъем имеет удобную конструкцию, позволяющую легко и быстро перекоммутировать кабель. Работать с программатором становится удобнее. Не забывайте - отключать и подключать программатор сле- дует только при выключенном компьютере! Рис. 2-3. Чертеж печатной платы программатора Для питания программатора очень удобно использовать сетевой адаптер от модема, поскольку обычно программатор и модем не ис- пользуются одновременно. Автор использовал как адаптер от модема "Zyxel Omni-288S", так и "US Robotics Courier". Обратите внимание, что у модемов "Zyxel" и "US Robotics" разная толщина центрального штырька разъема питания. Проверьте имеющийся у вас разъем перед установкой на плату. При монтаже платы имейте в виду, что стабили- заторы 78L08 и 78L05 имеют не традиционную цоколевку "вход- земля-выход" а наоборот, "выход-земля-вход". В качестве панельки для микроконтроллера лучше всего приме- нить специальный ZIF-разъем "TEXTOOL" с нулевым усилием уста- 114
Простой программатор Р16РО новки, в котором выводы микросхемы зажимаются поворотом рычажка, но при его отсутствии подойдет обычная 18-контактная панелька. Для облегчения установки/извлечения контроллера из нее можно удалить неиспользуемые контакты. Будьте очень внимательны при установке микроконтроллера в па- нельку программатора' Автомат программирования в микроконтрол- лерах PIC не имеет надежной защиты от входных перегрузок и легко выходит из строя. При установке контроллера в программатор его питание должно быть выключено Автор программатора разрешает вставлять котроллер при включенном питании, но иногда случаются сбои в работе параллельного порта, например, когда из другого окна Windows вы случайно пошлете задание на печать и включится напря- жение программирования Установка контроллера в программатор или извлечение из него при включенном напряжении программирования с ве- роятностью 90% приведет к выходу кристалла из строя Установка микроконтроллера в панельку "наоборот", те. с разворотом на 18(f, тоже может привести к выходу из строя, но реже, поскольку сраба- тывает встроенная защита микромощных стабилизаторов 78L05 и 78L08. После сборки программатора, не подключая его к компьютеру и не устанавливая микроконтроллер в панельку, визуально проверьте правильность монтажа, подайте на программатор питание и измерьте напряжения в контрольных точках (выходы стабилизаторов). При этом должны гореть оба светодиода. Если напряжения соответствуют норме, отключите питание, подключите программатор к порту прин- тера, подайте питание и запустите программу "P16PRO Light". Дол- жен гореть один зеленый светодиод "ready". Как правило, если нет ошибок в монтаже, никакой другой проверки либо отладки про- грамматор не требует и работает без сбоев. Если в процессе записи программа будет выдавать сообщение "Programming Failure" (Программирование прервано), значит, либо неисправен микроконт- роллер, либо надо подобрать номинал конденсатора С4. РАБОТА С ПРОГРАММОЙ "P16PRO LIGHT" Установка программы: 1. Создайте новую папку с любым удобным названием и в любой поддиректории. 2. Если вы загрузили из Интернет zip-архив, распакуйте его в но- вую папку, либо просто скопируйте в нее имеющиеся файлы. 3. При необходимости настройте параметры программы (один раз), как будет описано далее. 116
Часть 2. Руководство для начинающих. Первые шаги 4. Файл DEVICE.INI обязательно должен находится там же, где и P16PROL.EXE. На этом установка программы закончена. Подключите програм- матор к порту принтера. МЕНЮ И ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ Программа "P16PRO Light" управляется при помощи ниспадающих меню, функциональных клавиш с Fl по F12 и некоторыми другими кла- вишами, назначение которых будет описано далее. Ниспадающие меню включаются нажатием комбинации Alt-Z, где Z - соответствующая кла- виша. Например, меню "File" включается клавишами Alt-F. Для переме- щения по диалоговым окнам и управления опциями необходимо исполь- зовать курсорные клавиши, Esc, Tab, Enter и пробел. Описание программы подходит также для полной платной версии "P16PRO". Меню "File" Open program - открывает заданный .hex файл (код программы), со- зданный при помощи MPASM, MPALC, МРС и т.п. в формате INH8M или INH16. Если вы используете MPLAB или MPASM, вам нет необхо- димости заботиться о формате файла - форматы выходного файла ассем- блера и входного файла программатора по умолчанию совпадают. Save Program - сохраняет текущий код программы, слово конфи- гурации, а также данные EEPROM контроллеров PIC16C84/F84 в за- данный .hex файл. Open Data - только для контроллеров PIC16C84/F84. Открывает данные для EEPROM из указанного файла. Save Data - только для контроллеров PIC16C84/F84. Сохраняет данные EEPROM начиная с относительного адреса Oh. Вы можете установить ранее запрограммированный контроллер в программа- тор, считать из него содержимое памяти и сохранить на диске данные EEPROM, после чего перепрограммировать кристалл. Разумеется, это возможно, если не установлен бит защиты. Edit Program - редактирование кода программы. Адрес и код вво- дятся в виде шестнадцатиричных чисел. После того, как значение вве- дено, программа автоматически инкрементирует значение адреса для ввода следующего значения. Редактирование завершается нажатием клавиши Esc или выбором <Cansel> и Enter. С точки зрения программирования эта опция не очень полезна, про- граммировать непосредственно в кодах для микроконтроллеров прак- тически невозможно. Зато таким способом можно разместить в про- граммной памяти, за пределами исполняемого кода, некоторую важную 116
Простой программатор Р16РО информацию в коде ASCII непосредственно при помощи программато- ра. Это может быть фамилия автора, номер версии программы и т.п. Для перемещения кодов программы в окне просмотра используйте кла- виши <Page Up> и <Page Down>. Fill Program - заполняет выбранную часть программной памяти константой, заданной в виде шестнадцатиричного числа. Edit Data - только для контроллеров PIC16C84/F84. Редактирова- ние значений в ячейках EEPROM. Может использоваться для ввода индивидуальных данных для конкретного экземпляра контроллера: пароля, настроечных констант и т.п. Fill Data - только для контроллеров PIC16C84/F84. Заполнение ячеек EEPROM шестнадцатиричной константой. Clear Buffer - очищает память программ (и данные EEPROM для PIC 16C84/F84) до исходного состояния, соответствующего незапро- граммированному контроллеру. About - выводит информацию о версии и авторских правах. Dos Shell - временный переход в режим DOS. Exit - выход из программы. Меню "Settings" Device - выбор типа микроконтроллера. Версия "Light" работает только с кристаллами PIC16C84/F84. Fuse - установка конфигурации микроконтроллера (тип тактового генератора, включен/выключен сторожевой таймер и т.д.). Если эти параметры заданы при написании программы, то они считываются вместе с .hex файлом и нет необходимости задавать их дополнительно. ID - выбор метода задания идентификационного номера кристал- ла. Может использоваться значение контрольной суммы программы для генерации значения ID, значение ID может увеличиваться на еди- ницу при каждом новом программировании (т.е. серийный номер), или любое допустимое значение может быть введено вручную. Hardware - подстройка программы под различные параметры схе- мы. По умолчанию программа работает с программатором, собран- ным на микросхемах 74LS05 или 74LS06 или КР1533ЛН2 и двух р-п-р транзисторах. Если программатор собран в строгом соответствии со схемой и подключен к стандартному порту LPT, то в настройках это- го пункта ничего менять не надо. Other - группа дополнительных настроек: LPT - номер порта принтера (по умолчанию 1). Save On Exit - Если опция включена, программные настройки ав- томатически сохраняются в файле P16PRO.INI при завершении рабо- ты с программой и восстанавливаются при следующем запуске. 117
Часть 2. Руководство для начинающих. Первые шаги Show Program Data - отображение окна с кодом программы (on/off) Show Data for 84 - отображение окна с данными EEPROM (on/off). Hex Type INH8M - формат используемых .hex файлов. Load Prog On Start - если опция включена, при запуске программы автоматически загружается .hex файл, с которым работали в послед- ний раз. Очень удобная опция при отладке программы, сопровожда- ющейся частой перезаписью контроллера. Save - сохранение текущих настроек, включая тип микроконтрол- лера и слово конфигурации в файле P16PRO.INL В этом пункте меню есть еще две опции, к моменту написания книги не описанные автором программы в его руководстве Verify [ON/OFF] - если опция вкпючена, после окончания записи про- граммы происходит автоматическое сравнение кода, записавшегося в кристалл с исходным кодом При несоответствии выдается сообщение об ошибке записи Program ID [ON/OFF] - разрешение/запрет записи номера ID в кри- сталл во время программирования. Функциональные клавиши F1 - чтение кода программы из .hex файла в программный буфер F2 - установка конфигурации микроконтроллера F3 - выбор типа микроконтроллера F4 - запись программы в микроконтроллер F5 - сравнение программы, записанной в микроконтроллер с со- держимым программного буфера F6 - чтение содержимого из микроконтроллера (программа, кон- фигурация, ID, данные EEPROM) F7 - проверка микроконтроллера на чистоту памяти F8 - программирование только слова конфигурации F9 - очистка микроконтроллера (стирание памяти программ и EEPROM) F10-выход из программы Fl 1 - очистка программного буфера и данных EEPROM Fl 2 - повторное чтение последнего .hex файла <Page Up> - сдвиг кодов программы в окне на страницу вверх <Page Down> - сдвиг кодов программы в окне на страницу вниз Пользователь также может редактировать файлы DEVICE.INI, P16PROL.INI и SN.INI. Обладатель полной платной версии может самостоятельно настроить программу под любой новый тип микро- контроллера PIC. Начинающему пользователю можно порекомендо- вать только изменение параметра "ProgDelay=6" в файле 118
Простой программатор Р16РО P16PROL.INI, если при работе с программатором периодически по- является сообщение об ошибке. Файлы надо редактировать при по- мощи неформатирующего редактора, например, стандартного блок- нота для Windows. Подробно этот процесс описан в файле README.TXT, но без крайней необходимости редактировать на- званные файлы не следует. После того, как программатор изготовлен, и простейшая схема спаяна, пора приступать к написанию прикладных программ. В принципе, текст программы можно набрать в любом неформатирую- щем редакторе, например, в стандартном блокноте Windows, а затем откомпилировать при помощи фирменной программы ассемблера MPASM. Но гораздо удобнее воспользоваться интегрированной сре- дой разработки MPLAB-IDE. Есйи вы впервые приступаете к освоению микроконтроллеров PIC и среды разработки, не пытайтесь с первого раза постигнуть все пре- мудрости работы с MPLAB-IDE и создания сложных проектов. Лучшим стимулом для изучения программирования микроконтрол- леров является решение практических задач. Сначала освойте основ- ные навыки работы, разберите примеры простейших программ, по- пробуйте поэкспериментировать с ними. Затем, по мере необходимос- ти, вы будете возвращаться к материалу книги. ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ MPLAB Что же такое MPLAB? Это работающая на базе Windows интегри- рованная среда разработки (Integrated Development Environment - IDE). MPLAB является свободно распространяемой прграммой, и его можно загрузить с сайта www.microchip.com или www.microchip.ru. Эта программа бывает также на некоторых компакт-дисках с коллек- циями программ по радиотехнике. О ВЕРСИЯХ ПРОГРАММЫ Когда автор начинал подготовку этой книги, распространялась версия MPLAB 4.12.00, а когда написание книги близилось к завер- шению, появилась версия MPLAB 5.00.00. Эти версии не имеют ка- ких-либо фундаментальных отличий, и, учитывая, что на дисках и "с рук на руки" продолжает распространяться версия MPLAB 4.12, бы- ло решено дать описание, максимально соответствующее обеим вер- сиям. Скриншоты даны для версии 5.00.00. Незначительные различия интерфейса и порядка установки некоторых опций не должны поме- шать в работе даже начинающему пользователю. В сопроводитель-
Часть 2. Руководство для начинающих. Первые шаги ном релизе к версии 5 00.00 компания Microchip" сообщает об изме- нениях и исправлениях, мы рассмотрим наиболее важные. • Все опции программы, касающиеся выбора типа контроллера и настройки параметров разработки и отладки сведены в одно диало- говое окно Options>De\'elopnient Mode с закладками, расположен- ными в удобном порядке Диалог интерактивный: многие опции ста- новятся доступны или отключаются в зависимости от того, какой контроллер выбран и какой режим задан. • Опции настройки параметров оболочки, ранее распределенные по независимым пунктам меню, теперь объединены в диалоговом ок- не Oplions>Environment Setup.. , где задаются все параметры, начиная от системных цветов и заканчивая путями сохранения файлов. Что очень удобно, можно настроить параметры проекта по умолчанию, включая язык программирования и пути к различным компонентам проекта. • Все управление точками останова, исключая традиционную пра- вую кнопку мыши, сведено в одно диалоговое окно Debug>Break Settings • Доработаны файлы помощи и добавлена развернутая контекстная помощь для многих окон. • Пользователям, которые ранее использовали общие файлы скриптов компоновщика, включающие в себя скрипты для группы контроллеров, надо иметь в виду, что теперь для каждого контролле- ра существует свой скрипт (файл с расширением ,1кг). Например, те- перь вы не можете использовать скрипт 16C76.LKR для процессоров 16С77, 16Е876 или 16F877, как делали это раньше. • В компоновщик MPLINK. внесен ряд специальных изменений для обеспечения поддержки нового семейства PIC18CXXX. • Смотровое окно MPLAB по умолчанию не поддерживает 24- битовый формат Microchip и формат IEEE с плавающей запятой. При создании нового смотрового окна эти форматы следует выбирать в окне параметров, открывающемся при нажатии кнопки "Properties". • При использовании эмулятора PICMASTER дисплей стека те- перь корректно отображает как инструкцию, так и адрес. • Теперь вместе с проектом сохраняются дополнительные опции, например тип резонатора • В окне трассировки теперь можно отображать протокол в виде дизассемблированного кода, исходного кода или обоих одновремен- но. • Теперь, если в процессе отладки вы измените исходный текст, го прежде чем продолжить выполнение (симуляцию) программы, 120
Интегрированная среда разработки MPLAB MPLAB спросит, не следует ли перекомпилировать программу для получения нового кода. • Вы можете настроить собственную панель инструментов при по- мощи отдельного пункта в диалоговом окне Options>Environment Setup. • Теперь MPLAB поддерживает относительную адресацию из окна выполнения программного кода. Ранее при помощи меню Debug>Execute>Execute an Opcode вы могли исполнить только опера- цию абсолютного перехода goto хххх, а теперь можете выполнить от- носительный переход, например, goto +20. • Если в свойствах проекта вы зададите генерацию шар-файла или error-файла, они автоматически будут сохранены под именем, соот- ветствующим имени проекта и с расширениями .шар и .err соответст- венно. Впоследствии эти имена в любой момент можно изменить. • Окно, отображающее состояние регистров, сохраняет данные в промежутках между сессиями. Так, если проект сохранить, когда от- крыто окно регистров и в нем отображаются данные, то при после- дующем открытии этого проекта автоматически откроется это окно с сохраненными данными. • Теперь MPLAB полностью поддерживает компоновку проектов под Windows NT. • Окно листинга и окно шар-файла теперь открываются автома- тически при повторном открытии проекта, если они были открыты в момент, когда проект сохранялся. ОФИЦИАЛЬНО ОБЪЯВЛЕННЫЕ ПРОБЛЕМЫ • Не отображается стек при работе с эмулятором ICEPIC. • Окно останова по условию не отображает корректные ассемб- лерные команды и не всегда работает правильно с контроллерами семейства PIC18CXXX. • Ошибка динамической библиотеки BWCC.DLL. Если вы по- лучаете от MPLAB сообщение о файле BWCC.DLL, то это, как пра- вило, означает, что приложения на вашем компьютере используют более старую версию системного драйвера фирмы Borland. MPLAB также использует этот драйвер. Если версия, более старая, чем ис- пользуемая MPLAB, окажется загруженной в память к моменту запу- ска MPLAB, то появится сообщение об ошибке. Для устранения ошибки найдите в своем компьютере все файлы с именем BWCC.DLL и проверьте их датировку. Файлы, более старые, чем тот, который идет в комплекте с MPLAB, замените на файл из поставки MPLAB. • PICMASTER не работает под Windows NT. 121
Часть 2. Руководство для начинающих. Первые шаги • Новый диалог Options>Development Mode не добавляется на па- нель кнопок. К нему можно получить доступ только через стандарт- ное ниспадающее меню. Развернутое описание MPLAB-IDE и работающего в составе паке- та ассемблера MPASM способно занять объем, превосходящий объем этой книги, поэтому ограничимся сжатым описанием, пригодным для большинства применений. MPLAB включает в себя текстовый редак- тор, программный симулятор и менеджер проектов, поддерживает фирменные внутрисхемные эмуляторы и программаторы. Состав па- кета инструментов MPLAB таков: Менеджер проектов - используется для создания проектов и рабо- ты с группой файлов, входящих в проект. При использовании проекта код программы создается и загружается в симулятор или эмулятор одним щелчком мыши. Редактор - используется для создания и редактирования текстовых файлов, таких как исходные тексты программ, коды и файлы скрип- тов для редактора связей. Симулятор MPLAB-SIM - программный симулятор, моделирую- щий исполнение инструкций программы и работу портов вво- да/вывода микроконтроллера. Эмулятор MPLAB-ICE - использует аппаратное обеспечение для внутрисхемной эмуляции микроконтроллеров в режиме реального времени. Может применяться как фирменный эмулятор производства Microchip®, так и эмуляторы иных производителей, в том числе рос- сийских, совместимые по стандарту. Универсальный ассемблер MPASM / Компоновщик связей MPLINK / Менеджер библиотек MPLIB - ассемблер MPASM позво- ляет ассемблировать программы, созданные в виде ANSI-текстов без запуска MPLAB. При работе с MPLAB ассемблер запускается для ге- нерации кода автоматически и в командной строке ему передаются имя проекта и параметры, возвращаемые сообщения отображаются в окнах MPLAB. Компоновщик связей MPLINK создает финальное приложение путем компоновки перемещаемых программных модулей из MPASM и MPLAB-C17. Менеджер библиотек MPLIB позволяет создавать пользовательские библиотеки и управлять ими для макси- мального повторного использования ранее написанных программ. Компилятор MPLAB-C17 - предоставляет возможность создавать программы на языке высокого уровня в виде комбинации программ- ного текста на языке С и ассемблерных кодов, что позволяет достичь высокой скорости исполнения кода. Работа с привычным для множе- ства программистов мощным языком С значительно облегчает напи- сание сложных приложений. 122
Интегрированная среда разработки MPLAB Поддержка программаторов PRO МАТЕ® и PICSTART® Plus - ес- ли вы приобрели один из этих фирменных программаторов, то може- те записывать готовые коды в любой микроконтроллер фирмы Microchip® непосредственно под управлением MPLAB. Впрочем, про- грамматор PRO MATE II может работать и без использования MPLAB. Внутрисхемные эмуляторы PICMASTER и PICMASTER-CE - эти эмуляторы также эмулируют микроконтроллеры PIC в режиме реаль- ного времени непосредственно в устройстве. Упомянутый выше эму- лятор MPLAB-ICE является наиболее новым вариантом эмулятора. ТРЕБОВАНИЯ К КОМПЬЮТЕРУ, ИНСТАЛЛЯЦИЯ И УДАЛЕНИЕ MPLAB-IDE Требования к компьютеру, на который будет устанавливаться MPLAB, достаточно невысоки: РС-совместимый, 486 или выше (рекомендуется Pentium) MS Windows 3.1 х или Windows 95/98 Дисплей VGA (рекомендуется SuperVGA) 8 МВ ОЗУ (рекомендуется 32 MB) 20 МВ свободного пространства на винчестере Мышь или иной манипулятор. Для установки программы на свой компьютер необходимо запус- тить исполняемый файл MPvvvvv.EXE, где vvvvv - версия програм- мы. После запуска мастера установки выберите компоненты, которые следует установить. Если вы не планируете приобретать фирменные программаторы и эмуляторы, то установите только следующие ком- поненты: - файлы MPLAB IDE, - файлы MPASM / MPLINK / MPLIB, - файлы поддержки симулятора MPLAB-SIM, - фалы помощи. Если впоследствии понадобятся файлы поддержки програм- маторов или эмуляторов, программу просто следует инсталлировать повторно. Для деинсталляции запустите программу UNWISE.EXE или UNWISE32.EXE из директории MPLAB. Сведения обо всех установ- ленных файлах находятся в файле INSTALL.LOG. Программа деин- сталляции использует данные из этого файла для удаления ранее ус- тановленных файлов. ИЗ
Часть 2. Руководство для начинающих. Первые шаги НАЧИНАЕМ РАБОТУ С MPLAB Среда разработки MPLAB представляет собой достаточно мощное приложение, позволяющее удовлетворить почти все запросы подго- товленного разработчика, но дающее возможность эффективно рабо- тать даже при минимальном знакомстве с программой. Поэтому опи- сание функций программы разбито на два логических подраздела Сначала мы освоим базовые навыки. Усвоение этих навыков позво- лит вам немедленно приступить к работе с MPLAB, не тратя время на получение информации, которая вряд ли понадобится в первые дни (и, не будучи сразу востребованной, вскоре забудется). Следующий подраздел, в котором углубленно рассмотрены все функции MPLAB, для начала можно просмотреть бегло, чтобы иметь представление о полных возможностях программы, а затем, по мере приобретения опыта, освоить дополнительные возможности. УСТАНОВКА РЕЖИМА РАЗРАБОТКИ Основное окно программы MPLAB выглядит аналогично боль- шинству приложений Windows, у которых вверху расположена панель меню, а внизу строка состояния. В строке состояния отображается текущая настройка и состояние отладочной системы. Более подробно содержание нижней строки мы рассмотрим позже. Сейчас мы разбе- ремся, как настроить режим разработки приложений. В режиме разработки доступны все инструменты, в том числе для отладки исполняемого кода. Для обучения и отладки большинства несложных приложений достаточно использовать встроенный про- граммный эмулятор MPLAB-SIM. В дальнейшем, если вы приобрете- те один из фирменных эмуляторов, вы можете легко выбрать в меню отладку с его применением. Режим "Editor Only" ("Только редактор") применяется, если вы не стали инсталлировать симулятор и не имеете фирменного эмулятора. В этом случае вы сможете только писать тек- сты и создавать исполняемые коды без отладки. Выберите в меню пункт Options>Development mode, который от- крывает окно настройки этого режима. Выберите опцию "MPLAB- SIM Simulator" в колонке слева и процессор PIC16F84 в ниспадающем меню справа. Затем нажмите кнопку "Reset" на панели инструментов или функциональную клавишу <F6>. Симулятор инициализируется, в нижней строке можно будет видеть надписи "PIC16F84" и "sim", про- грамма сейчас настроена для программной симуляции контроллера PIC16F84. 124
Интегрированная среда разработки MPLAB СОЗДАНИЕ НОВОГО ПРОСТОГО ПРОЕКТА Мы только что настроили программный симулятор, который ра- ботает с hex-файлами, записываемыми непосредственно в контроллер. Но чтобы получить hex-файл, сначала надо написать исходный текст программы и успешно его проассемблировать. Результатом работы ассемблера будет файл с расширением .hex и несколько файлов со служебными сообщениями (сообщения линкера, сообщения об ошиб- ках и т.д.) Затем hex-файл можно будет загружать в программатор не используя ассемблер или проект для MPLAB. В качестве наглядного пособия будем использовать файл tutor84.hex. Описанию ассемблера, его опций и специальных директив посвящена отдельная глава. Ее содержание понадобится вам позже, когда вы научитесь создавать проекты и писать простые программы. Того, что вы прочтете в этой главе, вполне достаточно для начала работы. Выберите в меню File>New и вы получите доступ к диалоговому окну создания нового проекта. Нажмите кнопку "Yes", выберите имя для своего первого проекта и путь для его сохранения. Хорошо его запомните, он понадобится в дальнейшем, но не во всех окнах про- граммы этот путь очевиден по умолчанию - небольшой недочет раз- работчиков. Мы выберем для обучения имя файла tutor84.pjt в папке c:\tutorial, которую создадим заранее. Нажав ОК перейдем к окну настройки опций проекта. Симулятор, программатор и эмулятор могут работать с hex-файлами, которые созданы при помощи ассемблирования, компилирования и/или ком- поновки исходных кодов. Несколько различных программных инст- рументов могут создавать hex-файлы, и каждый такой инструмент может являться частью любого проекта. Надо сказать, что писать и ассемблировать программы можно и без создания проекта, но на- личие проекта позволит в дальнейшем гибко выбирать, какие инст- рументы будут использованы для создания hex-файла, один раз и на- всегда задать командную строку ассемблера и пути для всех использу- емых файлов. Поэтому лучше сразу обучаться работе с проектами. Итак, в секции Project, строка Target Filename вы видите имя фай- ла, префикс которого соответствует имени проекта, но с расширением hex. В нашем случае это tutor84.hex, под таким именем будет сохранен код программы после ассемблирования, в той же папке, что и проект. Следующие три строки пока не трогаем, они понадобятся, когда бу- дем создавать более сложные комплексные проекты. Далее видны опции, установленные ранее (MPLAB-SIM, 16F84) и те- кущий словарь языка программирования (Microchip). Это именно те значения, которые нам нужны, поэтому не следует их изменять. В секции Project Files находится запись tutor84[.hex]. Щелкнув на этой записи, мы 125
Часть 2. Руководство для начинающих. Первые шаги увидим, что стала доступной кнопка Node Properties. Прежде чем созда- вать hex-файлы, мы должны сформулировать опции для ассемблера, ко- торые MPLAB будет передавать в крмандной строке. Нажмем кнопку Node Properties и перейдем к соответствующему окну Окно опций ассемблирования содержит все установки, заданные по умолчанию. Инструментом с базовым языком для написания про- грамм является ассемблер MPASM, кроме него доступны несколько компиляторов MPLAB-Cxx и компоновщик MPLINK. Мы оставляем ассемблер MPASM. Далее расположена таблица, в которой га- лочками можно отмечать различные опции, но менять ничего не нуж- но, поскольку по умолчанию установлены именно те опции, которые нам нужны. В строке ниже таблицы отображается командная строка, которая будет передана ассемблеру. Все параметры таблицы (и, соот- ветственно, командной строки) мы подробно рассмотрим в главе, посвященной ассемблеру. Нажав на кнопку ОК мы возвращаемся в предыдущее окно, при этом становится доступной кнопка Add Node. (В версии 5 00.00 и далее эта кнопка доступна сразу, и это правильно. Ведь мы очень часто используем параметры по умолчанию - прим ав- тора) Нажмите эту кнопку. Появится окно для ввода имени файла, введите туда имя исходного файла tutor84.asm, этот файл будет нахо- диться в той же папке, которую вы указали для проекта tutor84.pjt. Нажав ОК вы вернетесь к предыдущему окну, где будет отображено имя tutor84.asm внизу, после tutor84.hex. Еще раз нажмите ОК, окно закроется в рабочем окне MPLAB будет открыто безымянное окно текстового редактора для ввода исходного кода программы. (К со- жалению, окно безымянное, а не именовано автоматически как tutor84.asm, что следовало бы из всей логики предыдущих и дальнейших действий ) СОЗДАНИЕ НОВОГО ПРОСТОГО ИСХОДНОГО ТЕКСТА Выберите пункт меню File>Save As. . и назвав файл как tutor84.asm, сохраните его под этим именем. Теперь мы имеем чистое окно для ввода текста программы с именем tutor84.asm. В случае с нашим проектом имя файла должно быть идентично имени проекта. Когда создается проект, использующий компоновщик, имена вход- ных файлов могут отличаться от имени выходного файла. MPASM также создает выходной hex-файл с тем же именем, что и исходный asm-файл, поэтому, если вам нужен hex-файл с конкретным именем, назовите этим именем исходный текст или самостоятельно переиме- нуйте впоследствии выходной файл. 126
Интегрированная среда разработки MPLAB ВВОД ИСХОДНОГО ТЕКСТА Щелкните указателем мышки на чистом текстовом поле окна редак- тора и введите приведенный ниже текст. Комментарии, следующие после точки с запятой, вводить не надо Текст надо вводить построчно list р= 16F84 ;задали тип контроллера include <pl6F84.inc> щодключили файл опций cl equ OxOC присвоили переменной cl ячейку с адресом ;0x0C org 0x00 стартовый адрес, равный вектору сброса reset goto start щереход на старт основной программы org 0x04 разовый адрес для начала кода пользователя start movlw 0x09 ;запись в счетчик начального значения, 0x09 movwf cl ^охранение значения в переменной cl loop incfsz cl, f щнкремент значения с сохранением резуль ;тата в cl goto loop щовтор цикла, если результат не равен нулю goto start ;если счетчик cl обнулился, возврат на старт end Это пример простейшей программы, которая циклически инкре- ментирует ранее объявленную переменную cl и по ее обнулению воз- вращается на адрес старта по сбросу, после чего работа программы повторяется. Первые две строки и последняя строка являются дирек- тивами ассемблера. Последняя строка означает конец программного кода. Первая строка указывает ассемблеру, для какого контроллера написан текст, вторая строка указывает на специальный файл pl6F84.inc, в котором заранее, самой фирмой Microchip®, указаны опции ассемблера именно для этого контроллера. В частности, там указаны адреса регистров INTCON, OPTION_REG и других, поэтому при написании программы нет нужды указывать заново их адреса, а можно просто упоминать их имена. Файл находится в каталоге MPLAB. Вы можете открыть его при помощи стандартного блокнота Windows и просмотреть текст, но, не имея достаточной подготовки, не следует его изменять. Подробно все опции и команды ассемблера мы рассмотрим в соответствующей главе. Закончив ввод текста и проверив его правильность, сохраните файл. В дальнейшем, для упрощения написания программ, можно вос- пользоваться готовым файлом-заготовкой, расположенным по адре- су. C:\Program Files\MPLAB\TEMPLATE\Code\f84temp.asm. Этот тек- стовый файл уже содержит заголовок с местом для имени авторов, необходимые директивы и опции, стартовый фрагмент программы и даже фрагмент кода подпрограммы для сохранения и последующего 127
Часть 2. Руководство для начинающих. Первые шаги восстановления значений аккумулятора W и регистра STATUS (как вы помните, у контроллера PIC16F84 нет команд PUSH и POP). Вам остается только открыть этот файл в редакторе MPLAB, затем сохра- нить копию под нужным именем и ввести код своей программы. Не забудьте проверить и установить такие опции слова состояния кон- троллера, как тип тактового генератора, включение сторожевого таймера и т.д.! По умолчанию сторожевой таймер включен, и, если его использование у вас не предусмотрено, он будет каждые несколь- ко миллисекунд сбрасывать контроллер. Несоответствие слова состо- яния реальным потребностям вследствие рассеянности - очень рас- пространенная ошибка. Рассматривая все последующие примеры, мы будем подразумевать, что вы используете файл-заготовку f84temp asm и не станем приво- дить никакой иной текст, кроме текста программы. ПОДРОБНЕЕ О РЕДАКТОРЕ MPLAB EDITOR Как вы только что убедились, вводить исходный текст программы легко даже начинающему программисту. Тем не менее, не следует лег- комысленно относиться к изучению приемов работы с текстовым ре- дактором MPLAB Editor, в окне которого мы только что набирали текст. Когда текст программы разрастается, все больше рабочего времени уходит на его ввод и редактирование; подчас даже отладка занимает гораздо меньше времени, чем ввод текста. Для удобства на- писания программы большое значение имеет и то, как текст програм- мы отображается на экране: нумерация линий, отступы, размер и цвет шрифта. Причем разные программисты имеют разные пристрастия. Редактор MPLAB Editor, являющийся интегральной частью среды разработки MPLAB-IDE, обладает многими дополнительными функ- циональными удобствами, освоение которых облегчает дальнейшую работу. Максимальная длина текста программы и количество одно- временно открытых окон зависят только от объема памяти вашего компьютера. При настройке редактора вы можете установить опции по умолчанию, которые будут действительны для каждого открываемого окна редактора, и текущие опции, которые действительны только для данного окна и только во время данной сессии. Текущие опции нуж- ны, если, например, только в конкретном окне надо включить или отключить нумерацию строк, задать нестадартный отступ по клавише "Tab" и т.д. Опиии по умолчанию устанавливаются в диалоговом окне Options>Environment Setup>Default Editor Modes. 128
Интегрированная среда разработки MPLAB File Type - если вы хотите, чтобы установки по умолчанию приме- нялись только к какому-то определенному типу файлов, выделите эту опцию и введите нужный тип файла, обязательно с предшествующей точкой, например ".1кг"или выберите введенный ранее тип из списка. Environment Setup General Project *| File* *] Default Editor Mode* Key Mapping* Color* 'j z File Type | -~j| ,♦ Other Type* New He* Uclele Tpp? | ' Э Screen Formatting ------------ - - ----------------- X®b Size: |8 | _J Wrap Line* at Column! |7~' | й i Soft Tab* Di*play/lnput Mode* ------------------- - ----------------- Auto Indent I Show line number* Strip trailing (pace* J Overwrite Language | (none) xll 0, Printing - -- - - --------------------------------------------- .J Page Header* M j Wrap Long Line* Fie Mode* — ------------- - J Read Only J Strip Ctrl+i on load И, Backup when saving J Add Ctrl+Z on save I No EOLN after la*t fine | OK | Cancel | Apply | Help | Рис. 2-4. Установка опций редактора по умолчанию Other Туре - опция установлена по умолчанию, действует для ти- пов файлов, не указанных в ниспадающем списке. New files - установки по умолчанию применяются к новым фай- лам, создаваемым командой File>New. ---------Screen Formatting-----------— Tab Size - определяет величину отступа при нажатии клавиши "Tab". Soft Tabs - если опция выбрана, вместо символа табуляции встав- ляется соответствующее количество пробелов. 5' Зак. № 4879 Яценко® 129
Часть 2. Руководство для начинающих. Первые шаги Wrap Lines at Column - если опция выделена галочкой, то длинные строки разрываются и переносятся при достижении позиции, указан- ной в поле рядом. Если опция не выделена, строки могут быть произ- вольной длины. .........Display/Input Modes..........— Auto Indent автоматический сдвиг (отступ) новой строки на тот же уровень, что и у предыдущей. Удобно при написании текстов со зрительным структурированием, например, вложенных подпрограмм. Strip trailing spaces - удаление пустых пробелов в конце строки каждый раз, когда нажимается "Enter". Show line numbers - отображение номеров строк. Overwrite - замена символа в позиции курсора, по умолчанию ре- дактор работает в режиме вставки нового символа. Language - выбирается режим специального форматирования, адаптированный, например, для языков Си или Паскаль. .........Printing...-—....... Эти опции устанавливают некоторые особенности вывода текста программы на печать по умолчанию, но могут быть изменены непо- средственно перед печатью. Page Headers - на каждой странице выводится заголовок с именем файла, номером страницы и текущей датой. Wrap Long Lines - разрыв строк, превышающих ширину страницы и продолжение их с новой строки в процессе печати. ........File Modes............. Read Only - файлы открываются в режиме "только для чтения". Backup when saving - при сохранении нового варианта делается ре- зервная копия предыдущего варианта подтем же именем. Strip Ctrl+Z on load - автоматически удаляет символы Ctrl+Z в конце файла при чтении файла с диска. Add Ctrl+Z on save - автоматически добавляет символы Ctrl+Z в конец файла при записи файла на диск. No EOLN after last line - не записывать символ конца строки CR+LF или LF после последнего символа последней строки текста. Вы можете ввести набор свойств по умолчанию для одного типа файлов, сохранить набор кнопкой "Apply", ввести набор свойств для следующего типа файлов и вновь сохранить, создав, таким образом, наборы свойств по умолчанию для каждого редактируемого типа файлов. Текущие опции устанавливаются при помощи диалогового окна Options>Current Editor Modes. Назначение всех приведенных в этом 130
Интегрированная среда разработки MPLAB окне параметров соответствует одноименным параметрам из окна установок по умолчанию. Но текущие опции действительны только для конкретного окна и только в конкретной сессии. Впрочем, теку- щие опции можно превратить в опции по умолчанию, командой Options>Window Setup>Save Setup... Если на появившийся вопрос "Сохранять ли текущие установки как установки по умолчанию?" вы ответите "Нет", то сможете сохранить их под произвольным именем с расширением .cfg и впоследствии прочитать командой Options> Window Setup>Load Setup... Current Editor Modes Untitled! Current Window: Display/Input Modes: I । Auto Indenting i _ Strip Trailing Spaces ‘ _ Show Line Numbers I Overwrite h — h r ‘ Language Jj none] Screen Formatting: lab Size 8 I Soft Tab: _J Wrap Enabled Wrap Column ?? Printing: _j Page Headers _J Wrap Long Lines Current File: Read Only I Add Ctrl+Z on save ✓ Backup when saving _J No EOLN after last line OK Cancel | Help [ Рис. 2-5. Установка опций редактора для текущего окна Некоторые параметры можно переключать двойным щелчком мыши на соответствующей надписи в строке состояния главного окна MPLAB. Так, двойной щелчок на надписи "WR/RO" включает/выключает режим "Read Only", на надписи "No Wrap/Wrap хх" включает/выключает разрыв строк, а надпись "INS/OVR" пере- ключает режим вставки/замены. 131
Часть 2. Руководство для начинающих. Первые шаги СОЗДАНИЕ ТРАФАРЕТНЫХ ФАЙЛОВ Как избавиться от повторения набора одних и тех же фрагментов программного текста при создании новых исходных файлов? Вы мо- жете каждый раз находить и копировать нужные фрагменты из ранее созданных файлов и вставлять их в новый текст, но такой метод мо- жет привести к появлению ошибок. Редактор MPLAB Edit позволяет создавать специальные трафаретные файлы и вставлять заранее под- готовленные текстовые файлы или фрагменты текста в новые файлы. Вы можете использовать готовые трафареты, находящиеся в подди- ректории Template папки MPLAB, или создать свои собственные. Мы уже упоминали файл-заготовку f84temp.asm, который используется при создании программ для PIC16F84. Создайте файл трафаретов с расширением .tpl: Edit>Template>Create File. Введите имя файла и путь для сохранения. Если вы хотите, чтобы это файл автоматически становился доступ- ным для всех ваших проектов, назовите его auto.tpl. Выберите пункт меню Edit>Template>New и создайте свой текст трафарета или используйте текст готовых файлов из каталогов MPLAB\Templates\Code или MPLAB\Templates\Object, открыв нуж- ный файл, например f84temp.asm и скопировав оттуда текст в окно своего файла. Затем поместите курсор в каждое место своей заготов- ки, куда впоследствии разработчик (или вы сами) должен вставить свой текст и вставьте туда маркеры: Edit>Template>Insert Mark. Впос- ледствии эти маркеры будут нужны для быстрого доступа к нужному месту текста. Сохраните свой новый файл командой Edit>Template>Store As. Выберите имя файла и нажмите ОК. Вы можете повторить описанные выше шаги и создать сколько угодно трафаретных файлов, например, для каждого типа приложений или для каждого типа контроллера. Подключение трафаретных файлов к своим исходным текстам Используя команду Edit>Template>Attach File подключите нужный трафаретный файл. Файл с именем auto.tpl, как мы уже говорили, подключается по умолчанию. Откройте имеющийся исходный текст программы (File>Open)nm создайте новое окно исходного текста (File>New), куда вы будете вставлять содержимое трафаретного фай- ла. Поместите курсор на то место, куда вы будете вставлять ранее приготовленный текст-шаблон. Выберите в меню команду Edit>Template>Insert, выберите трафаретный файл из списка, выдели- те шаблон и нажмите ОК. Команда Edit>Template>Find Mark позво- ляет быстро находить нужные шаблоны для вставки в ваш собствен- ный текст программы. 132
Интегрированная среда разработки MPLAB Отключение трафаретного файла Команда меню Edit>Template>Detach File. Вы не сможете от- ключить трафаретный файл, если в это момент открыто окно для ре- дактирования его содержимого. Редактирование имеющегося трафаретного файла Соответствующая команда меню: Edit>Template>Edit. Выберите трафаретный файл и индивидуальный шаблон, который вы хотите изменить и нажмите ОК. Измените текст шаблона. Затем сохраните изменения под тем же именем (Edit>Template>Store) или создайте но- вый вариант трафаретного файла под другим именем (Edit>Template>Store As). Когда вы будете закрывать главное окно MPLAB, вам будет задан вопрос, сохранять ли изменения в трафаре- те. Если вы ответите "Нет", будет восстановлен исходный вариант. Удаление трафаретного файла - команда меню Edit > Template >Dele te. Поиск и замена текста или символов задается командами Edit>Find, Edit>Repeat Find и Edit>Replace. Изменение величины отступа можно осуществить как при помощи команд Edit>Text Indent и Edit Text Unindent, так и при помощи спе- циальных кнопок в наборе инструментов текстового редактора, что удобнее. Группа сдвигаемых строк предварительно должна быть вы- делена. Изменение регистра выделенного текста выполняется командами Edit>Text>Uppercase или Edit>Text>Lowercase. Взаимозамена символов производится нажатием клавиш <Ctrl>+<T> или командой меню Edit>Text>Trant,pose. При этом сим- вол справа от курсора и символ слева от курсора меняются местами. Если курсор стоит в начале или конце строки, взаимозамена не про- исходит. Отмена операиии производится либо нажатием традиционного сочетания клавиш <Ctrl>+<Z>, либо нажатием кнопки на панели ин- струментов, либо командой меню Edit>Undo. Редактор запоминает серию операций для отмены, поэтому, если надо отменить несколько операций подряд, пользуйтесь командой меню Edit>Undo. ., потому что там пишется название отменяемой в данный момент операции. Буфер отмены обладает весьма своеобразной логикой и, если нажи- мать кнопку или комбинацию клавиш, то можно нечаянно отменить ввод целого фрагмента текста, а команды "Повтор" нет ®. 133
Часть 2. Руководство для начинающих. Первые шаги Поиск парных скобок Разделительные скобки, используемые в тексте программы, опре- деляются тем, какой язык программирования используется. Для языка С применяются скобки и (.. ); для языка программирования, обозначенного в свойствах MPLAB как "попе", применяются все до- ступные варианты скобок: <...>, {...}, [...] и (...) Для поиска парной скобки в сложном тексте поместите курсор перед одной из скобок и нажмите <Ctrl>+<B>. Курсор встанет перед соответствующей парной скобкой. Дополнительные удобства для программирования на С Если в свойствах проекта или редактора установлен язык про- граммирования С, то редактор предоставляет дополнительные удоб- ства программисту: - редактор всегда переносит символ напечатанный в произ- вольном месте пустой строки, в ее первый столбец. - редактор всегда переносит парную закрывающую скобку "}" в тот столбец пустой строки, который соответствует положению от- крывающей скобки если эта скобка находится в пустой строке. Пример программы на языке С: уу*************************^***^**************** // EXAMPLE.C //********************************************* include <Р1С16С84.Н> void delay(void); void main(void) { unsigned int ij; TRISB = Oxff; PORTB = 0; i = 0x1; while(l) PORTB = i; if (i == 0x80) i = 0x1; else i <<= 1; TRISB = 0; delayO; TRISB = Oxff; 134
Интегрированная среда разработки MPLAB delay(), } } void delay(void) { int x, у; x = 0x3f; у = Oxff; while(x-) { while(y-) NOPO; Как видите, парные скобки находятся на одинаковых позициях, причем закрывающая скобка автоматически помещается на позицию (столбец) открывающей. АССЕМБЛИРОВАНИЕ И ОТЛАДКА ПРОГРАММ Для ассемблирования программы выберите в меню Project>Build All. Если вы не создавали проект, а просто набрали в новом окне редактора исходный текст, то выберите пункт Project>Build Node. В любом случае произойдет фоновый запуск ассемблера, а перед этим исходный файл (проект) будет автоматически сохранен под именем, объявленным ранее. После окончания ассемблирования вы увидите окно результата. Если программа содержала ошибки, в окне будет выведен список сообщений об ошибках Сделайте двойной щелчок мышкой на сообщении об ошиб- ке, и курсор автоматически перейдет на соответствующее место в исход- ном тексте. Разумеется, ассемблер выявляет только очевидные ошибки, такие как неправильный синтаксис, ссылки на необъявленные метки или переменные, неправильный тип данных. Выявлять логические ошибки, наподобие зацикливания, он не может. Когда все ошибки устранены, ассемблер выдаст сообщение "Build completed successfully". Теперь мы имеем законченный проект, гото- вый к выполнению на симуляторе ЗАПУСК ВАШЕЙ ПРОГРАММЫ В верхней части окна MPLAB, под строкой меню, отображаются кнопки, соответствующие командам меню. Крайняя левая кнопка пе- 1»
Часть 2. Руководство для начинающих. Первые шаги реключает "четыре группы кнопок, применяемых для различных це- лей Убедитесь, что отображается группа, в которую входят кнопки со стилизованными иконками светофора и человеческих следов Сейчас нам понадобится именно эта группа. При наведении указателя мыши на кнопку в строке состояния отображается название запуска- емой этой кнопкой функции. Инициализируйте систему нажатием кнопки "Reset" с изображени- ем символов перепада уровня и "#####". Программный счетчик бу- дет сброшен на ноль, что соответствует reset-вектору для PIC16F84. Строка исходного кода, соответствующая этому адресу, выделена темным фоном. В строке статуса MPLAB отображается состояние программного счетчика РС:0х00. По мере исполнения программы выделение смещается. Нажмите кнопку "Step" с изображением следов ноги. Будет выполнена первая команда (в нашем случае goto start). Программный счетчик будет показывать РС:0х04, темная строка пе- реместится на следующую исполняемую команду. Для пошагового выполнения можно также использовать функциональную клавишу <F7>. Понажимайте клавишу <F7> несколько раз и наблюдайте, как перемещается по тексту затемненная строка и изменяются показания программного счетчика. Нажмите клавишу "Run" с зеленым светофо- ром или функциональную клавишу <F9>, чтобы запустить програм- му в режим непрерывного исполнения. Цвет строки состояния изме- нится, показывая, что программа находится в режиме исполнения. До тех пор, пока программа не остановлена, никакие поля в строке со- стояния не могут быть изменены. Остановите программу нажатием на кнопу с красным светофором или функциональную клавишу <F5>. Цвет строки состояния вернется к исходному и будет отображено текущее значение программного счетчика и другие параметры состояния. ОТКРЫТИЕ ДРУГИХ ОКОН ОТЛАДКИ Используя программу MPLAB можно контролировать различные параметры исполнения программы. Например, наша программа должна периодически инкрементировать переменную счетчика, но как это увидеть, чтобы убедиться, что программа работает правиль- но? Одним из способов является использование окна, отображающего значения, хранимые в регистрах общего применения. В нашей про- грамме для хранения значения переменной cl используется регистр общего применения по адресу ОхОС. Нажмите кнопку с надписью "RAM". Интересующее нас значение находится на пересечении строки 0000 и столбца ОС. Когда содержимое одной из ячеек изменяется, оно выделяется красным светом, что облегчает контроль над работой 136
Интегрированная среда разработки MPLAB программы. Но если вы отлаживаете сложную программу, использу- ющую большое число часто изменяемых переменных, становится трудно определить, какая переменная изменилась в данный момент времени, поскольку красным цветом выделены несколько значений. Для решения этой проблемы существует так называемое смотровое окно (watch window). Создание смотрового окна Нажмите кнопку "Create New Watch Window" с изображением очков, либо выберите пункт меню Window>New Watch Window. В ди- алоговом окне введите имя переменной с! в поле "Simbol", или выбе- рите его в прокручиваемом списке. Нажмите "Add", затем "Close". Вы создали смотровое окно, которое выборочно отображает значение только переменной cl. Можно создать смотровое окно, которое од- новременно отображает значения нескольких переменных или регис- тров. В этом случае надо нажимать "Add" для каждого нужного значения из списка, а закончив формировать список нажать "Close". Нажмите несколько раз клавишу <F7> чтобы проверить, как изменя- ется значение переменной cl. Сохранение смотрового окна Для сохранения всех настроек текущего смотрового окна нажмите кнопку в его левом верхнем углу и выберите строку "Save Watch". Введите любое корректное имя и нажмите ОК. Настройки будут со- хранены в текущем рабочем каталоге, где расположен весь проект. При сохранении проекта также сохраняется вся информация об от- крытых и закрытых окнах, их размерах и расположении на рабочем столе. При последующем открытии проекта автоматически восста- навливается исходное состояние всех окон. Ранее созданное смотровое окно впоследствии можно отредакти- ровать. Нажав на кнопку в левом верхнем углу, выберите "Edit Watch" чтобы удалить из окна ненужные значения, или "Add Watch" чтобы добавить новые значения. Кроме этого, для каждого из отоб- ражаемых значений, нажав кнопку "Properties", можно выбрать, как оно будет отображаться: в битовом, шестнадцатеричном или ASCII формате и т.д. ЗАДАНИЕ ТОЧЕК ОСТАНОВА Если программа находилась в процессе симуляции, нажмите <F5>, чтобы остановить ее. Щелкните мышкой непосредственно перед мет- кой "start" нашей учебной программы. Нажмите правую кнопку мы- 137
Часть 2. Руководство для начинающих. Первые шаги ши и в появившемся меню выберите опцию "Break Point(s)". Строка, в которой расположен курсор, изменит свой цвет, сигнализируя, что сразу после исполнения команды в этой строке выполнение програм- мы остановится. Сбросьте систему в исходное состояние клавишей <F6>, затем за- пустите на исполнение клавишей <F9>. При достижении точки оста- нова симулятор остановится на строке, следующей за точкой остано- ва (но эта команда не выполнится). Если нажать клавишу <F9> еще раз, симуляция программы продолжится как обычно, вновь изменит- ся цвет строки состояния, но наша программа работает в цикле, по- этому, после достижения точки останова, симулятор вновь остано- вится. Разумеется, когда программа работает в цикле, и не достигла точки останова, ее можно остановить нажатием клавиши <F5>. Ког- да программа остановлена, в смотровом окне и окне регистров обще- го применения отображаются текущие значения регистров. Дополнительные рекомендации Вы можете задать равнозначные точки останова в таких окнах, как: Window>Program Memory. Window>Absolute Listing. Окно исходного текста (как было описано выше). Если работаете с проектом, используйте окно Window>Project для быстрого вызова файлов, входящих в проект. Двойной щелчок на имени файла, выделенного цветом, открывает его в окне редактиро- вания. Биты конфигурации, заданные в исходном тексте программы, (такие, как тип резонатора, включение/выключение сторожевого тай- мера и т.д.) не устанавливают автоматически соответствующие опции процессора для симулятора или эмулятора. Например, если в тексте программы вы установили опцию "WDT_OFF" - сторожевой таймер выключен, то соответствующий бит будет сброшен при записи про- граммы в кристалл при помощи любого программатора. Для от- ключения этого же режима в симуляторе или эмуляторе MPLAB не- обходимо с помощью меню Options>Processor Setup>Hardware от- ключить соответствующий режим. Такое отсутствие прямой связи между опциями в программе и режимом симулятора позволяет в про- цессе отладки изменять параметры, не меняя исходный текст. Используя меню Options и Options>Environment Setup, вы можете: - модифицировать панель инструментов - установить расположение панели инструментов - изменить количество знаков для меток и имен регистров - настроить экранные шрифты 138
Интегрированная среда разработки MPLAB - перенастроить "горячие клавиши" для функциональных клавиш и специальных символов ASCII. ПОДРОБНЕЕ О ПРОЕКТАХ В MPLAB Итак, вы научились работать с программой MPLAB на уровне, достаточном для написания и отладки простых программ (при усло- вии знания ассемблера). Даже на этом уровне работа с проектами да- ет некоторые преимущества. Если вы будете и дальше практиковаться в создании практических приложений, у вас обязательно накопится своя коллекция программ, библиотек, фрагментов кода. При написа- нии сложных приложений значительно удобнее "собирать" програм- му из готовых отработанных фрагментов и использовать свободно распространяемые библиотеки и отдельные подпрограммы. При этом нежелательно чрезмерно отвлекаться на заботу о том, чтобы все необходимые файлы были упорядочены и соответственно именованы. Использование проектов, в том числе сложных, когда программа при помощи компоновщика собирается из нескольких источников, ощу- тимо облегчает и упорядочивает процесс разработки. ЧТО ТАКОЕ ПРОЕКТ? Проектом в MPLAB называется группа файлов, необходимых для создания приложения путем обработки этих файлов соответствую- щими программными инструментами. Готовый проект состоит из модуля проекта (описания проекта) и одного или нескольких исход- ных модулей (файлов). Исходными модулями могут быть: обычные исходные файлы MPASM, исходные файлы MPLAB-C17, предвари- тельно скомпилированные библиотеки и объектные файлы, скрипты компоновщика. Обычно проект помещается в ту же директорию, что и главный исходный файл. Когда вы создаете проект, то должны указать для него соответст- вующий инструмент обработки, за исключением тех случаев, когда такое указание излишне. Например, если вы используете MPASM и один исходный файл, как было описано ранее, то не нужно присоеди- нять обработчик исходного модуля, поскольку модуль проекта из- начально настроен на применение MPASM. Аналогично, предвари- тельно скомпилированные библиотеки и объектные файлы, скрипты компоновщика для MPLAB-C17 или MPASM не нужно связывать с обработчиком, поскольку они всегда обрабатываются при помощи MPLINK. 139
Часть 2. Руководство для начинающих. Первые шаги Рис. 2-6. Обобщенная структура проекта Для каждого обработчика можно задавать различные параметры, обычно передаваемые через командную строку DOS при его запуске. Эти параметры показаны в окне "Node Properties" (свойства модуля) каждого доступного для редактирования модуля. Это, например, вы- бор типа выходного .hex-файла, включение/выключение сообщений об ошибках и другие. Опции могут быть различными для разных ис- ходных файлов одного проекта, но обычно их делают одинаковыми. Как правило, в большинстве случаев используют опции, заданные по умолчанию. Опции, отмечаемые в диалоговом окне, автоматически переносятся в командную строку, отображаемую ниже. О значении каждой опции для MPASM будет подробно рассказано в следующей главе. Описание MPLAB-C17 и HI-TECH PIC С в этой книге не при-* водится. СОЗДАНИЕ ПРОЕКТА С ОДНИМ ИСХОДНЫМ ФАЙЛОМ Вы уже научились создавать простой проект, но сейчас мы кратко повторим пройденный путь, используя некоторые другие команды меню. После этого нам будет легче перейти к следующему пункту - созданию проекта с несколькими исходными файлами. Итак, Выберите пункты меню Project>New Project Введите имя проекта sample.pjt. Он должен быть сохранен непо- средственно в каталоге, куда инсталлирован MPLAB. Не меняйте имя проекта. 140
Интегрированная среда разработки MPLAB После нажатия кнопки ОК появится диалоговое окно редактиро- вания проекта. В окне "Project Files" щелкните на имени sample.hex и нажмите кнопку "Node Properties". В появившемся диалоговом окне ничего пока не меняйте. Нажмите ОК для возврата в диалоговое окно редактирования проекта. Нажмите кнопку "Add Node" и введите имя sample.asm, нажмите ОК. Теперь мы видим, что в структуру проекта sample.pjt входят фай- лы sample.hex и sample.asm. В этом несложном примере вам не потре- буется задавать дополнительные пути. Когда ваши приложения ста- нут более сложными, возможно, вам понадобится дополнительно за- давать имена директорий для подключаемых файлов в соответству- ющих окнах. Нажмите ОК в окне редактирования диалога. Выберите в меню Project>Make Project для компиляции приложе- ния с помощью MPASM. Файл sample.asm уже имеется в корневом каталоге, он создан программистами фирмы Microchip® в качестве примера, поэтому компиляция пройдет успешно и появится сообще- ние "Build completed successfully". Разумеется, если вы создавали учебный проект с другим именем, то должны создать и файл исходно- го ассемблерного текста, прежде чем запускать сборку проекта. Рис. 2-7. Структура проекта с одним исходным файлом КОМПИЛЯЦИЯ ОДИНОЧНОГО ИСХОДНОГО ФАЙЛА БЕЗ СОЗДАНИЯ ПРОЕКТА Как ууже было сказано, одиночный исходный файл можно отком- пилировать и без создания проекта, особенно при написании неслож- ной маленькой программы. Недостатком данного метода является 141
Часть 2. Руководство для начинающих. Первые шаги необходимость задавать параметры компиляции каждый раз, когда вы запускаете компиляцию. Иногда, при отладке программы, это приходится делать десятки раз. Для иллюстрации метода используем имеющийся файл sample.asm. Если у вас был открыт проект, закройте его, используя меню Project>Close Project Откройте исходный файл sample.asm, находя- щийся в корневой директории MPLAB, командой File>Open. Исход- ный текст программы появится в окне редактора. Сейчас он доступен для редактирования. Выберите в меню пункт Project>Build Node. Откроется охно под названием "Invoke Build Tool", которое соответствует окну "Node Properties" при работе с проектом. Убедитесь, что обработчиком на- значен ассемблер MPASM и нажмите ОК. Начнется процесс компиля- ции и результат будет отображен в отдельном окне. СОЗДАНИЕ ПРОЕКТА С ПРИМЕНЕНИЕМ НЕСКОЛЬКИХ ИСХОДНЫХ ФАЙЛОВ Сейчас мы научимся использовать MPLINK для объединения двух или более объектных файлов MPASM. Если у вас был открыт другой проект, закройте его, используя меню Project>Close Project. Рис. 2-8. Структура проекта с несколькими исходными файлами Как уже было описано ранее, создайте новый проект с именем example.pjt в поддиректории \MPLAB\EXAMPLE. Как обычно, щелк- нув на имени hex-файла в нижнем окошке Project Files: example[.hex], нажмите кнопку "Node Properties" В правом верхнем углу окна "Node 142
Интегрированная среда разработки MPLAB Properties" задайте параметр "Language Tool: MPLINK" и нажмите ОК. Затем в окне "Edit Project" нажмите кнопку "Add Node" для до- бавления исходных файлов. Для вас уже заботливо приготовлены два файла примера, example.asm и example!.asm (в вашем собственном проекте исходных файлов может быть намного больше). Вы можете вставить их одновременно, выделив сразу все названия традицион- ным для Windows способом: держа нажатой клавишу <Ctrl> и щелк- нув поочередно на каждом имени, либо выделив первое имя и, при нажатой клавише <Shift>, щелкнув на последнем имени. Можно вставлять файлы и поочередно. Важно только, чтобы все они были в одном подкаталоге с проектом. В принципе, опции обработки ("Node Properties") для каждого исходного файла могут быть разными, но чаще их делают одинаковыми. Мы сейчас тоже не будем вносить раз- личия. Можно применить кнопку "Copy Node", которая специально используется для того, чтобы задать одинаковые опции обработки для всех файлов. Для этого в нижнем окошке "Project Files:" кнопкой "Add Node" добавьте файл, опции которого будут образцом. Выдели- те имя этого файла щелчком мыши и нажмите кнопку "Copy Node". Выберите один или несколько файлов, которые надо добавить, и на- жмите ОК. Файлы будут добавлены с теми же опциями обработки, что и первый файл. Теперь надо задать скрипт компоновщика, или линкер-скрипт. Это специальный файл для MPLINK, который описывает архитекту- ру памяти каждого микроконтроллера. Стандартные скрипты по- ставляются вместе с MPLINK и находятся в корневой директории MPLAB. Для нашего примера используется файл picl6f84.1kr, распо- ложенный в поддиректории \MPLAB\EXAMPLE. Нажмите кнопку "Add Node", в окне выбора файла задайте тип файла - скрипт компо- новщика и выберите pic 16f84.1kr. Опции "Node Properties" для файлов скрипта не задаются. Нажмите кнопку ОК диалогового окна "Edit Project". На этом со- здание проекта закончено. Мы ничего не вводили в поля Include Files, Library Files и Linker Script Files, потому что все необходимые файлы располагались в одном подкаталоге с проектом. В противном случае необходимо ввести соответствующие пути. Выберите пункт меню Project> Make Project и проследите, как проходит компиляция и сборка проекта. Если вы все сделали пра- вильно, процесс завершится успешно. Теперь вы можете смело экспе- риментировать с уже имеющимися файлами или создать свой проект. Напоминание используйте окно Window>Preject для быстрого вызо- ва исходных файлов, входящих в проект Двойной щелчок на имени фай- ла, выделенного цветом, открывает его в окне редактирования 143
Часть 2. Руководство для начинающих. Первые шаги РАСШИРЕННЫЕ ОТЛАДОЧНЫЕ ФУНКЦИИ MPLAB Мы достаточно исчерпывающе рассмотрели вопросы создания и компиляции проектов. Вы написали программу, как вы надеетесь, не содержащую ошибок, и откомпилировали ее. Если у вас есть внутри- схемный эмулятор или программатор и микроконтроллер с flash- памятью программ, то проверить работоспособность программы чрезвычайно просто. Программируем контроллер или эмулятор, встав- ляем в панельку на плате и ... программа не работает, или работает не- правильно. Вносим исправления, снова программируем и пробуем. А если отладочный кристалл не flash, а с УФ-стиранием, и его программ- ную память надо стирать от 40 до 60 минут. Мысленно "прокрутить" программу тоже нелегко, не все ошибки очевидны. Если алгоритм про- граммы сложен, если программа должна по-разному реагировать на раз- личные внешние воздействия, лучше воспользоваться средствами отлад- ки, предлагаемыми MPLAB. В случае, если отладочной версии кристалла нет, равно как и внутрисхемного эмулятора, а приложение надо срочно закончить, использование программного симулятора является единст- венным доступным способом отладки (ибо цена каждой ошибки - от двух долларов за кристалл и выше). ОТЛАДОЧНЫЕ ФУНКЦИИ MPLAB Для работы в режиме отладки рекомендуется включить панель ин- струментов, которая показана на рис. 2-9. , MPLAB___________________________________________________________ File Protect Edit Qetiug PejtartPlus Qptnrw look V^ndow fjefc НИР Рис. 2-9. Панель инструментов для режима отладки При отладке программу можно запустить как в пошаговом режи- ме, так и в режиме непрерывного исполнения. Вы можете использо- вать точки останова и трассировки при запуске программы в непре- рывном режиме. В пошаговом режиме можно наблюдать содержимое специальных регистров и регистров общего применения в специаль- ных окнах. Внутрисхемный эмулятор MPLAB-ICE работает со ско- ростью, определяемой тактовой частотой вашей реальной схемы и позволяет задавать только точки останова. Программный симулятор MPLAB-SIM исполняет программу со скоростью, определяемой быс- тродействием вашего компьютера. Поэтому, когда говорят об отлад- ке в режиме реального времени, имеют в виду аппаратные эмуляторы. 144
Интегрированная среда разработки MPLAB Скорость исполнения программы на симуляторе заведомо ниже, чем в реальной схеме и, кроме параметров самого компьютера, зави- сит от того, какие приложения Windows работают в фоновом режиме. Программный эмулятор должен обновлять симулируемые регистры и RAM, проверять порты ввода/вывода, устанавливать и сбрасывать флаги, проверять наличие точек сброса и трассировки и симулиро- вать остальные команды. ОГРАНИЧЕНИЯ ПРИ РАБОТЕ С СИМУЛЯТОРОМ Очень часто в программах применяются вложенные циклы для фор- мирования периода задержки. Когда вы тестируете программу на си- муляторе, то рискуете очень сильно затянуть ее исполнение. Временно уменьшите значения констант циклов, либо вообще временно удалите задержки, чтобы увеличить скорость симуляции. Симулятор имитирует обработку портов и внешних выводов син- хронно с исполнением команд. Поэтому симулятор не может имити- ровать, например, воздействие короткого (короче одного командного цикла) спада напряжения на выводе MCLR, тогда как реально в этом случае произойдет сброс процессора. Подобные явления эмулируют только при помощи внутрисхемного эмулятора Кроме этого, существует еще ряд ограничений для контроллеров с расширенными функциональными возможностями. Для контроллеров со встроенной аппаратной поддержкой ШИМ не могут быть симули- рованы импульсы с шириной менее одного командного цикла. Симулятор не имитирует работу встроенного последовательного порта вво- да/вывода. Сравнение сигналов разрядностью более 8 бит не поддержи- вается. В режиме асинхронного счета импульсы короче одного команд- ного цикла не обрабатываются, так как встроенный триггер-защелка не имитируется. Тактовые импульсы на выводах RC0/RC1 и их соотношение по вре- мени с исполняемыми командами не отображается. РЕЖИМ АНИМАЦИИ Режим анимации (animated mode) является способом автома- тического пошагового исполнения программ. После исполнения каж- дой команды симулятор останавливается на некоторое время, доста- точное для того, чтобы рассмотреть значения регистров в соответст- вующих окнах. Значения в окнах изменяются в момент остановки. После небольшой задержки выполняется следующая команда. 145
Часть 2. Руководство для начинающих. Первые шаги ТРИГГЕРНЫЕ ТОЧКИ, ТОЧКИ ОСТАНОВА И ТРАССИРОВКИ Отладочные функции симулятора основываются на трех основных элементах: - точки останова - точки трассировки - счетчики числа прогонов. MPLAB позволяет использовать не более 16 именованных счетчиков в каждом диалоге. Точки трассировки и точки останова функционируют абсолютно независимо друг от друга и могут быть установлены в любом месте программы. Чтобы открыть окно наст- ройки точек останова надо выбрать пункт меню Debug>Break Settings, для настройки точек трассировки соответственно пункт Debug>Trace Settings. ОСТАНОВ ПО УСЛОВИЮ Точки останова по условию не всегда являются конкретным мес- том программного кода, достигнув которого процессор обязательно должен остановиться. Образно выражаясь, это условие, внутри кото- рого происходит исполнение всех команд программы, если после вы- полнения некой команды возникает соответствие параметра останова заданному условию, то процессор останавливается. Одновременно может быть задано несколько условий останова. MPLAB позволяет задать следующие условия останова: - останов по совпадению адреса - останов по заполнению буфера трассировки - останов по равенству счетчика прогонов - останов по переполнению стека - останов по окончанию периода сторожевого таймера - пользовательский останов. В окне программной памяти (Program Memory Window) слева от программного кода можно увидеть следующие обозначения точек останова: В - точка останова; Т - точка трассировки; Q - адрес счетчика прогонов. Останов по совпадению адреса происходит, когда значение про- граммного счетчика совпадает с заранее заданным значением. На- пример, если точка останова задана по адресу 8Ch, то процессор ос- тановится после выполнения команды по адресу 8Ch. Как вы уже вспомнили, это есть тот останов, который мы изучили ранее, когда ставили точку останова прямо в программном тексте. Так удобнее, 146
Интегрированная среда разработки MPLAB поскольку не надо задумываться, по какому физическому адресу бу- дет расположена та или иная команда. Но если надо установить не- сколько точек останова подряд, либо подключить к точкам останова счетчик числа прогонов, то придется воспользоваться более сложным методом. Для примера откройте имеющийся в корневом каталоге MPLAB учебный файл sample.asm (File>Open>sample.asm) и отком- пилируйте его без создания проекта (Project>Build Node>OK). 2 0001 0192 3 0002 0193 4 0003 3008 5 ...Q 0004 0094 6 ..-Q 0005 0810 7 гаоооб 1003 8 0007 0С91 9 0008 1003 18 0809 0792 11 000Й 0С92 12 0008 0С93 13 ооос 0894 лплп Рис. 2-10. Задание точек останова в диалоговом окне Для откомпилированного файла sample.asm откройте окно Window>Program Memory и окно Debug>Break Settings. В поле "Title" введите имя точки останова или группы точек останова. В поле "Start" введите адрес первой точки останова в группе точек, либо с ниспадающем списке выберите имя метки, которое соответствует нужной точке В поле "End" введите адрес последней точки останова в группе или выберите метку в ниспадающем списке. Внесите заданную точку/группу точек в список нажатием кнопки с галочкой. Если начальная и конечная точки будут заданы одним и тем же адресом или меткой, то будет отмечена только одна соответствующая строка. В приведенном на рисунке примере заданы две точки останова: по адресу 0007Н (или метка loop), по адресу 0008Н. Вместе они составля- ют группу точек останова. Процессор сначала остановится после вы- полнения команды по адресу 0007h, после нажатия клавиши <F9> он выполнит команду по адресу 0008h и вновь остановится. Очередное нажатие возобновит циклическое выполнение программы, но при до- стижении адреса 0007h процессор вновь остановится. Кнопка "Remove АП" удаляет все точки из списка, а кнопка "Disable АП" отключает все точки, не удаляя из списка. Ставя или удаляя галочки в списке, можно по мере надобности включать или выключать точки останова при отладке. 147
Часть 2. Руководство для начинающих. Первые шаги Если вы поставите галочку, поле "Address is Qualifier", то строки в программном коде будут помечены уже не буквой В, а буквой Q. Это означает, что при прохождении программного счетчика через каж- дую такую строку значение счетчика числа прогонов будет умень- шаться на единицу. Когда счетчик числа прогонов обнулится, выпол- нение программы остановится. В этом же окне можно задать опцию "Break on Trace Buffer Full", чтобы процессор остановился, когда за- полнится буфер трассировки. Останов по заполнению буфера трассировки происходит, когда бу- фер трассировки емкостью 8К заполнился. О том, что такое буфер трассировки и как настроить трассировку, написано ниже. Останов по равенству счетчика прогонов: MPLAB имеет счетчик прогонов, который может быть подключен либо к логике трассиров- ки, либо к логике останова, в зависимости от этого, при равенстве счетчика прогонов заранее заданному числу, происходит либо собы- тие трассировки, либо останов процессора. Например, если счетчик прогонов подключен к логике останова и его значение равнялось де- сяти, то процессор остановится после того, как исполнение програм- мы десять раз пройдет через заранее заданный адрес счетчика прого- нов Q. Значение в счетчике при этом декрементируется до нуля. Останов по переполнению стека происходит, когда MPLAB обна- руживает, что стек переполнен. Это событие возможно, например, при большом количестве вложенных вызовов подпрограмм. Останов по окончанию периода сторожевого таймера происходит, когда сторожевой таймер WDT генерирует аппаратный сброс. Дан- ная опция удобна для проверки того, успевает ли нормально работа- ющая программа сбросить сторожевой таймер командой CLRWDT, или надо добавить эту команду в других местах. Пользовательский останов, строго говоря, не задается точкой ос- танова, а происходит при нажатии клавиши <F5>, кнопки с красным сигналом на панели инструментов MPLAB или выборе пункта меню Debug>Run>Halt. Для задания некоторых опций останова существует специальное окно, показанное ниже. Оно открывается обращением к пункту меню Options>Development Mode>Break Options Clear Breakpoints on Download - если опция выбрана, при загрузке программы в эмулятор удаляются все точки останова, трассировки, триггерные точки в счетчики прогонов. Global Break Enable - если опция выбрана, разрешено применение точек останова Если опция отключена, все точки останова аннули- руются. Опция доступна для быстрого переключения двойным щелчком мышки ?статусной строке главного окна MPLAB (Bk On/Bk Off) 148
Интегрированная среда разработки MPLAB Development Mode И Tools 'l I arts *] Clock Configuration Power Pins И Clear Breakpoints on Download ✓j global Break Enable I Stack Overflow Break Enable J Disable Stack Overflow Warning ✓I Freeze Peripherals On Halt < I Break on Trace Buffer Full | Mon Oij Vf.l............... |i Break Options i OK I Cancel Apply Help Рис. 2-11. Окно выбора опций останова Stack Overflow Break Enable - если опция выбрана, происходит ос- танов программы при переполнении стека или попытке его избы- точной выгрузки. Disable Stack Overflow Warning - если опция выбрана, не выводит- ся сообщение при переполнении или перевыгрузке стека. Freeze Peripherals On Halt - если опция выбрана, то в случае примене- ния эмулятора при остановке процессора синхронно останавливается периферия (например, драйвер ШИМ, способный работать автономно, драйвер ЖКИ, таймеры, порты и т. д.). Этот режим позволяет избежать нежелательной ситуации, когда после останова процессора встроенный автономный таймер продолжает работать и обнуляется. Если опция вы- брана, то после останова вы можете записать данные в порт, но не може- те прочесть данные из порта иначе, как выполнив команду в пошаговом режиме. В пошаговом режиме, когда периферия остановлена, содержимое окна специальных регистров не обновляется’ Break on Trace Buffer Full - если опция выбрана, процессор оста- навливается, когда заполняется буфер трассировки. Эта опция также доступна из окна установки точек трассировки в версии 4.хх.хх. ТОЧКИ ТРАССИРОВКИ Трассировка предназначена для регистрации хода выполнения про- граммы. MPLAB-SIM имеет восьмикилобайтный буфер трассировки, в 149
Часть 2. Руководство для начинающих. Первые шаги который заносятся адреса и коды выполненных команд. Буфер цик- лический, и при заполнении буфера (если не включен останов по запол- нению буфера трассировки) новые записи смещают и вытесняют старые. Сам смысл трассировки заключается в том, что при выполнении команд, которые отмечены точками трассировки, в буфер трассировки заносится адрес команды; код команды/операнда; метка перехода (если она есть); метка времени; регистры, изменившиеся при выполнении команды. Чтобы увидеть результаты трассировки, надо открыть соответствующее окно. В меню выберите пункт Window> Trace Memory. Точками трассировки могут быть помечены как разрозненные ко- манды, произвольно распределенные по телу программы, так и фраг- менты программного кода (например, некая подпрограмма целиком). Это зависит только от ваших потребностей. Точки трассировки мож- но расставить разными способами. Для тренировки откройте имею- щийся в корневом каталоге MPLAB учебный файл sample.asm (File>Open>sample.asm) и откомпилируйте его без создания проекта (Project>Build Node>OK). непосредственно в окне текста программы поместите курсор на ту строку, которую хотите пометить точкой трассировки, щелкните правой кнопкой мыши и выберите опцию "Trace Point(s)". Строка изменит цвет. Одну из точек трассировки по- местите, например, на строку с меткой, расставьте точки трассировки в других местах, где хотите. Запустите программу на исполнение. По- дождите пару секунд и остановите программу. Откройте окно трасси- ровки. Как видите, в буфере трассировки отмечено исполнение тех команд, для которых вы установили точки трассировки. Существует второй, более мощный способ. Для откомпилирован- ного файла sample.asm откройте окно Window>Program Memory и ок- но Debug>Trace Settings Пример показан на рисунке 2-12. Рис. 2-12. Установка точек трассировки 150
Интегрированная среда разработки MPLAB В поле "Title" введите имя точки/блока точек трассировки. Оно понадобится, когда вы будете задавать счетчик числа прогонов для этой точки либо блока точек. В поле "Start" задайте начальный адрес трассировки, выбрав из ниспадающего списка имя метки, либо введя вручную начальный адрес из окна программной памяти. В поле "End" введите конечный адрес блока трассировки, либо выберите из ниспа- дающего списка имя конечной метки. Если ввести в поля "Start" и "End" одинаковые значения, то будет выбрана одна строка. В данном примере выбраны строки с адресами от 001 Oh до 0013h. Нажатием на кнопку с галочкой поместите настроенный указатель трассировки в список. Можно задать несколько указателей трассировки и, по мере необходимости, включать или отключать их. Кнопки "Remove АП" и "Disable АП" соответственно удаляют или отключают все точки трас- сировки. Изменять адреса точек трассировки и менять их опции мож- но после занесения в список. Выделите нужную точку трассировки в списке. Опция "Address is Qualifier" означает, что данный адрес точки (или диапазон адресов) будет использоваться для изменения счетчика прогонов. Счетчик прогонов декрементируется при выполнении каж- дой команды. В отличие от случая с точками останова, если счетчик прогонов подключен в точке трассировки, запись в буфер трассиров- ки начинается только после того, как счетчик прогонов декременти- руется до ноля. Если верить руководству в программе MPLAB, то, когда счетчик прогонов подключен в точке трассировки, трассировка не начинается до тех пор, пока счетчик прогонов не обнулится. Только после этого начинается заполнение буфера трассировки. Но в действительности, в имеющихся у автора версиях программы, при обнулении счетчика про- гонов процессор останавливается независимо от того, подключен счетчик в точке останова или в точке трассировки. Трассировка может быть остановлена независимо от продолжения симуляции программы. Во время симуляции с трассировкой нажмите кнопку "Halt Trace". Трассировка остановится, в окне трассировки можно будет увидеть ее результаты, но процессор не остановится. Повторное нажатие на кнопку "Halt Trace" возобновит трассировку с текущего момента. УДАЛЕНИЕ ТОЧЕК ТРАССИРОВКИ И ОСТАНОВА Чтобы удалить все точки останова и трассировки выберите пункт Меню Debug>Clear All Points и нажмите ОК. Все точки будут удалены. Операция необратима. 151
Часть 2. Руководство для начинающих. Первые шаги ОСТАНОВ ПО УСЛОВИЮ Если включен режим останова по условию, MPLAB останавливает выполнение программы, когда значение выбранного внутреннего ре- гистра совпадает с заранее заданным значением (условием). Чтобы открыть окно настройки останова по условию выберите пункт меню Debug>Execute>Conditional Break Выполнение программы начинается после нажатия кнопки "Start" и прекращается при выпол- нении условия или при нажатии кнопки "Halt". Кнопка "Reset" симу- лирует сброс процессора. Single Cycle - в этом режиме MPLAB последовательно исполняет команду за командой и после выполнения каждой команды проверяет соответствие заданному условию. Поскольку соответствие условию проверяется после каждой команды, в этом режиме можно отслежи- вать появление редко возникающих или быстро пропадающих значений регистров. Conditional Bieak ♦ Single Cycle* Multiple Cycle* ✓ Update Dieplay; Condition* |-= (Equal*) Reg: [count Value: |l 6 3 3 pace Data Add |_________| Retaove a| | Рис. 2-13. Окно диалога настройки останова по условию Multiple Cycles - исполнение программы прерывается в заранее за- данной точке, проверяется соответствие условию и продолжается ис- полнение программы. Полный останов происходит только тогда, когда к моменту достижения точки останова условие выполнено. Очевидно, что в этом режиме отследить редкое или быстро пропада- ющее значение сложно, поскольку за время движения к точке остано- ва оно может быть изменено. Точки останова задаются известным вам способом, после нажатия на кнопку "Break Settings". При исполь- 152
Интегрированная среда разработки MPLAB зовании аппаратного эмулятора в режиме real-time надо иметь в виду, что режим real-time прерывается на время проверки условия. Update Display - когда эта опция выключена, не происходит дина- мическое обновление отображения дизассемблированного кода в ок- не справа Список выполненных команд (протокол исполнения про- граммы) в этом случае выгружается в окно с момент останова. Длина буфера окна 1000 строк. Отключение динамического обновления ус- коряет симуляцию. Conditions - условие, на основании которого сопоставляются значение одного из регистров в 8-битное значение, которое вы ввели в поле Value. Условие выбирается в ниспадающем списке. Помните, значения ре- гистров анализируются как 8-битные числа без знака, поэтому условие "<0" никогда не станет истинным Trace Data - позволяет отслеживать изменение заранее заданных регистров. Данные трассировки отображаются в окне справа, совме- стно с протоколом исполнения программы, в ниспадающем списке надо выбрать регистры, значения которых будут заноситься в буфер трассировки и добавить их в список кнопкой "Add". Убрать регистры из списка можно кнопками "Remove" и "Remove АП". Протокол и данные трассировки сохраняются в файле с расширением .tb после нажатия кнопки "Save Buffer". СПЕЦИАЛЬНЫЕ ОКНА MPLAB Мы уже упоминали так или иначе почти все специальные окна, те- перь рассмотрим некоторые из них подробнее. Доступ к специальным окнам открывается через пункт меню Window>. Каждое окно в верхнем левом углу имеет кнопку системного меню. При нажатии на эту кнопку открывается ниспадающее меню, в котором можно вы- брать один из вариантов или форматов отображения данных в окне. Program Memory показывает расположение данных в памяти про- грамм. Используя кнопку системного меню, можно представить дан- ные в одном из трех форматов: Hex Code Display - содержимое программной памяти представле- но как шестнадцатеричные данные. Machine Code Display - содержимое программной памяти показа- но как дизассемблированные коды, но без символьной информации. Disassembly Display - показаны дизассемблированные коды с сим вольной информацией (имена регистров, метки). Когда данные представлены в виде дизассемблированных кодов, текущее положение счетчика адреса программы подсвечивается ин- версной строкой. Другие окна MPLAB могут вносить изменения в 153
Часть 2. Руководство для начинающих. Первые шаги окно программной памяти. Например, установка точек останова или трассировки изменяет цвет соответствующих строк окна Program Memory. Trace Memory отображает "снимок" хода выполнения вашей про- граммы. Если у вас есть эмулятор с буфером трассировки, то в окне отображается содержимое его буфера при выполнении программы с реальной скоростью. Некоторые приложения, например, программа управления шаговым двигателем, не могут быть остановлены для просмотра содержимого регистров, и, соответственно, некоторые ошибки могут быть выявлены только тогда, когда приложение не- прерывно работает. Для использования аппаратного буфера эмуля- тора надо воспользоваться описанием эмулятора. В режиме симулятора буфер трассировки применяется для того, чтобы запротоколировать ход выполнения программы и впоследст- вии его проанализировать. Способ отображения в окне также выби- рается при помощи кнопки системного меню. Чтобы воспользоваться окном трассировки, сначала задайте точки или диапазон трассировки как было описано выше. Симулятор помещает метку времени в каж- дой строке и регистрирует, какие регистры изменили свое значение при выполнении отмеченной команды. EEPROM Memory показывает содержимое EEPROM, если симу- лируемый контроллер имеет такую память. Содержимое EEPROM не может быть изменено в этом окне. Для изменения данных обратитесь к меню Window>Modify... Calibration Memory показывает содержимое калибровочных кон- стант, если контроллер содержит калибровочную память. Это, на- пример, распространенный контроллер 12С509, в котором применя- ется встроенный тактовый генератор, и калибровочные константы настраивают тактовую частоту. Внешний вид этого окна может быть разным, в зависимости от типа контроллера. Absolute Listing - файл листинга, сгенерированный компилятором или ассемблером и показывающий исходный код совместно со сгене- рированным объектным кодом. Stack показывает содержимое стека в процессе выполнения про- граммы. Если включен останов по переполнению стека, MPLAB мо- жет выдавать соответствующее предупреждение, когда это происхо- дит. Для настройки останова и предупреждения по переполнению стека выберите меню Option>Development Mode>Break Options, как это было описано ранее, в подпункте "Останов по условию". File Registers - показывает содержимое регистров общего пользо- вания (значения пользовательских переменных). Значения, изменив- шиеся прй выполнении программы, выделяются красным цветом. Со- 154
Интегрированная среда разработки MPLAB держимое может отображаться в трех вариантах, переключаемых кнопкой системного меню: Hex Display - представление в виде таблицы шестнадцатеричных данных. Simbolic Display - каждый регистр представлен в виде данных в шестнадцатеричном, двоичном и символьном формате с указанием соответствующего имени регистра (переменной). Наиболее удобный для отладки формат. ASCII Display - представление данных в виде соответствующих ASCII символов. Special Function Registers (SFRs) - показывает содержимое функ- циональных регистров контроллера одновременно в нескольких фор- матах. Содержимое регистров можно легко изменить дважды щелк- нув мышкой на имени нужного регистра. Откроется окно "Modify", в которое уже будет занесено имя регистра и его предыдущее значение. Введите новое значение и нажмите кнопку "Write". Show Simbol List - показывает имена и адреса всех служебных и пользовательских переменных меток, встречающихся в программе. Эти данные сохраняются в файле *.COD вашего проекта. Stopwatch and Clock Frequency - окно секундомера позволяет из- мерять время выполнения кода. Но вычисления не всегда точны в по- шаговЬм режиме. Время выполнения рассчитывается исходя из такто- вой частоты контроллера. Тактовая частота задается в диалоге Options>Development Mode>Clock (или Options>Processor Setup>Clock Frequency для старой версии MPLAB). Перед установкой тактовой частоты сверьтесь с техническим описанием контроллера. Откройте окно секундомера, обнулите показания кнопкой "Zero" и запустите программу на выполнение. В окне секундомера будут периодически изменяться значения числа командных циклов и затраченного на них времени. Для измерения скорости прохождения критического участка программы поставьте первую точку останова непосредственно перед началом этого участка, а вторую сразу после его окончания. Сбросив процессор, запустите программу на выполнение. Когда программа остановится на первой точке, обнулите показания секундомера и вновь запустите программу. Программа остановится на второй точке, секундомер будет показывать время выполнения участка и ко- личество циклов. Watch Windows - смотровое окно позволяет отслеживать измене- ния одного или нескольких указанных регистров, что облегчает об- наружение изменившихся значений. Создание смотровых окон и ра- бота с ними уже описаны в подпункте "Создание смотрового окна". 155
Часть 2. Руководство для начинающих. Первые шаги Modify - окно позволяет читать и записывать данные по опреде- ленному адресу в памяти или заполнять участки памяти. Окно позво- ляет модифицировать стек, данные пользователя, программные коды и память EEPROM, если она есть. ФУНКЦИИ ВНЕШНЕГО ВОЗДЕЙСТВИЯ Функции внешнего воздействия предназначены для симуляции внешних событий и принудительного управления содержимым регис- тров. с их помощью можно имитировать появление на выводах сиг- налов высокого или низкого уровня и заносить значения непосредст- венно в регистры. Существует четыре режима внешних событий: - асинхронное воздействие - при помощи интерактивного диало- га, управляющего внешними уровнями на входах контроллера, - файл внешних воздействий на выводы - текстовый файл, описы- вающий внешние сигналы на входах контроллера, - файл внешних воздействий на регистры - текстовый файл, со- держащий набор 8-битных значений для записи непосредственно в регистры, - частотное воздействие - программируемый источник регулярных внешних импульсов. АСИНХРОННОЕ ВНЕШНЕЕ ВОЗДЕЙСТВИЕ Асинхронное внешнее воздействие осуществляется при помощи специального диалогового окна с настраиваемыми кнопками. Поль- зователю предоставлено 12 кнопок, параметры которых можно наст- роить индивидуально. Откройте диалоговое окно Debug>Simulator Stimulus>Asinchronous Stimulus. Щелкните правой кнопкой мыши на- пример, на первой кнопке, обозначенной "Stiml (Р)". Откроется диа- логовое окно, в котором выбирают форму сигнала, воздействующего на вывод и номер вывода. Доступны следующие формы внешнего воздействия: Pulse - изменяет уровень на выводе на противоположный и воз- вращается в исходное состояние (кратковременный импульс). High - устанавливает постоянный высокий уровень на входе. Low - устанавливает постоянный низкий уровень на входе. Toggle - изменяет уровень входного сигнала на противоположный и держит его. Выберите нужную форму сигнала щелчком мыши на его обо- значении. Еще раз откройте окно настройки кнопки, щелкните на "Assign Pin". Откроется ниспадающее меню, в котором обозначены все доступные для внешнего воздействия выводы контроллера, с ко- 156
Интегрированная среда разработки MPLAB торым вы сейчас работаете. Двойным щелчком мыши выберите нуж- ный вывод. Если, например, вы выбрали вывод RB0 и вид воздейст- вия Low, то на кнопке появится соответствующее обозначение "RB0 (L)". Закончив настройку кнопок, запустите программу на исполнение в режиме Debug>Run>Animate Нажимая кнопки, в соответствующих окнах можно наблюдать изменение уровней на входах портов и реак- цию программы на эти изменения. Одному и тому же выводу можно поставить в соответствие не- сколько кнопок и смоделировать самые различные сигналы. Если, например, сначала при помощи одной кнопки установить низкий уровень на входе RB0, а затем второй кнопкой на этот вывод пода- вать импульсы в режиме "Pulse", то мы получим на входе RB0 поло- жительные импульсы, возникающие в момент нажатия кнопки. И на- оборот, если сначала установить на RB0 постоянный высокий уро- вень, то получатся импульсы отрицательной полярности. Длитель- ность импульсов не может быть меньше одного командного цикла. ФАЙЛ ОПИСАНИЯ ВНЕШНЕГО ВОЗДЕЙСТВИЯ Иногда бывает необходимо имитировать внешнее воздействие в строго определенный момент времени или выстроить строго описан- ную последовательность сигналов. Для этого используется специаль- ный текстовый файл, с расширением .STI, в котором описывается по- следовательность уровней 0 и 1 в привязке к командным циклам про- граммы. Обозначенный в файле уровень сигнала прикладывается к назначенному выводу в момент, когда значение счетчика циклов в окне секундомера (Window>Stopwatch) совпадает со значением в столбце CYCLE файла описания. Для примера создадим сами про- стейший файл описания внешних воздействий. Используя меню File>New File создайте новое окно редактора и введите приведенный ниже текст. Не обязательно вводить текст ком- ментариев после символов ? "!". CYCLE RB1 RB0 20 0 0 41 1 0 ; высокий уровень к биту 1 порта В 52 0 1 ; высокий уровень к биту 0, к биту 1 низкий 55 1 1 э 60 0 0 65 1 0 ; инверсия бита 1, затем... 76 0 1 ; ...еще инверсия бита 0
Часть 2. Руководство для начинающих. Первые шаги Из содержания файла следует, что, начиная с 20-го командного цикла по 40-й ко входам RB1 и RB0 будет приложен низкий уровень, начиная с 41-го по 51-й командный цикл ко входу RB1 будет прило- жен высокий уровень, а состояние на входе RB0 в это время не изме- нится, и так далее. Для точного определения соответствующих значений счетчика циклов можно воспользоваться окном секундоме- ра в сочетании с точками останова в тех местах программы, где необ- ходимо изменять внешние уровни на входах. Используя меню File>Save As... сохраните файл под именем tutor84.sti там же, где вы ранее сохраняли свой учебный проект tutor84.pjt. Теперь при отладке программы вы можете открыть это файл в меню Debug>Simulator Stimulus>Pin Stimulus. Для совместимо- сти с предыдущими версиями MPSIM первая строка обязательно должна начинаться со слов CYCLE или STEP. Далее следуют наиме- нования выводов, принятые в MPLAB. Чтобы увидеть весь список доступных имен обратитесь, например, к окну настройки кнопок асинхронного воздействия, в строке могут быть перечислены все до- ступные выводы. Комментарии. отделяются от описания символом точки с запятой или восклицательным знаком, перед которым и после которого должно быть не менее одного пробела. ФАЙЛ СОБЫТИЙ РЕГИСТРА Файл событий регистра содержит единственную колонку значений, которые последовательно записываются в регистр, когда значение программного счетчика совпадает со значением, указанным в окне настройки. Последовательная запись значений в регистр может применяться, например, для симуляции аналого-цифрового преобра- зования. Для создания файла событий откройте новое окно редактора, ис- пользуя меню File>New File, и введите приведенный ниже текст. 10 2Е 38 41 50 7А 99 АО FD Создавая свой файл, будьте уверены, что вводите значения именно в том порядке, какой вам нужен. В документации нет ограничений на 158
Интегрированная среда разработки MPLAB максимальную длину файла. Сохраните созданный файл с расшире- нием .REG в том же месте, что и ваш проект. Файл нашего примера сохраните под именем tutor84.reg. Теперь откройте и откомпилируйте файл tutur84.asm, если он не был загружен ранее Для удобства от- кройте окна Wmdow>Program Memory и Windov.>File Registers Те- перь откройте диалоговое окно Debug>Simulator Stimulus>Register Stimulus>Enable и поле "Program Memory Address" введите имя мет- ки loop или ее адрес в программной памяти. В поле "Register Address" для примера укажите регистр OxOd. Нажав кнопку "Browse..." укажите путь к файлу внешнего воздействия, который только что создали. Сбросьте процессор и запустите пошаговое выполнение. Теперь, ког- да программный счетчик будет достигать заданного адреса, в регистр будет заноситься очередное значение из файла. Значения повторяются циклически, пока программа работает. В окне Window>File Registers вы можете видеть, как меняется значение в регистровой ячейке по ад- ресу OxOd. СИМУЛЯЦИЯ ВНЕШНИХ ТАКТОВЫХ ИМПУЛЬСОВ Симулятор позволяет имитировать воздействие циклических по- следовательностей на любых выводах контроллера (на нескольких одновременно и независимо друг от друга). Поскольку программный симулятор не обрабатывает импульсы короче одного командного цикла, все параметры длительности измеряются в командных циклах. Откройте диалоговое окно Debug>Simulator Stimulus>Clock Stimulus В поле "Pin selection" выберите из списка нужный вывод. В поле "High Stimulus Clock Count" введите длительность состояния вы- сокого уровня (например, 2). В поле "Low Stimulus Clock Count" вве- дите длительность состояния низкого уровня (например, 4). На за- данный вывод будет воздействовать последовательность прямоуголь- ных импульсов с соотношением длительностей ноля и единицы 4:2. Галочка "Stimulus Invert" инвертирует уровни воздействия. Кнопка "Add" добавляет описание в список воздействия Кнопки "Open..." и "Save..." соответственно, открывают имеющийся файл с готовым опи- санием (расширение .sti) или сохраняют настройки в файле Кнопка "Delete" удаляет строку из списка. Кнопка "Apply" должна вносить изменения в выбранную строку списка (на момент написания книги в документации не описана и у автора не работала). На этом мы заканчиваем изучение программы MPLAB. Читатель, хорошо освоивший этот материал, наверняка сможет самостоятельно решить все проблемы, возникающие в процессе повседневной работы с MPLAB. Для более углубленного изучения следует обратиться к 159
Часть 2. Руководство для начинающих. Первые шаги полному фирменному описанию, бесплатно распространяемому на фирменном компакт-диске Microchip®. АССЕМБЛЕР MPASM Ассемблер MPASM выпускается компанией Microchip® в двух ва- риантах: для работы под DOS 5 0 и выше, и под Windows 95/98/NT MPASM представляет собой законченное автономное приложение, включающее в себя макроассемблер и утилиты. В процессе разработ- ки ассемблер чаще всего запускается из MPLAB, а параметры пере- даются автоматически в командной строке. Результаты ассемблиро- вания также выводятся в окно MPLAB. Но ассемблер может быть за- пущен и полностью автономно или из вашей собственной оболочки Инсталляция обычно производится автоматически, при установке пакета MPLAB. Если вы хотите установить MPASM отдельно, вам надо приготовить для него поддиректорию (папку) с произвольным именем и распаковать туда при помощи WinZip® или PKZIP® файл ассемблера, загруженный с веб-сайта компании Microchip® или с дис- ка технической поддержки. Ассемблер полностью поддерживает все типы микроконтроллеров Microchip®, память и другие устройства, выпускаемые этой фирмой. Достаточно легко осуществляется перевод программного обеспечения со старого семейства контроллеров на более новое, либо между близ- кими семействами. Так, например, чтобы перенести программу с кон- троллера PIC16C54 на контроллер PIC16C71 потребуется лишь заме- нить несовпадающие мнемоники, поскольку использование регистров с периферии у них очень схоже. Макрокоманды и большинство ди- ректив можно не изменять. MPASM может быть использован для двух целей. - генерация абсолютного кода, который является окончательным и предназначен для записи в микроконтроллер при помощи програм- матора. - генерация объектного кода, который впоследствии будет связан с другими ассемблированными или компилированными модулями. Абсолютный код является для MPASM выходным кодом по умолчанию. Если исходный файл ассемблируется этим способом, то все перемен- ные источника должны быть явно описаны в тексте программы или в файле, подключаемом непосредственно в тексте программы при помо- щи директивы INCLUDE <filename>. Если ассемблирование происхо- дит без ошибок, то генерируется выходной .hex-файл, который затем при помощи программатора записывается в микроконтроллер. 160
Ассеблер MPASM Рис. 2-14. Генерация абсолютного кода MPASM способен также генерировать объектные модули, которые могут быть впоследствии объединены с другими модулями при по- мощи компоновщика MPLINK для создания окончательного испол- няемого кода. Этот метод удобен для создания проверенных, часто употребляемых модулей, которые можно использовать в любой мо- мент без дополнительной проверки. Сходные по назначению модули могут быть сгруппированы и сохранены в библиотеке при помощи менеджера библиотек MPLIB. Необходимые библиотеки могут быть указаны во время компоновки, причем достаточно указать только пути с необходимым библиотекам, чтобы получить окончательный исполняемый код. Рис. 2-15. Создание библиотеки модулей 6 Зак № 4879 Яцспков 161
Часть 2. Руководство для начинающих. Первые шаги Рис. 2-16. Создание исполняемого кода из объектных модулей ИСХОДНЫЕ И ВЫХОДНЫЕ ФАЙЛЫ АССЕМБЛЕРА Исходным файлом по умолчанию является файл с расширением ".ASM". В принципе, исходный файл может быть создан в любом не- форматирующем текстовом редакторе, создающем файлы в формате ASCII. Текст исходного файла должен соответствовать определенным требованиям. Эти требования, в том числе синтаксис команд и опе- рандов, подробно описаны в разделе "Синтаксис исходного текста". Файл листинга (.LST) генерируется ассемблером в следующем, строго определенном, порядке: 1. Имя и версия программного продукта, дата и время ассембли- рования, номер текущей страницы. 2. Первый столбец цифр содержит базовый адрес памяти, куда бу- дет помещен код. Второй столбец показывает 32-битное значение всех идентификаторов, созданных директивами SET, EQU, VARIABLE, CONSTANT или CBLOCK. Третий столбец предназ- начен для машинных кодов. Это те коды, которые будут записаны в память микроконтроллера. Четвертый столбец содержит номер соот- ветствующей строки исходного текста. Если в процессе ассемблиро- вания генерируются описания ошибок, предупреждения или сообще- ния, то они помещаются между строками листинга и относятся к ни- жележащей строке исходного текста. 3. Таблица идентификаторов (SIMBOL TABLE) содержит описа- ние всех идентификаторов, объявленных в программе. 162
Ассеблер MPASM 4. Карта использования памяти в условном виде показывает соот- ношение свободной и занятой памяти микроконтроллера. Если гене- рируется не абсолютный, а объектный код, то карта использования памяти не выводится. 5. Завершается файл листинга сводной статистикой ошибок и пре- дупреждений. Ниже приведен пример файла листинга для только что рассмот- ренного нами примера программы. MPASM 01.99.21 Intermediate MANUAL.ASM 5-30-1997 15:31:05 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0000000B 00001 ; 00002 ; Sample MPASM Source Code. 00003 ; 00004 list p=16c54 00005 Dest equ H'OB' 01FF 00006 00007 org H'OIFF' 01FF 0A00 00008 goto Start 0000 00009 00010 org H'0000' 0000 0C0A 00011 00012 Start movlw H'OA' 0001 002B 00013 movwf Dest 0002 0A00 00014 goto Start 00015 00016 end MPASM 01.99.21 Intermediate MANUAL.ASM 5-30-1997 15:31:05 PAGE 2 SYMBOL TABLE LABEL VALUE Dest 0000000B Start 00000000 _16C54 00000001 MEMORY USAGE MAP ('X' = Used, = Unused) 0000 : XXX—- 01 CO:.............. -..............—-...........X All other memory blocks unused. Program Memory Words Used: 4 Program Memory Words Free: 508 163
Часть 2. Руководство для начинающих. Первые шаги Errors : О Warnings : 0 reported, 0 suppressed Messages : 0 reported, 0 suppressed Файл ошибок (.ERR) генерируется ассемблером по умолчанию, в случае появления ошибок MPLAB автоматически открывает этот файл в своем окне. Каждой ошибке или предупреждению соответству- ет одна строка. Формат строки сообщения таков: <тип ошибки> [номер] <имя файла> <строка> <описание ошибки> Пример: Error [113] C:\PROG.ASM 7 : Symbol not previously defined (start) Выходные файлы (.HEX. .HXL, .HXE1) представляют собой раз- личные форматы шестнадцатеричных файлов. Рассмотрим их по- дробнее. 1. Шестнадцатеричный 8-битный формат (Intel Hex Format). Этот формат представляет собой файл с комбинацией младших и старших байтов. Поскольку в этом формате каждому адресу сопоставлено только 8 бит, для передачи полного числа все адреса дублируются. Например, рассматриваемый нами микроконтроллер PIC16F84 ис- пользует 14-битный программный код, и в описании кодов команд задействованы 8 младших и 6 старших бит. Каждая запись в этом формате начинается с девятизначного пре- фикса и заканчивается двухзначной контрольной суммой. Формат каждой записи выглядит так: :ВВААААТТНННН.........НННСС, где ВВ - два знака шестнадцатеричного байта, показывающего ко- личество представленных в строке байтов данных; АААА - четыре знака шестнадцатеричного адреса, представляющего собой старто- вый адрес для записи блока данных; ТТ - два знака, обозначающие тип записи, всегда должны иметь значение "00", исключая запись "конец файла", когда они должны иметь значение "01"; НН - два бай- та шестнадцатеричных значений программного кода, представленные в виде последовательности комбинаций "младший байт/старший байт"; СС - два знака контрольной суммы, вычисляемой из всех пре- дыдущих байтов записи. Пример содержимого файла: <file_name>.HEX : 1OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFO -.04001ОООООООООООЕС : 100032000000280040006800А800Е800С80028016D 164
Ассеблер MPASM : 100042006801А9018901 EAO 1280208026A02BF02C5 : 10005200E002E80228036803BF03E803C8030804B8 :1000620008040804030443050306E807E807FF0839 :06007200FF08FF08190A57 .0000000 IFF 2. Восьмибитный раздельный формат, в этом случае генерируется два раздельных файла, с расширениями .HXL и .НХН. Формат пред- ставления данных тот же самый, что и для нормального 8-битного формата, за исключением того, что младшие байты сохраняются в файле с расширением .HXL, и старшие в файле с расширением .НХН, адреса не дублируются. Этот формат применяется для записи 16- битных слов в пару 8-битных ППЗУ: один файл в ППЗУ для старших байтов, другой файл в ППЗУ для младших. 3. 32-битный шестнадцатеричный формат сходен с описанным выше 8-битным форматом, исключая то, что расширенный линейный адрес выводится совместно со старшими 16-и битами адреса про- граммной памяти. Этот формат в основном применяется для процессоров с 16- битным ядром, адресуемая программная память которых превышает 32k слов. Каждая запись в этом формате начинается с девятизначного пре- фикса и заканчивается двухзначной контрольной суммой. Формат каждой записи выглядит так: :ВВААААТТНННН.........НННСС, где ВВ - два знака шестнадцатеричного байта, показывающего ко- личество представленных в строке байтов данных; АААА - четыре знака шестнадцатеричного адреса, представляю- щего собой стартовый адрес для записи блока данных; ТТ - два знака, обозначающие тип записи: 00 - строка данных 01 - конец файла 02 - запись содержит адрес сегмента памяти 04 - запись содержит линейный адрес в сегменте. НН - два байта шестнадцатеричных значений программного кода, представленные в виде последовательности комбинаций "младший байт/старший байт". СС - два знака контрольной суммы, вычисляемой из всех преды- дущих байтов записи. Отладочный файл (.COD) создается при генерации абсолютного кода и используется для последующей отладки с MPLAB. 165
Часть 2. Руководство для начинающих. Первые шаги Объектный файл (.О) представляет собой перемещаемый код, ге- нерируемый из исходного файла. ИНТЕРФЕЙС АССЕМБЛЕРА При запуске ассемблера самостоятельно, без MPLAB, появляется окно опций, показанное на рисунке. Если ассемблер запускается из MPLAB, то это окно не выводится, соответствующие параметры устанавливаются в настройках проекта или исходного файла, как это описано в руководстве для MPLAB HmPASM v02.40 Miciochip Technology, Inc BBS Source File Name ] Browse... | Options Radix ^ibefaufj C Hexadecimal Г Decimal C Octal Microchip Warning Level Hex Output f Default Default Г All Messages CINHX8M Г Warnings and Errors C INHX3S C Errors Only , c INHX32 Generated Files P Error File P List File Г Cross Reference File f“ Object File P Case Sensitive Macro Expansion <• Default con rOff Processor [Default Tab Sue Is E Extra Options X Exit | Assemble | P Save Settings on Exit I ? tL&lp Override source file macro expansion Рис. 2-17. Окно настройки параметров ассемблера Radix - применяемая в исходном файле система счисления. По умолчанию анализируется формат объявленных в программе кон- стант в соответствии с их синтаксисом. Warning Level - если используется установка не по умолчанию, и в исходном файле указан уровень сообщений об ошибках, то он отвер- гается и используется уровень, заданный в окне. Hex Output - определяет выходной формат. Если выходной фор- мат был указан в исходном файле, но в окне установлена другая оп- ция, то опция окна имеет приоритет. 166
Ассеблер MPASM Generated Files - включает/выключает генерацию различных вы- ходных файлов. Case Sensitive - включает/выключает чувствительность с регистрам текста. Macro Expansion - включает/выключает обработку макрорасши- рений Опция окна имеет приоритет перед аналогичной опцией за- данной в тексте Processor - если задать тип процессора иной, чем в исходном текс- те, то определение в исходном тексте будет проигнорировано. Tab Size - сообщает ассемблеру величину отступа по табуляции в исходном тексте. Вы должны быть уверены, что указанный отступ соответствует реальности, в противном случае текст не будет пра- вильно обработан Если ассемблер запускается из MPLAB, то величина отступа передается в командной строке Extra Options - некоторые дополнительные опции командной строки, будут рассмотрены далее. Save Settings on Exit - при завершении работы все установленные опции сохраняются в файле MPLAB.INI и восстанавливаются при последующих запусках. СИНТАКСИС ИСХОДНОГО ТЕКСТА Каждая строка текста программы может содержать чедыре разно- видности информации: - метки - мнемонические команды - операнды - комментарии. Порядок их следования и позиция принципиально важны. Макси- мальная длина строки не может превышать 255 символов. Метки должны начинаться с первого столбца. От следующих за ними команд метки отделяются двоеточием, пробелом, табуляцией или символом конца строки (т.е. в строке может быть только метка, команда помещается к следующей строке). Метка должна начинаться с буквы или символа подчеркивания (_), может содержать буквы, ци- фры, символы подчеркивания и вопросительного знака. Длина имени метки не может превышать 32 символа. По умолчанию ассемблер чувствителен к регистру и такие имена меток, как Label_l и label_l будут восприняты как разные Соответственно, как разные будут восприниматься и имена переменных, набранные в разных регистрах Ассемблер можно сделать нечувствительным к регистру, убрав га- лочку для опции "Case sensitive", либо изменив соответствующий пара- метр командной строки 167
Часть 2. Руководство для начинающих. Первые шаги Мнемонические команды, директивы ассемблера и макрокоманды должны начинаться со второго столбца или далее. Под вторым столбцом понимается расстояние отступа по табуляции. В редакторе MPLAB Edit величина этого отступа настраивается. Операнды следуют после команд и отделяются одним или не- сколькими пробелами или табуляцией. Два операнда разделяются запятой или запятой и пробелом. Комментарии могут начинаться с любой позиции строки или за- нимать целую строку. В начале комментария обязательно ставится точка с запятой, в конце строки никакие специальные символы не ставятся. Ассемблер нормально воспринимает строковые константы, содержащие символ точки с запятой и отличает их от комментариев. Ниже приведен пример текста программы (только в качестве ил- люстрации): ; Sample MPASM Source Code. list p=16c54 Dest equ H'OB' org H'OIFF' goto Start org H'0000' Start movlw H'OA' movwf Dest bcf Dest, 3 goto Start end ЦИФРОВЫЕ КОНСТАНТЫ И СИСТЕМЫ СЧИСЛЕНИЯ MPASM поддерживает следующие форматы представления значений: шестнадцатеричный, десятичный, восьмеричный, двоичный и ASCII. По умолчанию установлен шестнадцатеричный формат. Формат по умолчанию означает, что если для переменных и присое- диненных к ним значений явно не указан формат, то при генерации исполняемого кода они воспринимаются в формате по умолчанию. Константы могут иметь знак плюс или минус. Отсутствие знака оз- начает положительное число. В тексте программы константы записываются следующим образом: 168
Ассеблер MPASM Десятичные О'<цифры>' или .<цифры> D'100' .100 Шестнадцатеричные Н'<цифры>' или Ох<цифры> H'9f 0x9f Восьмеричные О'<цифры>' 0'777' Двоичные В'<цифры>' В’ООПЮОГ Строковые ASCII А'символ' или 'символ' АС 'С ДИРЕКТИВЫ АССЕМБЛЕРА Ниже приводится полный перечень директив ассемблера MPASM. Тому, кто впервые сталкивается с программами на языке ассемблера и программами для ассемблера следует четко понимать разницу между инструкциями микроконтроллера, которые ассемблер преобразует в исполняемый код микроконтроллера, с директивами самого ассемб- лера При помощи директив ассемблера может быть написана целая программа, с циклами, функциями и условными переходами, но это будет программа, которая руководит работой самого ассемблера: управляет внешним видом листинга, принудительно формирует неко- торые фрагменты исполняемого кода и т.д. В исходном тексте про- граммы наряду с инструкциями микроконтроллера всегда присутст- вуют хотя бы несколько директив ассемблера. Начинающему про- граммисту достаточно знать только некоторые из них. Некоторые директивы применяются только для управления листингом, который часто рассматривают как официальный документ законченного про- екта. Но при подготовке объектных кодов, при создании сложных приложений, которые могут ассемблироваться в нескольких раз- личных версиях, потребуется более глубокое знание директив и мак- роязыка. _ BADRAM Идентификатор недоступной области памяти _badram <expr>[-<expr>] [, <expr>[-<expr>]] Директивы_____BADRAM и____MAXRAM совместно закрывают до- ступ к неиспользуемым ячейкам памяти. Директива_BADRAM оп- ределяет расположение недоступных ячеек памяти. Эта директива разработана для применения совместно с директивой_MAXRAM Каждое значение <ехрг> должно быть меньше или равно значению, указанному для ___MAXRAM. Когда применяется директива __MAXRAM и проверка выделенного адреса ОЗУ включена, исполь- зование карты памяти определяется директивой_BADRAM Чтобы определить диапазон неприменимых ячеек, используется синтаксис <minloc>-<maxloc>, где <minloc> - начальный адрес диапазона, <maxloc> - конечный адрес 169
Часть 2. Руководство для начинающих. Первые шаги Пример см пример для директивы__MAXRAM См также__MAXRAM BANKISEL Генерация кода косвенного выбора банка bankisel <label> Используется при генерации объектного файла Эта директива яв- ляется инструкцией для компоновщика, генерирующего соответству- ющий код выбора банка для косвенного доступа и адресу, определяе- мому меткой <label> Может быть объявлена только одна метка Ни- какие операции над <label> не выполняются Метка <label> должна быть объявлена заранее Компоновщик генерирует соответствующий код выбора банка Для контроллеров с 14-битным ядром генерирует- ся инструкция сброса/установки бита IRP в регистре STATUS Для контроллеров с 16-битным ядром генерируется инструкция МО VLB или MOVLR Если пользователь корректно и полностью определил косвенную адресацию без применения этих инструкций, то никакие дополнительные инструкции не генерируются Пример movlw Vari movwf FSR bankisel Vari movwf INDF См также BANKSEL, PAGESEL BANKSEL Генерация кода выбора банка banksei <IabeI> Используется при генерации объектного файла Эта директива яв- ляется инструкцией компоновщику для генерации кода выбора банка, чтобы установить банк, в котором находится <Iabel> Может быть назначена только одна метка Никакие операции над <IabeI> не вы- полняются Метка <label> должна быть предварительно описана Компоновщик генерирует соответствующий программный код выбо- ра банка Для контроллеров с 12-битным ядром генерируются инст- рукции установки/сброса бита в FSR Для 14-битных устройств гене- рируются инструкции установки/сброса бита в регистре STATUS Для устройств с расширенным 16-битным ядром генерируется директива 170
Ассеблер MPASM MOVLB Если контроллер содержит только один банк памяти, ника- кие инструкции не генерируются Пример banksei Vari movwf Vari См также BANKISEL, PAGESEL CBLOCK Определение блока констант cblock <label>[ <increment>][,<label>[ <mcrement>]] endc Определяет список именованных констант Каждая метка <label> получает значение адреса большее, чем предыдущие Назначением этой директивы является присвоение адресного пространства множе- ству меток Список имен завершается директивой ENDC Значение <ехрг> означает стартовый адрес для первого имени в блоке Если это значение опущено, то отсчет начинается с ближайшего старшего значения, оставшегося свободным после описания предыдущего бло- ка Если первый блок не имеет стартового значения, то отсчет адресов начинается с нуля Если определено значение <increment>, то следу- ющее значение <label> размещается по адресу, большему чем преды- дущий адрес на величину <increment> Имена разделяются запятыми Директива CBLOCK применяется для распределения констант в па- мяти программ и данных Пример cblock 0x20 name_l, name_2 name_3, name_4 endc cblock 0x30 , name_l will be , assigned 20 , name_2, 21 and so on , name_4 is assigned 23. TwoByteVar 0, TwoByteHigh, TwoByteLow Queue QUEUE_SIZE QueueHead, QueueTail Double! 2, Double2 2 endc См также ENDC 171
Часть 2. Руководство для начинающих. Первые шаги CODE Начало секции объектного кода [<label>] code [<ROM address>] Применяется при генерации объектного файла. Объявляет начало секции программного кода Если метка <label> не специфицирована, секция получает имя " code". Стартовым адресом секции считается объявленный адрес, если он не специфицирован, то секция присоеди- няется во время компиляции. Две секции одного источника не могут иметь одно и то же имя Пример: RESET code H'OIFF' goto START См. также EXTERN, GLOBAL, IDATA, UDATA. UDATA_ACS, UDATA_OVR, UDATA_SHR. __CONFIG Установка битов конфигурации процессора __config <ехрг> или _config <addr>, <expr> Устанавливает биты конфигурации процессора в значения, описывае- мые выражением <ехрг>. Для семейства PIC18CXXX также должен быть указан адрес <addr> байта конфигурации. Для получения информации о значении каждого бита обращайтесь к описанию соответствующего кон- троллера. Перед применением директивы_CONFIG процессор должен быть объявлен в командной строке ассемблера, либо директивой LIST, либо директивой PROCESSOR. Если используется процессор семейства PIC17CXX, то в командной строке или в директиве LIST должен быть установлен формат выходного файла INHX32. Пример: list р=17с42, f=INHX32 _ _config H’FFFF' См. также _IDLOCS, LIST, PROCESSOR CONSTANT Объявляет символьную константу constant <label>=<expr> [..., <label>=<expr>] Создает символы для использования в выражениях MPASM. Кон- станты, будучи единожды объявленными, не могут быть переустанов- лены и выражения должны быть полностью разрешимыми в момент их создания. Это является принципиальным различием между симво- 172
Ассеблер MPASM лами, объявленными директивой CONSTANT и директивой VARIABLE или созданными директивой SET. Во всем остальном константы и переменные могут использоваться в выражениях на рав- ных условиях. Пример: variable RecLength=64 , значение RecLength по умолчанию constant BufLength=512 ; инициализация BufLenght .... ; значение переменной RecLength .... ; может быть переустановлено позже, .... ; например, в RecLength= 128 constant MaxMem=RecLength+ BufLength ; вычисление MaxMem См. также SET, VARIABLE DA Помещает строку в программную память [<label>] da <ехрг> [, <ехрг2>,..., <exprN>] Генерирует сжатые 14-битные числа, представляющие собой два 7-битных символа ASCII. Применяется для сохранения строк в памя- ти контроллеров с флэш-памятью. Пример: da "abcdef" (помещаете программную память 30Е2 3IE4 32Е6 3380 da "12345678", 0 (помещает в программную память 18В2 19В4 1АВ6 0000) da 0x3FFF (помещает в программную память 0x3FFF) DATA Создает цифровые и текстовые значения [<label>] data <expr>,[,<expr>,...,<expr>] [<label>] data "<text_string>"[,"<text_string>",...] Инициализирует одно или более слов, содержащих данные, в про- граммной памяти. Данные могут иметь форму константы, перемеща- емой или внешней метки или выражения идущих по одному или под- ряд. Данные могут состоять также из текстовой строки ASCII, за- ключенной в одиночные кавычки для одиночной буквы и двойные кавычки для строки. Одиночный символ помещается в младший байт слова, символы из строки пакуются по два в слово Если число симво- 173
Часть 2. Руководство для начинающих. Первые шаги лов в строке нечетное, то завершающим байтом является ноль. Для всех семейств микроконтроллеров, исключая PIC18CXXX, первая буква является старшим значащим байтом слова У PIC18CXXX первая бук- ва является младшим байтом снова Когда генерируется объектный файл, эта директива может быть использована для объявления ини- циализированных значений блока данных. Для более подробного изучения этого вопроса обратитесь к описанию директивы IDATA. Пример: data reloc_label+10 ;константы data 1,2,ext_label ; константы, внешние значения data "testing 1,2,3" ; текстовая строка data 'N' ; одиночная буква data start_of_program ; перемещаемая метка См. также DB, DE, DT, DW, IDATA DB Объявляет данные в одном байте [<label>] db <ехрг> [, <ехрг>,... , <ехрг>] Резервирует в программной памяти слово со сжатым 8-битным значением. Множество значений <ехрг> продолжает заполнение бай- тов последовательно до тех пор, пока не закончится список значений. Если число значений нечетное, то последний байт получит нулевое значение. Когда генерируется объектный файл, эта директива может быть использована для объявления инициализированных значений блока данных. Для более подробного изучения этого вопроса обрати- тесь к описанию директивы IDATA. Пример. db't', OxOf, 'е', OxOf, 's', OxOf, 't', '\n' См. также DATA, DE, DT, DW, IDATA DE Объявляет байты данных для EEPROM [<label>] de <expr> [, <expr>,..., <expr>] Резервирует слово в памяти под 8-битные данные. Каждое значение <ехрг> должно выражаться 8-битным числом. Старшие би- ты программного слова равняются нулю. Каждая буква текстовой строки сохраняется в отдельном слове. Несмотря на то, что директива разработана специально для инициализации данных в EEPROM кон- троллера PIC16C8X, она может быть использована для любого раз- мещения данных в любом процессоре. 174
Ассеблер MPASM Пример: org Н'2100' ; инициализация данных в EEPROM de "Му Program, vl.О", О См. также DATA, DB, DT, DW #DEFINE Определяет метку подстановочной строки #define <name> [<string>] Директива определяет текст подстановочной строки. Где бы ни находилось в ассемблируемом коде имя <name>, вместо него будет подставлена строка <string>. Директива используется без непосредст- венного указания значения <string>, если соответствующее имя <name> является внешним и его значение может быть проверено ди- рективой IFDEF. Эта директива эмулирует стандарт ANSI С для #define. Символы, определенные этим методом, недоступны для про- смотра при помощи MPLAB. Пример: #define length 20 #define control 0x19,7 #define position(X,Y,Z) (Y-(2 * Z +X)) testjabel dw position( 1, length, 512) bsf control ; set bit 7 in fl 9 См. также #UNDEFINE, IFDEF, IFNDEF DT Определяет таблицу [<label>] dt <expr> [, <expr>,..., <expr>] Генерирует последовательность инструкций RETLW, одна инст- рукция для каждого значения <ехрг>. Значения <ехрг> должны быть 8-битными. Каждый символ из строки сохраняется со своей инструк- цией RETLW. Пример: dt "A Message", 0 dt FirstValue, SecondValue, EndOfValues См. также DATA, DB, DE, DW 175
Часть 2. Руководство для начинающих. Первые шаги DW Объявляет данные в одном слове [<label>] dw <ехрг> [, <ехрг>, <ехрг>] Резервирует слова программной памяти для данных, заполняя их описанными в директиве значениями. Для контроллеров PIC18CXXX инструкция DW предпочтительнее, чем DB. Значения сохраняются в последовательных ячейках памяти и счетчик каждый раз уве- личивается на единицу. Выражение <ехрг> может быть текстовой строкой, которая сохраняется в соответствии с описанием для дирек- тивы DATA. Когда генерируется объектный файл, эта директива может быть использована для объявления инициализированных значений блока данных. Для более подробного изучения этого вопро- са обратитесь к описанию директивы IDATA. Пример: dw 39, "diagnostic 39", (d_list*2+d_offset) dw diagbase-1 См. также DATA, DB, IDATA ELSE Начинает альтернативный ассемблерный блок директивы IF else Применяется совместно с директивой IF для предоставления аль- тернативного пути ассемблирования, если выражение директивы IF не является истинным. Директива ELSE может быть использована внутри обычного программного блока или макроса. Пример: speed macro rate if rate < 50 dw slow else dw fast endif endm См. также ENDIF, IF END Окончание блока программы end 176
Ассеблер MPASM Директива помещается в конец текста программы и завершает ее ассемблирование. ENDC Окончание блока констант endc Директива завершает список, описанный директивой CBLOCK и не должна быть пропущена в конце списка. См. также CBLOCK ENDIF Завершает блок программ, ассемблируемый по условию endif Директива завершает блок программы, ассемблируемый по усло- вию, и может быть использована внутри обычного программного блока или макроса. См. также ELSE, IF ENDM Завершает описание макроса, начатого директивой МА CRO Пример: make_table macro argl, arg2 dw argl, 0 ; null terminate table name res arg2 ; reserve storage endm См. также MACRO, EXITM ENDW Окончание цикла no директиве WHILE Эта директива завершает цикл, начатый по директиве WHILE. До тех пор, пока условие, специфицированное директивой WHILE будет оставаться истинным, исходный код между директивами WHILE и ENDW будет продолжать повторно вставляться в ассемблируемый поток исходного текста. Директива может быть использована внутри обычного программного блока или макроса. Пример: См. пример для директивы WHILE EQU Определяет ассемблерные константы <label> equ <ехрг> Значение <ехрг> связывается с указателем <label>. 177
Часть 2. Руководство для начинающих. Первые шаги Пример: four equ 4 ; Значение 4 связано с указателем "four" См также SET ERROR Выводит сообщение об ошибке error "<text_string>" Строка "<text_string>" выводится в формате, аналогичном форма- ту других сообщений об ошибках ассемблера MPASM. Строка долж- наиметь длину от 1 до 80 символов. Пример: error_checking macro argl if argl >= 55 ; if arg is out of range error "error_checking-01 arg outof range" endif endm См. также MESSG ERRORLEVEL Устанавливает уровень вывода сообщений errorlevel {0|l|2|+<msgnum>| -<msgnum>} [,...] Директива устанавливает типы сообщений, которые печатаются в файле листинга и файле ошибок. 0 Печатаются сообщения, предупреждения и ошибки. 1 Печатаются предупреждения и ошибки. 2 Печатаются только ошибки. -<msgnum> исключая печать сообщения с номером <msgnum>. +<msgnum> включая печать сообщения с номером <msgnum> Значения <msgnum> с расшифровкой приведены в приложении к главе. Сообщения об ошибках не могут быть отключены. Устанавли- вая значения 0, 1 или 2 можно управлять выводом каждого сообще- ния в отдельности. Пример: errorlevel 1,-202 См. также LIST EXITM Выход из макроса exitm 178
Ассеблер MPASM Немедленный выход из процедуры обработки макроса во время ассемблирования. В отличие от директивы ENDM, которая всегда ставится в конце макроса, директива EXITM может стоять в произ- вольной строке макроса и применяется для немедленного выхода по условию Пример: test macro filereg if filereg == 1 ; check for valid file exitm else error "bad file assignment" endif endm См. также ENDM, MACRO EXPAND Разворачивает макросы в листинге expand Разворачивает все макросы в файле листинга. Эта директива при- близительно похожа на опцию /т в командной строке MPASM, но может быть отключена следующей за ней в исходном тексте директи- вой NOEXPAND. Если разворачивание включено, то каждый раз, когда вызывается макрос, в текст листинга вставляется его полное содержание. Вставка полного текста макроса может облегчить от- ладку и анализ программы, но если макрос вызывается рекурсивно, лис- тинг в этом месте становится почти нечитаемым и значительно уд- линяется В таких случаях макрорасширение отключают директивой NOEXPAND Включать и отключать вывод макрорасширений можно сколь угодно много раз. См. также MACRO, NOEXPAND EXTERN Объявляет внешнюю метку extern <label> [, <label> . .] Применяется при генерации объектных файлов. Объявляет сим- вольное имя некой процедуры, которая может быть использована в текущем модуле, но описана как глобальная в другом модуле. Дирек- тива EXTERN должна быть помещена в исходном тексте до того, как будет использована метка <label>. В строке должна быть специфици- 179
Часть 2. Руководство для начинающих. Первые шаги рована, как минимум, одна метка Если процедура с именем <label> описана в том же модуле, где происходит ее описание как внешней при помощи директивы EXTERN, го ассемблер выдаст сообщение об ошибке из-за повторяющейся метки Пример: extern Function call Function См также GLOBAL, IDATA, TEXT, UDATA, UDATAJICS', UDATA-OVR, UDATA.SHR FILL Заполняет область памяти значением [<label>] fill <expr>, <count> Генерирует значения программных слов или байтов (для PIC18CXX) в количестве <count> Если выражение <ехрг> помещено в круглые скобки, оно может быть ассемблерной инструкцией. Пример fill 0x1009,5 fill (GOTO RESET_VECTOR), NEXT_BLOCK-$ Вторая строка примера заполняет кодом команды GOTO RESET_VECTOR область программной памяти от текущего места до метки NEXT_BLOCK См. также DATA, DW, ORG GLOBAL Экспорт метки global <label> [, <label> . .] Используется при генерации объектного кода. Объявляет сим- вольное имя, которое определено в текущем модуле и может быть до- ступно для других модулей Директива GLOBAL должна быть распо- ложена после того, как символьное имя <label> описано. Пример udata Vari res 1 Var2 res 1 global Vari, Var2 180
Ассеблер MPASM code AddThree global AddThree addlw 3 return См. также EXTERN, IDATA, TEXT, UDATA, UDATA_ACS, UDATAJ3VR. UDATA_SHR IDATA Начало секции предустановленных данных объектного файла [<label>] idata [<RAM address>] Используется при генерации объектного файла. Объявляет начало секции предустановленных данных. Если метка <label> не специфи- цирована, то секция получает имя .idata. Начальным адресом в ОЗУ считается указанный адрес <RAM address>, если же он не указан, то адрес присваивается при компоновке. В этом сегменте не могут быть сгенерированы коды. Компоновщик создаст табличный вход для каждого байта, специфицированного в секции IDATA. Затем пользо- ватель должен включить или связать соответствующий инициализи- рующий код. Эта директива не подходит для процессоров с 12- битным ядром. Директивы RES, DB и DW могут быть использованы для резервирования пространства под переменные. RES генерирует нулевое начальное значение. DW сгенерирует последовательные бай- ты в ОЗУ, по одному слову, в порядке младший байт - старший байт. Пример: idata LimitL dw О LimitH dw D'300' Gain dw D'5' Flags db 0 String db 'Hi there!' См. также EXTERN, GLOBAL, TEXT, UDATA, UDATA„ACS, UDATA_OVR, UDATA_SHR JDLOCS Задает расположение ID-номера процессора __idlocs <expr> или _idlocs <exprl>, <expr2> В случае применения микроконтроллеров PIC12CXX, PIC14000 и PIC16CXX, директива___idlocs устанавливает значения четырех ячеек иденнтификатора ID в соответствии с шестнадцатеричным значением 181
Часть 2. Руководство для начинающих. Первые шаги <ехрг>. Для контроллеров PIC18CXX директива устанавливает двух- байтный ID-номер устройства <exprl> в соответствии с шестнадца- теричным значением <ехрг2> Директива неприменима для контрол- леров PIC17CXX. Следует напомнить, что для PIC12CXX, PIC14000 и PIC16CXX значения идентификатора записываются только в четыре младшие бита каждой ячейки, а старшие следует оставлять незапро- граммированными, чтение и запись этих ячеек возможны только при программировании Например, если <ехрг> имеет значение 1AF, то первое (младшее) значение идентификатора равно нулю, второе рав- но 1, третье - десяти, четвертое - шестнадцати. Перед тем, как приме- нить директиву, необходимо объявить тип процессора в командной строке, директивой LIST или директивой PROCESSOR. Пример: „idlocs Н'1234' См также LIST, PROCESSOR, „CONFIG IF Начало условно ассемблируемого блока if <ехрг> Начинает обработку условно ассемблируемого блока. Если выра- жение <ехрг> истинное, ассемблируется код, следующий немедленно за директивой IF, в противном случае нижеследующий за IF код иг- норируется и ассемблируется код, следующий от директивы ELSE до директивы ENDIF Если выражение <ехрг> задано явно и равно ну- лю, оно трактуется как ложное, если выражение имеет какое-либо иное явное значение, оно трактуется как истинное. if version == 100; проверяем номер текущей версии movlw 0x0а movwf io_l else movlw 0x0la movwf io_2 endif См. также ELSE, ENDIF IFDEF Исполнить, если символ определен ранее ifdef <labe!> Если символьное имя <label> было определено ранее, как правило, при помощи директивы #DEFINE или установкой значения в ко- 182
Ассеблер MPASM мандной строке MPASM, то ассемблируется код, следующий сразу за директивой, до достижения директивы ENDIF Пример. #define testing ; определили testing ifdef testing <execute test code>; этот путь ассемблирования endif , будет выполнен См. также #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE IFNDEF Исполнить, если символ не был определен ранее ifndef <!abe!> Если символьное имя <labe!> не было определено ранее или опре- деление было отменено директивой #UNDEFINE, будет ассемблиро- ван код, следующий непосредственно за директивой, пока не встре- тится директива ENDIF. В противном случае код после директивы IFNDEF будет пропущен, а будет ассемблирован код, следующий по- сле ENDIF. Пример: #define testing ; включить режим тестирования WWidefine testing 1 ; выключить режим тестирования ifndef testing , если сейчас не тестовый режим, ; выполняется ; этот путь endif ; end ; окончание программы См. также #DEFINE, ELSE, ENDIF, IF, #UNDEFINE INCLUDE Подключает дополнительный файл источника include <<include_file>> include "<include_file>" 183
Часть 2. Руководство для начинающих. Первые шаги Указанный файл читается, как исходный код. При этом получается тот же эффект, как если бы вы вставили фрагмент текста из другого файла в текст своей программы при помощи текстового редактора, в то место, где находится директива INCLUDE. Допускается до шести уровней вложенности файлов в файл. Имя файла можно заключать в кавычки или угловые скобки. Если определен полный путь к файлу, то он разыскивается только в соответствии с этим путем. Если путь не определен, то файл разыскивается в следующем порядке: текущая ра- бочая директория, директория исходного файла, директория испол- няемого файла MPASM. Пример: include "c:\sys\sysdefs.inc" include <regs.h> LIST Опции листинга ; системные описания ; описания регистров list [<list_option>,..., <list_option>] Начиная со строки, в которой расположена директива, включается вывод листинга, если ранее он был отключен. В ином случае, для уп- равления процессом ассемблирования или форматом файла листинга могут быть использованы следующие опции: Опция По умолчанию Описание b=nnn 8 Отступ табуляции. c=nnn 132 Ширина столбца. f=<format> INHX8M Выходной формат. <format> может быть INHX32, INHX8M, или INHX8S. free FIXED « Использовать синтак- сический анализатор свобод- ного формата. Применяется для обратной совместимости. fixed FIXED Использовать анализатор с фиксированным форматом синтаксиса. mm={ON|OFF} On Печатать в листинге карту распределения памяти. n=nnn 60 Количество строк на странице. p-<type> None Задание типа процессора, на- пример, PIC16F84. 184
Ассеблер MPASM Опция По умолчанию Описание r=<radix> hex Система счисления: hex, dec, oct. st={ON|OFF} On Печатать таблицу символов в файле листинга. t={ON|OFF} Off Обрывать длинные строки листинга. w={0|l|2} 0 Установить уровень сообще- ний. См. ERRORLEVEL. x={ON|OFF} On Включить/выключить мак- рорасширение. Пример: list р=17с42, f=INHX32, r=DEC См. также ERRORLEVEL, EXPAND, NOEXPAND, NOLIST, PROCESSOR, RADIX LOCAL Объявляет локальную переменную макроса local <label> [, <label>...] Директива объявляет те переменные, которые в данном макросе будут использованы локально. Имя <labe!> при этом может быть идентичным имени, объявленному извне макроса и это не приведет к ошибке. Если макрос вызывается рекурсивно, каждый вызов будет создавать собственную локальную копию переменной. Директива применяется только внутри макроса. Пример: <main code segment> 1еп size equ 10 equ 20 ;глобальная переменная len ; глобальная переменная size test macro size local len, label ; ; передали в макрос аргумент size локальные len и label len set size ; изменили локальную переменную ;(len=size) label res len ; создали резервный буфер len endm set len-20 ;вновь изменили len ; завершение макроса 185
Часть 2. Руководство для начинающих. Первые шаги См. также ENDM, MACRO MACRO Объявляет начало описания макроса <label> macro [<arg>, <arg>] Макрос - это последовательность инструкций, которая может быть вставлена в ассемблируемый исходный код путем простого вы- зова макроса. Перед тем, как макрос будет вызван, он должен быть описан. Макрос может вызывать другие макросы или рекурсивно вы- зывать сам себя. См. также раздел "Макросы и макроязык". Пример: Read endm macro device, buffer, count movlw device movwf ram_20 movlw buffer movwf ram_21 movlw count call sys_21 ; buffer address ; byte count ; read file call См. также ELSE, ENDIF, ENDM, EXITM, IF, LOCAL __MAXRAM Определяет наибольший адрес ОЗУ __maxram <expr> Директивы_____MAXRAM и_______BADRAM совместно закрывают до- ступ к регистрам, применение которых невозможно. _MAXRAM определяет абсолютный наибольший корректный адрес ОЗУ и ини- циализирует карту корректных адресов ОЗУ от значения <ехрг> и ниже. Значение <ехрг> должно быть больше или равно максимально- му адресу ОЗУ нулевой страницы и меньше, чем 1000Н. Эта директи- ва разработана для использования с директивой _BADRAM. Как только применена директива __MAXRAM, включается проверка каждого конкретного адреса на доступность, при этом используются ограничения карты памяти, сделанные директивой_BADRAM. Ди- ректива ______________________________________MAXRAM может быть использована более одного раза, но каждое новое использование этой директивы полностью переопре- деляет всю карту распределения ОЗУ. Пример’ list р= 16с622 186
Ассеблер MPASM _maxram H'OBF' __badram H'O7'-H'O9', H'OD'-H'lE' __badram H'87'-H'89', H'8D', H'8F'-H'9E' movwf H'07' ; здесь ассемблер сгенерирует movwf H'87' ; сообщения о некорректной ; области ОЗУ См. также__BADRAM MESSG Создает сообщение, определенное пользователем messg "<message text>" Генерирует информационное сообщение, выводимое в файл лис- тинга. Текст сообщения может иметь длину до 80 символов. При вы- воде сообщений этой директивой не устанавливаются и не возвраща- ются никакие коды сообщений об ошибках. Если эта директива ис- пользуется для вывода сообщений о каких-либо внутренних огра- ничениях или ошибках при ассемблировании, то сообщение выводит- ся в строгом соответствии с алгоритмом, который определил пользо- ватель и с текстом, который задал пользователь. Пример: mssg_macro macro messg "Макрос вызван без аргумента!" endm См. также ERROR NOEXPAND Отключает разворачивание текста макросов noexpand Директива отключает разворачивание текста вызываемых макро- сов в тексте файла листинга. Если разворачивание включено, то каж- дый раз, когда вызывается макрос, в текст листинга вставляется его полное содержание. Вставка полного текста макроса может об- легчить отладку и анализ программы, но если макрос вызывается ре- курсивно, листинг в этом месте становится почти нечитаемым и значительно удлиняется В таких случаях макрорасширение от- ключают директивой NOEXPAND Включать и отключать вывод ма- крорасширений можно сколь угодно много раз. См. также EXPAND 187
Часть 2. Руководство для начинающих. Первые шаги NOLIST Отключает вывод листинга nolist Директива прекращает вывод текста в файл лиотннга. Вывод мо- жет быть вновь включен директивой LIST. См. также LIST ORG Устанавливает начальный адрес программы <label> org <ехрг> Директива устанавливает стартовый адрес программного кода, своего рода "начало координат", в соответствии со значением <ехрг>. Если специфицирована метка <label>, на нее можно ссылаться в дру- гих выражениях, как на соответствующее численное значение (см. пример). Если директива ORG не используется, то код генерируется с нулевого адреса. Код программы может быть разбит на физические фрагменты несколькими, директивами ORG. Эта директива не может быть использована при генерации объектного кода. Пример: int_l org 0x20 ; коды для вектора 20 будут находиться здесь int_2 org int_l+0xl0 ; коды для вектора 30 будут находиться здесь См. также FILL, RES PAGE Вставляет прогон страницы листинга page Директива временно прекращает вывод текстового потока в файл листинга и заполняет остаток страницы символами перевода строки, что при печати приводит к "прогону" страницы в принтере. Вывод тек- ста возобновляется с начала следующей страницы. Применяется для удобства оформления листинга и разбивки его на смысловые блоки. См. также LIST, SUBTITLE, TITLE PAGESEL Генерирует код выбора страницы pagesel <label> 188
Ассеблер MPASM Директива применяется при генерации объектного файла. Являет- ся инструкцией компоновщику сгенерировать коды установки битов выбора страницы программной памяти, которая соответствует метке <label>. Одна директива может использовать только одну метку, ко- торая должна быть объявлена заранее. Для процессоров с 12-битным ядром компоновщик сгенерирует инструкции установки/сброса битов регистра STATUS. У процессоров с 14- и 16-битным ядром при по- мощи инструкций MOVLW и MOVWF будет модифицирован регистр PCLATCH. Если применяемый процессор содержит только одну страницу программной памяти, то никакие коды не генерируются. В случае с контроллерами PIC 18СХХХ эта директива ничего не делает. Пример: pagesel GotoDest грамм goto GotoDest ; выбрали нужную страницу памяти про- ; перешли на метку на этой странице pagesel CallDest грамм call CallDest ; выбрали нужную страницу памяти про- ; вызвали подпрограмму на этой странице См. также BANKISEL, BANKSEL PROCESSOR Указывает тип процессора processor <processor_type> Директива указывает ассемблеру, для какого процессора должна быть ассемблирована программа. Пример: processor 16с54 См. также LIST RADIX Система счисления по умолчанию radix <default_radix> Директива устанавливает систему счисления по умолчанию для данных. Если директива не использовалась, то системой счисления по умолчанию считается шестнадцатеричная. Корректными считаются следующие наименования систем счисления: hex, dec, oct. Пример: radix dec Г89
Часть 2. Руководство для начинающих. Первые шаги См. также LIST RES Резервирование памяти [<!abe!>] res <mem_units> Начиная с указанного адреса резервирует ячейки памяти, в ко- личестве, указанном в <mem_units>. В неперемещаемом коде <label> соответствует конкретному адресу программной памяти. В перемеща- емом коде (с применением MPLINK) директива RES может быть также использована для резервирования ячеек под хранение данных. Адрес описывается словами для I2-, 14- и 16-битных контроллеров и байтами для расширенных 16-битных контроллеров. Пример: buffer res 64 ; резервирует 64 ячейки См. также FILL, ORG SET Определяет ассемблерную переменную <label> set <ехрг> Директива связывает символьное имя <label> со значением кор- ректного ассемблерного выражения <ехрг>. Директива SET является функциональным эквивалентом директивы EQU, за исключением то- го, что значение, заданное одной директивой SET, впоследствии мо- жет быть изменено другой директивой SET. Пример: area set О width set 0x12 length set 0x14 area set length * width length set length + 1 См. также EQU, VARIABLE SPACE Вставляет пустую строку в текст листинга space <ехрг> Вставляет пустые строки в количестве <ехрг> в файл листинга. Пример: space 3 ; вставляет три пустых строки в листинг 190
Ассеблер MPASM См. также LIST SUBTITLE Описывает подзаголовок программы subtitle "<sub_text>" Значение "<sub_text>" представляет собой ASCII строку длиной не более 60 символов, заключенную в двойные кавычки. Эта директива устанавливает второй заголовок программы, который используется как подзаголовок в выходном листинге. Пример: subtitle "input section" См. также TITLE TITLE Описывает заголовок программы title "<title_text>" Значение "-»title_text>" представляет собой ASCII строку длиной не более 60 символов, заключенную в двойные кавычки. Директива определяет текст, который будет выводиться в первой строке каждой страницы файла листинга. title "diagnostic code, rev 5.0" См. также LIST, SUBTITLE UDATA Объявляет неинициализированный блок данных объектного файла [<label>] udata [<RAM address>] Директива используется при генерации объектного файла. Объяв- ляет начало секции неинициализированных данных. Если значение <label> не указано, секция получает имя ".udata". Стартовый адрес может быть указан явно (<RAM address>) или присвоен во время компоновки. В этом сегменте не генерируется никакой программный код. Для резервирования пространства под данные используется ди- ректива RES. В одном источнике две секции не могут иметь одно и то же имя. Пример: udata Vari res 1 Double res 2 191
Часть 2. Руководство для начинающих. Первые шаги См. также EXTERN, GLOBAL, IDATA, UDATA_ACS, UDATAJDVR, UDATAJSHR, TEXT UDATA_ACS Объявляет неинициализированный блок данных доступной части ОЗУ [<label>] udata_acs [<RAM address>] Директива используется при генерации объектного файла. Объявляет начало секции неинициализированных данных ОЗУ Если значение <label> не указано, секция получает имя ".udata_acs". Стартовый адрес может быть указан явно (<RAM address>) или присвоен во время компо- новки. Директива используется для объявления переменных, которые располагаются в доступной части ОЗУ микроконтроллеров PIC18XXX. В этом сегменте не генерируется никакой программный код. Для резерви- рования пространства под данные используется директива RES. В одном источнике две секции не могут иметь одно и то же имя. Пример: udata_acs Vari res 1 Double res 2 См. также EXTERN, GLOBAL, IDATA, UDATA, UDATAJDVfc, UDATAJSHR, TEXT UDATA_OVR Объявляет перекрывающийся неинициализированный блок данных [<label>] udata_ovr [<RAM address>] Директива используется при генерации объектного файла. Объяв- ляет начало секции перекрывающихся неинициализированных дан- ных. Если значение <label> не указано, секция получает имя ",udata_ovr". Стартовый адрес может быть указан явно (<RAM address>) или присвоен во время компоновки. Пространство данных, объявленное этой директивой, может перекрываться другими данны- ми, далее объявленными директивой UDATA_OVR с таким же име- нем. Это идеальный способ объявления временных переменных, по- скольку это позволяет различным переменным быть объявленными в одной области памяти В этом сегменте не генерируется никакой про- граммный код. Для резервирования пространства под данные исполь- зуется директива RES. Пример: Temps udata_ovr 192
Ассеблер MPASM Tempi res 1 Temp 2 res 1 ТетрЗ res 1 Temps udata_ovr LongTempl res 2 , эта переменная займет то же место, что и ; переменные Tempi и Тетр2 LongTemp2 res 2 ; эта переменная займет то же место, что и ; переменная ТетрЗ См. также EXTERN, GLOBAL, IDATA, UDATA, UDATA_ACS, UDATA_SHR, TEXT UDATASIIR Объявляет секцию скрытых неинициализированных данных [<label>] udata_shr [<RAM address>] Директива используется при генерации объектного файла. Объяв- ляет начало секции скрытых неинициализированных данных ОЗУ. Если значение <label> не указано, секция получает имя ".udata_shr". Стартовый адрес может быть указан явно (<RAM address>) или при- своен во время компоновки. Директива используется для объявления переменных, которые располагаются в скрытой области памяти (т.е. в невыбранном банке ОЗУ). В этом сегменте не генерируется никакой программный код. Для резервирования пространства под данные ис- пользуется директива RES. В одном источнике две секции не могут иметь одно и то же имя. Пример: Temps udata_shr Tempi res 1 Temp 2 res 1 ТетрЗ res 1 См. также EXTERN, GLOBAL, IDATA, UDATA, UDATA_ACS, UDATA.OVR, TEXT #UNDEFINE Удаляет соответствующую метку #undefme <label> Символьное имя <label> в данном случае является идентификато- ром, ранее определенным при помощи директивы #DEFINE, и после применения директивы &UNDEFINE удаляется из таблицы символов. Пример: #define length 20 7 Зак Ns 4879 Яцевков 193
Часть 2. Руководство для начинающих. Первые шаги #undefme length См также #DEFINE, IFDEF, INCLUDE, IFNDEF VARIABLE Объявляет символьную переменную variable <label>[=<expr>][, <label>[=<expr>] ..] Директива создает символы для применения в выражениях MPASM. Переменные и константы равноправно используются в вы- ражениях. Директива VARIABLE создает символ, который функцио- нально эквивалентен созданному директивой SET. Различие состоит в том, что директива VARIABLE не требует, чтобы символьному име- ни было присвоено значение сразу, как только оно объявлено. По- мните, что значение переменной не может быть изменено внутри опе- ранда. Вы должны размещать присвоение переменных, инкремент или декремент в разных строках. Пример- См. пример для директивы CONSTANT См. также CONSTANT, SET WHILE Продолжать цикл, пока условие цикла истинно while <ехрг> endw Строки между директивами WHILE и ENDW ассемблируются по- вторно до тех пор, пока сохраняется истинность выражения <ехрг>. Каждый раз, в начале цикла значение выражения <ехрг> проверяется, и если возвращается ноль, то выражение считатся ложным, а если лю- бое другое значение - то истинным. Цикл WHILE обычно содержит до 100 строк и повторяется не более 256 раз. Пример: test_mac macro count variable i i = 0 while i < count movlw i i+= 1 endw 194
Ассеблер MPASM endm start test_mac 5 end См. также ENDW, IF ИСПОЛЬЗОВАНИЕ MPASM ДЛЯ СОЗДАНИЯ ПЕРЕМЕЩАЕМЫХ КОДОВ Как уже говорилось, в комплекте с MPLAB-IDE компания Microchip® предоставляет набор файлов с заголовками программы (например, pl7c756.inc), которые могут быть использованы при гене- рации объектных модулей. Файлы заголовка описывают специальные функциональные регистры соответствующего процессора. Просмот- реть содержание этих файлов можно при помощи обычного текстово- го редактора. Абсолютный (неперемещаемый) код программы генерируется не- посредственно при ассемблировании и располагается в программной памяти в порядке следования операторов программы. Операторы пе- рехода на метку сразу заменяются соответствующим кодом перехода на адрес метки. Аналогично обрабатываются вызовы подпрограмм. Когда генерируется перемещаемый код, каждая секция программно- го кода должна предваряться директивой CODE. Окончательное раз- мещение программных кодов, расстановку физических адресов перехо- дов и, при необходимости, подстановку кодов переключения страниц памяти, выполняет компоновщик MPLINK. Если в исходном файле более одной секции CODE, то каждая секция должна иметь уникальное имя. Если имя не определено, то по умолчанию секции присваивается имя ".code". Каждая секция программной памяти должна быть непре- рывной для одного исходного файла. Секция не может быть раздроб- лена на части внутри одиночного исходного файла. Физический адрес кода может быть жестко задан путем указания необязательного адресного параметра директивы CODE. Это бывает необходимо в случаях: - описания векторов прерывания - когда необходимо быть уверенным, что сегмент кода не выйдет та пределы страницы памяти. Пример перемещаемого кода: Reset CODE H'OIFF' GOTO Start Main CODE CLRW OPTION 195
Часть 2. Руководство для начинающих. Первые шаги ОПЕРАНДЫ ИНСТРУКЦИЙ Существуют некоторые ограничения на использование операндов в инструкциях. Операнды инструкций должны иметь следующий вид' [HIGH|LOW|UPPER] (<relocatable symbol>+<constant offset>), где <relocatable symbol> - любая метка, которая определяет адрес па- мяти программ или данных; <constant ofiset> - постоянное смещение, вычисляемое во время ассемблирования и лежащее в пределах от -32768 до 32767. Некоторые из значений <relocatable symbol> или <constant offset> могут быть пропущены. Операнды в виде: <relocatable symbol>-<relocatable symbol> преобразуются в постоянные значения, если оба символа определены в одной и той же секции кода или данных. Если используется опция HIGH, то в выражении используются только биты с 8 по 15. В случае использования опции LOW исполь- зуются только биты с 0 по 7. Если используется опция UPPER, то з выражении будут использованы только биты с 16 по 21-й. РАСПРЕДЕЛЕНИЕ ОЗУ Пространство ОЗУ должно быть распределено в секции данных. Существует пять типов секции данных: UDATA - неинициализированные данные. Это наиболее общий тип секции данных. Ячейки памяти резервируются, но не инициали- зируются (в них не записываются конкретные значения). К ячейкам можно получить доступ только при помощи метки, указывающей на эту секцию, или путем косвенной адресации. UDATA_ACS - неинициализированные данные доступа. Эта секция данных используется для переменных, которые будут помещены в ОЗУ быстрого доступа микроконтроллеров PICI8CXX. Эта область ОЗУ ис- пользуется для прямого обращения к данным некоторыми инструкциями. UDATA_OVR - неинициализированные перекрывающиеся данные. Такая секция данных применяется для переменных, которые могут быть объявлены по тому же самому адресу, что и другие переменные в этом модуле или других подключаемых модулях. Типичным применением это- го типа секции данных является хранение временных переменных UDATAJSHR - неинициализированные скрытые данные. Эта сек- ция данных применяется для переменных, которые будут помещены в "теневой" или противоположный активному банк памяти. IDATA - инициализированные данные Компоновщик генерирует таблицу соответствия, которая может быть использована для присво- 196
Ассеблер MPASM ения переменным в этой секции конкретных значений. К ячейкам можно получить доступ только при помощи метки, указывающей на эту секцию, или путем косвенной адресации. Следующие примеры показывают, как объявляют секции данных для абсолютного и перемещаемого кода Абсолютный код CBLOCK 0x20 InputGain, OutputGain ; Рабочие переменные программы. HistoryVector ; Надо инициализировать значением 0. Tempi, Temp2, ТетрЗ ; Временные переменные. ENDC Перемещаемый код IDATA HistoryVector DB 0 UDATA InputGain OutputGain RES 1 RES 1 UDATA_OVR Tempi Temp 2 ТетрЗ RES 1 RES 1 RES 1 При необходимости расположение секции может быть фиксирова- но в памяти назначением необязательного значения адреса. Если опи- сывается более чем одна секция каждого типа, то они должны по- лучать уникальные имена. Если описываются инициализированные данные в секции IDATA, то должны использоваться директивы DB, DW и DATA. Описание этих директив приведено выше, а здесь показан пример, демонстри- рующий объявление данных в перемещаемом коде: 00001 00002 LIST p=17c44 IDATA 0000 01 02 03 00003 Bytes DB 1,2,3 0003 34 12 78 56 00004 Words DW H'1234', H'5678' 0007 41 42 43 00 00005 String DB "ABC",0 ДОСТУП К МЕТКАМ ИЗ ДРУГИХ МОДУЛЕЙ Метки, объявленные в одном модуле, для использования в других модулях должны быть экспортированы с применением директивы 197
Часть 2. Руководство для начинающих. Первые шаги GLOBAL. В модулях, где используются такие метки, они должны быть объявлены как внешние директивой EXTERN. Следующий пример демонстрирует применение директив GLOBAL и EXTERN: Перемещаемый код, определяющий модуль UDATA InputGain RES 1 OutputGain RES 1 Filter GLOBAL CODE InputGain, OutputGain GLOBAL Filter : ; код подпрограммы с именем Filter Перемещаемый код, вызывающий модуль EXTERN InputGain, OutputGain, Filter UDATA Reading RES 1 CODE MOVLW GAIN1 MOVWF InputGain MOVLW GAIN2 MOVWF OutputGain MOVF Reading,W CALL Filter ПРОБЛЕМА С РАЗБИЕНИЕМ НА БАНКИ И СТРАНИЦЫ Очень часто ОЗУ контроллера разбито на отдельные банки, а про- граммная память разделена на несколько страниц. В этом случае не- обходимо правильно указывать банк и страницу, правильно обраща- ясь к нужным меткам. Однако, поскольку абсолютные адреса пере- менных и адреса меток неизвестны во время ассемблирования, не все- гда в итоге получается корректный код. Например, в зависимости от величины программы, ее код может поместиться на одной странице, а может и не поместиться Соответственно, одна из меток в конце программы (и ее физический адрес) может соответствовать одной странице программной памяти, а может и другой Но заранее, в начале ассемблирования, это не всегда очевидно и ассемблер может сгенериро- вать некорректный код 198
Ассеблер MPASM Для предотвращения подобных ситуаций добавлены новые дирек- тивы, BANKSEL и PAGESEL. Эти директивы дают компоновщику команду выполнить предварительную проверку и при необходимости сгенерировать коды переключения страницы или банка для коррект- ного обращения к указанной метке. Далее приведен пример того, как может быть преобразован код с использованием директив BANKSEL и PAGESEL: Абсолютный код LIST P=12C509 #include Vari Var2 "P12C509.INC" EQU H'10' EQU H'30' MOVLW InitialVaiue BCF FSR, 5 MOVWF Vari BSF FSR, 5 MOVWF Var2 BSF STATUS, РАО CALL Subroutine Subroutine CLRW ;In Pagel! RETLW 0 Перемещаемый код LIST P-12C509 ftinclude "P12C509.INC" UDATA Vari Var2 RES 1 RES 1 CODE MOVLW InitialVaiue BANKSEL Vari MOVWF Vari BANKSEL Var2 MOVWF Var2 PAGESEL Subroutine CALL Subroutine 199
Часть 2. Руководство для начинающих. Первые шаги Subroutine CLRW RETLW О НЕДОСТУПНЫЕ ДИРЕКТИВЫ При генерации объектного файла доступны все возможности мак- росов и почти все директивы ассемблера, кроме директивы ORG. При создании перемещаемых кодов ее необходимо заменить на директиву CODE, как показано в примере: Абсолютный код Reset ORG H'OIFF' GOTO Start Перемещаемый код Reset CODE H'OIFF' GOTO Start ГЕНЕРАЦИЯ ОБЪЕКТНЫХ МОДУЛЕЙ (ФАЙЛОВ) Когда преобразование исходного текста к виду, соответствующе- му требованиям перемещаемого кода, завершено, может быть сгене- рирован объектный файл Для этого в оболочке MPASM для Windows или в соответствующем окне MPLAB-IDE надо галочкой отметить опцию "Object File" Диалоговые окна среды MPLAB по- дробно описаны в предыдущей главе. Далее мы рассмотрим пример несложной программы, сначала в виде абсолютного кода, а затем разобьем исходный файл на две части, одна из которых будет представлять собой вызываемую под- программу, которую можно включить в состав библиотеки и вызы- вать из других программ, а вторая часть будет представлять собой главный модуль, вызывающий подпрограмму. Абсолютный код LIST P=16C54 #INCLUDE "P16C5x.INC" cblock H '020' mulcnd mulplr H_byte L_byte count RES 1 ; 8-битное множимое RES 1 ; 8-битный множитель RES 1 ; Старший байт 16-битного результата RES 1 ; Младший байт 16-битного результата RES 1 ; Счетчик цикла 200
Ассеблер MPASM mpy clrf H_by te clrf L_byte movlw 8 movwf count movf mulcnd,w bcf STATUS,C Loop rrf mulplr,F btfsc STATUS ,C addwf H_byte,F rrf H_byte,F rrf L_byte,F decfsz count,F goto loop retlw 0 . ******************************************************* ; Test Program .******************************************************* start clrw option main movfPORTA,w movwf mulplr movf PORTB,w movwf mulcnd call_m call mpy ; вызываем подпрограмму умножения ; помещаем результат в H_byte и L_byte goto main ORG OlFFh goto start END Эта простая программа считывает два значения: с порта А множи- тель, а с порта В множимое, и при помощи специальной подпрограм- мы перемножает эти числа, помещая результат в ячейки с именами H_byte и L_byte. Действие программы циклически повторяется. Про- грамма имеет иллюстративный характер, однако будучи ассемблиро- ванной, работает правильно. Исходный текст предназначен для кон- троллеров Р16С5Х, но с незначительными изменениями его можно применить и для PIC16X8X. Этот пример иллюстрирует создание пе- ремещаемого кода и библиотечного модуля. Практические примеры программ с подробными комментариями мы рассматриваем далее, в соответствующей главе. 201
Часть 2. Руководство для начинающих. Первые шаги Очевидно, что подпрограмма, перемножающая два 8-битных числа, может нам понадобиться в дальнейшем и ее целесообразно вы- делить в библиотечный модуль. Для этого, как показано далее, выде- ляем подпрограмму в отдельный фрагмент и объявляем переменные mulcnd, mulplr, H_byte и L_byte как глобальные. Также объявляем глобальным имя подпрограммы умножения тру. Для того чтобы компоновщик зарезервировал ячейки ОЗУ под переменные, отводим им секцию данных директивой UDATA и директивой RES резервиру- ем под каждую переменную необходимое число ячеек. Далее исход- ный файл ассемблируется как объектный модуль и на выходе по- лучается объектный файл с расширением ".О". Основной модуль программы считывает данные с выводов портов (по умолчанию после сброса они настроены на ввод) и вызывает под- программу умножения. Глобальные переменные и имя подпрограммы объявлены внешними, поскольку они описаны в другом модуле^ Перемещаемый код, главный (вызывающий) модуль LIST Р=16С54 ^INCLUDE "P16C5x.INC" EXTERN mulcnd, mulplr, H_byte, L_byte EXTERN mpy CODE start clrw option main movf PORTA, w movwf mulplr movf PORTB, w movwf mulcnd call_m call mpy ; вызываем подпрограмму умножения ; помещаем результат в H_byte и L_byte goto main Reset CODE H'OIFF' goto start END Перемещаемый код, библиотечная подпрограмма LIST Р=16С54 #INCLUDE "P16C5x.INC" 202
Ассеблер MPASM UDATA mulcnd mulplr H_byte L_byte count RES 1 ; 8-битное множимое RES 1 ; 8-битный множитель RES 1 ; Старший байт 16-битного результата RES 1 ; Младший байт 16-битного результата RES 1 ; Счетчик цикла GLOBAL mulcnd, mulplr, H_byte, L_byte CODE mpy GLOBAL mpy clrf H_byte clrf L_byte movlw 8 movwf count movf muland, W bcf STATUS, C loop rrf mulplr, F btfsc STATUS, C addwf H_byte, F rrf H_byte, F rrf L_byte, F decfsz count, F goto loop retlw 0 END МАКРОСЫ И МАКРОЯЗЫК Макрос - это определяемая пользователем последовательность ин- струкций процессора и директив ассемблера, которая вставляется в исходный текст при ассемблировании каждый раз, когда вызывается макрос. В макрос можно передавать аргументы извне, что делает его очень гибким. Преимуществом применения макросов является: - высокий уровень абстракции, повышающий читаемость и по- нятность программы; - компактное представление часто встречающихся функций; - простота внесения изменений; '-хорошая тестируемость. СИНТАКСИС МАКРОСА Макросы описываются при помощи директивы MACRO: <label> macro [<argl>, <arg2>,..., <argn>] 203
Часть 2. Руководство для начинающих. Первые шаги endm Описание макроса должно быть обязательно завершено директивой ENDM. Будьте внимательны и убедитесь, что не завершили макрос ди- рективой END Встретив директиву END, ассемблер расценит ее как ко- нец программы и ассемблирование будет прервано. Макрос обязательно должен иметь имя <label>, но в него не обязательно передаются аргумен- ты. Значения, связанные с этими аргументами, подставляются в выраже- ния, когда имя аргумента встречается в теле макроса. Выполнение макро- са продолжается до тех пор, пока не встретится директива EXITM или ENDM. Директива LOCAL описывает локальные переменные макроса и применяется только внутри макросов. Предыдущий "формат с точкой" для описания специальных макро- директив MACRO, LOCAL, EXITM и ENDM больше не поддержива- ется. В целях совместимости старые тексты для ASM 17, в которых применен этот формат, будут ассемблироваться текущими версиями MPASM, но для гарантии совместимости в будущем старые тексты лучше откорректировать ПОДСТАНОВКА ТЕКСТА Строковая замена и вычисление выражений осуществляется толь- ко внутри тела макроса и представляет собой достаточно оригиналь- ный и мощный метод. Рассмотрим его подробнее. Команда <arg> заменяет имя аргумента в выражении его значением. Пример: Read macro device, buffer, count movlw device movwf ram_20 movlw buffer movwf ram_21 movlw count call sys_21 endm В этом примере именами аргументов являются device, buffer и count. Если вызвать макрос Read строкой Read Н'16', Н'24', Н'32' то аргументам device, buffer и count будут присвоены соответственно шестнадцатеричные значения Н'16', Н'24' и Н'32'. Когда имена аргу- 204
Ассеблер MPASM ментов будут встречаться в теле макроса, вместо них ассемблер будет подставлять соответствующие значения. Аргументы не используются как часть обычных выражений. Можно писать "movlw buffer", но нельзя "movlw buffer+12". Команда #v(<expr>) возвращает целое значение выражения <ехрг> для подстановки в текст. Обычно применяется для создания уникальных имен переменных, имеющих одинаковый для всех пре- фикс или суффикс. Не может быть использована в директивах, ассем- блируемых по условию (т.е. IFDEF, WHILE). Пример: define_table macro local a = О while a < 3 entry#v(a) dw 0 a += 1 endw endm После вызова макроса будут сгенерированы имена переменных в секции данных: entryO dw О entry I dw О entry2 dw 0 entry3 dw 0 ПРИМЕНЕНИЕ МАКРОСОВ Если макрос однажды определен, он может быть вызван в любом месте программного модуля при помощи макровызова: <macro_name> [<arg>, ..., <arg>] где <macro_name> - имя определенного ранее макроса, <arg> - ар- гументы макроса, если они требуются. Макрос, вызывающий сам се- бя, не занимает дополнительного места в памяти. Тем не менее, гене- рируемые расширения каждого макроса будут начинаться с текущей позиции программной памяти. Для резервирования места в списке аргументов могут использо- ваться кавычки. В этом случае аргумент будет представлять собой пустую строку. Список аргументов прерывается пробелом или точкой с запятой. Директива EXITM предоставляет альтернативный метод прерывания макроса. Если эта директива встречается во вложенном макросе, то происходит возврат в макрос предыдущего уровня. 205
Часть 2. Руководство для начинающих. Первые шаги ПРИМЕРЫ МАКРОСОВ Первый пример представляет собой макрос, написанный для кон- троллера PIC17C42, и выполняет перемножение двух 8-битных чисел. Множители и имена ячеек, в которые помещается результат, переда- ются в виде аргументов. subtitle "macro definitions" ; подзаголовок страницы листинга multiply macro argl, arg2, dest_hi, destjo local i = 0 ; создаем локальную переменную ; и присваиваем ей значение movlw argl ; принимаем значение множителя movwf mulplr movlw arg2 clrf dest_hi clrf destjo bcf _carry while i < 8 ; помещаем множимое в регистр w ; очищаем старший байт результата ; очищаем младший байт результата ; сбрасываем бит переноса ; цикл обработки всех восьми битов addwf destjii ; прибавляем множимое rrcf dest_hi ; сдвиг вправо через перенос rrcf destjo ; сдвиг еще раз с захватом бита переноса i+= 1 endw endm ; если он был установлен предыдущим сдвигом ; инкремент счетчика цикла ; прекратить после восьми повторений ; конец макроса Когда по ходу написания некой прикладной программы необходимо несколько раз поместить в нее фрагмент, выполняющий перемножение двух чисел, нет нужды повторять фрагмент исходного кода, надо лишь вызвать макрос и передать ему в качестве аргументов имена необхо- димых переменных (множителей и приемников результата) В выход- ной исполняемый код при ассемблировании будут помещены необходи- мые процессорные команды со ссылками на соответствующие ячейки памяти Разумеется, это иллюстративный пример, и логичнее было бы оформить этот фрагмент как подпрограмму Но бывают случаи, ког- да, например, необходимо выполнять одинаковую последовательность действий над разными ячейками памяти (регистрами общего пользова- ния), а свободных ячеек для использования в качестве временных пере- менных нет - и нет возможности передавать данные в подпрограмму Либо глубина стека подпрограмм исчерпана В таких случаях помогает применение повторяющихся фрагментов кода 206
Ассеблер MPASM В следующем примере мы напишем макрос, сравнивающий пере- менные file и con и уходящий на метку jump_to, если file>=con: cfljge macro file, con, jump_to movlw con subwf file, w btfsc status, carry goto jump_to endm Если теперь мы вызовем макрос строкой cfljge switch_val, max_switch, switch_on то ассемблер сгенерирует нам выходной код, эквивалентный следую- щему фрагменту программы: movlw max_switch subwf switch_val, w btfsc status, carry goto switch_on ОПЕРАТОРЫ И СИМВОЛЫ В этом разделе перечислены все арифметические и логические опе- раторы и символы, которые вы можете использовать при работе с директивами ассемблера и написании макросов. $ Текущий/возвратный про- граммный адрес goto $+3 ( Левая скобка (l+d)*4 ) Правая скобка (1 +d)*4 I Логическое НЕ if! (a==b) - Инверсия (двоичное допол- нение) -l*MyVar Дополнение flags=~flags high Возвращает старший байт movlw high CTR_Table low Возвращает младший байт movlw low CTR_Table upper Возвращает наибольший байт movlw upper CTR_Table * Умножение a=b*c / Деление a=b/c % Модуль entry Jen=tot Jen% 16 + Сложение totjen=entryjen*8+1 207
Часть 2. Руководство для начинающих. Первые шаги - Вычитание entry_len=(tot_len-l)/8 « Сдвиг влево flags=flags«l >> Сдвиг вправо flags=flags»l >= Больше или равно if entryjdx >= num_entries > Больше, чем... if entryjdx > num_entries < Меньше, чем... if entryjdx < num_entries <= Меньше или равно if entryjdx <= num_entries = — Равно if entryjdx == num_entries = Не равно (в сочетании с "!") if entryjdx != num_entries & Побитное И flags=flags & ERRORJ3IT Л Побитное исключающее или flags=flags л ERROR_BIT 1 Побитное ИЛИ flags=flags | ERRORJ3 IT && Логическое И if (len==5!2) && (b==c) II Логическое ИЛИ if (len==512) || (b==c) — Сделать равным... entryJndex=0 += Сложить и присвоить значение... entryjndex += 1 — Вычесть и присвоить значение... entryjndex -= 1 *— Умножить и присвоить значение... entryjndex *= entryjength /= Разделить и присвоить значение... entryJotal /= entryjndex %= Взять по модулю, присво- ить значение... entryjndex %= 8 «= Сдвинуть влево, присвоить значение... flags «= 3 »= Сдвинуть вправо, присво- ить значение... flags »= 3 &= Логическое И, присвоить значение... flags &= ERROR_FLAG 1= Логическое ИЛИ, присво- ить значение... flags |= ERROR_FLAG Л — Исключающее ИЛИ, при- своить значение... flags A=ERROR_FLAG ++ Инкремент i ++ — Декремент i - 208
Ассеблер MPASM Операторы инкремента и декремента могут применяться к пере- менной только в качестве единственного оператора в строке; они не могут быть встроенным фрагментом более сложного выражения. Пример: LoopCount = 4 while LoopCount>0 rlf Reg, f LoopCount - endw Операторы HIGH, LOW и UPPER применяются для возврата одного байта из многобайтного значения, соответствующего метке (имени). Они устанавливают должным образом динамический указатель при выполне- нии инструкций табличного чтения / табличной записи. Пример: movlw low size movpf wreg, low sizejo movlw high size movpf wreg, high size_hi ПРИМЕНЕНИЕ АССЕМБЛЕРА ДЛЯ ПРОГРАММИРОВАНИЯ EEPROM Кроме микроконтроллеров, компания Microchip® выпускает до- вольно широкий ассортимент электрически стираемых микросхем памяти (EEPROM). Эти микросхемы программируются по последо- вательному каналу. Ассемблер позволяет готовить данные для записи в эти микросхемы. Чтобы перевести его в этот режим, необходимо в исходном тексте в качестве процессора указать EEPROM8 или EEPROM16. Данные генерируются побайтно, но EEPROM8 подра- зумевает 8-битное слово, a EEPROM 16-битное слово. По умолчанию размер памяти составляет 128 байт. Он может быть изменен применением директивы LIST M=<max address>. Учтите, что значение <max address> может быть только десятичным числом. Файл заголовка MEMORY.INC, поставляемый в составе пакета MPLAB-IDE, позволяет определять максимальный адрес для всех до- ступных микросхем памяти Microchip®. Описывающий микросхему символ имеет формат <device>. Например, чтобы установить макси- мальный размер памяти для микросхемы 24LCS21 используйте дирек- тиву LIST M=_24LCS2L ДО
Часть 2. Руководство для начинающих. Первые шаги Для работы с микросхемами памяти ассемблер поддерживает ди- рективы генерации данных DW, FILL и ORG. Результат работы дру- гих директив генерации данных не гарантируется. Все остальные ди- рективы не изменяются. В качестве примера рассмотрим файл генерации данных для про- граммирования микросхемы памяти. .Яс************************************************ 9 LIST P=EEPROM8, R=DECIMAL INCLUDE "MEMORY.INC" LIST M=_24LCS21 #DEFINE MAXJVALUE 255 ORG 0 ; Создаем исходную строку данных, которую завершает ноль. DW "Hello World", О ; Создаем схему отображения данных в строке. Позиция X ; подразумевает расположение данных в микросхеме. ; Значение Y сохраняется в микросхеме. ; Сначала описываем функцию LineO для строки. #DEFINE Line( X) Slope * X + Y_Intercept ; Теперь описываем переменные, необходимые для функции. Slope EQU 10 Y_Intercept EQU 5 ; Объявляем и инициализируем значения X и Y VARIABLE X = 0, Y = Line( X) ; Генерируем значения до тех пор, пока максимальное значение Y ; не достигнуто, или пока микросхема не заполнена. WHILE (Y <= МАХ_VALUE) && ($ <= _24LCS21) DW Y X = X+ 1 Y = Line( X) ENDW 210
Ассеблер MPASM ; Выполняем некоторые проверки на основании данных о строке, ; полученных выше. ; Если микросхема заполняется раньше, чем достигнут конец строки, ; генерируется ошибка. Иначе, если микросхема едва ; не переполнилась, генерируется сообщение. IF (Y < MAX_VALUE) ERROR "Микросхема переполнена." ELSE IF (($+10) > _24LCS21) MESSG "Микросхема почти переполнена." ENDIF ENDIF ; Заполняем остаток памяти нулевыми значениями. FILL 0,_24LCS21 -$+ 1 END Начинающих программистов прошу еще раз обратить внимание, что в приведенном выше тексте выражения и функции не являются программой, которую исполняет микроконтроллер. Это программа, которую исполняет ассемблер "внутри себя" Результатом исполнения этой программы будет либо шестнадцатеричный выходной файл, ко- торый можно при помощи программатора записать в микросхему памяти, либо сообщение об ошибке, если текстовая строка не поме- щается в памяти Конечно, исходными данными не обязательно должна быть текстовая строка. Это может быть набор констант или идентификаторов. КОМПОНОВЩИК MPLINK MPLINK является компоновщиком для фирменного ассемблера MPLAB и компилятора MPLAB-C17/C18, а также используется сов- местно с менеджером библиотек MPLIB. MPLINK выполняет следующие задачи: Распределяет коды и данные. Получив исходный файл перемещае- мого кода, и основываясь на специальном файле скрипта MPLINK определяет, в какую часть программной памяти будут размещены коды и в какую область RAM будут помещены переменные.
Часть 2. Руководство для начинающих. Первые шаги Распределяет адреса. Обращения к внешним объектам в исходном файле порождают перемещаемые ссылки в объектном файле. После того, как MPLINK разместит коды и данные в памяти, информация о перемещаемых ссылках (в виде таблицы условных ссылок) использу- ется для обновления всех внешних ссылок и присвоения им конкрет- ных физических адресов. Генерирует исполняемый код. Выдает файл в формате .HEX, кото- рый может быть записан в память микроконтроллера, внутрисхемно- го эмулятора или использован для программной симуляции. Конфигурирует размер и расположение стека. Требуется примене- ние компилятора MPLAB-С 17/C 18 для выделения дополнительного пространства RAM под динамический стек. Отслеживает конфликты адресов. Гарантирует, что программа или данные не будут размещаться в пространстве адресов, которое уже занято или ранее зарезервировано. Предоставляет символьную информацию для отладки. Выдает файл, который MPLAB использует при отладке, чтобы отслеживать адреса меток, расположение переменных, а также позволяет увязы- вать отлаживаемый код со строками текста в исходном файле. Управление процессом компоновки осуществляется при помощи скриптов компоновщика и опций командной строки. Можно создать приложение из готовых библиотечных модулей, либо из комбинации вновь написанного исходного кода и предварительно скомпилиро- ванных модулей, либо подготовить предварительно скомпилирован- ные модули для различных приложений. При достаточно серьезной работе, связанной с разработкой приложений, следует стремиться к созданию собственной коллекции проверенных и откомпилирован- ных перемещаемых модулей, поскольку в дальнейшем их наличие значительно облегчает создание программ для микроконтроллеров. Кратко суть работы компоновщика можно выразить схемой на рис. 2-18. MPLINK комбинирует различные входные объектные модули, ге- нерируемые при помощи MPASM или MPLAB-С 17/C 18 в один вы- ходной исполняемый hex-файл. Скрипт компоновщика описывает, как именно должны быть скомбинированы эти модули. MPLINK начинает работать после ассемблирования или компиляции переме- щаемых объектных модулей. Реальные адреса данных и расположение функций могут быть определены при компоновке. Это способ, при котором посредством скрипта вы можете проинструктировать MPLINK поместить коды и-данные где-либо в именованных областях памяти. Именованные области памяти могут быть как строго опре- деленными физическими адресами, так и не являться ими. 212
Компоновщик MPLINK Рис. 2-18. Диаграмма взаимодействия MPLIB с другими модулями Скрипт компоновщика также сообщает, какие области памяти данных и программ физически доступны для заданного микроконт- роллера. Затем компоновщик пробует разместить программный код в память программ и распределить переменные в памяти данных. Если программа слишком велика, либо для хранения переменных не хвата- ет ячеек, MPLINK генерирует сообщение об ошибке. В этом случае надо попробовать еще раз разобраться, какие переменные являются временными и могут использовать одну и ту же ячейку ОЗУ и попы- таться оптимизировать программный код, в противном случае при- дется использовать более мощный микроконтроллер. Использование компоновщика позволяет очень гибко использовать определенную область ОЗУ под хранение значений переменных из разных участков программы. Если, например, некоторые значения переменных ис- пользуются только в фрагменте кода инициализации по сбросу, то затем эти же ячейки могут быть "отданы" для хранения переменных другого фрагмента программы. Достаточно лишь соответствующим образом описать переменные и область памяти (см. раздел директив MPASM) и компоновщик автоматически распределит адреса в вы- ходном коде. Вам не понадобится постоянно помнить, какая ячейка освободилась и жестко присваивать им имена. Впрочем, в случае с 213
Часть 2. Руководство для начинающих. Первые шаги несложными программами, имена переменных очень часто ставят в соответствие определенным адресам ОЗУ. Мы тоже будем так делать в примерах простых программ. Существует огромное количество различных библиотечных фай- лов, практически для всех типов микроконтроллеров Microchip, напи- санных как на ассемблере, так и на MPLAB-C17/C18. Большинство из них бесплатно распространяется в сети Internet. При наличии доста- точно полной библиотеки создание приложения может свестись к на- писанию небольшого по объему специального модуля и последующей компоновке его с нужными объектными файлами из имеющегося на- бора. ВХОДНЫЕ И ВЫХОДНЫЕ ФАЙЛЫ КОМПОНОВЩИКА Рассмотрим подробнее, какие входные и выходные файлы исполь- зуются при работе компоновщика. Входные файлы Объектные файлы (.О) - перемещаемые коды, создаваемые из ис- ходных файлов. Библиотечные файлы (.LIB) - коллекция объектных файлов, со- бранных вместе для удобства. Скрипты компоновщика (.LKR) - расшифровка распределения памяти для индивидуальных процессоров / проектов. Примечание: исходные файлы используются, если генерируется файл листинга. Выходные файлы: Файлы COFF (.OUT, .COF) - промежуточные файлы, используе- мые компоновщиком MPLINK для генерации файлов .COD, .HEX или .LST. Файл кода (.COD) - отладочный файл, используемый MPLAB. Исполняемый файл (.HEX) - двоичный исполняемый файл, не со- держащий никакой отладочной информации. Файл листинга (.LST) - файл, содержащий оригинальный исход- ный код совместно с окончательным двоичным кодом и некоторой служебной информацией. Файл карты памяти (.МАР) - показывает распределение памяти после компоновки, включая занятые и не занятые участки. MAP-файл представляет собой обычный текстовый файл и его можно открыть для просмотра командой меню MPLAB File>Open. Окно автоматически обновляется при каждой перекомпиляции про- екта. В файле находится информация о физическом размещении вы- 214
Компоновщик MPLINK ходных кодов программы и данных после компоновки. Файл содер- жит три таблицы. Первая таблица (Section Info) содержит информа- цию о каждой секции, включая имя секции, ее тип, начальный адрес, в какой области памяти находится секция: данных или программ и ее размер в байтах. Существует четыре типа секций: код (code) инициализированные данные (idata) неинициализированные данные (udata) инициализированные данные ROM (romdata). Пример: Section Info Section Type Address Location Size(Bytes) Reset code 0x000000 program 0x000002 .cinit romdata 0x000021 program 0x000004 .code code 0x000023 program 0x000026 .udata udata 0x000020 data 0x000005 Вторая таблица (Symbols - Sorted by Name) предоставляет инфор- мацию о символьных именах в выходном модуле. Под символьными именами подразумеваются имена меток и переменных. Символы рас- сортированы по имени и для них указаны имя, адрес, тип памяти в котором он находится, имеет ли символ статическую или внешнюю связь и имя файла, в котором он определен. Пример: Symbols - Sorted by Name Name Address Location Storage File call_m 0x000026 program static C:\MPLAB\ASMFOO\sampobj.asm loop 0x00002e program static C:\MPASMV2\MUL8X8.ASM main 0x000024 program static C:\MPLAB\ASMFOO\sampobj.asm mpy 0x000028 program extern C:\MPASMV2\MUL8X8ASM start 0x000023 program static C:\MPLAB\ASMFOO\sampobj.asm Hbyte 0x000022 data extern C:\MPASMV2\MUL8X8ASM Lbyte 0x000023 data extern C:\MPASMV2\MUL8X8ASM count 0x000024 data static C:\MPASMV2\MUL8X8.ASM mend 0x000020 data extern C:\MPASMV2\MUL8X8.ASM mulplr 0x000021 data extern C:\MPASMV2\MUL8X8ASM Третья таблица (Symbols - Sorted by Address) предоставляет ту же информацию, что и вторая таблица, но отсортированную по адресам, а не по символьным именам. Если возникает ошибка компоновки, то 21S
Часть 2. Руководство для начинающих. Первые шаги законченная карта памяти не создается. Тем не менее, если в команд- ной строке (например, при настройке опций проекта - см. выше) бу- дет задана опция -гл, то будет создан файл карты с сообщением об ошибке. Этот файл содержит только информацию о секциях - данных о символах в нем нет. В сочетании с сообщением об ошибке этой ин- формации достаточно, чтобы понять, почему одна или несколько секций не могут быть размещены в памяти. ВЗАИМОСВЯЗЬ ПРОЕКТОВ MPLAB С MPLINK Как вы помните, проект MPLAB представляет из себя композицию некоторых модулей или блоков (nodes), среди которых могут быть (не обязательно все сразу) исходные файлы ассемблера, исходные файлы С, библиотечные файлы, предварительно откомпилированные объ- ектные файлы и файлы скриптов компоновщика. В результате обра- ботки проекта генерируются выходные файлы - мы достаточно по- дробно рассмотрели их раньше. Наряду с ассемблером и компилято- ром С17/С18, MPLINK играет роль инструмента, при помощи кото- рого обрабатывается проект. НАСТРОЙКА ПРОЕКТА MPLAB ДЛЯ ИСПОЛЬЗОВАНИЯ MPLINK После создания проекта (Project > New Project) вы получаете до- ступ к окну редактирования свойств проекта. Мы подробно рассмот- рели работу с этим окном ранее, в главе, описывающей работу с MPLAB. Выделите имя проекта щелчком мышки и, когда станет ак- тивной кнопка "Node Properties", нажмите на нее. В диалоге "Node Properties", в поле "Language Tool" выберите MPLINK. Если необхо- димо, установите другие опции компоновщика. Добавьте исходные файлы в ваш проект, используя кнопку "Add Node". Укажите программный инструмент, при помощи которого будет скомпилирован каждый исходный файл, выбирая имя этого файла и нажимая кнопку "Node Properties". Добавьте предварительно откомпилированные файлы и библиоте- ки (например, входящие в состав MPLAB-C17/C18). Вы можете доба- вить несколько файлов одновременно, если выбирая файлы в списке будете удерживать нажатой клавишу <Ctrl>. Затем добавьте скрипт компоновщика в качестве одного из модулей проекта, используя кнопку "Add Node" Окончив настройку, нажмите кнопку "ОК" окна редактирования свойств проекта. 216
Компоновщик MPLINK Генерация выходных файлов Когда проект MPLAB настроен, вы можете выполнить его сборку, запустив процесс обработки командой меню Project > Make Project. Сгенерированные hex-файлы автоматически загружаются в ОЗУ ва- шего компьютера. Кроме этого, генерируются дополнительные фай- лы для документирования и отладки, их назначение мы рассмотрели в разделе "Входные и выходные файлы компоновщика". СКРИПТЫ КОМПОНОВЩИКА Скрипт компоновщика является его командным файлом и описывает: Память данных и память программ Размер стека и его расположение (для MPLAB-С 17/C 18) Логические секции, используемые в исходном коде для размещения кодов и данных. Существуют четыре основные категории директив, применяемых в скриптах. Сейчас мы подробнее рассмотрим каждую из этих дирек- тив. Комментарии в скриптах помечаются символами косой черты любой текст, помещенный между этими символами, игнорирует- ся. Мы не будем описывать опции командной строки, потому что ме- неджер проектов MPLAB автоматически подставляет их в соответст- вии с настройками диалоговых окон. Вероятность того, что вы будете работать непосредственно с командной строкой, очень мала, но в случае необходимости вы можете обратиться к файлу помощи MPLINK. ОПРЕДЕЛЕНИЕ РЕГИОНОВ ПРОГРАММНОЙ ПАМЯТИ Для описания памяти кода программы, инициализированных значений данных, значений констант а также внешней памяти для контроллеров PIC17CXX используется директива CODEPAGE. Она имеет формат CODEPAGE NAME=memName START=addr END=addr [PROTECTED] [FILL=fillvalue] 'memName' - любая строка ASCII, применяемая для идентифика- ции региона памяти; 'addr' - десятичное или шестнадцатеричное значение начального или конечного адреса; 'fillvalue' - переменная, которой заполняется любой незанятый блок памяти. Если она представлена в десятичном формате, то долж- на соответствовать любому 16-битному числу, если в шестнадцате- 217
Часть 2. Руководство для начинающих. Первые шаги ричном формате, то может иметь любую длину, кратную полному слову в 16 бит; PROTECTED - регионы памяти, помеченные этим необязательным ключевым словом, не используются для обычного размещения про- грамм или данных. Эти регионы предназначены для специального применения и вы можете поместить в них только коды или данные, специально помеченные как "#pragma code/udata" в исходном коде MPLAB-C17/C18 или "code/udata" в исходном коде MPASM. Пример: Этот пример описывает распределение памяти для микроконтрол- лера PIC17C42A. CODEPAGE NAME=vectors START=0x0 END=0x27 PROTECTED CODEPAGE NAME=pageO START=0x28 END=0x7FF CODEPAGE NAME=. config START=0xFE00 END=0xFE0F PROTECTED ОПРЕДЕЛЕНИЕ РЕГИОНОВ ОЗУ Область памяти ОЗУ микроконтроллера состоит из ячеек предназ- наченых для хранения значений специальных функциональных регис- тров (СФР), и ячеек ОЗУ для хранения переменных. Ячейки памяти для хранения пользовательских значений переменных иначе называ- ют регистрами общего назначения. Директивы DATABANK, SHAREBANK и ACCESSBANK применяются для различных данных во внутренней оперативной памяти. Для регистров, разделенных на банки: DATABANK NAME=memName START=addr END=addr [PROTECTED] Для регистров, не разделенных на банки: SHAREBANK NAME=memName START=addr END=addr [PROTECTED] Регистры доступа (только для PIC18CXX): ACCESSBANK NAME=memName START=addr END=addr [PROTECTED] 'memName' - любая строка ASCII, применяемая для идентифика- ции региона памяти; 'addr' - десятичное или шестнадцатеричное значение начального или конечного адреса; PROTECTED - ячейки памяти, помеченные этим необязательным словом, могут быть использованы только для переменных, специаль- но отмеченных в исходном коде. Далее приводятся два примера скрипта для процессора PIC17C42A. Карта распределения регистровых ячеек приведена в 218
Компоновщик MPLINK таблице. Как нетрудно заметить, часть памяти не разбита на банки, как, например диапазон адресов 00h...0Fh, но есть участки памяти, разбитые на банки. Адрес Bank 0 Bank 1 Bank 2 Bank 3 00h INDFO Olh FSRO OEh TBLPTRH OFh BSR lOh PORTA DDRC TMR1 PW1DCL llh DDRB PORTC TMR2 PW2DCL 16h TXREG PIR PR3LCA1L TCON1 17h SPBRG PIE PR3HCA1L TCON2 18h PRODL 19h PRODH lAh IFh Регистры общего применения, не разделенные на банки 20h FFh Регистры общего при- менения Регистры общего при- менил Не используется Пример А - память с разделением на банки DATABANK NAME=sfrO START=0x 10 END=0xl7 PROTECTED //Специальный функциональный регистр в BankO DATABANK NAME=sfr 1 START=0x 110 END=0x 117 PROTECTED //Специальный функциональный регистр в Bankl DATABANK NAME=sfr2 START=0x210 END=0x217 PROTECTED //Специальный функциональный регистр в Bank2 DATABANK NAME=sfr3 START=0x310 END=0x317 PROTECTED //Специальный функциональный регистр в ВапкЗ DATABANK NAME=gprO START=0x20 END=0xFF //Регистр общего применения в BankO DATABANK NAME=gprl START=0xl20 END=0xlFF //Регистр общего применения в Bankl 219
Часть 2. Руководство для начинающих. Первые шаги Пример В - память без разделения на банки SHAREBANK NAME=sfmobnk START=0x0 END=0xF PROTECTED //INDFO через BSR - доступен во всех банках SHAREBANK NAME=sfmobnk START=0x 100 END=0x 1 OF PROTECTED //INDFO через BSR - доступен во всех банках SHAREBANK NAME=sfmobnk START=0x200 END=0x20F PROTECTED //INDFO через BSR - доступен во всех банках SHAREBANK NAME=sfmobnk START=0x300 END=0x30F PROTECTED //INDFO через BSR - доступен во всех банках SHAREBANK NAME=sfrprod START=0xl8 END=0xl9 PROTECTED //PRODL, PRODH - доступен во всех банках SHAREBANK NAME=sfrprod START=0xl 18 END=0xl 19 PROTECTED //PRODL, PRODH - доступен во всех банках SHAREBANK NAME=sfrprod START=0x218 END=0x219 PROTECTED //PRODL, PRODH - доступен во всех банках SHAREBANK NAME=sfrprod START=0x319 END=0x319 PROTECTED //PRODL, PRODH - доступен во всех банках SHAREBANK NAME=gpr2 START=0xlA END=0xlF PROTECTED //1А через 1F - доступен во всех банках SHAREBANK NAME=gpr2 START=0xl 1A END=0xl IF PROTECTED //1А через IF-доступен во всех банках SHAREBANK NAME=gpr2 START=0x21A END=0x21F PROTECTED //1А через 1F - доступен во всех банках SHAREBANK NAME-gpr2 START=0x31A END=0x31F PROTECTED //1А через 1F - доступен во всех банках ОПРЕДЕЛЕНИЕ ЛОГИЧЕСКИХ СЕКЦИЙ Логические секции применяются для описания того, какие регио- ны памяти могут быть использованы для определенных фрагментов исходного кода. Для использования логических секций определите секцию с неким именем в файле скрипта при помощи директивы SECTION и затем сошлитесь на это имя в исходном файле, применяя соответствующий механизм управления компиляцией (например, сек- цию #pragma для MPLAB-C17/C18). Директива SECTION описывает секцию, используя ее имя и блок программной памяти в ПЗУ либо блок памяти данных в ОЗУ: SECTION NAME='secName' { ROM-memName | RAM-memName'} 'secName' - строка ASCII для идентификации секции, ее имя; 'memName' - предварительно определенные области памяти, такие как ACCESSBANK, SHAREBANK, DATABANK или CODEPAGE. 220
Компоновщик MPLINK Аттрибут ROM должен всегда ссылаться на память программ, пред- варительно определенную директивой CODEPAGE. Аттрибут RAM должен всегда ссылаться на память данных, предварительно опреде- ленную директивами ACCESSBANK, DATABANK или SHAREBANK. Пример: Для того, чтобы секция, имя которой 'filter_coeffs', была загружена в предварительно определенный логический блок с именем 'constants', в командный файл компоновщика должна быть добавлена следующая строка: SECTION NAME=filter_coeffs ROM=constants Для размещения исходного кода MPASM в секцию filter_coeffs, перед необходимым исходным кодом ассемблера должна стоять строка: filter_coeffs CODE ОПРЕДЕЛЕНИЕ СТЕКА Для MPLAB-С 17/C 18 требуется программная установка стека. Следующий оператор описывает размер стека и (опционально) банк данных, в котором стек будет расположен: STACK SIZE-allocSize' [RAM-'memName'] 'allocSize' - размер стека в байтах; 'memName' - имя блока памяти, предварительно объявленного директивами ACCESSBANK, DATABANK или SHAREBANK. Пример: Чтобы размер стека был определен как '0x20' в области ОЗУ, пред- варительно определенной как 'gprO', в скрипт компоновщика должна быть включена строка: STACK SIZE=0x20 RAM=gprO НЕКОТОРЫЕ ПРЕДУПРЕЖДЕНИЯ ПО ПОВОДУ ПРИМЕНЕНИЯ СКРИПТОВ Компания Microchip® приводит следующие предупреждения, свя- занные с применением скриптов компоновщика: Вполне возможно, что перед использованием вам понадобится мо- дифицировать файлы скриптов, поставляемые в комплекте с MPLINK. Вам понадобится устанавливать размер стека, если вы используете MPLAB-C17/C18 с MPLINK. 1М
Часть 2. Руководство для начинающих. Первые шаги Вам понадобится разделять страницы памяти, если ваш код со- держит инструкции GOTO или CALL без применения псевдоинструк- ции PAGESEL. В MPASM вы не можете переключать впред-назад секции в оди- ночном файле, т.е. вы не должны делать нечто наподобие этого' CODE MY_ROM (инструкции программы) UDATA MY_VARS (переменные) CODE MY_ROM (вновь инструкции программы) КАК РАБОТАЕТ КОМПОНОВЩИК? В предыдущих разделах этой главы мы в общих чертах описали, какие задачи выполняет компоновщик. Вполне возможно, что мно- гим разработчикам этой информации будет достаточно. Для более глубокого знакомства с компоновщиком MPLINK надо знать не только что он делает, но и как он это делает. Итак, как мы уже знаем, компоновщик комбинирует входные объ- ектные модули в один выходной исполняемый модуль. Входные объ- ектные модули могут содержать перемещаемые или абсолютные сек- ции кода или данных, которые компоновщик разместит в памяти. Архитектура памяти описана в скрипте компоновщика. Скрипт пре- доставляет гибкий механизм для спецификации блоков памяти. Если компоновщик не может найти блок памяти, в котором должна распо- лагаться специфицированная секция, то генерируется ошибка. Как только компоновщик успешно распределил все секции из всех входных модулей в доступной памяти, начинается процесс перерас- пределения свойств указателей или символов. Остановимся подробнее на обобщенном понятии символа. Использование символов является механизмом для описания и идентификации различных частей про- граммы. Этими частями являются имена функций, имена переменных, имена секций, имена файлов и т.д. В зависимости от контекста, когда мы говорим о символах, мы можем иметь в виду имена переменных, имена меток, другие понятия. Соответственно, если мы говорим о пе- 222
Компоновщик MPLINK ременной, то имени переменной (ее символу) поставлен в соответст- вие адрес ОЗУ или смещение от начального адреса. Если мы говорим о подпрограмме, то ее имени (символу) поставлен в соответствие аб- солютный или относительный адрес в памяти программ. Эти адреса являются значениями названных символов. Указатели-символы, определенные в каждой входной секции, имеют условные значения адреса, отсчитываемые относительно начала секции. Впоследствии компоновщик придает этим адресам конкретные значения в соответствии с текущими адресами секций. После того, как компоновщик перераспределил значения символов в каждой входной секции, он рассчитывает значения внешних симво- лов. Компоновщик пытается установить соответствие между всеми символьными ссылками и символьными значениями. Если для неко- торых символьных ссылок не удается подобрать соответствующее внешнее определение, делается попытка найти эти определения в под- ключенных библиотечных файлах. Если и там нужные определения не найдены, генерируется сообщение об ошибке. АЛГОРИТМ РАЗМЕЩЕНИЯ СЕКЦИЙ Алгоритм размещения кодов и данных, именуемых секциями, поз- воляет компоновщику эффективно управлять размещением этих секций в памяти. Существует четыре разновидности размещения, доступных компоновщику. Секции могут быть абсолютными или перемещаемыми (неабсолютными) и они могут быть либо связаны с заданным блоком памяти при помощи командного файла компоновщика, либо не связа- ны. Итак, существует четыре типа размещения секций: абсолютный связанный; абсолютный несвязанный; перемещаемый связанный; перемещаемый несвязанный. Абсолютные секции могут быть связаны с блоком памяти при по- мощи командного файла. Но, поскольку абсолютный адрес секции является фиксированным, компоновщик в этом случае может только лишь проверить, помещается ли эта секция в указанном блоке памяти и не перекрывается ли она с другими секциями. Если для абсолютной секции в явном виде не задан блок памяти, компоновщик пытается соответствующий блок. В случае неудачи с размещением генерируется ошибка. Так как абсолютные секции могут быть размещены только по фиксированному адресу, связанные и несвязанные секции распре- деляются не упорядоченно по виду или по порядку следования исход- ных файлов, а в соответствии с необходимыми для них адресами бло- ков памяти. С) 223
Часть 2. Руководство для начинающих. Первые шаги Когда заканчивается размещение абсолютных секций, компонов- щик приступает к размещению перемещаемых связанных секций. Для них компоновщик проверяет наличие необходимого объема памяти и в случае нехватки генерирует ошибку. Размещение перемещаемых секций происходит в том порядке, в каком они описаны в командном файле. После окончания размещения связанных секций, компоновщик начинает размещать перемещаемые несвязанные секции. Компонов- щик начинает работу с наибольшей перемещаемой секции и последо- вательно переходит к меньшим секциям. При этом для каждой пере- мещаемой несвязанной секции из имеющихся блоков памяти подби- рается оптимальный. Такой алгоритм позволяет значительно уве- личить шансы бесконфликтного размещения перемещаемых несвя- занных секций. Стек не является секцией, но размещается во время обработки сек- ций. Командный файл компоновщика может либо связывать, либо не связывать стек с определенным блоком памяти. Если стек связан с определенным участком памяти, то он обязательно размещается до начала обработки перемещаемых секций. Если стек не связан, то он размещается после окончания обработки перемещаемых связанных секций, но до начала обработки перемещаемых несвязанных секций. Пример: Этот пример иллюстрирует, как компоновщик перемещает секции. Допустим, в исходном файле на языке С встречается такой фрагмент: /* File: ref.c */ char varl; /* Line 1 */ void setVarl(void) /* Line 2 */ varl = OxFF; /* Line 3 */ } Допустим, мы откомпилировали эту программу и получили сле- дующие ассемблерные инструкции (для простоты мы не приводим другие коды, генерируемые MPLAB-С 17/C 18 для поддержки точек входа в функцию и выхода из нее): 0x0000 MOVLW OxFF 0x0001 MOVLR ?? ; Потребуется задать банк для varl 0x0002 MOVWF ?? ; Потребуется установить смещение Когда компилятор обрабатывает строку 1, он создает символьную таблицу ссылок для идентификатора varl, которая содержит следую- щую информацию: Symbol[index] => name=varl, value=0, section=.data, class=extern 224
Компоновщик MPLINK Когда компилятор обрабатывает строку 3, он генерирует две пе- ремещаемые метки в секции кода для идентификатора varl, так как его окончательный адрес неизвестен до момента компоновки: Reloc[index] => address=0x0001 symbol=varl type=bank Relocpndex] => address=0x0002 symbol=varl type=offset После размещения каждой секции в памяти будут известны окончательные адреса. Когда все идентификаторы получат свои окончательные адреса, компоновщик должен откорректировать все ссылки на эти идентификаторы (символы), используя перемещаемые метки. Как показано в примере, обновляемый символ теперь будет расположен по адресу 0x125: Symbol[index] => name=varl, value=0x!25, section=.data, class=extern Если секция кода будет перемещена на начальный адрес 0x50, то обновленные перемещаемые метки будут начинаться с адреса 0x51: Relocpndex] => address=0x0051 symbol=varl type=bank Relocpndex] => address=0x0052 symbol=varl type=offset Компоновщик будет проходить по перемещаемым меткам, и уточнять связанные с ними секции. Окончательный ассемблерный эквивалент нашей программы будет таким: 0x0050 MOVLW OxFF 0x0051 MOVLR 0x1 ; Установлен банк для varl 0x0052 MOVWF 0x25 ; Установлено смещение varl ИНИЦИАЛИЗИРОВАННЫЕ ДАННЫЕ MPLINK выполняет специальную обработку входных секций с инициализированными данными. Секция инициализированных дан- ных содержит начальные значения (инициализаторы) для переменных и констант, определенных внутри нее. Поскольку переменные и кон- станты внутри секции инициализированных данных находятся в ОЗУ и при выключении питания теряются, их значения должны быть со- хранены в постоянной памяти программ (ПЗУ). Для каждой секции инициализированных данных компоновщик создает секцию в про- граммной памяти. После старта по сбросу инициализирующие значения специальным кодом (предоставляемым с MPLAB С17/С18 и MPASM) переносятся в соответствующие ячейки ОЗУ. Имена инициализированных секций в памяти создаются компо- новщиком с теми же именами, что и у входных секций инициализиро- ванных данных, но с добавлением "_i". Например, если входной мо- 8 Зак № 4879 Яценкон 225
Часть 2. Руководство для начинающих. Первые шаги дуль содержит секцию инициализированных данных с именем ",idata_main.o", то компоновщик создаст в программной памяти сек- цию с именем ".idata_main.o_i", содержащую данные- инидиализаторы В дополнение к созданию секции инициализаторов, компоновщик создает в программной памяти секцию, именуемую ".cinit". Эта секция содержит таблицу со списками для каждой секции инициализированных данных. Каждая запись является триплетом, указывающим, где в программной памяти начинается секция инициа- лизаторов, где в памяти данных начинается секция инициализиро- ванных данных и сколько байтов в секции инициализированных дан- ных. Загрузочный код по сбросу обращается к этой таблице и перено- сит данные в ОЗУ. Существуют и другие примеры, очень большие и сложные, иллюс- трирующие применение компоновщика, но их описание выходит за рамки этой книги Как правило, сложные проекты из множества фай- лов, со сложными скриптами компоновщика применяются для напи- сания программ под микроконтроллеры, более мощные, чем PIC16F83/84. Для создания таких проектов недостаточно прочесть одну-две книги. Необходим опыт программирования более простых приложений, желательно для микроконтроллеров различных се- мейств. МЕНЕДЖЕР БИБЛИОТЕК MPLIB Менеджер библиотек позволяет создавать и модифицировать фай- лы библиотек Библиотечный файл является всего лишь коллекцией объектных модулей, которые сохранены в одном файле. MPLIB ис- пользует объектные модули с именем типа "filename.о" формата COFF (Common Object File Format). Этот формат используется для описания объектных/исполняемых файлов Зачем вообще создавать библиотечные файлы? Для их создания существует несколько причин: - библиотеки упрощают компоновку. Поскольку библиотечные файлы могут содержать множество объектных файлов, имя библио- течного файла может быть использовано вместо длинного перечня имен объектных файлов при компоновке. - библиотеки позволяют (а точнее, не мешают) формировать не- большие коды. Так как компоновщик использует только необходи- мые объектные файлы, содержащиеся в библиотеке, ненужные файлы не включаются в выходной модуль компоновщика. - библиотеки делают проект более "ремонтопригодным". Если библиотека включена в проект, добавление или удаление обращений к библиотеке не требует изменений процесса компоновки. 226
Менеджер библиотек MPLIB - библиотеки помогают передать назначение группы объектных модулей. Обычно в библиотеки собирают объектные модули, связан- ные неким схожим назначением, например, библиотека подпрограмм для работы с периферийными устройствами по протоколу 12С. Биб- лиотеке можно присвоить интуитивно понятное имя, и это будет го- раздо легче, чем придумывать осмысленные имена для каждого из объектных модулей, а потом пытаться их запомнить. РАБОТА С MPLIB MPLIB не требует отдельной инсталляции и устанавливается в со- ставе MPLAB-IDE. В комплекте поставки идет две версии: MPLIBD.EXE является версией для работы только под DOS или в окне DOS Windows 3.x. MPLIB.EXE является консольным 32-битным приложением для Windows 95/98/00/NT. Обе эти программы являются приложениями, запускаемыми из командной строки (консоли). Чтобы запустить менеджер библиотек MPLIB.EXE, надо открыть окно "Пуск > Программы > Сеанс MS- DOS" и запустить программу из командной строки с определенными опциями. Постоянная работа с графической оболочкой Windows рас- слабляет и отучает от работы с командной строкой. Набирая строку запуска, убедитесь, что находитесь в нужной поддиректории (это в Windows папки, а в MS-DOS директории). В этой же поддиректории должны находиться компоненты будущей библиотеки и/или готовая библиотека. Компоненты библиотеки можно в любое время добав- лять или удалять. Синтаксис командной строки для вызова MPLIB таков: mplib [/q]/{ctdrx} LIBRARY [MEMBER...] /с - создать библиотеку; создает библиотеку с именем LIBRARY и компонентами MEMBER(s). /t - список компонентов; выводит на экран таблицу со списком компонентов библиотеки. /d - удалить компонент; удаляет компонент из библиотеки. Если имя компонента не указано, библиотека не изменяется. /г - добавить/заменить компонент; если компонент с таким именем уже есть, он заменяется новым, в противном случае он добавляется в конец библиотеки. /х - извлечь компонент; если компонент есть в библиотеке, он из-, влекается в виде самостоятельного файла. Если имя компонента не задано, извлекаются все компоненты. /q - скрытый режим; никакие сообщения не выводятся на экран. 8* 227
Часть 2. Руководство для начинающих. Первые шаги Пример. Допустим, нам надо создать библиотеку с именем dsp.lib из трех файлов, которые называются fft.o, fir.о и iir.o. Для этого мы должны набрать в командной строке следующий текст: mplib /с dsp.lib fft о fir о iir.o При создании библиотек следует иметь в виду, что MPLIB создает библиотечные файлы, которые могут содержать только одиночные внешние определения для любых символов. Поэтому, если к библиоте- ке попытаться добавить файл, в котором повторяется какое-либо внешнее определение, MPLIB сгенерирует сообщение об ошибке. Ошибка возникнет даже в том случае если, например, в одном объ- ектном файле вы обращаетесь к внешней переменной MyName, а в другом файле вызываете внешнюю подпрограмму с эти же именем. При создании библиотеки строится таблица внешних определений и непонятно, какой файл и какой внешний объект поставить в соответ- ствие символу MyName. Для минимизации выходного исполняемого кода, который получается после компоновки, следует постараться предельно минимизировать объектные файлы библиотек. Благо, до- статочно постараться один раз и затем пользоваться ими постоянно. Создание объектных файлов, содержащих одиночную функцию, зачастую позволяет ощутимо минимизировать выходной код и опти- мально разместить его в памяти. 228
Часть 3 ПРОГРАММЫ И СХЕМЫ ПИШЕМ ПЕРВЫЕ ПРОГРАММЫ Для того, чтобы написать первые учебные программы и проверить их в действии, нам понадобится собрать несложную схему. Конечно, ход исполнения небольшой программы легко можно проверить на встроенном программном симуляторе, обязательно попробуйте это сделать. Но когда речь идет о программах, которые должны правиль- но работать в режиме реального времени (например, программа гене- рации звуковых сигналов), то без отладочного макета не обойтись. Простые микроконтроллеры PIC, в отличие от мощных микро- процессоров, лишены многих возможностей для организации интер- фейса с пользователем. Самые распространенные средства для вывода информации от микроконтроллера - это светодиоды и звуковые из- лучатели (биперы). Далее по сложности идут светодиодные и жидко- кристаллические индикаторы. Для ввода/управления обычно исполь- зуют кнопки или простейшую клавиатуру. Мы начнем со светодиода и бипера, но впоследствии рассмотрим и работу с ЖК-индикатором Также в этой части книги мы рассмотрим полное описание за- конченного устройства' часов-термометра с ЖК-индикатором. Описы- вая эту конструкцию, мы рассмотрим некоторые подпрограммы. Их можно впоследствии использовать в самостоятельных разработках. Первая схема показана на рис. 3-1. Все приведенные далее учебные программы ориентированы на работу с приведенными в книге схема- ми и протестированы автором. Эту схему можно собрать на небольшом кусочке макетной платы или фольгированного текстолита, выполнив соединения тонким про- водом МГТФ Схему можно питать от любого имеющегося источника стабилизированного напряжения +5 вольт. В качестве стабилизатора желательно применить микромощный стабилизатор 78LM05 Он пре- дохранит микроконтроллер от повреждения при неправильной уста- новке в панельку или при ошибке в монтаже. 229
Часть 3. Программы и схемы Рис. 3-1. Простейшая отладочная схема HELLO, WORLD! МИГАЮЩИЙ СВЕТОДИОД Простейшая ассемблерная программа, заставляющая мигать све- тодиод, подключенный к одному из портов, имеет такое же культовое значение, как программа, выводящая строку "Hello, World!" для начинающих программистов на языке С или Perl. Она позволяет ощу- тить, с чем и как вы работаете, и увидеть воочию результат своего труда. Далее мы приводим листинг этой программы. Если вы будете вводить ее текст в текстовом редакторе, то не обязательно вводить строки комментариев, которые следуют после точки с запятой. Мы очень подробно опишем алгоритм первой программы для тех, кто только начинает программировать, а более подготовленных читателей просим отнестись к этому с пониманием. Далее мы будем двигаться по принципу "от простого к сложному". ЛИСТИНГ 1 . Mt******************************************-************** ; * мигание светодиода, подключенною к выводу RA1(18) * list p-16F84 ; директива, определяющая тип процес- ;сора 230
Пишем первые программы #include <p!6F84.inc> ; файл, описывающий специфические ; переменные, соответствующие процес- сору CONFIG _CP_OFF&_WDT_OFF& JPWRTE.ON&_XTOSC ********************************************************* * описание используемых переменных ( назначение адресов * ячеек для хранения пользовательских переменных) * ********************************************************* count 1 EQU ОхОС ; переменная цикла count2 EQU OxOD ; переменная цикла ledset EQU ОхОЕ ; значение для вывода через порт ********************************************************* ; * исполняемая программа * . ********************************************************* ORG 0x000 ; вектор сброса процессора, начальный ; адрес clrf PORTA ; очистили выходные защелки порта А clrf PORTB ; и порта В bsfSTATUS, RPO ; включили банк 1 movlw b' 1111110 Г ; настроили на вывод movwf PORTA ; линию RA1 порта А, остальные на ввод movlw Ь'ОООООЮГ ; настроили порт В movwf PORTB ; линии RB0,RB2 на ввод, остальные на вы- ;вод bcfOPTION_REG, 7 ; включили подтягивающие резисторы bcfSTATUS, RPO ; включили банк 0 clrf ledset ; обнуляем значение ledset loop movlw b'0000001 O' xorwf ledset, f movf ledset, w movwf PORTA movlw OxFF movwf count 1 cycle 1 movlw OxFF movwf count2 cycle2 decfsz count2, f ; инвертируем текущее значение бита <1> ; переменной ledset, сохраняем новое значение ; в ledset и дублируем его в аккумуляторе ; выводим значение ledset в порт А из аккуму- ;лятора ; устанавливаем начальное значение перемен- ; ной ; внешнего цикла устанавливаем начальное значение перемен- ; ной ;вложенного цикла ; декремент переменной цикла count2= count2-l
Часть 3. Программы и схемы goto cycle2 ; если count2 не равна нулю, повторить декре- ; мент, decfsz count 1, f goto cycle 1 , иначе декремент переменной внешнего цикла ; если count 1 не равна нулю, повторяем цикл. ; если обе переменных счетчика обнулились, goto loop ; переходим к метке loop для вывода ; нового значения в порт и повторения процесса. end ; конец программы Пусть вас не удивляет такой, казалось бы, большой листинг для программы, выполняющей простейшую задачу. На самом деле, ис- полняемый код этой программы занимает ячейки программной памя- ти с OOOOh по OOOFh, всего лишь 16 ячеек. Почти половину этого обь- ема занимают команды начальной настройки портов и инициализа- ция значений переменных. Строка "_CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & " является директивой ассемблера, под руководством которой в выход- ной файл заносится информация о слове состояния процессора. Она означает: • _CP_OFF - бит защиты кода после программирования не уста- навливать. • _WDT_OFF - сторожевой таймер отключен. • _PWRTE_ON - таймер задержки сброса при подаче питания включен. • _XT_OSC - тип резонатора: керамический или кварцевый (кроме XT также могут быть значения LP, HS или RC, в соответствии с резо- натором в схеме). Как вы уже знаете, информация о слове состояния процессора, бу- дучи записанной в кристалл, впоследствии может быть изменена только при помощи программатора. Он получает эту информацию автоматически, из выходного hex-файла, но биты слова состояния запрограммированного контроллера вы можете изменить, пользуясь интерфейсом программы, поддерживающей программатор (в нашем случае это PicPro Light). Как работает программа? Указав ассемблеру тип процессора и подключив соответствующий файл описания pl6F84.inc, мы описыва- ем, в каких ячейках ОЗУ (регистрах общего применения) будут хра- ниться значения наших переменных. Затем приступаем к настройке портов. Сначала обнуляем значения в выходных защелках портов. В нашей программе мы могли бы этого и не делать, но правильный стиль программирования микроконтроллеров PIC требует, чтобы значения в выходных защелках были явно определены перед тем, как 132
Пишем первые программы некоторые линии будут настроены на вывод. Давайте привыкать к этому с самого начала. Затем, установив в 1 бит RP0 регистра STATUS, мы получаем до- ступ к регистровому банку 1. Теперь, обращаясь к регистрам PORTA и PORTB, мы обращаемся не к выходным защелкам, а к регистрам состояния этих портов, и настраиваем часть линий на ввод, а часть на вывод, что соответствует схеме. Устанавливаем бит RP0 обратно в О, обнуляем служебную Переменную ledset. Далее (метка loop) при помощи операции "исключающее или" ин- вертируем бит <1> переменной ledset, сохраняя значение обратно в ledset (xorwf ledset, f) и, скопировав результат в аккумулятор (movf ledset, w), выводим значение ledset в выходную защелку порта А. На линии RA1 появляется уровень, соответствующий текущему значению бита<1> переменной ledset. Затем инициализируем переменную внешнего цикла count 1. Внут- ри этого цикла вложен еще один цикл, с переменной count2. На- значение этих циклов - сформировать задержку, в течение которой на выводе порта удерживается установленное значение. Когда задержка исчерпана, в порт выводится инверсное значение и цикл повторяется. Когда вы введете текст программы, сохраните его под произволь- ным именем и откомпилируйте. Запишите при помощи программато- ра полученный hex-файл в память микроконтроллера и установите контроллер в панельку вашего макета. Когда вы подадите питание, светодиод начнет мигать. Попробуйте увеличить частоту мигания, уменьшая начальные значения переменных count 1 (movlw OxFF movwf count 1) и count2 (movlw OxFF movwf count2). Но учтите, если вы установите частоту мигания более 20...25 герц, то вам будет казаться, что светодиод го- рит непрерывно, хотя программа будет работать правильно. Если вы введете во внутренний цикл три-четыре команды NOP, то задержка заметно увеличится, соответственно уменьшится частота мигания. ПРОГРАММА ГЕНЕРАЦИИ ЗВУКА Итак, вы опробовали программу, заставляющую мигать светоди- од. Теперь сгенерируем звуковой сигнал. Поскольку для генерации импульсов звуковой частоты нужна относительно небольшая задерж- ка, программа будет еще проще, чем для мигающего светодиода. По- надобится сделать небольшие изменения имеющейся программы. Ни- же приведен листинг нового варианта программы. 233
Часть 3. Программы и схемы ЛИСТИНГ 2 if:******************************************************* , * программа генерации звука 1000Гц через вывод RB4( 10) * ц******************************************************** list p=16F84 #include <р 16F84 inc> „CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC count 1 EQU OxOC ledset EQU OxOD ORG 0x000 clr f PORTA clr f PORTB bsf STATUS, RP0 movlw b'11111101’ movwf PORTA movlw Ь'ОООООЮГ movwf PORTB bcf OPTION_REG, 7 bcf STATUS, RP0 clrf ledset loop movlw b'00010000' xorwf ledset, f movf ledset, w movwf PORTB movlw OxAO movwf count 1 cycle decfsz count 1, f goto cycle goto loop end В этой программе мы убрали одну переменную цикла, и оставили только один цикл для формирования импульсов Изменили констан- ту, при помощи которой инвертируется бит в ledset таким образом, чтобы инвертировался бит <4> Значение ledset теперь мы выводим в порт В Начальное значение переменной цикла подобрано так, чтобы при тактовой частоте 4МГц генерировались импульсы с частотой 234
Пишем первые программы 1000Гц Изменяя значение этой переменной, вы можете изменять частоту звука ОБРАБОТКА НАЖАТИЯ КНОПКИ Теперь несколько усложним нашу задачу Построим программу так, чтобы в дежурном режиме мигал светодиод, а при нажатии на кнопку S2, подключенную к выводу RB2, программа генерировала звуковой сигнал Во время генерации импульсов низкой частоты мы будем периодически опрашивать состояние кнопки, и, если она нажа- та, гызывать подпрограмму генерации звука Таким образом, мы по- лучаем комбинацию ранее написанных программ, из которых одна является главной, а другая вызывается как подпрограмма ЛИСТИНГ3 list р= 16F84 #include <pl6F84 inc> -CONFIG _CP_OFF&_WDT_OFF& JPWRTE_ON&_XT_OSC count 1 EQU OxOC , переменная цикла count2 EQU OxOD , переменная цикла count3 EQU OxOE , переменная цикла ledset EQU OxOF , значение для вывода через порт ORG 0x000 clrf clrf PORTA PORTB bsf STATUS, RP0 movlw b'lllllior movwf PORTA movlw Ь'ОООООЮГ movwf PORTB bcf OPTIONJREG, 7 bcf STATUS, RP0 clrf ledset loop movlw b’00000010* xorwf ledset, f movf ledset, w movwf PORTA movlw OxFF movwf count 1 cycle 1 movlw OxFO movwf count2
Часть 3. Программы и схемы cycle2 btfss PORTB, 2 call beep decfsz count2, f goto cycle2 decfsz countl, f goto cycle! ; проверяем кнопку S2, если нажата, вызы- ; ваем ; подпрограмму генерации звука, если не ; нажата , декремент переменной цикла count2= ; =count2-l ; если count2 не равна нулю. goto loop ; начало подпрограммы генерации звука , инициализируем переменную цикла beep movlw ОхАО movwf count3 loop_b movlw b'00010000' ; инвертируем xorwf ledset, f movf ledset, w movwf PORTB decfsz count3, f goto loop_b return end ;уровень ; на выводе ;RB4(10) ; декремент count3, если не ноль ; повторить цикл, иначе ; возврат из подпрограммы Теперь, если мы нажмем кнопку S2, светодиод будет мигать очень редко, и из динамика раздастся звук с частотой примерно 1000Гц. По- сле отпускания кнопки светодиод начнет мигать с обычной частотой, а звук прекратится. Разумеется, эта программа написана не опти- мально с точки зрения конечного результата: так как, несмотря на нажатие кнопки, цикл управления светодиодом продолжает выпол- няться, звук прерывается легкими щелчками и светодиод хоть и ред- ко, но переключается. Эти проблемы легко устранить, но тогда про- грамма не будет настолько простой и наглядной. Если вам совершенно понятно, как работает эта программа, ис- правьте ее самостоятельно, чтобы устранить описанные выше не- дочеты. Затем сделайте так, чтобы при нажатии кнопки раздавался короткий "beep", после чего программа возвращалась к нормальной работе независимо от состояния кнопки. При отпускании и повтор- ном нажатии все должно повторяться. Затем сделайте так, чтобы звук раздавался синхронно с включением светодиода, но длительности включенного и выключенного состояния были равны. Когда вы на- пишете эти программы, можете считать, что почти научились про- граммировать микроконтроллеры. 236
Пишем первые программы ОБРАБОТКА ПРЕРЫВАНИЯ Микроконтроллеры PIC16FXX имеют два внешних и два внут- ренних прерывания. В качестве примера мы рассмотрим внешнее пре- рывание по входу RB0/INT. Разобравшись с этим примером, вам бу- дет несложно работать и с внешним прерыванием по изменению со- стояния линий RB4-RB7. Обработку внутреннего прерывания по пе- реполнению таймера мы рассмотрим в описании программы часов- термометра. Прерывание по входу RB0/INT может происходить как по нарас- танию, так и по спаду входного сигнала. Мы сделаем так, чтобы пре- рывание вызывалось при нажатии кнопки S1. В исходном состоянии на входе поддерживается высокий логический уровень при помощи внутреннего подтягивающего резистора. При нажатии кнопки проис- ходит переход от высокого уровня к низкому. Поэтому для генерации прерывания в момент замыкания контактов кнопки бит INTEDG ре- гистра OPTION_REG должен быть установлен в ноль. Кроме этого следует учесть, что вектор прерывания всего один и находится по адресу 0004Н. Поэтому с адреса 0004Н начинается под- программа обработки прерывания, а по адресу вектора сброса OOOOh размещаю! команду перехода на метку, расположенную после окончания подпрограммы обработки прерывания. В состоянии ожидания наша программа, как обычно, будет мигать светодиодом, а при нажатии кнопки S1 уходить в подпрограмму и генерировать звуковой сигнал продолжительностью около 0,5сек. ЛИСТИНГ 4 .*********************************************************** * обработка прерывания по спаду уровня на входе RB0/INT (6) * .*********************************************************** list p=16F84 #include <pl6F84.inc> „CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC count 1 EQU OxOC ; переменная цикла count2 EQU OxOD ; переменная цикла count3 EQU OxOE ; переменная цикла ledset EQU OxOF ; значение для вывода через порт st_tmp EQU 0x10 ; ячейка для хранения STATUS w_tmp EQU Ox 11 ; ячейка для хранения W ORG 0x000 ; вектор сброса процессора goto main ; переход на начало основной программы ,----------начало обработки прерывания--------------- 237
Часть 3. Программы и схемы ORG 0x004 movwf w_tmp movf STATUS,w movwf st_tmp ; вектор прерывания , сохранение текущего значения аккумуля- ,тора W ; перенос значения регистра STATUS в W , сохранение значения регистра STATUS movlw movwf beepl movlw movwf beep2 movlw movwf ----формирование звукового сигнала 0x10 count! 0x10 count2 0xA0 count3 Joop_b movlw b'00010000' xorwf ledset, f ; инвертируем значение на выводе RB4(10) ; и формируем задержку на длительность од- ; ного ; полупериода звуковой частоты movf ledset, w movwf PORTB decfsz count3, f goto loop_b decfsz count2, f goto beep2 decfsz countl, f goto beep 1 ;...---------окончание звукового сигнала movf st_tmp,w movwf STATUS swapf w_tmp,f swapf w_tmp,w bcf INTCON, INTF retfie ; перенос копии регистра STATUS в W ; восстановление прежнего значения STATUS main , восстановление прежнего значения W ; сброс флага прерывания по RB0/INT ; возврат из прерывания --------окончание обработки прерывания------------- PORTA PORTB STATUS, RPO b'l 1111101’ PORTA b'00000101* PORTB b'0011111 Г , включаем подтягивающие резисторы и clrf ] clrf ] bsf ! movlw movwf movlw movwf movlw movwf OPTION_REG ; прерывание по спаду уровня 238
Пишем первые программы movlw b' 10010000' ; разрешаем прерывание по входу movwf INTCON ; RB0/INT, остальные прерывания запрещаем bcf STATUS, RP0 clrf ledset loop movlw b'00000010' xorwf ledset, f movf ledset, w movwf movlw movwf cycle 1 movlw movwf PORTA OxFF count 1 OxFF count2 cycle2 decfsz count2, f goto cycle2 decfsz count 1, f goto cyclel goto loop end Как видите, теперь после директивы "ORG 0000h" идет команда перехода на метку main, а затем директива "ORG 0004h" Начиная с этого адреса будет располагаться подпрограмма обработки прерыва- ния. Она начинается стандартным фрагментом кода, сохраняющего текущие значения аккумулятора W и регистра STATUS. Затем идет программа генерации звукового фрагмента. От предложенной в лис- тингах 2 и 3 она отличается только тем, что добавлены два внешних цикла, чтобы задать необходимую длительность звукового сигнала Когда все циклы завершены, восстанавливаются сохраненные значения W и STATUS, очищается флаг-бит прерывания и происхо- дит возврат из прерывания. В основном фрагменте подпрограммы добавилась настройка слу- жебных регистров OPTIONJR.EG и INTCON Настройка портов и управление светодиодом происходит так же, как и в предыдущих про- граммах У вас может возникнуть вопрос при замыкании и размыкании кноп- ки происходит так называемый "дребезг контаков ", т е очень быстрое и хаотическое появление и пропадание контакта В результате на вхо- де RB0/INT реально присутствуют не четкие фронты, а серии хао- тичных импульсов при замыкании и размыкании Встроенный триггер 239
Часть 3. Программы и схемы Шмитта не полностью защищает от дребезга Как в этом случае бу- дет обрабатываться прерывание? Хороший вопрос © Дребезг в мо- мент нажатия кнопки устраняется легко Когда процессор переходит на вектор обработки прерывания, автоматически сбрасывается бит GIE, тем самым запрещаются повторные прерывания (у PIC16F84 только один вектор прерывания) При выполнении команды RETFIE бит GIE восстанавливается Как особо указано в фирменной докумен- тации, если происходит событие прерывания, когда прерывания запре- щены, то соответствующий флаг-бит все равно устанавливается Именно поэтому мы программно обнуляем флаг-бит INTF в конце под- программы обработки прерывания Если бы мы обнулили его сразу, как только вошли в прерывание, он мог бы быть вновь установлен из-за дре- безга контактов, и выйдя из прерывания, контроллер вновь ушел бы в прерывание В нашей программе, пока генерируется звук, дребезг успе- вает исчезнуть с большим запасом по времени Таким образом, дребезг при замыкании контактов нашей программе не страшен Другое дело дребезг при размыкании Если кнопка разомкнется, пока генерируется звук, ничего не случится Если же разомкнуть кнопку в то время, когда программа вернулась в обычный режим, то из-за дре- безга вновь может быть сгенерировано прерывание На практике это случается примерно в одном-двух случаях из десяти размыканий Сле- довательно, сразу после выхода из прерывания должен быть сформиро- ван некий защитный интервал, в течение которого прерывания по RB0/TNT запрещены Попытайтесь самостоятельно усовершенство- вать программу ПОДРОГРАММА ТАБЛИЧНОЙ КОНВЕРТАЦИИ - БУДЬТЕ ВНИМАТЕЛЬНЫ! Табличная конвертация чисел является очень эффективным при- емом программирования микроконтроллеров Этот прием удается реализовать благодаря команде RETLW, которая осуществляет воз- врат из подпрограммы с записью константы в аккумулятор, а также благодаря возможности прямых арифметических операций над про- граммным счетчиком Мы уже применяли табличную конвертацию в одном из примеров, в программе управления шаговым двигателем Как работает эта под- программа7 Перед обращением к подпрограмме в аккумулятор запи- сывается некая константа, которую надо преобразовать. В нашем случае это текущий номер шага, изменяющийся в диапазоне от 0 до 3. В теле самой подпрограммы первой командой является ADDWF PCL, F Это означает, что после того, как процессор считал эту ко-
Пишем первые программы манду и аппаратно увеличил программный счетчик на один шаг, со- держимое аккумулятора суммируется с содержимым регистра PCL, в котором хранятся младшие разряды программного счетчика, и ре- зультат записывается в регистр PCL Таким образом осуществляется прямое принудительное смещение программного счетчика на величину, которая была передана в акку- муляторе, относительного того положения где должен был бы нахо- диться программный указатель после считывания команды ADDWF PCL, F. Если, например, было W=0, то программный счетчик не из- менится и будет выполнена следующая команда, retlw b'01010000', которая вызовет возврат из подпрограммы с записью в аккумулятор константы '01010000'. Исходный номер шага 0 будет перекодирован в константу, соответствующую необходимым уровням на выходных портах. Если, например, W=2, то программный счетчик сместится на ко- манду retlw Ь'Ю 100000' и номер шага 2 перекодируется в другую кон- станту. Несмотря на внешнюю простоту, необходимо очень осторожно обращаться с подпрограмми табличной конвертации Дело в том, что в процессе табличной конвертации, при сложении используются только два младших байта программного счетчика. Это означает, что данный метод не позволяет конвертировать более чем 256 значений в одной таблице. И более того, даже если вы конвергируете лишь не- сколько значений, применение табличной конвертации может привес- ти к полной неработоспособности программы. Дело в том, что если не принимать особых мер, то подпрограмма табличной конвертации может оказаться в неизвестном заранее фрагменте физической памяти. Может получиться так, что первые несколько команд RETLW kk работают нормально, а при обращении к другим командам RETLW kk этой же таблицы происходит пере- полнение двух младших байтов регистра PCL, но реального переноса аппаратно не происходит и программный счетчик "вылетает" на случайное значение адреса, что приводит к сбою программы. То есть возникает отвратительная ситуация, когда сбой происходит только в определенном случае. Найти причину такого сбоя бывает очень тяже- ло. Поэтому, скомпилировав свою программу, откройте окно "Program Memory" программы MPLAB и убедитесь, что ваша под- программа табличной конвертации размещена корректно и нигде на ее протяжении не происходит переноса из второго байта программ- ного счетчика. Если это все же случилось, попробуйте в исходном 9 Зак № 4879 Яценков 241
Часть 3. Программы и схемы тексте программы переставить местами ее фрагменты так, чтобы таб- лица перекодировки располагалась корректно. Казалось бы, можно применить директиву ORG 0x00, где х - стар- шее число в адресе блока, и поместить ее перед началом подпрограм- мы конвертации, чтобы заставить ассемблер разместить подпрограм- му в нужном месте, но этот метод не работает. По крайней мере, он не работает в контроллерах, выпущенных в конце 1998 года - начале 1999 года. В имеющемся у автора экземпляре, при внешней коррект- ности программы, во время табличной конвертации при помощи подпрограммы, размещенной с применением директивы ORG 0x00 периодически "слетал" ...указатель стека! А ведь стек всего лишь должен хранить ранее записанные адреса возврата и никак не реаги- ровать на арифметические операции -с текущим значением регистра PCL. На практике процессор нормально входил в подпрограмму, нормально вычислял смещенный адрес и уходил на него, но при воз- врате по команде RETLW kk записывал константу в аккумулятор и возвращался почему-то не на адрес возврата, записанный в стек, а на адрес ООхх, где хх - величина смещения, исходного значения, которое использовалось при конвертации. Этого в принципе не должно быть, но это так. Проведя серию экспериментов, автор пришел к выводу, что в имеющихся у него экземплярах PIC16F84 вложенная подпрограмма табличной конвертации, то есть вызываемая из другой подпрограм- мы, нормально работает только тогда, когда она расположена в пер- вом 256-байтном блоке адресного пространства. В свою очередь, в фирменном описании сказано, что подпрограмма табличной конвер- тации должна быть целиком расположена внутри 256-байтного бло- ка, но не сказано, что именно первого блока. И если конвертация вы- зывается не из другой подпрограммы, а из тела основной программы, то табличная конвертация действительно работает корректно в лю- бом блоке. Но, к сожалению, чаще всего подпрограмма конвертации оказывается вложенной. С учетом всех несомненных достоинств мик- роконтроллеров PIC16F84, вышесказанное подтверждает древний постулат: нет гармонии в подлунном мире. ПРАКТИЧЕСКИЕ ПРИМЕРЫ СХЕМ И ПРОГРАММ В предыдущих пунктах мы рассматривали программы, не имею- щие особого практического значения. Сейчас ознакомимся со схема- ми и программами, которые могут вам пригодиться на практике. 242
Практические примеры схем и программ СЕНСОРНЫЙ ДАТЧИК В схеме применяется достаточно оригинальная идея, предложенная Владимиром Белчевым из Болгарии. В описании микроконтроллеров PIC упоминается о том, для надежной работы устройств необходимо давать в программах небольшую задержку для установления уровней на входах. Это связано с тем, что компоненты схемы и входы микро- контроллера обладают некоторой суммарной емкостью, которая должна успеть перезарядиться. Если в цепи входа включено некото- рое сопротивление, то постоянная времени получившейся RC- цепочки может быть сопоставима с длительностью машинного такта и даже превысить его. Это явление, в большинстве случаев вредное, в данном случае приносит пользу. Используя минимум внешних элементов (два конденсатора и рези- стор), можно создать сенсорный переключатель или регулятор. Вла- димир Белчев разработал в качестве иллюстрации программу для PIC12CXXX, но в нашей книге приводится программа для PIC16F84. Свободно распространяемую программу для PIC12CXXX можно за- грузить с сайта www.microchip.сот или с фирменного компакт-диска технической поддержки, документ 2_012.pdf. OUT SB Cl R1 У— IN Рис. 3-2. Схема RC-цепочки сенсорного датчика Рассмотрим принцип работы схемы. На рисунке 3-2 показана схе- ма RC-цепочки сенсорного датчика. На ней не показана собственная емкость входа микроконтроллера, т.к. сейчас она не имеет принципи- ального значения. Чтобы определить, есть прикосновение к этому датчику или нет, выполняются всего две операции. На йыводе OUT выставляется высокий уровень. Сразу же после этого, второй коман- дой считывается состояние входа IN. Если сенсорный контакт свобо- ден, то емкость С1 не оказывает никакого влияния, и сигнал на входе IN нарастает достаточно быстро, хотя его фронт сглажен внутренней емкостью входа. Форма сигнала показана на рис. 3-3. К моменту считывания уровень на входе успевает достигнуть ве- личины логической единицы. Тестируя прочитанное значение, мы делаем вывод, что сенсор свободен. э*
Часть 3. Программы и схемы Рис. 3-3. Диаграммы сигналов на неактивном датчике Если к сенсору прикоснулся человек, то его емкость окажется под- ключенной последовательно с С1 и постоянная времени цепи резко возрастет. В этом случае уровень на входе IN к моменту считывания не успеет достигнуть уровня логической единицы (рис.3-4). Будет считан ноль, на основании чего мы сделаем вывод, что было прикос- новение к сенсору. Прикосновение к сенсору есть Рис. 3-4. Диаграммы сигналов иа активном датчике Поскольку все порты микроконтроллера могут работать как на ввод, так и на вывод, будет логично сделать схему сенсора симмет- ричной и попеременно опрашивать выводы, обрабатывая две сенсор- ных кнопки. Схема показана на рис. 3-5. Светодиоды LEDO и LED1 предназ- начены только для индикации срабатывания сенсоров. В схеме, пред- назначенной для практического применения, их может не быть. Но-
Практические примеры схем и программ миналы резистора и конденсаторов могут потребовать подбора в за- висимости от конкретного экземпляра. У автора схема надежно рабо- тала при значениях R2=10K и Cl=C2=470pF. Поскольку считывать состояние входа надо не более, чем через 1...2 миллисекунды после подачи высокого уровня на выход, должен применяться кварцевый резонатор с частотой 4МГц. В качестве сенсорных кнопок можно использовать печатные контакты площадью около 1см2. Соедини- тельные проводники до сенсоров должны быть как можно короче, чтобы избежать ложных срабатываний. U1 R2. R3 360 470 LED1 PIC RA? RA3 RAVrOCKI RA1 RA) |8 LEDO I 9 —yH R ВОЛ NT RB1 RB2 —HRB3 ^c|mCLR XAs OSC1/CLKIN OSC2/CLKOUT Mid 16 Ji 13 RB7 RB6 Hr— RB5 -ft- RB4 10 ♦6V C3 33pF PIC16F84 XTAL1 4MHz C4 33pF Рис. 3-5. Схема подключения сенсорного датчика В схеме совершенно произвольно, для примера, сенсорные датчики подключены к каналам RBI, RB2. Они могут быть подключены к лю- бым другим каналам. Для соблюдения симметрии в схеме датчика желательно использовать входы с одинаковой структурной схемой. Например, RA4 и RB0 имеют триггеры Шмитта на входе, в разные структурные группы объединены каналы RB4...RB7 и RA0...RA3. Вообще, при проектировании схемы и программировании необходи- мо учитывать различия в структурной схеме портов. ЛИСТИНГ 5 .************************************************************* ; * программа обработки сенсорных датчиков * .************************************************************* ; назначение выводов в схеме ; RB 1(7) - сенсорный датчик SBO (input/output) ; RB2(8) - сенсорный датчик SB 1 (input/output) ;RA1(18)-LED1 для кнопки SB1 245
Часть 3. Программы и схемы ; RA0(17) - LEDO для кнопки SBO list p=16F84 #include <pl6F84.inc> _CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;*** Базовые значения (могут быть изменены при изменении схемы) SBO EQU 1 ; номер соответствующего бита для SB0 SB1 EQU 2 ; номер соответствующего бита для SB1 SB0_SET EQU b’ 1111101Г ; PORT В: RB1 -ввод, ВВ2-вывод SB 1JSET EQU b' 1111110 Г ; PORT В: RB 1 -вывод, ВВ2-ввод LEDO EQU 0 ; номер бита для светодиода LEDO LED1 EQU 1 ; номер бита для светодиода LED1 INIT_A EQU b'l 1111100' ; настройка PORT A: RAO, RA1 вывод, ; остальные на ввод INIT_B EQU b'l 1111001' ; настройка PORT В: RBI, RB2 вывод, ; остальные на ввод FLAGS EQU ОхОС; адрес переменной флаг-битов ORG 0x000 ; начальный адрес программы ; *** Начальная инициализация clrf PORTA ; очистили выходные защелки порта А clrf PORTB ; и порта В bsf STATUS, RP0 ; включили банк 1 movlw INIT_A ; настроили PORT А movwf PORTA ; movlw INIT_B ; настроили порт В. movwf PORTB ; bcf STATUS, RP0 ; включили банк 0 Main_Loop:___________________________________________________ ; Пространство для пользовательского кода. ; Здесь вы можете вставить свою программу, ______; использующую значения флаг-битов из переменной FLAGS. call READ_SENSORS ; чтение состояния сенсоров btfss FLAGS, 0 ; пропустить, если SB0 нажата goto SBO_untouched ; иначе перейти на гашение LED0 bsf PORTA, LEDO ; LED0=ON goto CheckJSB1 ; перейти на проверку следующей кнопки SB0_untouched: bcf PORTA, LEDO ; LED0=OFF CheckJSBF btfss FLAGS, 1 ; пропустить, если SB 1 нажата (DC=1) 246
Практические примеры схем и программ goto bsf goto SBl_untouched ; иначе перейти на гашение LED1 PORTA, LED 1 ;LED1=ON Main_Loop ; перейти на повторение цикла SBl_untouched: bcf PORTA, LED 1 ; LED 1 =OFF goto Main_Loop ; перейти на повторение цикла ;*** Подпрограмма чтения сенсоров ; Входные параметры: нет ; Выходные параметры: флаг-бит FLAGS,0 = 1 если нажат сенсор SB0, ; флаг-бит FLAGS,! = 1 если нажат сенсор SB1 READ_SENSORS: bcf FLAGS, 0 ;сброс bcf FLAGS, 1 ; флагов ;*** Чтение сенсорной кнопки SB0 bsf STATUS, RPO ; включили банк 1 movlw SB0_SET ; RBI (SB0) на ввод, movwf PORTB ; RB2 (SB 1) на вывод bcf STATUS, RPO ; отключили банк 1 bsf PORTB, SB 1 ; сформировали фронт — btfss PORTB, SBO ; перейти если сенсор SB0 не нажат bsf FLAGS, 0 ; иначе выставить флаг-бит ;*** Разрядка входного конденсатора Cl bsf STATUS, RPO ; включили банк 1 movlw INIT_B ; настроили оба movwf PORTB ; канала на вывод bcf STATUS, RPO ; отключили банк 1 bcf PORTB, SBO ; обнуление канала 0 (разрядка) bcf PORTB, SB 1 ;обнуление канала 1 ;*** Чтение сенсорной кнопки SB1 bsf STATUS, RPO ; включили банк 1 movlw SB1_SET movwf PORTB bcf STATUS, RPO bsf PORTB, SBO btfss PORTB, SB 1 bsf FLAGS, 1 ; RB2 (SB1) на ввод, ; RBI (SBO) на вывод ; отключили банк 1 ; сформировали фронт — ; перейти если сенсор SB0 не нажат ; иначе выставить флаг-бит *** Разрядка входного конденсатора С2 bsf STATUS, RPO ; включили банк 1 movlw INIT.B movwf PORTB bcf STATUS, RPO ; настроили оба ; канала на вывод ; отключили банк 1
Часть 3. Программы и схемы bcf PORTB, SB 1 bcf PORTB, SBO return end ; обнуление канала 0 (разрядка) ,обнуление канала 1 ; возврат из подпрограммы ; конец программы Программа построена таким образом, чтобы при изменении схемы изменения в программе были минимальными. Ее можно было бы оп- тимизировать еще больше, но в этом случае пострадала бы нагляд- ность. Изначально установлено, что сенсоры подключены к порту В, выводы 7 и 8, а светодиоды к порту А, выводы 17 и 18. Изменив схе- му, следует изменить базовые значения SB0 и SB1, означающие номе- ра битов в слове, прочитанном из порта, изменить LEDO и LED1, со- ответствующим образом изменить INIT_A, INIT_B, SB0_SET и SB1_SET. При этом не понадобится делать изменений в теле про- граммы, что увеличивает ее гибкость. Изменения в программе пона- добятся, когда вы удалите светодиоды или подключите сенсоры к порту А. Разумеется, вам понадобится вставить программу взаимо- действия с исполнительным устройством или интерфейсную про- грамму в отмеченное рамкой место. В начале работы программы настраиваются порты ввода-вывода, затем программа начинает работать циклически. В каждом цикле вы- зывается подпрограмма проверки состояния сенсоров. Сначала канал RB1 настраивается на ввод, a RB2 на вывод. На выводе RB2 форми- руется положительный фронт. Тут же, следующей командой, считывается и тестируется уровень на выводе RB1. Если он низкий, значит есть прикосновение к сенсору и выставляется в единицу флаг- бит <0> переменной FLAGS. Затем оба канала настраиваются на вы- вод, на канал RB2 подается низкий уровень и конденсатор разряжает- ся, чтобы надежно определить следующее прикосновение. Попутно разряжаются внутренние емкости входных цепей микроконтроллера. Если бы мы не разряжали конденсатор, то к моменту следующего тес- тирования он был бы уже заряжен, сглаживание фронта не произош- ло бы, и программа сделала бы ошибочный вывод, что прикоснове- ния к сенсору нет. После разрядки конденсатора С1 канал RB1 наст- раивается на вывод, а канал RB2 на ввод, и тестирование повторяется с тем же алгоритмом, но для другого вывода. Затем происходит возврат из подпрограммы, флаг-биты тестиру- ются и принимается решение о включении светодиодов, после чего флаг-биты обнуляются и цикл повторяется. Вместо управления свето- диодами легко может быть присоединен любой другой программный модуль, например для плавного включения и гашения освещения и т.п. 248
Практические примеры схем и программ УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ Следующая программа предназначена для управления шаговым двигателем. За основу взята свободно распространяемая программа для PIC12C509, которую написал Слав Славов (Slav Slavov) из Болга- рии Программа переписана для микроконтроллера PIC16F84, добав- лен фрагмент кода, фиксирующий ротор двигателя после включения питания. Шаговые двигатели имеют различные параметры, и харак- теризуются количеством шагов на 360°, количеством фаз (2 или 4) и т.д. Существуют двигатели с точностью 100 шагов/рад, 200 шагов/рад и другим количеством шагов на один радиан, но принцип работы у всех одинаков. Наша программа предназначена для управления 4-фазцым двига- телем, для подключения двигателя понадобится пять проводов. Дви- гатель может иметь либо пять выводов, если общие выводы каждой пары обмоток соединены вместе, либо шесть, если общие выводы пар выведены раздельно. Для экспериментов можно разобрать старый дисковод 5,25" и взять моторчик, перемещающий головку. При по- мощи тестера, или разобрав мотор, определите разводку выводов. На рисунке 3-7 показана схема включения мотора LI, L2 и L3, L4 пред- ставляют собой пары рабочих обмоток, имеющих по одному общему выводу. Эти пары абсолютно равнозначны и, если поменять их мес- тами, изменится только направление вращения. Направление враще- ния также изменится, если поменять местами выводы у одной пары. Чтобы мотор начал вращаться (циклически перемещаться по ша- гам) надо организовать на его выводах определенную последователь- ность изменения напряжения: Шаг А1 А2 В1 В2 1 0 1 0 1 2 0 1 1 0 3 1 0 1 0 4 1 0 0 1 1 0 1 0 1 Таким образом, чтобы мотор начал вращаться по часовой стрелке, надо, чтобы уровни на соответствующих выводах микроконтроллера изменялись в соответствии с порядком шагов 1, 2, 3, 4, 1,.... Для обрат- ного вращения порядок следования шагов должен быть обратным : 4, 3, 2,1,4, ... Отличительной особенностью шагового двигателя является то, что в промежутке между шагами его ротор неподвижен и зафиксирован магнитным полем катушек. Ротор может сколь угодно долго нахо- 249
Часть 3. Программы и схемы дитсья в неподвижном состоянии Потребляемый ток почти не зави- сит от того, вращается ротор, или нет. Схема включения микроконтроллера показана на рис. 3-6, а тран- зисторные ключи, управляющие током в обмотках, на рис. 3-7 —?- RA2 ___2 ___3 RA3 RA4/T0CKI MCLR XAs PIC RA1 RA0 OSC1/CLKIN OSC2/CLKOUT ХЛб ___6 ____7_ ____а_ ___9 RBOflNT RB1 RB2 RB3 RB7 RB6 RB5 RB4 18 _1Z_ 13 12 11 10 1L 15 14 PIC16F84 Рис. 3-6. Схема для управления шаговым двигателем Рис. 3-7. Схема включения шагового двигателя При нажатии кнопок L и R мотор вращается соответственно либо против часовой стрелки, либо по часовой стрелке. Транзисторы рабо- тают в режиме насыщения и практически не нагреваются, поэтому им не нужны радиаторы. Защитные диоды предохраняют транзисторы от пробоя выбросами обратного напряжения на обмотках, которые воз- никают в момент отключения тока в обмотке. Вместо транзисторов можно использовать очень распространенную микросхему, набор 250
Практические примеры схем и программ ключей ULN2003A Она может оказаться в том же дисководе, из ко- торого вы вынули двигатель. Микросхема имеет встроенные защит- ные диоды. Программа циклически опрашивает состояние кнопок и, если одна из кнопок нажата, выполняет процедуру перемещения ротора на один шаг. Если нажаты две кнопки одновременно, то кнопка вращения вправо имеет приоритет. Поскольку опрос кнопок происходит быст- ро, то при нажатии кнопки двигатель будет вращаться, пока вы не отпустите кнопку. Имейте в виду, что обычные шаговые двигатели имеют относи- тельно небольшую скорость вращения Если менять состояние обмо- ток слишком часто, то двигатель может не вращаться Поэтому в программе дважды вызывается подпрограмма задержки между обра- щениями к кнопкам Поэкспериментируйте с имеющимся у вас двигателем, изменяя ве- личину задержки в базовом значении del программы. Программа, текст которой приведен в листинге 6, очень проста и ее работа вполне понятна из комментариев. Если будете изменять схему и подключите кнопки к порту А, не забудьте про внешние подтягивающие резисто- ры. Можете использовать программу обработки сенсоров из преды- дущего примера. ЛИСТИНГ 6 .Ik************************************************************ ;* программа управления шаговым двигателем * ; назначение выводов в схеме ; RB1(7) - кнопка вращения вправо ; RB2(8) - кнопка вращения влево ; RB4(10) - выход В2 ; RB5(11) - выход Bl ; RB6(12) - выход А2 ; RB7(13) - выход Al list p=16F84 #include <pl6F84.inc> „CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;*** базовые значения 151
Часть 3. Программы и схемы Left EQU 1 Right EQU 2 del EQU OxFF INIT_A EQU b'l 111111 Г INIT_B EQU b'0000111 Г count EQU OxOC step EQU OxOD ; номер вывода кнопки "влево" ; номер вывода кнопки "вправо" ; константа длительности задержки ; настройка порта А: все каналы на ввод ; настройка порта В: RB0-RB3 ввод, ; RB4-RB7 вывод ; переменная подпрограммы задержки ; счетчик номера текущего шага ORG 0x00 ;*** начальная инициализация clrf PORTA ; очистили выходные защелки порта А clrf PORTB ; и порта В bsf STATUS, RPO ; включили банк 1 movlw INIT_A ; movwf PORTA ; настроили PORT A movlw INIT_B ; movwf PORTB ; настроили порт В bcf OPTION.REG, 7 ; включили встроенную нагрузку bcf STATUS, RPO ; включили банк 0 clrf step ; обнуляем переменную step clrw ; при включении фиксируем call Table ; ротор двигателя movwf PORTB ; в положении нулевого шага main call delay call delay ; формирование задержки ; (временного интервала между шагами) ;*** опрос кнопки "Вправо" Rights btfsc PORTB, Right goto LeftS incf step, f movlw .4 subwf step, w btfsc STATUS,C clrf step movf step, w call Table movwf PORTB goto main и обработка нажатия ; если Right=0, выполнить шаг вправо ; иначе перейти на LeftS ; step=step+1 ; если step>3, ; установить step=O ;иначе ; перекодировать номер шага в выходной ; КОД ; выставить новые значения на выводах ',*** опрос кнопки "Влево" и обработка нажатия 252
Практические примеры схем и программ Lefts btfsc PORTB, Left goto main decf step, f movlw .3 btfsc step, 7 movwf step movf step, w call Table movwf PORTB goto main ; если Left=0, выполнить шаг влево ; иначе перейти на метку main ; step=step-l ; если step<0, ; установить step=3 ;иначе ; перекодировать номер шага в выходной ;код ; выставить новые значения на выводах ;*** таблица перекодировки номера шага в уровни на выводах порта Table addwf PCL,f retlw Ь'ОЮЮООО' retlw b'01100000' retlw b'10100000' retlw b'10010000' ;*** подпрограмма формирования задержки между шагами delay movlw del movwf count loop decfsz count, f goto loop return END ДРАЙВЕР ЖК-ДИСПЛЕЯ НА ОТЕЧЕСТВЕННЫХ ДЕТАЛЯХ ПРИНЦИП РАБОТЫ ЖК-ИНДИКАТОРА Очень кратко рассмотрим принцип работы ЖК-индикатора, чтобы понять, какие требования предъявляются к схеме и программе. Мы используем простой и очень распространенный индикатор ИЖЦ21-4/7, но можно использовать и любой другой индикатор с од- ной подложкой, работающий как на отражение, так и с подсветкой. На рисунке 3-8 схематически изображен в разрезе один сегмент. Индикатор представляет собой герметическую структуру, в кото- рой промежуток между электродом подложки и электродом сегмента заполнен специальной рабочей жидкостью, молекулярные структуры которой способны вращаться в электрическом поле. Для начала пере- ориентации молекул достаточно очень небольшой разности потенци- алов, обычно менее одного вольта. 253
Часть 3. Программы и схемы Рис.3-8. Схематическое строение простейшего ЖК-индикатора Электроды подложки и сегментов стараются сделать максимально прозрачными, напыляя тончайший проводящий слой на стекло. Чаще всего используются соединения титана и, в последнее время, прово- дящие полимеры. Мы рассматриваем структуру индикатора, работающего в отра- женном свете. В исходном состоянии, когда сегмент не активизиро- ван, свет проходит через первую поляризующую пленку, наклеенную на внешнюю поверхность стекла и поляризуется. Далее он проходит через слой неактивной рабочей жидкости, которая разворачивает плоскость поляризации светового потока на 90°. Благодаря тому, что плоскость поляризации светового потока развернулась, он проходит через вторую поляризующую пленку, отражается от светоотражателя на задней стенке и возвращается обратно. Когда к электродам при- ложено напряжение, рабочая .жидкость активируется. В этом случае свет, пройдя через первую поляризующую пленку, поляризуется. Но при прохождении через активированную рабочую жидкость плос- кость поляризации светового потока не разворачивается. Поэтому, достигнув задней поляризующей пленки, свет не может через нее про- никнуть и отразиться от отражателя. В этом месте мы видим черный сегмент. Иначе говоря, чтобы сегмент стал активным, почернел, на него надо подать напряжение. Существуют ЖК-индикаторы, работающие не на отраженном све- те, а на просвет, а также индикаторы смешанного типа. Это, напри- мер, всем известные ЖК-мониторы ноутбуков и дисплеи карманных компьютеров с отключаемой подсветкой. Устройство этих мониторов значительно сложнее, но базовый принцип один и тот же. К сожалению, в использовании ЖК-индикаторов есть важные ог- раничения, порождающие большие сложности. Самое главное из них состоит в том, что категорически запрещается прикладывать к элект- 254
Практические примеры схем и программ родам напряжение постоянной полярности. В этом случае начнется электролитическая диссоциация рабочей жидкости и, в некоторых случаях, разрушение напыленных проводников. Индикатор очень быстро выйдет из строя. Поэтому на практике применяют чередование высокого и низкого уровней на подложке и электродах. При этом уровень на активном сегменте меняется в противофазе к уровню подложки, благодаря чему постоянно инвертируется поляр- ность приложенного к электродам напряжения. На неактивном сег- менте уровень переключается синфазно с подложкой, поэтому для него разность потенциалов всегда равна нулю. Диаграммы рабочего процесса показаны на рисунке 3-9. На частоту изменения уровней тоже есть ограничения. С одной стороны, частота не должна быть слишком маленькой, чтобы за один полу период не успевала начаться диссоциация С другой стороны, рабочая жидкость обладает инерционностью и при слишком высокой частоте ее молекулы не будут успевать переориентироваться в элект- рическом поле. Рис. 3-9. Диаграммы напряжений на электродах ЖК-индикатора На практике обычно достаточно, чтобы частота переключений со- ставляла 100...200 Герц. Для уменьшения числа выводов сегменты соединяют в группы, применяют несколько подложек и/или подают на них ступенчатое напряжение с несколькими уровнями. При этом напряжение на сегментах также меняется ступенчато, по достаточно сложному принципу, который невозможно реализовать простейшими методами. В этом случае применяют либо микроконтроллеры со встроенными драйверами ЖКИ, либо специальные микросхемы кон- троллеров ЖКИ. 255
Часть 3. Программы и схемы Кроме постоянного напряжения, на ЖКИ разрушающе действуют прямые солнечные лучи, вызывающие деструкцию молекул рабочей жидкости. При охлаждении очень сильно возрастает инерционность ЖКИ, поэтому существуют специальные прозрачные подогревающие пленки, которые наклеивают на внешнюю поверхность индикатора, если он должен работать на холоде. ПРИНЦИПИАЛЬНАЯ ЭЛЕКТРИЧЕСКАЯ СХЕМА К счастью, ЖК индикаторы нормально работают при подаче на вы- воды ТТЛ-уровней, поэтому выводы индикатора можно подключать прямо к выводам микросхем. Количества выводов микроконтроллера PIC16F84 недостаточно для подключения индикатора напрямую. По- этому принято решение выводить данные в последовательном виде и преобразовывать их в параллельный вид при помощи последовательно- параллельных сдвиговых регистров КР1533ИР24 (74LS299). В этом случае для вывода информации задействованы только два вывода мик- роконтроллера: вывод данных и вывод строба. Еще один вывод ис- пользуется для управления уровнем на подложке индикатора. Причем разрядность индикатора может быть очень большой и ограничивается только разумным количеством компонентов. Это схемное решение также подходит для других случаев преобра- зования последовательного кода в параллельный. Например, таким образом можно управлять большим числом семисегментных светоди- одных индикаторов и даже выводить информацию на принтер. Разуме- ется, существуют специальные микросхемы, управляющие ЖК- индикаторами. Но стоимость контроллера ЖКИ с шиной 12С произ- водства Philips при доставке почтой в регионы России составляет около 8 долларов, а стоимость четырех регистров КР1533ИР24, продающихся везде, около 6 рублей. Думается, что для радиолюбителя или при мел- косерийном производстве второй вариант предпочтительнее. На рис. 3-10 показана цоколевка индикатора ИЖЦ21-4/7, а на рис. 3-11 внешний вид макетной платы модуля индикации (контроллер расположен на другой плате). Взаимное соответствие битов выходного кода и сегментов знакоместа выглядит так: бит 7 6 5 4 3 2 1 0 сегмент Н* G F Е D С В А *Н - десятичная точка или иной разделитель 256
Практические примеры схем и программ Принципиальная электрическая схема показана на рисунке 3-12. Выводы микроконтроллера, к которым подключены выводы модуля индикации, выбраны произвольно и совпадают с выводами, задейст- воваными в схеме часов-термометра, описанной ниже. Рис. 3-15. Внешний вид макетной платы модуля индикации 257
4«V О Управление подложкой BCPL Данные Строб < G1 С 02 “ SO ~ S1 — >CLK < CLR - SR - SL □А 14— Часть 3. Программы и схемы PIC16F84 RAO PIC RA1 Uid RA2 0SC1/CLKIN RAVT0CK1 MCLR OSC2/CLKOUT RBO/IMT RBI RB2 RB3 \As Cl 32pF 32pF C2 _2. 3 1 19 Л 9 11 19 с 61 С 02 - SO - S1 “►CLK С CLR - SR - SL JC 4c A/QA B/QB C/QC D/QD E/QE F/QF G/QG H/QH ОН IX 16 QA A/QA B/QB С/ОС D/QD E/QE F/QF G/QG H/QH QH 6 5 зт A3 "B3X KN KN KN LCD1 vcc 19 12 61 62 SO $1 ►CLK CLR SR SL 8. QA -%— WQA B/QB C/QC D/QD E/QE F/QF 6/66 H/QH QH JX 6 14 5 IS EN 16 03 07 - блокировочные керамические конденсаторы, подключаемые к выводам 5 и 14 U1.10 и 20 U2 U5 61 G2 SO kS1 4Hclk IIе CLR SR SL 44 19 18 QA A/QA B/QB C/QC D/QD E/QE F/QF G/QG H/QH QH 7_____Al 13"'" BIX '6 CT\ ЧГ Fix 4 GTX 16 HIX ~iT~ x U2. U5 - КР1633ИР24 или SN74ALS299, 74LS299 LCD1 - ИЖЦ21-4/7 или аналогичный Рис. 3-12. Принципиальная электрическая схема модуля индикации гч
Практические примеры схем и программ Схема чрезвычайно проста и не требует особых комментариев. Источник питания +5В может быть любым и на схеме не показан. В соответствии со схемой, первым выгружается старший бит пер- вого знакоместа, и далее по порядку. После выгрузки всех восьми бит первого знакоместа выгружается старший бит второго знакоместа и т.д. Таким образом, старший бит первого знакоместа последователь- но проходит по всем регистрам, пока не достигнет своего разряда. Благодаря инерционности ЖКИ, мерцания сегментов во время за- грузки не заметно. Если использовать светодиодные индикаторы, то мерцание будет заметным и потребуется применять гашение индика- тора на время загрузки. Для этого можно, например, задействовать еще один вывод микроконтроллера и на время загрузки переводить выходы регистров в высокоимпедансное состояние. КАК РАБОТАЕТ ПРОГРАММА, ПРИВЕДЕННАЯ В ЛИСТИНГЕ 7? После сброса контроллера происходит настройка портов ввода- вывода и включаются встроенные подтягивающие резисторы. Затем выполняется демонстрационный фрагмент, в котором значения инди- цируемых чисел конвертируются в коды отображения при помощи подпрограммы табличной перекодировки и записываются в ячейки ОЗУ под именами digit.1 ...digit4. Нормально работающая программа отображает на индикаторе "1234", как показано на рисунке 3-11. Если вы будете использовать приведенную схему и программу для своих целей, то вместо демонстрационного фрагмента должны поместить в указанное место свой программный код, который будет формировать значения для digit 1 ...digit4. Чтобы включить разделительную точку, надо дополнительно ус- тановить в 1 старший, 7-й бит соответствующего знакоместа. Не забывайте, что ЖКИ требует регулярной инверсии уровня на подложке относительно электродов активных знакомест. Чрезмерно долгое удержание статичных уровней приводит к постепенной порче индикатора. Исполнение вашего программного кода может надолго прерывать обработку индикатора. Чтобы этого не происходило, при необходимости вызывайте подпрограмму отображения символов в процессе исполнения промежуточного кода и следите, чтобы индика- тор циклически обрабатывался, когда ваша программа находится в режиме ожидания внешнего воздействия. В качестве примера можете рассмотреть описание следующей конструкции - часов-термометра - в которой использован описываемый модуль ЖКИ. Когда числовые значения для индикации сформированы, вызыва- ется подпрограмма обслуживания ЖК-индикатора ind_LCD. Она, используя подпрограмму битового загрузчика loader, побитно и поочередно выгружает данные из digit 1...digit4 в последовательные регистры и устанавливает уровень на подложке в ноль. Затем форми- 259
Часть 3. Программы и схемы руется задержка, необходимая для нормальной работы индикатора. После окончания задержки уровень на подложке устанавливается в 1, значения для индикации выгружаются вновь, но на этот раз инверти- руются перед выгрузкой. Таким образом, уровень на активных сегментах, которые заданы единицей в коде символа, всегда оказывается в противофазе с уров- нем на подложке. Поэтому они видны на индикаторе. Уровень на не- активных сегментах всегда изменяется синфазно с уровнем на под- ложке, поэтому неактивные сегменты не видны. После выгрузки инверсных значений вновь вызывается подпро- грамма задержки. В нашей программе это необходимо для того, чтобы длительности индикации прямого и инверсного значений были симметричны. В вашем варианте программы, возможно, вторая за- держка не понадобится, ее роль может играть ваш собственный код, который будет исполняться в промежутке между обращениями к ин- дикатору. В любом случае надо стараться, чтобы сигнал на подложке по форме был максимально близок к меандру. ЛИСТИНГ 7 . ************************************************************* ;* Программа обслуживания ЖК-дисплея * *************************************************************** ;* Использованные компоненты схемы: * ;* Микроконтроллер - PICI6F84-04I/P * ;* Индикатор - ИЖЦ21-4/7 * ;* Регистры индикатора - КР1533ИР24 (4шт) * *************************************************************** ;* Используемые выводы микроконтроллера: * ;* АО (17) - строб записи в регистры * ;* AI (18) - данные для индикации * ;* ВЗ (9) - подложка для LCD индикатора * .* * *************************************************************** 5 ' list p=16F84 //include <p!6F84.inc> _CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC digit 1 EQU OxOC ; значение для 1-го знакоместа digit2 EQU OxOD 5 • digit3 EQU OxOE digit4 EQU OxOF ; значение для 4-го знакоместа digitemp EQU 0x10 ;рабочая переменная 260
Практические примеры схем и программ count 1 EQU Oxll , переменная счетчика count2 EQU 0x12 ; переменная счетчика ORG 0x000 main clrf PORTA clrf PORTB bsf STATUS, RPO ;bankl movlw b'l 1110000' movwf PORTA movlw b'l 111011 Г movwf PORTB bcf OPTION_REG, 7 bcf STATUS, RPO ; bank 0 *************************************************************. ; Далее располагается код пользователя, ; ; генерирующий значения для 4-х знакомест ; ; и помещающий их в переменные digit! ...digit4. ; ; Значение задержки в подпрограмме delay подбирается ; ; так, чтобы частота смены уровня ; ; на подложке индикатора составляла около 100-120 Гц. ; .*************************************************************« 9 9 movlw 0x01 call convert movwf digitl movlw 0x02 call convert movwf digit2 movlw 0x03 call convert movwf digit3 movlw 0x04 call convert movwf digit4 loop call ind_LCD; вызов подпрограммы индикации goto loop ; повторение цикла индикации .******* ОКОНЧАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО КОДА ********** .**************************************************************• ; подпрограмма отображения 4 символов на ЖК-индикаторе ; .Jit*************************************************************- ind_LCD bcf PORTB, 3 ; уровень на подложке в 0 261
Часть 3. Программы и схемы movf digit 1, w ; первая цифра в аккумуляторе movwf digitemp call loader ; выгрузили биты в индикатор movf digit2, w ; вторая цифра в аккумуляторе movwf digitemp call loader ; выгрузили биты в индикатор movf digits, w ; третья цифра в аккумуляторе movwf digitemp call loader ; выгрузили биты в индикатор movf digit4, w ; четвертая цифра в аккумуляторе movwf digitemp call loader ; выгрузили биты в индикатор call delay ; все данные выгружены, держим данные ; на индикаторе bsf PORTB, 3 ; уровень на подложке в 1 movf digitl,w ; первая цифра в аккумуляторе xorlw OxFF ; инверсия всех битов movwf digitemp call loader ; выгрузили биты в индикатор movf digit2, w ; вторая цифра в аккумуляторе xorlw OxFF ; инверсия всех битов movwf digitemp call loader ; выгрузили биты в индикатор movf digits, w ; третья цифра в аккумуляторе xorlw OxFF ; инверсия всех битов movwf digitemp call loader ; выгрузили биты в индикатор movf digit4, w ; четвертая цифра в аккумуляторе xorlw OxFF ; инверсия всех битов movwf digitemp call loader ; выгрузили биты в индикатор call delay ; все данные выгружены, держим данные ; на индикаторе return . * * * * * * *** * * * * * Ис * * *** * *********** * J^C********************* * ***** . ; подпрограмма табличной конвертации ; ; принимает и возвращает данные в W ; ************************************************************** . > 5 convert addwf PCL, f retlw Ь'ООПШГ ; символ "0" retlw b'00000110' ; СИМВОЛ "I" w
Практические примеры схем и программ retlw b'OlOHOH' retlw b'OlOOllir ,: retlw b'01100110' retlw b’OHOHOr retlw b'OlllllOr ,: retlw b’OOOOOlir retlw b'Olllllir retlw b’OHOllir ; символ "9" retlw b’000000001 ; "пустое" знакоместо retlw b'010000001 ; символ "минус" retlw b'0011100Г ; символ "С" retlw Ь'ОПИООГ ; символ "Е" .*************************************************************. 9 » ; подпрограмма выгрузки знакоместа в регистры, ; ; данные в переменной digitemp ; .Jit************************************************************. ? > loader movlw 0x08 movwf count 1 ; счетчик числа битов nextbit bcf PORTA, 0 ; строб в 0 btfss digitemp, 7 ; проверяем старший бит bcf PORTA, 1 ; установили порт Al в 0, если текущий бит = 0 btfsc digitemp, 7 bsf PORTA, 1 ; установили порт А1 в 1, если текущий бит = 1 bsf PORTA, 0 ; строб в 1, бит записан в регистр rlf digitemp, f ; сдвиг данных влево decfsz count 1, f goto nextbit return .*ф************’1'***********************’1'*******>Н’1'******,|'**,|'**,|'. 5 » ; подпрограмма задержки ; .*************************************************************. delay movlw 0x10 movwf count 1 loop 2 movlw OxAO movwf count2 loopl decfsz count 2, 1 goto loop 1 decfsz countl, 1 goto loop2 return END 263
Часть 3. Программы и схемы ЭЛЕКТРОННЫЕ ЧАСЫ-ТЕРМОМЕТР НА PIC16F84 Предлагаемая здесь конструкция доступна для повторения даже неподготовленному радиолюбителю. Стоимость набора деталей до- статочно низка, и все они доступны для приобретения, включая мик- роконтроллер PIC16F84 и две микросхемы фирмы Dallas Semiconductor, которые легко можно заказать по почте из любого региона России. Часы-термометр поочередно показывают на индикаторе текущее время и температуру окружающего воздуха. Использование шины 12С позволяет одновременно подключить до восьми независимых микро- схем термометра/термостата DS1621, а также другие периферийные устройства. Поэтому предлагаемую конструкцию можно рассматри- вать как базовую, на основе которой можно построить устройства климатической автоматики, таймеры и т.д. Принципиальная электрическая схема изображена на рис.3-13. Она содержит минимум пассивных элементов. Часы реального вре- мени на микросхеме DS1307 имеют резервную трехвольтовую лити- евую батарейку. В качестве кварцевого резонатора XTAL1 исполь- зуется любой часовой кварц. Микросхема часов по цепям основного и резервного питания зашунтирована блокировочными кера- мическими конденсаторами 0,01 мкФ. При первом включении часов микроконтроллер настраивает микросхему таким образом, что на ее выходе SQW/OUT появляется частота 4000 Гц с внутреннего про- межуточного делителя. Выход SQW/OUT имеет открытый коллек- юр, поэтому к нему подключен подтягивающий резистор. Далее тактовые импульсы поступают на вход RA4/T0CKI для внешнего тактирования таймера и формирования таймерного прерывания. Если часы будут предназначены для эксплуатации вне помещения со стабильной температурой, то для большей точности хода желатель- но предусмотреть термостатирование микросхемы часов и кварца или применить специальный термостабильный кварц. Можно, на- пример, использовать кварц от неисправных импортных автомо- бильных часов. Кварцы, применяемые в электронных часах инома- рок, особенно японских, обычно имеют очень хорошую термоста- бильность. Микросхема термометра-термостата DS1621 соединяется со схе- мой часов всего лишь четырьмя проводниками, включая питание, по- этому легко может быть вынесена за пределы корпуса основной кон- 264
Практические примеры схем и программ струкции. Используя выводы А0...А1, можно перемычками задавать субадрес термометра-термостата в адресном пространстве шины 12С. Можно подключить одновременно до восьми микросхем DS1621 на одну шину, с субадресами от ООО до 111. Одну из этих микросхем можно использовать в качестве собственного термостата часов, наст- роив ее соответствующим образом, и подключив к выходу Tout на- греватель через ключевой транзистор. При помощи остальных мик- росхем можно организовать сбор данных о температуре с нескольких точек. Это усовершенствование потребует незначительных изменений в программе и доступно даже начинающему разработчику. Выходные каскады линий SCL и SDA у микросхем DS1307 и DS1621 построены с открытым коллектором, поэтому к этим линиям также подключены подтягивающие резисторы. Если подключить ли- нии шины 12С к порту В микроконтроллера, то можно использовать его встроенные подтягивающие резисторы. В схеме, в качестве приме- ра, показаны оба варианта подключения: с внешними подтягиваю- щими резисторами к порту А (шина 12С) и без внешних резисторов к порту В (кнопки S1 и S2). Схема не критична к номиналу кварцевого резонатора в тактовом генераторе микроконтроллера. Можно использовать кварц номина- лом от 3 до 4 МГц и емкости от 18 до 47 пФ при условии устойчивой генерации. Модуль индикации подключается к базовой схеме по пяти прово- дам, включая питание, и легко может быть вынесен за пределы основ- ной платы. Схема модуля индикации полностью идентична описан- ной выше. На схеме не показан источник питания +5 В. Максимальный по- требляемый ток схемы около 170 мА, из которых 98% приходится на регистры модуля индикации. Для повышения помехоустойчивости желательно заблокировать цепи питания керамическими конденсато- рами 0,01 мкФ, подключенными вблизи выводов всех микросхем, осо- бенно аккуратно следует защищать от помех микросхему DS1307. Ба- тарейка ВТ1 любая трехвольтовая литиевая, аналогичная тем, кото- рые устанавливают на материнские платы компьютеров. Можно ис- пользовать две последовательно соединенные батарейки-"таблетки" от наручных часов. В режиме хранения информации ток, потребляе- мый микросхемой DS1307, сопоставим с током саморазряда батарей- ки, поэтому одной батарейки достаточно для резервирования пита- ния в течение нескольких лет. 265
§ 4«У U4 U7 - КР1533ИР24 или SN74ALS299,74LS299 выв 10 - GND, выв 20 - 46V LCD1 • ИЖЦ21-4/7 или аналогичный S G1 < 02 г $0 г* S1 Г *CLK < CLR Г- SR - SL G1 G2 $0 S1 •CLK CLR SR SL G1 G2 $0 S1 ►CLK CLR SR SL G1 CLK CLR SR SL Рнс. 3-13. Принципиальная электрическая схема часов-термометра ОД /VQA 0/08 C/QC O/QO ВОЕ F/QF G/QG H/QH ОН* ОД XVQA 0/08 C/QC D/QD ВОЕ F/QF G/QG H/QH ОН* ОД XVQA B/QB C/QC O/QO ВОЕ F/QF G/QG H/QH ОН* ОД л/оа B/QB C/QC 0/00 ВОЕ F/QF G/QG H/QH ОК [Л\ 16 НК Часть 3. Программы и схемы
Практические примеры схем и программ Описание приемов и тонкостей работы с микросхемами DS1307 и DS1621 выходит за рамки этой книги. Если вы хотите глубже изучить этот вопрос, обратитесь к pdf-файлам фирменной документации. Вы легко можете найти их в Iternet или получить в фирме, торгующей микросхемами производства Dallas Semiconductor, например, "АТОС", www atos ru. Авторский вариант схемы смонтирован на макетной плате отрезками провода МГТФ. При разработке печатной платы к ней не предъявляются особые требования. Надо только учитывать, что микросхема часов кри- тична к наводкам пс цепям питания, поэтому ее надо защитить блокиро- вочными емкостями и выполнить подключение к общему проводу пре- дельно коротким и широким проводником. АЛГОРИТМ ПРОГРАММЫ Алгоритм программы показан на рис.3-14. Логически программа разделена на две основных части: базовый модуль, который выполня- ется непрерывно и подпрограмму обработки таймерного прерывания. Инициализация по сбросу По сбросу программа стартует с адреса OOOOh и по первой команде переходит на метку mam, обходя подпрограмму обработки прерывания. Далее происходит следующее. • Происходит настройка портов ввода-вывода и регистра OPTION_REG. • Включаются встроенные подтягивающие резисторы, преддели- тель в режиме 1:8 подключается к таймеру TIMERO. • Включается режим отображения времени • Проверяется состояние несохраняемого бита настройки микро- схемы часов DS1307. Если этот бит сброшен, значит питание микро- схемы пропадало полностью, включая резервное, поэтому выполняет- ся инициализация микросхемы часов и устанавливается время 00 часов 00 минут. В противном случае инициализация игнорируется. • Инициализируется микросхема термометра. • Разрешается таймерное прерывание и начинается индикация те- кущего времени. После инициализации, в ожидании поступления таймерного пре- рывания, программа работает циклически. Поочередно опрашивается состояние кнопок "+час" и "+минута", обслуживается ЖК-индикатор, после чего цикл повторяется Поскольку для нормальной работы ЖК- индикатора требуется постоянно инвертировать уровень на подлож- ке, подпрограмма обслуживания индикатора включена в основной, достаточно быстрый цикл 267
Часть 3. Программы и схемы Рис.3-14. Обобщенный алгоритм программы часов-термометра
Практические примеры схем и программ При нажатии одной из кнопок коррекции времени вызывается подпрограмма обработки нажатия соответствующей кнопки. Новое значение времени записывается в регистры часов и отображается на индикаторе. На время настройки разделительная точка перестает ми- гать, указывая, что часы находятся в режиме коррекции. Режим кор- рекции включается независимо от того, что отображается, время или температура. Формирование таймерного прерывания Как уже было сказано в описании схемы, на вход таймера RA4/T0CKI через внутренний предделитель 1:8 поступают импульсы с частотой 4000Гц с выхода SQW/OUT микросхемы часов реального времени DS1307. Прерывание формируется при переполнении тайме- ра, т.е. при переходе состояния его счетчика из 255 в 0 (каждый 256-й импульс). Поэтому частота следования прерываний составляет около двух Герц: (4000/8)/256= 1,95. С такой частотой происходит опрос часов или термометра, в зависимости от того, какой режим включен в этот момент. Частота следования прерывания никак не влияет на точность хода часов. Обработка таймерного прерывания После генерации таймерного прерывания сохраняются текущие значения регистров W и STATUS, сбрасывается флаг прерывания и очищается таймер. Затем проверяется состояние бита <1> переменной flags. Если бит сброшен, значит происходит отображение текущего времени. Значения часов и минут считываются из регистров микро- схемы часов реального времени и конвертируются в формат отобра- жения на индикаторе при помощи подпрограммы clock. Состояние бита, управляющего включением/выключением разделительной точки, меняется на противоположное. Таким образом, в режиме ото- бражения времени разделительная точка мигает с частотой 1 Герц. Если бит <1> переменной flags установлен в 1, значит считывается значение температуры из регистров микросхемы термометра и кон- вертируется в формат отображения при помощи подпрограммы celsio. Разделительная точка гасится и во время отображения температуры не включается. Затем, и в том и в другом режиме, декрементируется счетчик се- кунд отображения текущего режима. Если время индикации данного режима истекло, значение бита режима индикации меняется на про- тивоположное и в счетчик индикации загружается время индикации другого режима. При окончании режима индикации температуры, кроМе этого, отдается команда термометру начать конвертацию 269
Часть 3. Программы и схемы (измерение) очередного значения температуры. Измерение темпера- туры производится только один раз за все время отображения пото- му, что микросхема термометра преобразует температуру в цифровое значение довольно долго. Время конвертации с учетом страховочного интервала может достигать 2-х секунд, поэтому термометр просто не успеет измерить температуру за один цикл прерывания. Впрочем, для измерения температуры в нашем случае задержка в несколько секунд не играет никакой роли и сопоставима с тепловой инерцией самой микросхемы. Обслуживание ЖК-индикатора Подпрограмма поддержки отображения на ЖК-индикаторе взята из предыдущего пункта, где описывалась конструкция ЖК-дисплея. Поддержка шины 12С Для работы с шиной 12С использованы свободно распространяе- мые в Internet подпрограммы. Не имеет смысла подробно описывать в этой книге протокол шины 12С и библиотеки для работы с ней. Для приведенной здесь программы многое (надеюсь) очевидно из коммен- тариев листинга. Если у кого-то появится желание более подробно изучить этот вопрос, то работа с шиной PC очень подробно описана в документации к микросхемам DS1307 и DS1621. Распространяемые в Internet библиотеки зачастую также имеют подробные комментарии и файлы описаний. ЛИСТИНГ ПРОГРАММЫ ДРАЙВЕРА ЧАСОВ ****************************3********************************** > ; Программа управления часами-термометром с ; жидкокристаллическим индикатором .************************************************************** J ; Использованные компоненты схемы: ; Микроконтроллер - PIC 16F84-04I/P ; Часы реального времени - DS1307 ; Термометр - DS1621 ; Индикатор - ИЖЦ21 -4/7 ; Регистры индикатора - КР1533ИР24 (4шт) .************************************************************** 9 9 ; Используемые выводы микроконтроллера: 170
Практические примеры схем и программ ; АО (17) - строб записи в регистры ; А1 (18) - данные для индикации ; А2 (1) - SCL ; АЗ (2) - SDA ; А4 (3) - вход 4кГц для таймера ; В1 (7) - вход кнопки "+минута" ; В2(8) - вход кнопки "+час" ; ВЗ (9) - подложка для LCD индикатора .***************************** ********************************>r: list p=16F84 #include <p!6F84.inc> _CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XTOSC w_temp EQU OxOC; переменная для временного хранения status_temp EQU OxOD; переменная для временного хранения count 1 EQU ОхОЕ ; рабочий счетчик count2 EQU OxOF ; рабочий счетчик count3 EQU 0x10 ; рабочий счетчик count4 EQU 0x11 ;рабочий счетчик flags EQU 0x12 ; переменная для хранения флаг-битов work_data EQU 0x13 ; рабочая переменная digit 1 EQU 0x14 ; значение для первого знакоместа digit2 EQU 0x15 ; значение для второго знакоместа digit3 EQU 0x16 ; значение для третьего знакоместа digit4 EQU 0x17 ; значение для четвертого знакоместа digitemp EQU 0x18 ; промежуточное значение знакоместа disp EQU 0x19 ; счетчик времени отображения bin EQU 0x1 А ; рабочая переменная tens_and_ones EQU Ox IB ; рабочая переменная для перекодировки hundreds EQU Ox 1С , рабочая переменная для перекодировки timelenght EQU 0x06 ; длительность индикации времени, сек templenght EQU 0x06 ; длительность индикации температуры, сек ;* Импортированные переменные для подпрограмм работы с шиной I2C * STATU EQU 20 ; Переменная состояния FLAG EQU 21 ; Переменная флагов общего назначения I2CDEV EQU 22 ; Битовый буфер ERCODE EQU 23 ; Код ошибки (для индикации занятости линии) ADDR EQU 24 ; Переменная адреса DATAI EQU 25 ; Переменная для хранения входных данных DATAO EQU 26 ; Переменная для хранения выходных данных DATAI. 1 EQU 27 ; Переменная для хранения входных данных DATAO-1 EQU 28 ; Переменная для хранения выходных данных ’271
Часть 3. Программы и схемы SLAVE EQU 29 , Адрес устройства (YYYYxxxO) TXBUF EQU 2A ; Буфер передачи RXBUF EQU 2B ; Буфер приема COUNT EQU 2C ; Счетчик битов ,*** Битовые переменные (флаги) подпрограмм работы с шиной I2C*** ERR1 EQU 0 , Флаг-бит ошибки (здесь не используется) SDA EQU 3 ; RA3, вход/выход данных (SDA) SCL EQU 2 ; RA2, тактовая частота (SCL) DI EQU 7 , Входной бит подпрограммы I2C DO EQU 6 ; Выходной бит подпрограммы I2C ORG 0x000 goto main ORG 0x004 ; вектор прерывания movwf w_temp ; сохранение текущего значения W movf STATUS,w ; перенос содержимого STATUS в W movwf status_temp ; сохранение содержимого регистра STATUS clrf TMRO ; очистка таймера bcf INTCON, T0IF ; сброс флага прерывания btfsc flags, 1 goto tempread timeread callclock btfss flags, 0 goto d_point bsf digit2, 7 bcf flags, 0 goto gohome d_point bcf digit2, 7 bsf lags, 0 decfsz disp, f ; если flags< 1 >=0 отображаем время ; если flags< 1 >= 1 отображаем температуру ; чтение текущего значения времени ; разделитель включен? ; если нет, ; то включаем разделитель ; сбрасываем флаг разделителя ; и выходим из подпрограммы ; иначе выключаем разделитель ; устанавливаем флаг разделителя ; уменьшаем на 1 время индикации. Время ; истекло? goto gohome bsf flags, 1 ; нет, продолжаем отображать часы ; иначе устанавливаем флаг индикации ; температуры movlw templenght movwf disp goto gohome ; и загружаем в disp ; длительность ее отображения tempread call celsio ; чтение текущего значения температуры 272
Практические примеры схем и программ btfss flags, 0 goto zerot bcf flags, 0 goto gohome zerot bsf flags, 0 decfsz disp, f , уменьшаем на 1 время индикации. Время , истекло? goto gohome , нет, продолжаем отображать термометр bcf flags, 1 ; если да, сбрасываем флаг индикации ; температуры movlw timelenght ; и устанавливаем длительность отображе- ; ния времени movwf disp movlw 0х9Е ; обращаемся к термометру movwf SLAVE movlw ОхЕЕ ; с командой начать новое измерение movwf ADDR gohome call WRCOM movf status_temp,w ; чтение копии регистра STATUS movwf STATUS ; восстановление значения регистра STATUS swapf w_temp,f swapf w_temp,w ; восстановление значения аккумулятора W retfie ; возврат из прерывания main clrf PORTA clrf PORTB clrf flags movlw timelenght movwf disp clrwdt ; очистка WDT и пределителя bsf STATUS, RPO ; bank 1 movlwb '01110010'; movwf OPTION_REG movlw b'l 1110000' movwf PORTA movlw b'l 111011Г movwf PORTB bcf STATUS, RPO; bank О *************************************************************. ; инициализация часов (DS 1307) и термометра (DS 1621) ; .*************************************************************. 10 Зак. Ns 4879 Яцонков 2»
Часть 3. Программы и схемы movlw 0х9Е movwf SLAVE , записываем в SLAVE адрес термометра movlw ОхАС movwf ADDR ; адрес регистра конфигурации термометра movlw OxOB ; режимы термометра. POL-high, ISHOT-yes movwf DATAO call WRBYTE , подпрограмма записи байта nop ; защитный интервал movlw 0x9E movwf SLAVE ; обращение к термометру movlw OxEE movwf ADDR ; команда начать измерение температуры call WRCOM ; запись команды в термометр nop ; защитный интервал movlw OxDO ; проверка пропадания питания movwf SLAVE ; установили адрес часов movlw 0x00 movwf ADDR ; установили адрес регистра состояния call RDBYTE ; считываем регистр состояния btfss DATAI,7 ; если питание не пропадало, обходим ; инициализацию goto okay ; и начинаем отображать время и температуру movlw OxDO movwf SLAVE clrw ; иначе - инициализируем часы movwf ADDR , кварцевый генератор включен, movwf DATAO ; счетчик секунд сброшен call WRBYTE ; запись байта nop movlw OxDO ; адрес для обращения к часам movwf SLAVE movlw 0x01 movwf ADDR movlw 0x00 movwf DATAO call WRBYTE ; обнуление счетчика минут nop movlw OxDO movwf SLAVE movlw 0x02 movwf ADDR ; адрес для обращения к часам movlw 0x00 ; обнуление счетчика часов 274
Практические примеры схем и программ movwf DATAO call WRBYTE nop movlw OxDO ; адрес для обращения к часам movwf SLAVE movlw 0x07 , адрес контрольного регистра movwf ADDR ; устанавливаем режим отображения 24 часа movlw 0x91 ; и частоту 4кГц на выходе Tout movwf DATAO call WRBYTE nop okay clrf TMR0 ; очищаем таймер movlw b'10100000' movwf INTCON; разрешаем прерывание no TMR0 repeat btfss PORTB, 1 ; нажата кнопка "+минута"? call mninc ; если да, увеличить значение минут call ind_LCD ; иначе обновить значение на индикаторе btfss PORTB, 2 ; нажата кнопка "+час"? call hrinc ; если да, увеличить значение часов call ind_LCD ; иначе обновить значение на индикаторе goto repeat .************************************************************* ; чтение текущего времени из часов ; .*************************************************************• clock movlw OxDO movwf SLAVE movlw 0x01 movwf ADDR call RDBYTEN ; чтение двух байтов: 01H, 02H movf DATAI.W andlw OxOF call convert ; табличная перекодировка movwf digit4 swapf DATAI,F movf DATAI,W andlw 0x07 call convert ; табличная перекодировка movwf digit3 movf DATAI_1,W andlw OxOF call convert ; табличная перекодировка 10' 275
Часть 3. Программы и схемы movwf digit 2 swapf DATAI_1 ,F movf DATAI_1,W andlw 0x03 btfsc STATUS,Z movlw OxOA call convert ; табличная перекодировка movwf digit 1 return .************************************************************* ; чтение значения температуры из термометра ; .*************************************************************. celsio movlw b'00000000' ; гасим первое знакоместо movwf digit 1 movlw b'OllOOOH' ;символ "градус" movwf di git 4 movlw 0x9E movwf SLAVE movlw OxAA movwf ADDR ; в четвертое знакоместо call RDBYTEN ; MSB-LSB movlw b'01000000' ; символ минус btfss DATAI,7 ; если бит 7= 1, то температура отрицатель- ; ная goto rotate decf DATAI,F movwf digit 1 ; записали символ минус в первое знако- ; место movlw OxFF xorwf DATAI,F rotate movf DATAI,W movwf bin bcf bin,7 call binary_to_bcd ; подпрограмма конвертации movf tens_and_ones,W andlw OxOF call convert movwf digit3 swapf tens_and_ones,F movf tens_and_ones,W andlw OxOF call convert 276
Практические примеры схем и программ movwf digit 2 xorlw 0x3F btfss STATUS, Z return movf digits, w movwf digit2 clrf digit4 movlw b'OHOOOH' movwf digits movf digit2, w xorlw 0x3F btfss STATUS, Z return clrf digit 1 return ; если в 2-м знакоместе незначащий ноль ; то для лучшей читаемости значения ; переносим значение из 3-го знакоместа в 2-е ; гасим 4-е знакоместо ;символ "С" ; в третье знакоместо ; если температура ноль градусов, ; то символ "плюс/минус" не отображаем .sic************************************************************* ; подпрограмма отображения 4 символов на ЖК-индикаторе ; .э|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|с>(сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|сэ|с. ind_LCD bcf PORTB, 3 movf digit 1, w movwf digitemp call loader movf digit2, w movwf digitemp call loader movf digit3, w movwf digitemp call loader movf digit4, w movwf digitemp call loader call delay ; уровень на подложке в 0 ; первая цифра в аккумуляторе ; выгрузили биты в индикатор ; вторая цифра в аккумуляторе ; выгрузили биты в индикатор ; третья цифра в аккумуляторе ; выгрузили биты в индикатор ; четвертая цифра в аккумуляторе ; выгрузили биты в индикатор ; все данные выгружены, держим данные ; на индикаторе bsf PORTB, 3 movf digit 1, w xorlw OxFF movwf digitemp call loader movf digit2, w xorlw OxFF movwf digitemp ; уровень на подложке в 1 ; первая цифра в аккумуляторе ; инверсия всех битов ; выгрузили биты в индикатор ; вторая цифра в аккумуляторе ; инверсия всех битов 277
Часть 3. Программы и схемы call loader movf digit3, w xorlw OxFF movwf digitemp call loader movf digit4, w xorlw OxFF movwf digitemp call loader call delay ; выгрузили биты в индикатор ; третья цифра в аккумуляторе ; инверсия всех битов ; выгрузили биты в индикатор ; четвертая цифра в аккумуляторе ; инверсия всех битов ; выгрузили биты в индикатор ; все данные выгружены, держим данные ; на индикаторе return .*************************************************************• 5 Э ; подпрограмма табличной конвертации ; ; принимает и возвращает данные в w .*************************************************************« convert addwf PCL, f retlw b’OOllllir retlw b'00000110' retlw b'OlOllOH' retlw b'OlOOllir retlw b'01100110' retlw Ь'ОНОИОН retlw b'OlllllOr’ retlw b'0000011Г retlw b'Olllllir retlw b'OllOllH' retlw b'00000000' retlw b'01000000' retlw b'OOlllOOr retlw b'01011110' retlw b'OHHOOr .***************************************************** Jit** *****, ’ 9 ; подпрограмма выгрузки знакоместа в регистры, ; ; данные в переменной digitemp ; .Нс************************************************************* ’ 9 loader movlw 0x08 movwf count3 nextbit bcf PORTA, 0 ; строб в 0 btfss digitemp, 7 ; проверяем старший бит 278
Практические примеры схем и программ bcf PORTA, 1 btfsc digitemp, 7 bsf PORTA, 1 bsf PORTA, 0 rlf digitemp, f decfsz count3, f goto nextbit return ; установили порт Al в 0, если текущий бит = 0 ; установили порт А1 в 1, если текущий бит = 1 ; строб в 1, бит записан в регистр ; сдвиг данных .Нефф**********************************************************. ; подпрограмма обработки кнопки "+час" .*************************************************************. hrinc clrf INTCON bcf flags, 1 movlw timelenght ; запрещаем все прерывания ; переустанавливаем время работы в режиме ; "часы" movwf disp movlw OxDO movwf SLAVE movlw 0x02 movwf ADDR call RDBYTE ; читаем текущее время swapf DATAI, w andlw OxOF movwf digitemp btfss digitemp, 1 goto highl movf DATAI, w andlw OxOF addlw 0x01 movwf w_temp btfsc w_temp, 2 clrf w_temp movf w_temp, f ; выделили старший полубайт в digitemp ; если старший разряд не равен 2 ; уходим на другой фрагмент ; выделяем младший полубайт ; если младший разряд часов =4 обнуляем его btfsc STATUS, Z clrf digitemp ; и обнуляем старший разряд, получили ; 00 часов goto sethr highl movf DATAI,w andlw OxOF addlw 0x01 movwf w_temp ; выделяем младший полубайт 279
Часть 3. Программы и схемы sublw OxOA btfsc STATUS, Z clrf w_temp ; если младший разряд часов больше 9, btfsc STATUS, Z incf digitemp, f ;обнуляем ; прибавляем 1 в старший разряд sethr swapf digitemp, f movf digitemp, w iorwf w_temp, f ; соединили старший и младший разряды movlw OxDO movwf SLAVE movlw 0x02 movwf ADDR movf w_temp, w movwf DATAO call WRBYTE ; в w_temp ; записали новое значение в часы call clock ; читаем новое значение времени bsf digit2, 7 ; разделитель постоянно включен movlw 0x10 movwf count4 reindh call indJLCD ; выполняем задержку в 1 Oh циклов инди- decfsz count4, f goto reindh clrf TMR0 ;кации ; очищаем таймер movlw b'10100000' movwf INTCON ; разрешаем прерывание по TMR0 return .*************************************************************. ; подпрограмма обработки кнопки "+минута" ; .*************************************************************. mninc clrf INTCON bcffiags, 1 movlw timelenght ; увеличиваем время работы в режиме "часы" movwf disp movlw OxDO ; читаем текущее время movwf SLAVE movlw 0x01 movwf ADDR call RDBYTE Ж
Практические примеры схем и программ swapf DATAI, w andlw OxOF movwf digitemp ; выделили старший полубайт в перем. sublw 0x05 btfss STATUS, Z ; digitemp ; если старший разряд не равен 5 goto high4 ; уходим на другой фрагмент movf DATAI, w andlw OxOF ; выделяем младший полубайт addlw 0x01 movwf w_temp sublw OxOA btfsc STATUS, Z clrf w_temp ; если младший разряд минут =10 обнуляем btfsc STATUS, Z clrf digitemp ; его ; и обнуляем старший разряд, получили 00 goto setmin high4 movf DATAI, w andlw OxOF ; минут ; выделяем младший полубайт addlw 0x01 movwf w_temp sublw OxOA btfsc STATUS, Z clrf w_temp ; если младший разряд минут больше 9, btfsc STATUS, Z incf digitemp, f ; обнуляем ; прибавляем 1 в старший разряд eetminswapf digitemp, f movf digitemp, w iorwf w_temp, f ; соединили старший и младший разряды movlw OxDO movwf SLAVE movlw 0x01 movwf ADDR movf w_temp, w movwf DATAO call WRBYTE ; в w_temp ; записали новое значение в часы call clock ; читаем новое значение времени bsf digit2, 7 ; разделитель постоянно включен
Часть 3. Программы и схемы movlw 0x10 movwf count4 reindm call ind_LCD decfsz count4, f goto reindm clrf TMRO ; очищаем таймер movlw b'10100000' movwf INTCON ; разрешаем прерывание no TMRO return .*************************************************************. 5 > ; подпрограмма задержки ; .*************************************************************' delay movlw 0x10 movwf count 1 loop2 movlw OxAO movwf count2 loopl decfsz count2, 1 goto loopl decfsz count 1,1 goto loop2 return .************************************************************** ; ИМПОРТИРОВАННЫЕ ПОДПРОГРАММЫ ; .*************************************************************. .♦.♦.♦**♦*♦♦+*♦+**+*♦++♦♦(,***♦***.*********+***♦******♦♦♦****♦♦♦♦• ; Запись одного байта данных в устройство I2C ; ; Входные данные: DATAO = байт данных для записи ; ADDR = адрес назначения (в устройстве) ; ; SLAVE = адрес устройства в схеме (101 ОхххО) ; .********************************** * * ***** *** * * ************. WRBYTE MOVF SLAVE,W MOVWF TXBUF CALL BSTART CALL TX MOVF ADDR,W MOVWF TXBUF CALL TX ; Переносим адрес устройства ; в буфер передачи ; Генерируем бит START ; Передаем адрес устройства ; Переносим адрес назначения ; в буфер передачи ; Передаем адрес назначения 282
Практические примеры схем и программ MOVF DATAO,W ; Переносим данные MOVWF TXBUF ; в буфер передачи CALL ТХ ; Передаем данные и анализируем подтвер- ; ждение CALL BSTOP ; Генерируем бит STOP RETURN .фффИс***************************************************** >к* * * • J > ; Запись команды в устройство I2C ; Входные данные: ADDR = команда ; ; SLAVE = адрес устройства в схеме (ЮЮхххО) .lie************************************************************- WRCOM MOVF SLAVE,W MOVWF TXBUF CALL BSTART CALL TX MOVF ADDR,W MOVWF TXBUF CALL TX CALL BSTOP RETURN ; Переносим адрес устройства ; в буфер передачи ; Генерируем бит START ; Передаем адрес устройства ; Переносим слово команды ; в буфер ; Передаем команду ; Генерируем бит STOP .^ф***^*******************************************************. ; Запись ДВУХ байтов данных в устройство I2C ; ; Входные данные: DATAO = 1-й байт данных для записи ; DATAO_1 = 2-й байт данных для записи ; ; ADDR = адрес назначения (в устройстве) ; ; SLAVE = адрес устройства в схеме (ЮЮхххО) .************************************************************* WRBYTEN MOVF SLAVE,W MOVWF TXBUF CALL BSTART CALL TX MOVF ADDR,W MOVWF TXBUF CALL TX MOVF DATAO ,W MOVWF TXBUF ; Переносим адрес устройства ; в буфер передачи ; Генерируем бит START ; Передаем адрес устройства ; Переносим адрес назначения ; в буфер передачи ; Передаем адрес назначения ; Переносим первый байт данных ; в буфер передачи 283
Часть 3. Программы и схемы CALL ТХ , Передаем данные и анализируем под- ; тверждение MOVF DATAO_1 ,W , Переносим второй байт данных MOVWF TXBUF ; в буфер передачи CALL ТХ ; Передаем данные и анализируем подтвер- ; ждение CALL BSTOP ; Генерируем бит STOP RETURN .************************************************************** ; Чтение байта данных из устройства I2C ; ; Входные данные: ADDR = адрес назначения (в устройстве) ; SLAVE = адрес устройства в схеме (101 ОхххО) : ; Выходные данные: DATAI = байт данных ; .*************************************************************. RDBYTE MOVF SLAVE,W ; Переносим адрес устройства MOVWF TXBUF ; в буфер передачи (R/W = 0) CALL BSTART ; Генерируем бит START CALL TX ; Передаем адрес устройства MOVF ADDR,W ; Переносим адрес назначения MOVWF TXBUF ; в буфер передачи CALL TX ; Передаем адрес назначения CALL BSTART ; Генерируем бит START MOVF SLAVE,W ; Переносим адрес устройства MOVWF TXBUF ; в буфер передачи BSF TXBUF,0 ; Устанавливаем режим READ (R/W = 1) CALL TX ; Передаем адрес устройства CALL RX ; Читаем байт и подтверждение CALL BSTOP ; Генерируем бит STOP MOVF RXBUF,W ; Сохраняем данные MOVWF DATAI ; в буфере приема DATAI RETURN .И*************************************************************. , Чтение ДВУХ байтов данных из устройства I2C ; ; Входные данные: ADDR = адрес назначения (в устройстве) ; ; SLAVE = адрес устройства в схеме (101 ОхххО) ; ; Выходные данные: DATAI = 1-й байт данных ; ; DATAI_1 = 2-й байт данных ; .*************************************************************. 5 ? 284
Практические примеры схем и программ RDBYTEN MOVF SLAVE,W MOVWF TXBUF CALL BSTART CALL TX MOVF ADDR,W MOVWF TXBUF CALL TX ; Переносим адрес устройства ; в буфер передачи (R/W = 0) ; Генерируем бит START ; Передаем адрес устройства ; Переносим адрес назначения ; в буфер передачи ; Передаем адрес назначения CALL BSTART ; Генерируем бит START MOVF SLAVE,W MOVWF TXBUF BSF TXBUF,0 CALL TX CALL RXO MOVF RXBUF,W MOVWF DATAI CALL RX MOVF RXBUF,W MOVWF DATAI. 1 CALL BSTOP RETURN ; Переносим адрес устройства ; в буфер передачи ; Устанавливаем режим READ (R/W = 1) ; Передаем адрес устройства ; Читаем первый байт и подтверждение ; Сохраняем данные ; в буфере приема DATAI ; Читаем второй байт и подтверждение ; Сохраняем данные ; в буфере приема DATAI_1 ; Генерируем бит STOP .Ис************************************************************* ; Подпрограмма генерации бита START ; ; Генерируется бит START (SCL удерживается в состоянии 1, ; ; пока на SDA происходит переход от высокого уровня к низкому) ; ; затем проверяется состояние линии SCL. ; ; Входных и выходных данных нет. .**************************** ****** **************************** BSTART MOVLW В'00000000' MOVWF PORTA BSF PORTA,SDA BSF PORTA,SCL MOVLW 1 BTFSS PORTA,SCL CALL ERR BCF PORTA,SDA NOP NOP NOP ; Настраиваем SCL и SDA на вывод ; В СООТВЕТСТВИИ СО СХЕМОЙ!!! ; надо быть уверенным, что SDA= 1 ^устанавливаем SCL=1 ; предполагаемый код ошибки 1 ; линия блокирована? ; если да, обработка кода ошибки ; переводим SDA в 0, пока SCL=1 ; защитный временной интервал 285
Часть 3. Программы и схемы BCF PORTA,SCL ; сбрасываем SCL, START выполнен RETLW О ; Генерация бита STOP ; ; Генерируется бит STOP (состояние SDA переходит из 0 в 1, ; пока на SCL удерживается высокий уровень) ; Входных и выходных данных нет. . э*е ** ** * * ** ** afe afe afe * ** ** afe ** afe * * ** ** ** afe * * ** ** afe afe * * ** ** ** afe afe * * *********. > з BSTOP MOVLW В’ОООООООО’ ; Настраиваем SCL и SDA на вывод MOVWF PORTA ; В СООТВЕТСТВИИ СО СХЕМОЙ!!! BCF PORTA,SDA ; Устанавливаем SDA=0 BSF PORTA,SCL ; Устанавливаем SCL=0 NOP ; Защитный временной интервал NOP NOP MOVLW 1 ; Предполагаемый код ошибки 1 BTFSS PORTA,SCL ;SCL=1? CALL ERR ; Нет, SCL удерживается устройством в 0 BSF PORTA,SDA ; Переводим SDA из 0 в 1, пока SCL=0 MOVLW 4 ; Предполагаемый код ошибки 4 BTFSS PORTA,SDA ;SDA=1? CALL ERR ; Нет, SDA не освобождается для STOP RETLW 0 .*************************************************************. ; Получение бита данных из устройства I2C в PIC ; .*************************************************************. BITIN MOVLW В'ООООЮОО' MOVWF PORTA BSF PORTA,SDA BCF I2CDEV,DI BSF PORTA,SCL MOVLW 1 BTFSC PORTA,SCL GOTO BIT1 BTFSS FLAG,ERR 1 MOVWF ERCODE BSF FLAG,ERR 1 ; SDA - ввод, SCL - вывод ; В СООТВЕТСТВИИ CO СХЕМОЙ ; DI=0 ;SCL=1 ; Предполагаемый код ошибки ; Пропустить, если SCL=0 ; Первая ли ошибка обнаружена? ; Сохранить код ошибки ; Установить флаг ошибки 286
Практические примеры схем и программ ШТ! BTFSC PORTA,SDA ; Читать данные с SDA BSF I2CDEV,DI ; DI=1 (если считана 1) NOP ; Защитная задержка NOP BCF PORTA,SCL , SCL=0 RETLW 0 *** зфс ******* зфс зфс зфс зфс зфс ******** ************************************** ; Передача бита данных из PIC в устройство I2C ; .♦#############################################*#*####*#####**. BITOUT MOVLW В'00000000' MOVWF PORTA BTFSS I2CDEV.DO GOTO BITO BSF PORTA,SDA MOVLW 2 BTFSC PORTA,SDA GOTO CLK1 BTFSS FLAG,ERR 1 MOVWF ERCODE BSF FLAG,ERR 1 GOTO CLK1 BITO BCF PORTA,SDA NOP NOP NOP NOP NOP CLM-1 BSF PORTA,SCL MOVLW 1 BTFSC PORTA,SCL GOTO BIT2 BTFSS FLAG,ERR 1 MOVWF ERCODE BSF FLAG,ERR 1 W NOP NOP ; SDA, SCL на вывод ; В СООТВЕТСТВИИ СО СХЕМОЙ , DO=0? ; если да, перейти на BITO ;SDA=1 ; предполагаемый код ошибки 2 ; проверка на наличие ошибки 2 ; если ошибки нет, уйти на CLK1 ; первая ли ошибка обнаружена? ; сохраняем код ошибки ; устанавливаем флаг наличия ошибки ; SDA=0 ; защитная задержка ;SCL=1 ; предполагаемый код ошибки 1 ; SCL удерживается в 0? ; если нет, перейти на BIT2 ; если да, ; сохранить код ошибки ; установить флаг наличия ошибки ; защитная задержка 287
Часть 3. Программы и схемы NOP BCF PORTA,SCL ; возврат SCL в О RETLW О .*************************************************************, ; Получение 8-битных данных из устройства I2C в PIC : ; Входных данных нет : ; Выходные данные: принятый байт в переменной RXBUF •*************************************************************. RX MOVLW .8 MOVWF COUNT CLRF RXBUF ; количество принимаемых битов ; очистка буфера приема RXLP RLF RXBUF, F SKPC BCF RXBUF ,0 SKPNC BSF RXBUF,0 ; сдвиг данных в буфере из бита переноса ; пропустить, если CARRY=1 ; очистка нулевого бита RXBUF ; пропустить, если CARRY=0 ; установить в 1 нулевой бит RXBUF CALL BITIN ; прочитать бит из устройства BTFSC I2CDEV,DI BSF RXBUF,0 DECFSZ COUNT, F GOTO RXLP BSF I2CDEV,DO CALL BITOUT ; если входной бит = 1, установить ; в 1 нулевой бит RXBUF ; все биты получены? ; нет, продолжить ; установить бит протокола ASK= 1 ; для прекращения дальнейшего обмена ; данными RETLW О •Не************************************************************. ; Получение 8-битных данных, в случае, если ASK=0 ; ; Полученный байт данных помещается в переменную RXBUF ; .************************************************************** RXO MOVLW .8 ; количество принимаемых битов MOVWF COUNT CLRF RXBUF ; очистка буфера приема RXLP0 RLF RXBUF, F SKPC BCF RXBUF,0 SKPNC 288
Практические примеры схем и программ BSF RXBUF.0 CALL BITIN BTFSC I2CDEV,DI BSF RXBUF,0 DECFSZ COUNT, F GOTO RXLPO BCF I2CDEV,DO CALL BITOUT ; установить бит протокола ASK=0(!!!) ; для прекращения дальнейшего обмена ; данными RETLW 0 .###*##########*####*#*##♦***♦**********************♦♦♦♦♦♦♦***• ; Побитная передача данных из PIC в устройство I2C ; Входные данные: байт в переменной TXBUF ; ; Выходные данные: нет ; Данные выводятся побитно через бит переноса CARRY .*************************************************************• IX MOVLW .8 MOVWF COUNT' TXLPBCF I2CDEV,DO BTFSC TXBUF,7 BSF I2CDEV,DO CALL BITOUT RLF TXBUF, F SKPC BCF TXBUF,0 ; количество передаваемых битов ; фиксируем выходной бит DO=0 ; если выводимый бит = 0, DO=0 ; иначе DO= 1 ; подпрограмма вывода бита ; сдвиг TXBUF влево ;f(6) —>f(7) ; f(7) —> carry SKPNC ; carry —> f(0) BSF TXBUF,О DECFSZ COUNT, F ; все биты выведены? GOTO TXLP CALL BITI MOVLW 3 ; нет, продолжить ; читаем бит протокола ASK ; предполагаемый код ошибки BTFSC I2CDEV.DI ; проверяем бит ASK CALL ERR RETLW 0 ; нет подтверждения от устройства .*************************************************************• ; Подпрограмма обработки кода ошибок шины I2C ; Входные данные: регистр W - код ошибки ; Выходные данные: переменная ERCODE - код ошибки ; FLAG(ERR1)=1 289
Часть 3. Программы и схемы ; код причина появления ошибки ; 5 " " " ’ , ; 1 : SCL удерживается в 0 (шина постоянно занята) ; ; 2 : SDA удерживается в 0 (шина постоянно занята) , , 3 Нет ответа от устройства ; ; 4 . SDA не освобождается для генерации бита STOP ; Подпрограмма идентифицирует состояние линий SCL и SDA в ; •.соответствии с таблицей кодов ошибок и выставляет флаг ошибки ; .***Ис*********************************************************. ERR BTFSS FLAG,ERR ; Первая ли ошибка встречена? MOVWF ERCODE ; Если да, сохранить код ошибки BSF FLAG,ERR1 ; Установить флаг наличия ошибки RETLW 0 ; Возврат с обнулением W . Ис************************************************************* ; Преобразование двоичного числа в двоично-десятичное ; ; Входные данные’ bin - исходное двоичное число ; ; Выходные данные: hundreds - сотни ; ; tens_and_ones - десятки и единицы ; .*************************************************************. binary_to_bcd CLRF hundreds SWAPF bin, W ADDWF bin, W ANDLW b'0000111 Г SKPNDC ADDLW 0x16 SKPNDC ADDLW 0x06 ADDLW 0x06 SKPDC ADDLW -0x06 BTFSC bin,4 ADDLW 0x16 - 1 + 0x6 SKPDC ADDLW -0x06 BTFSC bin, 5 ADDLW 0x30 290
Практические примеры схем и программ BTFSC ADDLW BTFSC ADDLW ADDLW RLF BTFSS ADDLW MOVWF BTFSC INCF RETURN bin, 6 0x60 bin, 7 0x20 0x60 hundreds, F hundreds, 0 -0x60 tens_and_ones bin,7 hundreds, F .**************** КОНЕЦ ПРОГРАММЫ *********************** END ПОДБОРКА ССЫЛОК В INTERNET Из огромного, практически необъятного множества ссылок на ре- сурсы Internet, в которых говорится о применении микроконтролле- ров PIC, мы выбрали лишь некоторые Надеемся, что они помогут вам в работе. К моменту написания книги все эти ссылки работали и их содержание соответствовало приведенному в аннотации Наверня- ка, к тому моменту, когда вы будете читать эту книгу, некоторые сай- ты или страницы прекратят свое существование, зато появятся новые интересные ресурсы. Возможно вы знаете адреса сайтов, которые до- стойны особого внимания, но не упомянуты в книге. Обратиться не- посредственно к автору книги, задать вопросы и высказать коммен- тарии вы можете, посетив сайт httn://radiospy.chat.ru. www.microchip.com - официальный сайт компании Microchip® Technologies Официальные новости компании, описания продуктов, новейшие версии MPLAB, примеры применения. www.microchip.ru - официальный сайт ООО "Микро-Чип", россий- ской фирмы, занимающейся продажей компонентов, произведенных компанией Microchip, а также различных сопутствующих компонен- тов и программаторов. На сайте конференция, подборка ссылок, справочные данные. На русском языке. www.geocities.com/SiliconValley/Way/5807/ - просто огромная под- борка ресурсов абсолютно про все, имеющее отношение к PIC. Автор - Алексей Владимиров, сайт на английском языке. Если вас не пугает перспектива чтения англоязычных страниц, то в поисках информации о PIC начинайте свое путешествие по Internet отсюда. www.koillismaa.fi/~tapsa/pic.html - на этой странице большая под- борка ссылок на Интернет-ресурсы по PIC Сайт финский, но аннота- 291
Подборка ссылок в Internet ции ссылок на английском языке. www.chat.ru/~picclub - страничка Луганского клуба разработчиков электронных и микропроцессорных устройств. Приведены полезные бесплатные схемы и программы на PIC, FAQ и многое другое. www.scenix.com.ua/develop.html - работа с микроконтроллерами Scenix - ваш следующий шаг после освоения Microchip PIC. Если го- ворить упрощенно, то Scenix - это очень сильно "продвинутый" PIC. На сайте официального представительства Scenix на Украине поме- щено множество крайне полезных ссылок на описания программато- ров, бесплатные программы и описания. www.pgm.ru - В одной таблице представлены сводные данные обо всех широкоизвестных программаторах из ценовой категории до 400 долларов США, реально доступных небогатому отечественному по- купателю и присутствующих на складе фирмы "Фитон" в Москве. Так же для сравнения представлены две топ-модели: MultiProg и Стерх- 01 1. Приведена статья о выборе оптимальных программаторов. www.phyton.ru - Фирма "Фитон" специализируется на разработке, изготовлении и поставке инструментальных средств для однокрис- тальных микроконтроллеров (ОЭВМ) семейств Intel MCS-96, Microchip PIC, Intel MCS-51 и их аналогов. www.sinor.ru/~zvn/prog pic.html - программа "Prog-PIC" (130kb) и схема программатора. http://ul.chat.ru/hack84.htm - снятие защиты с Р1С16х8х. http://me.tusur.ru/~radio/micro - страница по вопросам применения микроконтроллеров. Можно найти примеры схем и программ, ответы на часто задаваемые вопросы. www.sinor.ru/~zvn/main.html - программирование микроконтролле- ров с FLASH-памятью. www.telesys.ru/proiects/proi009/index.shtml - схема и описание не- сложной конструкции "Бегущая строка", доступной начинающим ра- диолюбителям. www.disall.newmail.ru/any.htm - разное о микроконтроллерах. В том числе, об отечественном почти-аналоге PIC16F84 - микроконтролле- ре КР1878ВЕ1, в чем-то даже превосходящем PIC. www.picpoint.com - сайт Tiziano Galizia, по тематике PIC, имеются описания проектов, ссылки, конференция. Можно искать описания готовых проектов в базе данных. Недавно вновь открыт после рекон- струкции. На английском языке. www.towertech.it/azummo - сайт Alessandro Zummo с подборкой ре- сурсов по PIC и не только, описанием проектов, программ и т.д. На английском языке. www.bobblick.com/bob/proiects - подборка описаний несложных, но весьма занятных любительских конструкций, в том числе программа- торов PIC. Среди проектов такой "шедевр", как переделка микроволно- вой печи в любительский трансивер на 2,45 ГГц. На английском языке. 292
СОДЕРЖАНИЕ Предисловие...................................................3 Введение......................................................4 Часть 1. Обзор микроконтроллеров PIC фирмы Microchip..........7 Популярные микроконтроллеры PIC............................8 Микроконтроллеры PIC16F8x и PIC16CR8x......................9 Расположение и назначение выводов......................11 Электрические параметры ...............................14 Организация памяти.....................................15 Специальные регистры...................................18 Программный счетчик....................................25 Порты ввода-вывода.....................................27 Модуль TIMER0 и регистр TMRO...........................32 Работа с EEPROM........................................34 Слово конфигурации CPU.................................38 Внешние источники тактовой частоты.....................39 Организация сброса.....................................43 Организация прерываний.................................46 Сторожевой таймер......................................48 Энергосберегающий режим SLEEP..........................49 Система команд.........................................51 Приложение 1. Отличия микроконтроллера PIC16C84 от PIC 16F83/84 и PIC16CR83/84............................69 Приложение 2. Улучшенные характеристики PIC16F8x и совместимость программных кодов между PIC16C5X и PIC16F8X.71 Микроконтроллеры PIC12С5хх.................................73 Основные электрические параметры........................75 Расположение и назначение выводов ......................76 Организация памяти......................................79 Специальные регистры....................................82 Программный счетчик.....................................87 Порты ввода-вывода......................................89 Модуль TIMER0 и регистр TMRO............................92 Работа с EEPROM (только для PIC12CE518 и PIC12CE519)....95 Слово конфигурации CPU..................................97 Источники тактовой частоты..............................98 Организация сброса......................................103 Сторожевой таймер.......................................106 Энергосберегающий режим SLEEP...........................107 Система команд (только отличия от PIC16F8X).............108 293
Часть 2. Руководство для начинающих. Первые шаги.............110 Простой программатор Pl 6PRO..............................111 Схема и печатная плата.................................111 Работа с программой P16PRO Light.......................115 Интегрированная среда разработки MPLAB....................119 О версиях программы....................................119 Начинаем работу с MPLAB................................124 Подробнее о редакторе MPLAB-Editor.....................128 Ассемблирование и отладка программ.....................135 Подробнее о проектах в MPLAB...........................139 Расширенные отладочные функции MPLAB...................144 Ассемблер MPASM...........................................160 Директивы ассемблера...................................169 Макросы и макроязык....................................203 Применение ассемблера для программирования EEPROM......209 Компоновщик MPLINK........................................211 Взаимосвязь проектов MPLAB с MPLINK....................216 Скрипты компоновщика...................................217 Как работает компоновщик...............................222 Менеджер библиотек MPLIB..................................226 Часть 3. Программы и схемы...................................229 Пишем первые программы....................................229 Hello, world! Мигающий светодиод.......................230 Программа генерации звука..............................233 Обработка прерывания...................................237 Подпрограмма табличной конвертации - будьте внимательны!.240 Практические примеры схем и программ......................242 Сенсорный датчик ......................................243 Управление шаговым двигателем..........................249 Драйвер ЖК-дисплея на отечественных деталях............253 Электронные часы-термометр на PIC16F84 ................264 Алгоритм программы.....................................267 Листинг программы драйвера часов.......................270 Подборка ссылок в Internet................................. 291
Phyten Инструментальные средства для мнкрояонгро i icpoB для профессионалов OKI SST Intel AMD MHS Zilog Atmel Philips Motorola Microchip Dallas Semiconductor Комплексные пакеты средств разработки. • Интегрированные среды разработки. • Си-компиляторы и ассемблеры. • Контроллеры-конструкторы. • Внутрисхемные эмуляторы. • Отладчики-симуляторы. • Программаторы: ПЗУ, FLASH, ОЭВМ, PLD. • Поставка ОЭВМ и ЖКИ. "ФИТОН" 127474, Москва. r80С 51 MCS-196 PlCmicro l AVR Дмитровское шоссе 62 к. 2 Телефакс: (095)-481-0583, 481-1383 E-mal: phyton@phyton.ru Website: http://www.phyton.ru
КАК САМОМУ ИЗГОТОВИТЬ ПЕЧАТНУЮ ПЛАТУ НА ПРОФЕССИОНАЛЬНОМ УРОВНЕ ? СУЩЕСТВУЮТ ДВА ДОСТУПНЫХ СПОСОБА: вы сами легко наносите фоторезист на плату, пользуясь нашим фоторезистом в аэрозольной упаковке. Рисунок на плате будет получен через три часа при незначительном расходе фоторезиста. Незаменимо при опытном и мелкосерийном производстве плат. ИЛИ ВЫ ИСПОЛЬЗУЕТЕ ГОТОВУЮ ЗАГОТОВКУ мы предлагаем очувствленные печатные платы с пленкой фоторезиста на высококачественном фольгированном стеклотекстолите. Рисунок промышленного качества получается через час. ВЫБИРАЙТЕ! В любом случае вы имеете разрешение элементов на плате не хуже 100 микрон. Не применяются никакие сложные реактивы или специальное оборудование, все процессы доступны в домашних условиях. Подробности о применении фоторезиста и других материалов на сайте http://users.compnet.ru/frast/ ЗАО «Фраст-М»: Адрес: 103527, г. Москва, Зеленоград, а/я 4, корпус 814. Телефон: (095) 530-78-88. Телефон/факс: (095)532-13-64. E-mail: frast@frast.compnet.ru, http://users.compnet.ru/frast/
ДЛЯ ЗАМЕТОК