Глава 10 Реальное окружение
До этого момента мы главным образом изучали взаимодействие программы с внутренними регистрами процессора и памятью данных. Но прежде чем перейти к изучению встроенных периферийных устройств микроконтроллера, посредством которых он может отслеживать состояние и управлять окружающей его средой, т. е. реальным миром вне его выводов, нам необходимо рассмотреть требования, предъявляемые к источнику питания, а также вопросы тактирования и сброса микроконтроллеров PIC.
Прочитав эту главу, вы:
• Ознакомитесь с рекомендуемыми величинами напряжения питания, а также допустимыми уровнями входных и выходных напряжений.
• Поймете, в чем разница между статической и динамической рассеиваемой мощностью, и узнаете, что величина последней прямо пропорциональна тактовой частоте микроконтроллера и квадрату напряжения питания.
• Научитесь переключать микроконтроллер в режим пониженного энергопотребления и выводить его из этого режима, а также узнаете, как этот режим влияет на процессор.
• Познакомитесь со встроенным тактовым генератором.
• Узнаете, как можно во время программирования микроконтроллера задавать его конфигурацию.
• Разберетесь в нюансах различных вариантов сброса.
В качестве своеобразной прелюдии к нашему разговору предлагаю взглянуть на Рис. 10.1, где показана структура микроконтроллеров PIC16F874 и PIC16F877, на примере которых мы в основном и будем далее изучать микроконтроллеры PIC. Эти модели полностью идентичны, за исключением большего объема памяти программ, данных и EEPROM в последней. Поэтому основное внимание мы уделим микроконтроллеру PIC16F877. Микроконтроллеры PIC16F873/6 являются 28-выводными вариантами тех же микроконтроллеров и соответственно имеют урезанный набор периферии. В дальнейшем для ссылки на эти четыре модели мы будем использовать обозначение PIC16F87X.
Рис. 10.1. Архитектура микроконтроллеров PICI6F874/77A
За исключением объемов различных областей памяти, ядра этих процессоров очень похожи на ядра остальных моделей среднего уровня, поскольку поддерживают набор из 33 команд, описанный в главе 5. Если сравнить структуру микроконтроллера PIC16F84, приведенную на Рис. 4.1 (стр. 89), со структурой микроконтроллеров, изображенной на Рис. 10.1, то можно заметить, что у последних имеется больше периферийных модулей. Разумеется, даже при наличии 40 выводов невозможно предоставить каждому периферийному устройству отдельные линии ввода/вывода для общения с внешним миром. Поэтому большинство выводов является разделяемым ресурсом. Например, вывод RA3 является 3-м битом порта А, но также может использоваться в качестве 3-го аналогового входа AN3 или даже как вход для подключения внешнего источника опорного напряжения Vref+ для модуля аналого-цифрового преобразователя. В более миниатюрных микроконтроллерах, таких как 18-выводной PIC16F627[128] и 8-выводной PIC12F675, цоколевка которых приведена на Рис. 10.2, тоже имеются различные периферийные модули. Только в этом случае один и тот же вывод может использоваться несколькими модулями, что накладывает более серьезные ограничения на одновременное применение различных модулей в конкретном приложении. В моделях с малым числом выводов разработчик обычно может использовать внутренний тактовый генератор, а также исключить вход внешнего сброса для экономии драгоценных ресурсов (см. Табл. 10.2).
Рис. 10.2. Цоколевка некоторых моделей микроконтроллеров PIC
Все микроконтроллеры РIС обычно имеют номинальное напряжение питания VDD = 5 В. Типичный представитель семейства PIC16F87X может работать на частотах до 20 МГц при напряжении питания 5 ±0.5 В. Если тактовая частота не превышает 16 МГц, то напряжение может быть снижено до 4 В. Многие представители семейства также имеют низковольтные исполнения. Например, микроконтроллер PIC16LF87X может работать на частотах до 10 МГц при напряжении 3…5.5 В, а при снижении частоты до 4 МГц напряжение питания может быть уменьшено до 2 В. А вот модели PIC12F629/675[129] даже в обычном исполнении могут работать при напряжении 2…5 В.
С точки зрения элементов схемы микроконтроллеры PIC являются обычными цифровыми микросхемами. Напряжение НИЗКОГО уровня на выводе, сконфигурированном как выход, не превышает значения VDD = 0.6 В при втекающем токе до 8.5 мА в диапазоне температур -40…+85 °C. Вывод, установленный микроконтроллером в состояние ВЫСОКОГО уровня, может отдавать ток до 3 мА, при этом напряжение на нем будет не менее VDD — 0.7 В, т. е. при VDD = 5 В напряжение ВЫСОКОГО уровня VОН = 4.3 В.
Для вывода, сконфигурированного как вход, напряжение величиной, составляющей менее 15 % (для входов с триггером Шмитта — менее 20 %) от напряжения питания, будет восприниматься как напряжение НИЗКОГО уровня. Таким образом, при VDD = 5 В входное напряжение НИЗКОГО уровня FIL составит 0.75 В. За небольшим исключением[130], все выводы, функционирующие как входы, воспринимают напряжение величиной более 25 % (для входов с триггером Шмитта — более 80 %) от напряжения питания плюс 0.8 В как напряжение ВЫСОКОГО уровня, т. е. VIH = 2 В при FDD = 5 В.
В Табл. 10.1 приведены значения тока потребления рассматриваемых моделей микроконтроллеров при различных режимах работы.
Многие микроконтроллерные устройства питаются от батарей, и в этих случаях величина тока потребления микроконтроллера является одним из его важнейших параметров. Для облегчения разработки таких устройств компания Microchip выпускает семейство nanoWatt, к которому, в частности, относятся модели PIC12F629/675. Представители этого семейства имеют очень маленькое потребление и способны работать в широком диапазоне питающих напряжений. Из документации на микроконтроллеры можно увидеть, что максимальный и минимальный токи потребления могут отличаться в десятки миллионов раз. Поэтому крайне необходимо четко понимать, какие факторы влияют на суммарное потребление микроконтроллера.
Типичная зависимость тока потребления микроконтроллеров PIC от их тактовой частоты приведена на Рис. 10.3. Ясно видно, что рассеиваемая мощность VDD х /DD прямо пропорциональна рабочей частоте. Так, при тактовой частоте 10 МГц ток потребления микроконтроллера в 100 раз больше, нежели при частоте 100 кГц.
Рис. 10.3. Типичная зависимость тока потребления от тактовой частоты
Чтобы понять, почему так происходит, представьте себе ключ, заряжающий и разряжающий емкостную нагрузку С, как показано на Рис. 10.4. В качестве такого ключа выступает транзистор, а нагрузкой является паразитная емкость связи со следующим полевым транзистором и его затвором. RS представляет собой сопротивление открытого транзистора.
Рис. 10.4. Эквивалентная схема выходного каскада (конденсатор С представляет собой как внутреннюю емкость, так и емкость нагрузки)
При разомкнутом ключе (транзистор закрыт) емкость заряжается по экспоненциальному закону до уровня V вольт с постоянной времени τ =CRL. В устойчивом состоянии в конденсаторе хранится энергия, равная 1/2 СV2 Дж. Кроме того, при протекании этого тока заряда конденсатора через сопротивление нагрузки в последнем рассеивается энергия, которая вычисляется следующим образом:
Итак, 1/2 СV2 Дж рассеивается на сопротивлении нагрузки (независимо от величины этого сопротивления RL!) и еще столько же накапливается в электрическом поле конденсатора. При разряде конденсатора эта накопленная энергия рассеивается на сопротивлении, образованном параллельным соединением резисторов RS и RL (и опять же значение рассеиваемой энергии не зависит от значений этих сопротивлений). Таким образом, при каждом переключении транзистора рассеивается энергия, равная CV2 Дж. Суммарная рассеиваемая мощность равна произведению этого значения на число циклов переключения в секунду (CV2f) плюс потери в статическом режиме из-за токов утечки.
Из предыдущего соотношения (CV2f) видно, что рассеиваемая мощность прямо пропорциональна частоте при любом заданном напряжении питания. Более того, она пропорциональна квадрату напряжения питания, так что, снизив напряжение питания в 2 раза (скажем, с 5 до 2.5 В), мы уменьшим рассеиваемую мощность (VDD х IDD) в 4 раза[131].
Значение динамической рассеиваемой мощности, вычисленной выше, следует сложить с мощностью, рассеиваемой в статическом режиме (при тактовой частоте устройства, равной нулю). Из нижней строки Табл. 10.1 видно, что величина этого базового тока (или тока в режиме Power Down), который в документации обозначается как IРD, обычно не превышает 1 мкА. При этом подразумевается, что периферийные модули, имеющие собственные тактовые генераторы (такие, как сторожевой таймер и схема сброса по снижению питания), отключены.
Разумеется, оставить процессор без тактового сигнала будет слишком непродуктивно, поскольку в этом случае он ничего не сможет делать! Однако во многих встраиваемых системах необходимость в вычислениях возникает спорадически, поэтому было бы полезно иметь возможность перевода процессора в режим ожидания в те периоды, когда от него не требуется никаких действий. Возьмем, к примеру, микроконтроллерный датчик системы радиотелеметрии, находящийся на дне озера. Он может проводить измерение температуры всего один раз в час, при этом время его работы от одной батареи должно составлять не менее года.
Для поддержки ситуаций, подобных описанной, все микроконтроллеры PIC имеют «спящий» режим, в котором внутренний тактовый генератор отключается. Переход в этот режим осуществляется по команде sleep. При нахождении в «спящем» режиме содержимое памяти данных не изменяется при условии, что напряжение питания больше 1.5 В (параметр VDR в документации). Микроконтроллеры PIC могут выходить из спящего режима при сбросе устройства (см. стр. 316), при появлении запроса разрешенного прерывания или при переполнении сторожевого таймера.
Когда процессор исполняет команду sleep, он сбрасывает бит в регистре STATUS (см. Рис. 4.6 на стр. 95) и выключает внутренний тактовый генератор. Если сторожевой таймер (см. стр. 453) включен, то при выполнении этой команды он вместе со своим предделителем сбрасывается, но продолжает работать, поскольку имеет собственный внутренний генератор. При этом устанавливается флаг
, индицирующий отсутствие тайм-аута. Содержимое всех регистров, включая различные установки портов, остается неизменным.
Для пробуждения микроконтроллера по прерыванию флаг этого прерывания должен быть сброшен, а соответствующий бит маски прерывания — установлен, чтобы разрешить запрос прерывания от этого источника. Если флаг общего разрешения прерываний GIE (см. Рис. 7.3 на стр. 213) установлен, то после выполнения команды, следующей за командой sleep, процессор перейдет к процедуре обработки прерывания, как и при обычном отклике на запрос прерывания. Однако если бит GIE сброшен, запрещая реакцию на прерывания, то процессор не будет передавать управление в обработчик прерывания, а просто выполнит команду, следующую за sleep, и продолжит работу в обычном режиме. Обратите внимание, что в этом случае программист должен будет после выхода из спящего режима сбросить соответствующий флаг прерывания.
Если при сброшенном бите GIE разрешенное прерывание произойдет до выполнения команды sleep (на что указывает установленный флаг прерывания), то команда sleep будет выполнена как команда nop (нет операции). При этом бит сброшен не будет, так что программа сможет, при необходимости, определить, действительно ли микроконтроллер находился в «спящем» режиме после выполнения команды sleep. Программа также может определить ситуацию пробуждения по тайм-ауту сторожевого таймера, контролируя состояние бита ТО регистра STATUS (в этом случае он должен быть сброшен). При использовании в программе сторожевого таймера хорошим тоном считается помещение перед командой sleep команды сброса сторожевого таймера clrwdt. Проверяя состояние флага соответствующего прерывания в регистре INTCON, можно будет определить, вышел ли микроконтроллер в результате прерывания из спящего режима или нет.
Независимо от причины, вызвавшей выход микроконтроллера из «спящего» режима, перед выполнением команды, следующей за sleep, формируется задержка длительностью 1024 такта fOSC. Эта задержка необходима для запуска тактового генератора и установления его сигнала. Данная задержка, показанная на Рис. 10.10, не формируется, если микроконтроллер использует тактовый генератор на RС-цепочке (см. Рис. 10.5, б и Табл. 10.3).
При выключенном сторожевом таймере ток ждущего режима IРD намного меньше. К примеру, в модели PIC16F87XA-I типичные значения тока IРD равны 1.5 мк (максимальное — 16 мкА) и 10.5 мкА (максимальное — 42 мкА) при выключенном и включенном сторожевом таймере соответственно. Указанные значения справедливы для VDD = 4 В, при этом все линии ввода/вывода микроконтроллера сконфигурированы как входы и подтянуты либо к VSS (как правило), либо к VDD.
Во всех микроконтроллерах PIC имеется встроенный тактовый генератор, который в совокупности с узлами схемы синхронизации формирует внутренние синхросигналы, показанные на Рис. 4.4 (стр. 92). Все модели могут работать в одном из четырех стандартных режимов, перечисленных в Табл. 10.2. В трех из этих режимов в качестве времязадающего элемента используется кварцевый или керамический резонатор, подключаемый между выводами OSC1 и OSC2 микроконтроллера. Для бюджетных приложений, не предъявляющих повышенных требований к стабильности частоты тактового сигнала, можно использовать режим, в котором частота тактового сигнала задается RС-цепочкой.
Таблица 10.2. Режимы работы тактового генератора
Режимы, стандартные для всех моделей
LP ∙ Экономичный режим для резонаторов с частотой до 200 кГц
XT ∙ Обычный режим для резонаторов с частотами от 200 кГц до 4 МГц
HS ∙ Высокопроизводительный режим для резонаторов с частотами от 4 до 20 МГц
RC/EXTRC ∙ Генератор с внешней RС-цепочкой. На вывод CLKOUT выдается тактовый сигнал
Дополнительные режимы для PIC12F629/675
INTOSC1 ∙ Внутренний RС-генератор 4 МГц. Вывод CLKOUT используется в качестве линии ввода/вывода
INTOSC2 ∙ Внутренний RС-генератор 4 МГц. На вывод CLKOUT выдается тактовый сигнал
ЕС ∙ Внешний генератор. Вывод CLKOUT используется в качестве линии ввода/вывода
RC2 ∙ Генератор с внешней RС-цепочкой. Вывод CLKOUT используется в качестве линии ввода/вывода
Из Рис. 10.5, а видно, что в режимах с резонатором для формирования сигнала используется инвертирующий усилитель, который отключается вместе с подключенными к нему узлами по команде sleep. Единственное различие между режимами заключается в коэффициенте усиления этого инвертирующего усилителя. В режиме LP коэффициент усиления имеет минимальное значение, за счет чего уменьшается потребление генератора. Режим HS используется при высоких частотах резонатора, при этом потребление генератора максимально. Вообще говоря, следует выбирать режим с минимально возможным коэффициентом усиления. В документации на конкретное устройство подробно указаны диапазоны рабочих частот и номиналы внешних компонентов. Максимальная тактовая частота моделей среднего уровня составляет 20 МГц[132], однако некоторые модели имеют пониженное быстродействие — их тактовая частота, как правило, не может превышать 4 МГц.
Рис. 10.5. Типовые конфигурации тактового генератора
В типичном устройстве с тактовой частотой 10 МГц используется 10-МГц кристалл с АТ-срезом в режиме HS, при этом С1 = 22 пФ и С2 = 33 пФ. В режиме LP используется 32-кГц резонатор с С1 = 68 пФ и С2 = 100 пФ. Несмотря на то что оба конденсатора могут иметь одинаковые номиналы, большее значение С2 улучшает пусковые характеристики после сброса и выхода из спящего режима. Некоторые резонаторы в режиме HS могут потребовать подключения к выводу OSC2 последовательного резистора. Более подробно это расписано в документе AN588 «Р1C16/17 Oscillator Design». Керамические резонаторы менее дороги, чем кварцевые, однако они имеют худшую точность установки частоты (порядка 0.5 %) и меньшую температурную стабильность. Некоторые керамические резонаторы могут уже иметь встроенные конденсаторы, что позволяет уменьшить количество компонентов схемы. В документе AN588 приводится сравнение керамических и кварцевых резонаторов, используемых в таких приложениях.
Четвертый из стандартных режимов позволяет использовать в качестве времязадающего элемента внешнюю ЛС-цепочку. В этом режиме, как показано на Рис. 10.5, б, вывод OSC2 играет роль буферизированного выхода тактового сигнала и может использоваться для синхронизации внешних цифровых схем, в том числе и других микроконтроллеров PIC. Такой режим в основном применяется в бюджетных приложениях, которые не предъявляют жестких требований к точности установки тактовой частоты и ее стабильности. Частота зависит от сопротивления R1, емкости конденсатора C1 и напряжения питания VDD. Как правило, в документации на конкретную модель приводятся таблицы и графики, показывающие типичные зависимости частоты от этих параметров. Так, в микроконтроллере PIC16F87X усредненное значение частоты будет равно 1.7 МГц ±10 % при VDD = 5 В, R1 = 3.3 кОм и C1 = 100 пФ (при температуре +25 °C). Разумеется, необходимо принимать во внимание точность параметров используемых компонентов, а также их температурные характеристики.
Кроме того, микроконтроллеры PIC можно тактировать от внешнего генератора. Эта возможность может быть полезна при работе нескольких устройств от одного тактового сигнала. В этом случае внешний генератор подключается к выводу OSC1 микроконтроллера, а вывод OSC2 оставляют неподключенным или заземляют через резистор, чтобы уменьшить уровень помех. Сигнал генератора должен удовлетворять следующим требованиям: напряжение НИЗКОГО уровня V1L < 0.3 VDD, а напряжение ВЫСОКОГО уровня V1H > 0.7 VDD[133]. При использовании внешнего генератора микроконтроллеры PIC должны работать в соответствующем по частоте режиме, рассчитанном на подключение резонатора.
Использование целых двух выводов для подключения времязадающих элементов слишком расточительно в случае 8-выводных устройств, особенно если учесть, что два вывода в любом случае используются для подачи питания! По этой причине в моделях с малым числом выводов обычно имеются дополнительные режимы схемы тактирования, предназначенные для высвобождения одного или даже обоих выводов под нужды ввода/вывода. В Табл. 10.2 для примера приведены режимы работы микроконтроллеров PIC12F629/675. В этих режимах используется генератор с внутренней RС-цепочкой, формирующий сигнал частотой 4 МГц. Как и в случае внешней RС-цепочки, реальное значение частоты можно определить только с известной долей приближения, однако для каждого конкретного экземпляра микроконтроллера программист может подстроить частоту, изменяя значение четырех младших битов регистра OSCAL (Oscillator CALibrate — калибровка генератора). За счет этого можно получить 16 слегка отличных друг от друга значений. Наилучшее из этих значений заносится при изготовлении микроконтроллера в последнюю ячейку памяти программ в виде команды retlw n. Таким образом, программист может в блоке инициализации программы выполнить эту команду с последующим копированием значения, возвращенного в W, в регистр OSCAL.
В режиме INTOSC2 на вывод OSC2 выдается тактовый сигнал для управления внешними узлами, как показано на Рис. 10.5, б. Остальные три режима высвобождают вывод OSC2 под нужды ввода/вывода. В частности, режим RC2 идентичен стандартному режиму RC (иногда называемому EXTRC), но не формирует выходного сигнала. Режим External Clock позволяет использовать внешний генератор, но, в отличие от обычного режима кварцевого генератора, также не препятствует использованию вывода OSC2 в качестве линии порта ввода/вывода.
Режим работы тактового генератора является всего лишь одной из опций, которые можно задавать в момент записи программы в память программ микроконтроллера. В принципе если вы не собираетесь разрабатывать собственный программатор, то вам будет совершенно неважно, каким образом осуществляется собственно процесс программирования. Но скорее всего вы будете использовать коммерческий программатор, например PICSTART®, выпускаемый компанией Microchip. Окно ИСР MPLAB при работе совместно с этим программатором показано на Рис. 17.4 (стр. 616).
Тем не менее для полноты изложения на Рис. 10.6, а приведена схема подключения микроконтроллера при так называемом высоковольтном программировании (High-Voltage Programming — HVP). Это специальное состояние микроконтроллера, используемое для его программирования и верификации, инициируется подачей на вход сброса напряжения +13 В при НИЗКОМ уровне на выводах RB6 и RB7. После этого требуемые данные можно будет пересылать в микроконтроллер через вывод RB6 синхронно с внешним тактовым сигналом, подаваемым на вывод RB7. Такими данными могут быть команды режима программирования или же машинный код. Аналогично, можно будет считать содержимое незащищенных областей памяти программ и сравнить с оригинальным кодом.
Большинство новых микроконтроллеров PIC поддерживают также режим низковольтного программирования (Low-Voltage Programming — LVP), не требующий использования источника питания высокого напряжения. Этот режим особенно полезен для осуществления внутрисхемного последовательного программирования (ICSP™), при котором перепрограммирование микроконтроллера осуществляется непосредственно на печатной плате устройства. Для входа в данное состояние необходимо во время сброса удерживать на выводе RB3 НИЗКИЙ уровень. Затем, после подачи на него напряжения ВЫСОКОГО уровня, можно выполнять программирование через выводы RB7 и RB6. К сожалению, после разрешения этого режима программирования вывод RB3 нельзя будет использовать в качестве вывода порта.
Рис. 10.6. Конфигурирование некоторых моделей микроконтроллеров PIC
Пока микроконтроллер находится в режиме программирования, программатор имеет доступ к памяти программ и может загружать в нее код программы. Кроме того, программатор может обращаться к некоторым «секретным» участкам памяти программ (скрытая область памяти), которые не видны прикладной программе при работе микроконтроллера в нормальном режиме. В микроконтроллерах среднего уровня таким участком является ячейка памяти программ с адресом h’2007’, зарезервированная под слово конфигурации[134].
Различные биты этого слова (биты конфигурации) используются для задания конфигурации тактового генератора и других узлов микроконтроллера при его работе в нормальном режиме. В качестве примера на Рис. 10.6, б показан формат конфигурационного слова модели PIC16F84, посредством которого можно задавать значения четырех конфигурируемых параметров. Эти параметры являются базовыми, т. е. имеются во всех микроконтроллерах:
• Биты FOSC1:() определяют режим работы тактового генератора (Табл. 10.2).
• Бит WDTE используется для включения и выключения сторожевого таймера, показанного на Рис. 13.1 (стр. 451).
• Бит используется для управления таймером включения питания, который рассматривается на стр. 318.
• Биты СР предназначены для защиты памяти программ от считывания. Как уже говорилось, в режиме программирования содержимое памяти программ доступно для считывания. Это сделано для того, чтобы программатор мог осуществлять верификацию кода, загруженного в память программ (см. Рис. 17.4 на стр. 616). Если сбросить все биты СР, то данная возможность будет заблокирована. Это позволяет предотвратить копирование прошивки микроконтроллера. После программирования биты СР нельзя стереть даже в исполнениях с кварцевым окошком или памятью программ EEPROM-типа. По этой причине Microchip не рекомендует использовать эту опцию во время разработки и отладки устройств.
Более новые модели семейства имеют дополнительные опции. Например, в микроконтроллере PIC16F87X, формат слова конфигурации которого показан на Рис. 10.6, в, можно защищать всю память программ, первую половину или вообще только 256 первых ячеек. Также в этих моделях имеются следующие опции:
• Бит BODEN, установленный в 1, разрешает работу схемы сброса по снижению напряжения питания (Brown-Out Reset — BOR). Эта схема позволяет перезапускать микроконтроллер при провалах напряжения питания ниже заданного уровня, как показано на Рис. 10.11.
• Установка бита LVP в 1 позволяет использовать режим низковольтного программирования.
• Бит CPD позволяет защитить содержимое EEPROM-памяти данных (см. главу 15).
• В этих моделях имеется возможность изменения содержимого незащищенных областей памяти программ непосредственно из самой программы, как показано на Рис. 15.4 (стр. 551). Сброс бита WRT запрещает это.
• В данных моделях имеется специальный режим отладки, который отключается при установке бита DEBUG в 1.
Рис. 10.7. Задание конфигурации микроконтроллера в среде MPLAB версии 7.x при использовании программатора PICSTART
Программное обеспечение большинства программаторов позволяет пользователю «вручную» задать значение требуемых битов слова конфигурации (как, скажем, на Рис. 10.7) перед собственно записью программы в память микроконтроллера. Однако наилучшим решением будет указание требуемого значения слова конфигурации непосредственно в программе для автоматического задания конфигурации микроконтроллера при его программировании. В качестве примера возьмем микроконтроллер PIC16F87X, который должен иметь следующую конфигурацию:
Режим генератора — XT
Биты 1:0 = 01
Сторожевой таймер — выключен
Бит 2 = 0
Таймер включения питания — включен
Бит 3 = 0
Защита памяти программ — отключена
Биты 5:4 и 13:12= 11
Схема сброса по снижению питания — включена
Бит 6 = 1
Низковольтное программирование — запрещено
Бит 7 = 0
Тогда наличие в исходном ассемблерном файле директивы
__config b’11111101110001’; или h’3F71’
приведет к формированию следующего машинного кода:
:02 400Е 00 713F 00
(формат этой строки[135] был описан на стр. 250). При программировании микроконтроллера требуемое значение будет записано в ячейку с адресом h’2007’. По умолчанию все биты слова конфигурации установлены в 1, поэтому без указания этой директивы микроконтроллер PIC16F87X будет иметь следующую конфигурацию:
• Используется тактовый генератор с внешней RС-цепочкой.
• Защита кода отсутствует.
• Работа таймера включения питания, сторожевого таймера, а также схемы сброса по напряжению питания разрешена.
• Низковольтное программирование и запись в память программ разрешены.
Во включаемых файлах, предоставляемых компанией Microchip для всех моделей микроконтроллеров (см. Листинг 8.1 на стр. 241), определены константы для всех опций, доступных в конкретном устройстве. Для формирования значения слова конфигурации необходимо объединить эти константы по И. Например, строка:
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_ON & _LVP_OFF
формирует тот же самый машинный код, но более понятна программисту, что уменьшает вероятность возникновения ошибок. Кроме того, такой код имеет большую переносимость, поскольку при замене процессора на другой (который может иметь совершенно иное расположение битов в слове конфигурации[136] достаточно будет поменять только название включаемого файла. Обращаю ваше внимание на то, что при включении некорректного заголовочного файла могут быть запрограммированы неправильные биты.
В компиляторах Си тоже имеется похожий механизм для задания значений битов слова конфигурации. Так, в компиляторе CCS для этого предусмотрена директива #fuses, размещаемая в начале файла. В нашем случае строка с данной директивой будет выглядеть следующим образом:
#fuses XT, NOWDT, PUT, NOPROTECT, BROWNOUT, NOLVP
Все последовательностные цифровые системы должны выходить из выключенного или какого-либо неисправного состояния строго определенным образом. Сброс микроконтроллеров PIC может быть осуществлен несколькими способами:
• Вручную, с помощью кнопки, подключенной к выводу , как показано на Рис. 10.8, а.
• При подаче питания на микроконтроллер, как показано на Рис. 10.10.
• При снижении напряжения питания ниже определенного значения во время работы микроконтроллера (см. Рис. 10.11).
• При наступлении тайм-аута сторожевого таймера (см. Рис. 13.1 на стр. 451), который может возникнуть из-за ошибки в программе или даже из-за выброса напряжения питания.
Рис. 10.8. Внешний сброс микроконтроллеров PIC
Мы рассмотрим все четыре механизма, а по традиции начнем с внешнего сброса. У всех микроконтроллеров PIC имеется, хотя бы как опция, вывод внешнего сброса . К этому выводу можно подключить кнопку или другую схему, как это показано на Рис. 10.8, а, посредством которых можно будет осуществлять перезапуск устройства, в результате чего программа снова начнет выполняться с команды, расположенной по адресу вектора сброса. До тех пор пока напряжение на выводе
не превышает 0.2 VDD, устройство остается в состоянии сброса (фаза Q1 внутреннего цикла, см. Рис. 4.4 на стр. 92). Для предотвращения ложных срабатываний схемы сброса НИЗКИЙ уровень на выводе
должен удерживаться в течение не менее 2 мкс (см. Пример 10.2). Максимальное рекомендуемое сопротивление подтягивающего резистора составляет 33 кОм. Такое значение выбрано для того, чтобы ток утечки вывода при разомкнутой кнопке не вызвал появления на выводе напряжения ниже 0.8 VDD. Максимальное значение тока утечки IIL вывода
составляет ±5 мкА при напряжении на входе VSS =<
=< VDD. Резистор сопротивлением 100 Ом предназначен для ограничения тока при появлении на выводе отрицательного выброса напряжения, в результате которого один из защитных диодов откроется.
Когда на выводе появляется лог. 1 (т. е. напряжение, больше или равное 0–8 VDD), процессор начинает работать в нормальном режиме, при этом счетчик команд и регистр PCLATH обнуляются, указывая таким образом на команду с адресом h’000’ (вектор сброса). Биты выбора банка ОЗУ IRP, RP0 и RP1 регистра STATUS также обнуляются, так что при запуске процессор работает с 0-м банком. Если вывод
использовался для «пробуждения» микроконтроллера, то бит
будет установлен в 1 (не было тайм-аута сторожевого таймера), а бит
будет сброшен в 0 (процессор находился в «спящем» режиме), в противном случае состояние этих битов не изменяется. В любом случае состояние флагов арифметических операций регистра STATUS не изменится. Состояния всех РСН после сброса приведены в Приложении Б.
Помимо сброса, инициируемого подачей сигнала на вход , во всех микроконтроллерах PIC предусмотрен сброс по включению питания (Power-On Reset — POR). Эта внутренняя схема автоматически определяет готовность процессора к работе после подачи питания на микроконтроллер.
При сбросе по включению питания сбрасывается бит регистра PCON[137], формат которого приведен на Рис. 10.9. Благодаря этому программа может определить наступление данного события (см. Табл. 10.4). При чтении бита
он не устанавливается автоматически в 1, это необходимо делать самостоятельно.
Рис. 10.9. Формат регистра PCON микроконтроллеров PIC16XXXX
Чтобы проиллюстрировать работу схемы сброса по включению питания, рассмотрим некоторую идеализированную ситуацию (см. Рис. 10.10). В момент времени t0 был включен источник питания, напряжение которого (VDD) стало возрастать по экспоненциальному закону до номинального значения +5 В. Если скорость нарастания этого напряжения превышает 0.05 В/мс, то при достижении уровня 1.5…2.1 В будет сформирован внутренний сигнал сброса. По этому сигналу происходит следующее:
1. С помощью 10-битного счетчика, тактируемого встроенным генератором, формируется задержка ТРWRT фиксированной длительностью 72 мс. Формирование этой задержки может быть отключено установкой бита слова конфигурации в 1 (см. Рис. 10.6).
Рис. 10.10. Процесс запуска 5-В устройства при подаче напряжения питания
2. Если используется один из режимов с резонатором, то после задержки ТРWRT формируется еще одна задержка TOST длительностью 1024 такта системного тактового сигнала. Эта задержка формируется с помощью 10-битного счетчика, тактируемого системным генератором. Таким образом, гарантируется, что к моменту старта программы основной генератор уже запущен и работает в нормальном режиме. Понятно, что длительность задержки TOST зависит от частоты резонатора. Например, при частоте резонатора 32 кГц длительность задержки будет не менее 32 мс, тогда как при резонаторе частотой 10 МГц длительность задержки будет равна 102 мкс. Если по окончании этой задержки генератор все еще не запустится[138], то будет сформирована дополнительная задержка неопределенной длительности. При использовании RС-генератора эта задержка не формируется. Также задержка TOST формируется при выходе микроконтроллера из «спящего» режима и опять с той же целью — чтобы обеспечить выход тактового генератора на нормальный режим к моменту запуска программы.
3. Как и в случае внешнего сброса, исполнение кода начинается с адреса вектора сброса (h’000’). Однако в отличие от внешнего сброса, который не влияет на биты и
, при сбросе по включению питания оба бита устанавливаются в неактивное состояние.
Все задержки, формируемые в том или ином случае, указаны в Табл. 10.3.
Если в конечном устройстве ручной сброс не требуется, вывод можно подключить непосредственно к линии VDD через токоограничивающий резистор. В моделях с небольшим числом выводов, таких как 8-выводной PIC12F629/675, этот вывод можно использовать в качестве линии порта ввода/вывода, если сбросить бит MCLRE слова конфигурации в 0.
Возможна такая ситуация, когда напряжение на выходе источника питания микроконтроллера возрастает настолько медленно, что внутренний импульс сброса по питанию не генерируется, или же напряжение не достигает требуемого значения даже по истечении задержек ТPWRT и TOST. Как правило, это значение составляет 4.5 В для 5-В моделей с генератором, работающим в режиме HS, и 4 В — в других режимах. В этом случае микроконтроллер может начать выполнять программу некорректно или вообще не запуститься. Когда надежность встроенной схемы сброса по включению питания вызывает сомнение, можно использовать дополнительные узлы, предназначенные для удерживания НИЗКОГО уровня на выводе в течение достаточно длительного времени, необходимого для достижения напряжением VDD своего рабочего значения. Указанные функции выполняет схема, показанная на Рис. 10.8, б. Емкость конденсатора следует выбирать таким образом, чтобы постоянная времени RC в несколько раз превышала время нарастания напряжения питания до рабочего значения. При заданном значении сопротивления и емкости конденсатора 2.2 мкФ постоянная времени будет равна примерно 100 мс. Более подробно об этом можно прочитать в документах AN522 «Power-up Consideration» и AN607 «Power-up Trouble Shooting».
Нормально работающий микроконтроллер может начать работать неправильно, если напряжение питания упадет ниже рабочего значения. Это может произойти из-за кратковременной просадки напряжения на линии VDD при переключении мощной нагрузки или из-за разряда батареи. В обоих случаях микроконтроллер PIC может начать работать неправильно из-за этого снижения напряжения (brownout)[139]. Указанное явление может привести к серьезным последствиям; например, нагревательный элемент посудомоечной машины может включиться при отсутствии воды в резервуаре!
Из Рис. 10.11 видно, что при включенном таймере BOR (т. е. при установленном бите BODEN в слове конфигурации) внутренний сигнал сброса будет сформирован при снижении напряжения питания VDD ниже порогового значения BVDD[140]. В устройствах, работающих при номинальном напряжении питания 5 В, этот порог составляет 4 ±0.3 В. Для устройств, способных работать в более широком диапазоне питающих напряжений, таких как PIC 12F629/675, это пороговое значение может быть снижено вплоть до 2 В.
Рис. 10.11. Сброс из-за провала (снижения) напряжения питания
Из рисунка видно, что напряжение питания через некоторое время превысило пороговое значение. Если время, в течение которого напряжение находилось ниже порогового значения, составило более 100 мкс, то, прежде чем процессор выйдет из состояния сброса, таймер включения питания (если его работа разрешена) сформирует задержку длительностью 72 мс, как показано на Рис. 10.10. По окончании этой задержки процессор приступит к исполнению команды, расположенной по адресу вектора сброса h’000’. В одних моделях, таких как PIC16F627, состояние бита изменяется автоматически при включении схемы BOD, чтобы гарантировать наличие задержки при снижении (провале) напряжения питания, тогда как в других, например PIC12F675, это остается на совести программиста, так что читайте документацию внимательно! Работающий таймер включения питания уменьшает вероятность многократного формирования сигнала сброса из-за помех на шине питания при медленном нарастании напряжения питания VDD.
После сброса по снижению напряжения питания в РСН заносятся те же значения, что и после сброса по включению питания, за исключением того, что сбрасывается флаг в регистре PCON. Благодаря этому программа может определить причину, по которой произошел сброс. При включении микроконтроллера состояние флага
не определено, поэтому он должен быть установлен в самом начале программы.
Одной из проблем, возникающих при включении схемы сброса по снижению напряжения питания, является повышение тока потребления микроконтроллера. К примеру, для моделей линейки PIC16F87X это приращение ΔIBOR составляет обычно 85 мкА (максимум до 200 мкА). Указанное значение следует прибавить к базовому значению тока, приведенному в Табл. 10.1. Более того, ток, потребляемый этой схемой, сравним с током потребления микроконтроллера в «спящем» режиме. С другой стороны, в моделях PIC12F629/675 семейства nanoWatt этот ток составляет всего 0.3/1.5 мкА (typ/max) при VDD = 2 В.
Помимо того, микроконтроллеры PIC могут сбрасываться по тайм-ауту сторожевого таймера. При этом процессор немедленно начинает исполнение программы с адреса вектора сброса, а также сбрасывает флаг и устанавливает флаг
регистра STATUS. Если тайм-аут сторожевого таймера наступит во время нахождения процессора в «спящем» режиме, то это приведет к продолжению выполнения программы, начиная с команды, расположенной после команды sleep (при работе от кварцевого генератора — после задержки TOST). При этом оба флага
и
регистра STATUS будут сброшены.
Различные варианты сброса микроконтроллера сведены в Табл. 10.4. В этой же таблице указана реакция на выход из «спящего» режима по прерыванию. При сбросе по включению питания устанавливаются оба флага — и
, тогда как при внешнем сбросе состояние этих битов не изменяется. Флаг
сбрасывается по тайм-ауту сторожевого таймера и устанавливается после выполнения команд clrwdt или sleep. Команда clrwdt также устанавливает флаг
, который сбрасывается при выполнении команды sleep. Оба этих флага доступны только для чтения, т. е. их нельзя явно изменить, скажем, командой bsf.
При сбросе микроконтроллера обнуляется счетчик команд и различные биты, отвечающие за переключение банков памяти данных, такие как RP0. Состояние битов статуса арифметических операций Z, С и DC после сброса по включению питания не определено, а при других видах сброса оно остается неизменным.
Примеры
Пример 10.1
Схема, приведенная на Рис. 10.12, похожа на схему с Рис. 10.5, б, но содержит два последовательно соединенных резистора. По задумке разработчика с помощью такой схемы программа сможет самостоятельно изменять скорость своего выполнения. Докажите его правоту, учитывая, что при заданной емкости конденсатора тактовая частота прямо пропорциональна сопротивлению, подключенному к выводу OSC1.
Можете ли вы придумать применение для такой возможности?
Рис. 10.12. Тактовый генератор с изменяемой частотой
Решение
Точка соединения резисторов подключена к выводу порта микроконтроллера. Любой вывод микроконтроллера может быть сконфигурирован как вход или как выход (это будет описано в следующей главе). При сбросе любого вида все выводы портов конфигурируются как входы. В данном случае, если не учитывать мизерный ток утечки, вывод RA0 не будет оказывать влияние на подключенные к нему резисторы. Таким образом, общее сопротивление цепочки будет немного больше 100 кОм. При емкости конденсатора 100 пФ и напряжении питания VDD = 5 В тактовая частота микроконтроллера будет равна примерно 100 кГц. В результате частота выполнения команд составит около 25 000 команд/с (на самом деле немного меньше, поскольку команды, вызывающие сброс конвейера, выполняются за два цикла).
Если программа переключит вывод RA0 на выход, установив при этом бит 0 регистра PORTA, то точка соединения резисторов окажется подключенной к линии VDD. При этом к выводу OSC1 реально окажется подключенным только один резистор сопротивлением 3.3 кОм. При таком значении сопротивления RC-цепочки частота генератора будет составлять 1.7 МГц, что в 17 раз увеличит частоту исполнения команд (до 450 000 команд/с). Таким образом, программа сможет при необходимости самостоятельно увеличивать свою скорость выполнения и замедляться в остальных случаях для экономии энергии источника питания.
Пример 10.2
В документации на микроконтроллер PIC16F84 сказано, что минимальная длительность сигнала НИЗКОГО уровня на выводе , распознаваемого как сигнал внешнего сброса, составляет 100 не. Можете ли вы предположить, какие проблемы могут возникнуть в связи с наличием такого условия?
Решение
В зашумленной среде микроконтроллер может работать неустойчиво из-за кратковременных импульсов, случайным образом сбрасывающих устройство. В таких случаях сигнал, подаваемый на вывод , следует пропускать через фильтр нижних частот (ФНЧ). Обычно хватает высокочастотного конденсатора емкостью 1 нФ, подключенного к выводу
вместе с подтягивающим резистором сопротивлением 10 кОм. Кроме того, необходимо предусмотреть развязку по питанию, элементы которой должны располагаться в непосредственной близости от выводов питания микроконтроллера. Из-за проблем такого рода в более современных моделях, даже в PIC16F84A, минимальная длительность импульса сброса увеличена до 2 мкс. Тем не менее все указанные методики справедливы и для них, особенно при работе устройства в среде с высоким уровнем помех.
Вопросы для самопроверки
10.1. Что произойдет, если из-за программной ошибки на выходе RA0 микроконтроллера, включенного в соответствии с Рис. 10.12, будет присутствовать лог. 0? Такая ситуация может возникнуть, если вывод будет сконфигурирован как выход до установки 0-го бита регистра PORTA в 1.
10.2. Каким образом схема, приведенная на Рис. 10.13, будет влиять на частоту тактового генератора?
Рис. 10.13. Альтернативная схема управления частотой тактового генератора
10.3. Пытаясь уменьшить потребление схемы при нахождении микроконтроллера в состоянии сброса, один студент поставил в цепь ручного сброса (Рис. 10.8) резистор сопротивлением 10 МОм. Почему микроконтроллер перестал выходить из состояния сброса?
10.4. Потребление микроконтроллера PIC, работающего на частоте 4 МГц и при напряжении 5 В, составило 550 мкА при отсутствии нагрузки на портах ввода/вывода. Каким будет потребляемый ток, если устройство будет работать на частоте 100 кГц и при напряжении питания 4 В?
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК