В микроконтроллерах PIC и PIC18, разумеется, тоже есть возможность задать конфигурацию до начала выполнения программы. И организована она похожим на AVR образом. Но терминология иная. Да и другие отличия есть. Но давайте обо всем по порядку.
Configuration Bits
Не смотря на иное название биты конфигурации точно так же, условно, соответствуют разрушаемым перемычкам. То есть, начальное (незапрограммированное) состояние "перемычка целая", что соответствует логической 1. При программировании некоторые перемычки условно "разрушаются", что соответствует логическому 0. Все как в AVR.
Но в отличии от AVR биты конфигурации собираются не в байты, а в слова с разрядностью равной разрядности памяти программ (12, 14, 16 бит). Поскольку в PIC18 память программ организована как массив байт (команда занимает 2 байта), каждое слово конфигурации дополнительно делится на два байта (старший ххххH, младший xxxxL).
Другим, очень важным и полезным, отличием от AVR является то, что слова конфигурации имеют собственные адреса. А это позволяет задавать их значение в программном коде, а не указывать отдельно.
Для конфигурационной информации точно так же предусмотрена отдельная область. Эта область далеко не всегда доступна для выполняемой микроконтроллером программы, так как ее адреса лежат вне доступного адресного пространства. Но для внешнего программатора адреса этой области доступны, и они могут быть указаны в загружаемом образе программы.
Для BaseLine и MidRange микроконтроллеров слова конфигурации размещаются начиная с адреса 0x2007 и выполняемая микроконтроллером программа не имеет к ним доступа. Для Enhanced MidRange слова конфигурации размещаются начиная с адреса 0x8007 и выполняемая микроконтроллером программа имеет возможность прочитать их. Для PIC18 слова конфигурации размещаются начиная с адреса 0x300000 и выполняемая микроконтроллером программа может и читать, и изменять их. Впрочем, эти адреса вам потребуются только если программе нужно считывать информацию о битах конфигурации
Количество бит конфигурации и их распределение по словам конфигурации (и количество этих слов) очень сильно зависят от конкретного микроконтроллера. Поэтому полную информацию следует искать в документации.
Давайте для примера рассмотрим доступные варианты конфигурации для нескольких микроконтроллеров. Так для простейшего PIC10F200
вариантов не много. Верхняя строка показывает и начальное значение бита по умолчанию. WDTE позволяет разрешить/запретить работу сторожевого таймера (по умолчанию разрешен). CP включает/отключает защиту кода программы от считывания программатором (по умолчанию защита отключена). MCLRE переключает работу вывода GP3 (3 бит порта ввода-вывода) между входом внешнего сброса и обычным цифровым входом.
Для PIC16F676 возможностей уже больше
Здесь биты FOSC отвечают за параметры тактового генератора. По умолчанию RC генератор с внешней цепочкой подключаемой к выводу RA5 и выводом тактовой частоты через RA4. PWRTE отвечает за использование таймера задержки после включения питания (по умолчанию запрещен). CPD разрешает/запрещает считывание EEPROM внешним программатором (по умолчанию разрешено). Биты BG определяют граничные уровни напряжения BOD, работа которого разрешается битом BODEN.
Кроме того, в различных микроконтроллерах битами конфигурации может определяться поведение при аварии питания, проблемах с тактовым генератором, задаваться режим работы оконного сторожевого таймера, защита отдельных областей памяти, и многое другое.
Задание конфигурации микроконтроллера в исходном тексте программы
Указывать конфигурацию микроконтроллера прямо в исходном тексте программы является стандартной практикой. Формат, разумеется, зависит от используемого компилятора. Но в конечном итоге информация попадает в загружаемый в микроконтроллер единый файл (обычно формата HEX).
Для стандартного С компилятора XC8 от Microchip, а так же компиляторов CC5X и CC8E, используется директива pragma config. Вот небольшой пример для PIC16F886 с комментариями
Видно, что можно как задать состояние бита (ON/OFF), так и присваивание определенного значения сгруппированным битам. Для программ на ассемблере, разумеется, формат будет иной.
Доступ к битам конфигурации в Enhanced MidRange
Чтение информации о конфигурации осуществляется так же, как и чтение памяти программ или EEPROM (HEF). Поскольку с этим мы еще не знакомились, но обязательно познакомимся , я не буду углубляться в детали. Для доступа к области памяти конфигурации, вместо доступа к памяти программ, нужно установить бит NVMREGS регистра NVMCON1.
Изменять состояние бит конфигурации средствами выполняемой программы невозможно.
Доступ к битам конфигурации в PIC18
В этих микроконтроллерах можно и читать, и изменять биты конфигурации. Для этого используются команды доступа к памяти программ - TBLRD и TBLWT. Разумеется, для изменения бит конфигурации нужно сначала разрешить запись и выполнить процедуру разблокировки.
ID Location и User ID
В микроконтроллерах PIC есть область памяти выделенная для хранения специальной информации пользователя. Количество ячеек памяти и адрес их размещения различны для разных микроконтроллеров. Подробности нужно искать в документации.
Я не считаю эту область памяти особенно полезной, поэтому не буду уделять ей много внимания. Сюда можно записать абсолютно любую информацию, она абсолютно никак не влияет на работу микроконтроллера.
В BaseLine и MidRange микроконтроллерах эта область памяти доступна только для программатора, но записываемая туда информация может быть задана в исходном тексте программы.
В Enhanced MidRange и PIC18 данные пользователя доступны и для чтения и для записи из выполняемой микроконтроллером программы. Процедура доступа такая же, как и для Config Bits, только адреса нужно указывать другие.
Начальное функциональное назначение этой области памяти - хранение контрольной суммы образа программы, серийного номера, служебных данных (номер контролера ОТК, например).
Да, все это можно просто разместить в области памяти программ. Но хранение, например, серийного номера в отдельной области позволяет обновить программу без необходимости перезаписывать серийный номер.
В любительских устройствах эта область памяти практически бесполезна.
Device ID
В Enhanced MidRange и PIC18 существует еще одна служебная область памяти - Device ID (идентификатор устройства). Это позволяет программе уточнить тип микроконтроллера, на котором она выполняется.
Информация о микроконтроллере доступна только для чтения. Доступ к Device ID осуществляется так же, как и к User ID.
Заключение
Как хорошо видно, в целом способ конфигурации PIC аналогичен AVR. Да, названия бит другие, другое расположение, различаются и настраиваемые параметры. Биты защиты памяти располагаются не в отдельной области памяти, а в битах конфигурации. Но в целом все так же.
А вот в STM8, который мы будем рассматривать в следующей статье, используется иной подход.