Журнал Радио 1 номер 2002 год. МИКРОПРОЦЕССОРНАЯ ТЕХНИКА

РАЗРАБОТКА И ОТЛАДКА УСТРОЙСТВ НА МК

 А. ДОЛГИЙ, г. Москва

Окончание. Начало см. в "Радио", 2001. № 5 — 12

Емкости конденсаторов С1 и С2 (см. рис. 23) во всех случаях выбирают одинаковыми. Их минимальное значение — 15 (на верхней границе частотного диапазона), максимальное — 150 пФ (на нижней), оптимальное зависит от характеристик конкретного резонатора и установленного режима. Лучше всего подобрать конденсаторы экспериментально. Учтите, что чрезмерное увеличение их емкости может привести к слишком длительной "раскачке" генератора после включения питания и неустойчивому запуску МК. Проверка наличия колебаний с помощью осциллографа, подключаемого непосредственно к выводам резонатора, не всегда дает правильный результат.

Настроенный на работу с резонатором МК можно синхронизировать и внешним тактовым сигналом, подав его на вывод 16 (OSC1). Резонатор ZQ1 с конденсаторами С1, С2 в этом случае не используют, а вывод 15 (OSC 2) оставляют свободным. Частота внешнего сигнала может быть сколь угодно низкой.

Если FOSC0=FOSC1=1, частотозада-ющим элементом генератора служит RC-цепь (рис. 24). Номинал резистора R1 — 4,7...100 кОм, конденсатора С1 — не менее 20 пФ. Генерируемую частоту fosc (в мегагерцах) рассчитывают по формуле fosc = 740(1+R1/1000)/(R1C1+4R1+40), где R1 — в килоомах, С1 — в пикофарадах. В изготовленном устройстве частоту RC-генератора нужно обязательно проверить и при необходимости подобрать элементы R1 и С1. С вывода 15 (OSC2) в этом случае можно снять сигнал частотой fosc/4 для контроля работы генератора или синхронизации внешних устройств.

Следующий разряд слова конфигурации — WDTE — управляет работой сторожевого таймера (см. рис. 22). Если в нем лог. 1, таймер включен и по истечении определенного времени подаст сигнал установки МК в исходное состояние. Чтобы этого не произошло, по всей программе "разбрасывают" команды clrwdt, заставляющие таймер снова начать отсчет выдержки, с таким расчетом, чтобы при нормальном ходе программы промежутки времени между исполнениями этих команд были заведомо меньше выдержки времени таймера. Если из-за сбоя очередная команда clrwdt не будет исполнена вовремя, выдержка истечет, таймер сработает и работа программы начнется с самого начала.

Причину сброса МК легко установить. Для этого достаточно проанализировать разряд ТО регистра STATUS. Если в нем лог. О, сработал сторожевой таймер, если 1, произошел нормальный старт при включении питания. Под действием сигнала сброса, поданного на вывод 4 (MCLR), состояние ТО не изменяется.

Выдержка времени сторожевого таймера задана внутренним генератором МК, независимым от рассмотренного выше тактового. Без предварительного делителя она равна приблизительно 18 мс, сильно изменяясь при колебаниях температуры и напряжения питания. Задав PSA=1 в регистре OPTION_REG, можно подключить к сторожевому таймеру предварительный делитель (одновременно отключив его от TMR0). В зависимости от значений разрядов PS0—PS2 того же регистра выдержка увеличится максимум в 128 раз.

Разряд слова конфигурации PWRTE управляет "таймером включения питания" (Power-up Timer), который точнее было бы назвать таймером задержки включения МК после подачи напряжения питания. Рассмотрим подробнее процесс пуска МК. Как только нарастающее после включения напряжение питания достигнет 1,2...1,7 В, внутри МК формируется импульсу аппаратного сброса POR. Если PWRTE=0, импульс запускает таймер, создающий задержку приблизительно на 72 мс. За это время напряжение питания должно достичь уровня, достаточного для нормальной работы всех узлов МК (не менее 2,5...4,5 В в зависимости от модификации). Если источник питания обеспечивает значительно более быстрое нарастание напряжения, выдержку можно исключить, задав PWRTE=1.

Независимо от состояния PWRTE, следующим вступает в работу таймер включения генератора. Он создает выдержку времени, равную 1024 периодам колебаний тактового генератора, что необходимо для возбуждения и стабилизации режима последнего. Этот таймер не действует, если в качестве частотозада-ющей применена RC-цепь. Колебания такого генератора можно считать установившимися с первого такта. Лишь после срабатывания всех названных узлов МК приступает к исполнению первой команды программы.

Слишком медленное нарастание напряжения питания может быть причиной неустойчивого запуска МК. Часто прибор, нормально работавший, пока на него подавали напряжение уже включенного источника питания, отказывается работать, будучи постоянно соединен с источником, на выходе которого имеется конденсатор большой емкости, а выключатель находится в первичной цепи. В подобных случаях помогает дополнительная задержка, создаваемая внешними цепями, генерирующими при включении питания импульс низкого уровня достаточной длительности на выводе 4 (MCLR). Если в подаче такого импульса нет необходимости, упомянутый вывод подключают к источнику питания непосредственно или через резистор. Оставлять его свободным недопустимо, так как наведенные на нем помехи могут вызвать непредвиденный сброс МК. На работу таймеров включения питания и тактового генератора сигнал MCLR не влияет: его повторная подача не вызывает запуска этих таймеров.

Вот, пожалуй, и все, что касается разработки программы реверсивного счетчика. Нужно сказать, что она ни в коем случае не является ни единственно возможной, ни наилучшей из программ, решающих поставленную задачу. Как и в случае обычных непрограммируемых цифровых устройств, здесь возможны многочисленные варианты, каждый со своими особенностями, преимуществами и недостатками. Многие рассмотренные фрагменты были включены в программу лишь для демонстрации тех или иных особенностей и возможностей МК PIC16F84. Кстати, за время работы над циклом статей эта микросхема была снята с производства и заменена более быстродействующей (fosc — ДО 20 МГц) PIC16F84A. Они полностью программно и аппаратно совместимы, но при замене одной на другую в действующем устройстве необходимо убедиться в правильной работе тактового генератора.

Расскажем еще о некоторых, не рассмотренных ранее возможностях этих МК. Прежде всего, о так называемом EEPROM — электрически программируемом ПЗУ В состав памяти команд и данных оно не входит, имеет восьмиразрядную организацию и предназначено для хранения значений переменных программы при выключенном питании. Обычно числа из EEPROM после старта программы переносят в обычные ячейки памяти данных. Сделать это довольно просто: достаточно занести адрес нужной ячейки EEPROM в регистр EEADR, затем занести лог. 1 в разряд RD регистра EECON1 и прочитать хранящийся код из регистра EEDATA.

Строго говоря, перед обращением к EEPROM следует проверить содержимое регистра EECON1 и убедиться, что успешно закончены предыдущие операции чтения (RD=0) и записи (WR=0). Нулевые значения в этих разрядах устанавливают аппаратно, их принудительная запись не имеет смысла. Между записью лог. 1 в RD и чтением регистра EEDATA разряд RD должен успеть вернуться в исходное (нулевое) состояние. Обычно это не проверяют, так как чтение из EEPROM занимает всего один машинный цикл, для него достаточно времени, затрачиваемого на переключение банков регистров командой bcf.

Предварительного стирания содержимого ячейки EEPROM перед записью в нее не требуется, но процедура записи умышленно усложнена. Это сделано для того, чтобы при сбоях предотвратить случайное искажение хранящихся данных. Занеся в регистр EEADR адрес ячейки, а в EEDATA — предназначенный для записи в нее код, следует выполнить следующие операции:

Команды, выделенные полужирным шрифтом, обязательны перед записью в каждую ячейку EEROM. Запрет прерываний необходим, если они были разрешены. После начала записи прерывания можно разрешить вновь. Установить WREN=1 допустимо один раз перед началом цикла записи в несколько ячеек. Если же запись в EEPROM не предвидится, лучше занести в этот разряд лог. 0.

Собственно запись занимает довольно много времени (до 10 мс на ячейку). Выполняется она без участия процессорного ядра МК, которое может в это время заниматься другими делами. Об окончании записи свидетельствует аппаратное обнуление разряда WR регистра EEC0N1 и установка лог. 1 в его же разряде EEIF — флаге запроса прерывания. Как было сказано в разделе, посвященном прерываниям ("Радио", 2001, № 12, с. 24), "сбрасывать" флаг следует программно.

Запись в EEPROM, несмотря на все принятые меры, остается одной из самых "опасных" операций. Случайное выключение питания, подача сигнала сброса или срабатывание сторожевого таймера во время ее выполнения приводят к досрочному прекращению начатого процесса, содержимое записываемой ячейки остается неопределенным. Об ошибке сигнализирует (к сожалению, не всегда) WRERR=1 в регистре EECON1, который в этом случае следует принудительно обнулить и повторить запись. Более надежно контрольное считывание записанного значения и сравнение его с заданным.

Команда SLEEP переводит МК в "спящий" режим, в котором выполнение команд прекращается, состояние выходов остается таким, каким оно было до команды SLEEP, тактовый генератор выключается. Потребляемый "спящим" МК ток не превышает нескольких микроампер, но его могут значительно увеличить подключенные к выходам МК низкоом-ные нагрузки или высокочастотный сигнал, поданный на один из входов. Если сторожевой таймер был включен, он продолжает работать, начав по команде SLEEP новый отсчет выдержки времени.

Срабатывание сторожевого таймера — один из способов "разбудить" МК, но в отличие от аналогичного события в активном режиме оно не переводит МК в исходное состояние. Выполнение программы продолжается со следующей за SLEEP команды.

Другой способ — подача импульса сброса на вывод 4 (MCLR) — действует как обычно, программа выполняется с самого начала.

Если разрешены прерывания по изменению состояния выводов порта В, окончанию записи в EEPROM или внешнему сигналу INT, эти события также "разбудят" МК. Когда в регистре INTCON GIE=1, произойдет обычный вызов процедуры обработки прерывания по адресу 4. В противном случае (GIE=0) выполнение программы продолжится со следующей за SLEEP команды. Конечно, установить разряды регистров INTCON и EECON1 в нужные состояния следует еще до "усыпления" МК.


Увеличить

В заключение — перечень макроопределений, встроенных "по умолчанию" в ассемблер MPASM. Они приведены в табл. 21. Большая их часть — условные переходы и управление разрядами признаков (флагов) в регистре STATUS. Повторять эти определения в программе не нужно, а соответствующими макрокомандами можно пользоваться как обычными. Но следует помнить, что трансляция той же программы с помощью другого ассемблера может сопровождаться ошибками.

Вернуться к содержанию журнала "Радио" 1 номер 2002 год