Перейти к содержанию

Генератор битов конфигурации PIC

Выберите микроконтроллер и задайте генератор, сторожевой таймер, сброс, LVP и защиту — калькулятор соберёт строки #pragma config для MPLAB XC8 или CONFIG для pic-as, покажет слова конфигурации в hex и предупредит о настройках, после которых кристалл не перепрошить вашим программатором. Можно и наоборот: вставить слово из HEX-файла и прочитать настройки.

Исходные данные

Чем прошиваете
CONFIG (адрес 0x2007)
чистый кристалл: 0x3FFF

11

1 · в даташите — WDTEN

1 · в даташите — PWRTEN

1

1

1

11

1

1

Результат

Слово конфигурации
0x3FFF
как у чистого кристалла
Семейство
mid-range
Формат кода

LVP = ON (так у чистого кристалла): вывод RB3/PGM занят и не работает как порт. Не оставляйте его висящим: при высоком уровне на PGM кристалл уходит в режим программирования, поэтому даташиты PIC16F87XA и PIC18F4550 требуют держать вывод в нуле — нужна подтяжка к земле.

Сторожевой таймер включён: программа должна регулярно выполнять команду CLRWDT (в XC8 — макрос CLRWDT()), иначе кристалл будет перезагружаться. Пока сторож не нужен, выключайте его.

BOR включён: порог 3,65…4,35 В (типично 4,0 В, D005). При питании ниже порога кристалл стоит в сбросе, поэтому на 3,3 В (это допустимо только для PIC16LF877A) BOR нужно выключить. У PIC16F877A при включённом BOR таймер PWRT работает независимо от PWRTE.

Биты конфигурации для MPLAB XC8

// PIC16F877A, MPLAB XC8: put before main() or in a separate config.c

// CONFIG @ 0x2007 = 0x3FFF
#pragma config FOSC = EXTRC  // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = ON     // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF   // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON    // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON      // Low-Voltage Programming Enable bit (RB3/PGM has PGM function, low-voltage programming enabled)
#pragma config CPD = OFF     // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF     // Flash Program Memory Write Enable bits (Write protection off)
#pragma config DEBUG = OFF   // In-Circuit Debugger Mode bit (In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins)
#pragma config CP = OFF      // Flash Program Memory Code Protection bit (Code protection off)

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Биты конфигурации PIC — то же, что фьюзы AVR: они лежат вне памяти программ, читаются кристаллом при включении и задают генератор, сброс, сторожевой таймер, детектор питания, низковольтное программирование и защиту кода — ещё до того, как выполнится первая команда. В MPLAB XC8 их задают строками #pragma config в исходнике, компилятор кладёт значения в HEX-файл, а программатор записывает их вместе с программой.

Как пользоваться

  1. Выберите микроконтроллер и способ прошивки: высоким напряжением на MCLR (PICkit, ICD) или низковольтно (LVP).
  2. Задайте каждую настройку в списках. Слово конфигурации пересчитывается сразу; можно и наоборот — вставить слово, прочитанное программатором или из HEX-файла, в поле «Значение».
  3. Скопируйте строки #pragma config в отдельный файл config.c или в начало main.c вне функций. Для ассемблера pic-as переключите формат: директива та же, CONFIG FOSC = HS.
  4. Прочитайте предупреждения под результатом: калькулятор отмечает сочетания, после которых кристалл не перепрошить вашим программатором или он не запустится.

Ссылка на страницу сохраняет выбранный кристалл и все слова — ей удобно поделиться.

Как устроены биты конфигурации

У PIC16 и PIC12 с ядром mid-range конфигурация — одно 14-битное слово по адресу 2007h, за пределами памяти программ: программа его не видит, доступ к нему есть только в режиме программирования. У enhanced mid-range (PIC16F1827 и новее) слов два и больше, CONFIG1 и CONFIG2 по адресам 8007h и 8008h. У PIC18 конфигурация разбита на байтовые регистры CONFIG1L…CONFIG7H с адреса 300000h.

Как и во Flash-памяти, стёртый бит равен 1, запрограммированный — 0. Даташит PIC16F87XA прямо называет стёртое значение слова: 3FFFh. Поэтому включение многих функций записывается нулём: PWRTE = ON — это бит PWRTE = 0, CP = ON — бит CP = 0. Чтобы не путаться в полярности, XC8 и MPLAB X пользуются именами значений (ON, OFF, HS, INTRCIO), а не нулями и единицами.

В HEX-файле mid-range каждое слово занимает два байта, поэтому адрес удваивается: слово 2007h лежит в HEX по адресу 400Eh. У PIC18 байты конфигурации лежат по своим адресам 300000h–30000Dh. Подробнее о записи HEX и о программаторах — в статье «Программирование PIC через ICSP».

Не все биты слова заняты. Неиспользуемые биты калькулятор оставляет единицами, как в стёртом кристалле; при чтении часть из них может вернуться нулями — у PIC16F628A это биты 12–9, у PIC12F629/675 — биты 11–9, у PIC18 — пустые биты каждого регистра. Поэтому 0x3F10 из вашего проекта и 0x2110, прочитанные программатором, — одна и та же конфигурация PIC16F628A; калькулятор показывает оба значения.

Основные настройки

НастройкаЧто задаётЗначение чистого кристалла
FOSCгенератор: LP, XT, HS — кварц; EC — внешний сигнал; INTOSC/INTRC — внутренний; RC — RC-цепьRC у PIC16F877A, PIC16F628A, PIC12F675; ECH у PIC16F1827; EC у PIC18F4550
WDTE (WDT у PIC18)сторожевой таймервключён
PWRTE (PWRT у PIC18)таймер включения питания: задержка после подачи питания, у PIC16F877A около 72 мсвыключен
BOREN (BOR у PIC18)сброс при просадке питаниявключён
MCLREвывод MCLR — сброс или обычный входсброс
LVPнизковольтное программирование, вывод PGMвключено
CP, CPDзащита памяти программ и EEPROM от чтения программаторомвыключена
WRTзащита памяти программ от записи самой программойвыключена
DEBUGвнутрисхемный отладчиквыключен

Обратите внимание на чистый кристалл: у него включён сторожевой таймер и выбран RC-генератор (у PIC16F1827 — внешний сигнал), так что программа без строк конфигурации почти наверняка не заработает. Руководство XC8 Getting Started Guide советует проверить в первую очередь генератор, выключить сторожевой таймер и защиту кода, пока они не нужны, а у PIC18 — выключить расширенный набор команд XINST: XC8 его не поддерживает.

Имена в даташитах иногда расходятся с именами XC8: у PIC16F877A биты называются WDTEN и PWRTEN, у PIC12F675 — BODEN, у PIC18F4550 — WDTEN, BOREN и PWRTEN, а в #pragma config пишут WDTE, PWRTE, BOREN, WDT, BOR и PWRT. Калькулятор подписывает такие поля обоими именами. Для своего кристалла их можно сверить в окне Configuration Bits MPLAB X или в файлах pic_chipinfo.html и pic18_chipinfo.html из каталога docs компилятора.

LVP и высоковольтное программирование

Войти в режим программирования PIC можно двумя способами: подать на MCLR высокое напряжение VPP (около 12 В у старых кристаллов; у PIC16F1827 — 8–9 В, по параметру VIHH из даташита DS41391D) или, при включённом бите LVP, обойтись напряжением питания. Во втором случае у старых кристаллов занят отдельный вывод PGM: RB3 у PIC16F877A, RB4 у PIC16F628A, RB5 у PIC18F4550.

Бит LVP стоит в единице у чистого кристалла и создаёт две ловушки:

  • Висящий PGM. Пока LVP = 1, вывод PGM не работает как порт, а высокий уровень на нём переводит кристалл в режим программирования. Даташиты PIC16F87XA и PIC18F4550 требуют держать его в нуле — подтяжкой к земле.
  • LVP = OFF без высоковольтного программатора. По даташитам бит LVP меняется только тогда, когда в программирование вошли высоким напряжением: низковольтный программатор его не сбросит. А после записи LVP = OFF кристалл программируется только с VPP на MCLR. MPLAB Snap высокое напряжение не выдаёт, поэтому такой кристалл ему недоступен — нужен PICkit 4, PICkit 5 или ICD.

Переключатель «Чем прошиваете» учитывает это: в режиме LVP запись LVP = OFF помечается ошибкой. У PIC16F84A, PIC12F629/675 и PIC16F690 бита LVP нет вовсе — их программируют только высоким напряжением.

У enhanced mid-range есть своя тонкость: пока LVP = 1, вывод MCLR всегда остаётся сбросом, и MCLRE = OFF не действует (DS41391D, регистр 4-1).

MCLRE = OFF и внутренний генератор

Восьмивыводные PIC12F629/675 соблазняют освободить GP3, выключив MCLRE, и работать от внутреннего генератора 4 МГц, чтобы занять под порт и GP4, GP5. Такая конфигурация рабочая, но программа стартует сразу после подачи питания и может успеть переключить выводы ICSPDAT и ICSPCLK (GP0, GP1) раньше, чем программатор начнёт обмен. Спецификация программирования DS41191D описывает вход так: сначала VIHH на MCLR, потом VDD. Программатор, который подаёт сначала питание, может не войти в такой кристалл; в MPLAB IPE порядок задаётся настройкой Apply Vpp before Vdd. Калькулятор предупреждает о сочетании MCLRE = OFF с внутренним генератором.

Защита кода

CP = ON запрещает программатору читать память программ: она читается нулями, поэтому проверка после записи не пройдёт. CPD = ON делает то же с EEPROM. Снять защиту можно только полным стиранием — вместе с программой и данными, поэтому код не утекает. Включайте защиту последним шагом, когда прошивка отлажена. У PIC18F4550 защита задаётся по блокам памяти (CP0–CP3, CPB для загрузочного блока), отдельно есть защита от записи (WRT) и от табличного чтения из других блоков (EBTR) — калькулятор прячет эти регистры под заголовок «Защита памяти».

PIC12F629/675: калибровка, которую нельзя стирать

У PIC12F629/675 два заводских значения: калибровка генератора OSCCAL в последней ячейке памяти программ 3FFh и биты BG1:BG0 в старших битах слова конфигурации — калибровка опорного напряжения детектора питания. Программатор обязан прочитать их перед стиранием и восстановить; значение, которое вы зададите в HEX-файле, на BG не влияет. Если калибровка потеряна, внутренний генератор уходит от 4 МГц, а пороги сброса — от паспортных.

PIC18F4550: PLL и USB

PLL у PIC18F4550 вырабатывает 96 МГц из строго 4 МГц на входе, поэтому PLLDIV подбирают под кварц: делитель 5 — для 20 МГц, 3 — для 12 МГц, 1 — для 4 МГц. Для USB Full-Speed нужно 48 МГц — это 96 МГц ÷ 2 при USBDIV = 2, а ядро тактируется от того же PLL через CPUDIV. Типовая настройка с кварцем 20 МГц:

РегистрЗначениеНастройки
CONFIG1L0x24PLLDIV = 5, CPUDIV = OSC1_PLL2 (ядро 48 МГц), USBDIV = 2
CONFIG1H0x0EFOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
CONFIG2L0x3EPWRT = ON, BOR = ON, BORV = 3, VREGEN = ON
CONFIG2H0x1EWDT = OFF, WDTPS = 32768
CONFIG3H0x81MCLRE = ON, PBADEN = OFF, LPT1OSC = OFF, CCP2MX = ON
CONFIG4L0x81LVP = OFF, XINST = OFF, STVREN = ON, DEBUG = OFF

У чистого PIC18F4550 PBADEN = ON: после сброса RB0–RB4 — аналоговые входы и читаются нулями, кнопки на PORTB «не работают». Для цифровых входов выбирайте PBADEN = OFF.

Как прочитать конфигурацию готового кристалла

Прочитайте кристалл программатором (в MPLAB IPE — кнопка Read) или откройте HEX-файл и перенесите слово конфигурации в поле «Значение» калькулятора — он разложит его по настройкам и отметит значения, которых нет в даташите. Так удобно разбираться с чужой прошивкой: в HEX-файле mid-range ищите запись по адресу 400Eh, у PIC18 — записи с адреса 300000h.

Откуда данные

Положение битов, их смысл и значения чистого кристалла взяты из разделов о конфигурации даташитов каждого кристалла (номера документов — в списке источников). Имена настроек и значений #pragma config сверены с базой устройств MPLAB X (8bit_device.info) через справочные страницы gputils, которые из неё сгенерированы; тесты калькулятора проверяют, что каждое значение даёт то же слово, что и эта база, и что типовые конфигурации совпадают с ручным расчётом по таблицам даташитов. Описания устройств из паков Microchip (DFP) калькулятор не использует.

Обзор семейства, замены классических PIC и выбор кристалла — на странице «Микроконтроллеры PIC», система команд — в статье «Система команд PIC16».

Частые вопросы

Какое слово конфигурации у PIC16F877A с кварцем 20 МГц?

Обычно 0x3F72: FOSC = HS, сторожевой таймер выключен, PWRT включён, BOR включён, LVP выключен, защиты нет. В XC8 это строки #pragma config FOSC = HS, WDTE = OFF, PWRTE = ON, BOREN = ON, LVP = OFF, CPD = OFF, WRT = OFF, DEBUG = OFF, CP = OFF. Порог BOR у PIC16F877A — около 4 В (3,65–4,35 В), поэтому для PIC16LF877A с питанием 3,3 В BOR выключают.

Почему после записи LVP = OFF программатор перестал видеть PIC?

При LVP = OFF кристалл входит в режим программирования только при высоком напряжении VPP на MCLR. Низковольтные программаторы — MPLAB Snap, самодельные на Arduino — его не выдают. Вернуть кристалл к жизни можно программатором с высоким напряжением, например PICkit 4 или PICkit 5.

Что такое BG1 и BG0 у PIC12F675?

Это биты 13–12 слова конфигурации с заводской калибровкой опорного напряжения для детектора питания и сброса. Программатор читает их перед стиранием и записывает обратно, поэтому в программе их не задают. Вместе с ними сохраняется калибровка генератора OSCCAL в ячейке 3FFh.

Где в MPLAB X посмотреть биты конфигурации?

В окне Configuration Bits (Window → PIC Memory Views → Configuration Bits по руководству XC8 Getting Started Guide). Там выбирают значения и нажимают Generate Source Code to Output — MPLAB X выдаст те же строки #pragma config, что и этот калькулятор. Окно не связано с исходником: после правки строк в коде окно само не обновится.

Источники

  1. Microchip. PIC16F87XA Data Sheet (DS39582C) — 14.1 и регистр 14-1 — слово 2007h, стёртое значение 3FFFh; 14.8 — при включённом BOR таймер PWRT работает всегда, VBOR 3,65–4,35 В (D005); 14.19 — LVP меняется только при VIHH на MCLR, RB3/PGM нельзя оставлять висящим
  2. Microchip. PIC16F627A/628A/648A Data Sheet (DS40044G) — регистр 14-1 — FOSC<2:0> в битах 4, 1, 0, биты 12–9 читаются нулями; 14.12 — LVP; снятие CP и CPD — только полным стиранием
  3. Microchip. PIC12F629/675 Data Sheet (DS41190G) и PIC12F629/675/PIC16F630/676 Programming Specification (DS41191D) — регистр 9-1 — BG1:BG0 и BODEN; DS41191D, 2.3 и рис. 2-2 — вход в программирование подачей VIHH на MCLR, затем VDD; OSCCAL в 3FFh и биты BG сохраняются перед стиранием
  4. Microchip. PIC16F84A Data Sheet (DS35007C) — регистр 6-1 — CP в битах 13–4, PWRTE, WDTE, FOSC1:FOSC0
  5. Microchip. PIC16F631/677/685/687/689/690 Data Sheet (DS40001262F) — регистр 14-1 — BOREN<1:0>, IESO, FCMEN, зарезервированные биты 13–12
  6. Microchip. PIC16(L)F1826/27 Data Sheet (DS41391D) — раздел 4, регистры 4-1 и 4-2 — CONFIG1 8007h и CONFIG2 8008h; MCLRE игнорируется при LVP = 1; LVP нельзя сбросить, войдя через LVP; при CP = 0 чтение даёт нули
  7. Microchip. PIC18F2455/2550/4455/4550 Data Sheet (DS39632E) — таблица 25-1 и регистры 25-1…25-12 — CONFIG1L…CONFIG7H и значения чистого кристалла; 2.2 — PLL 96 МГц от входа 4 МГц; 25.10 — LVP; D005 — пороги BORV
  8. Microchip. MPLAB XC8 Getting Started Guide (DS50002173A) — окно Configuration Bits (Window → PIC Memory Views → Configuration Bits), Generate Source Code to Output; XC8 не поддерживает расширенный набор команд PIC18; pic_chipinfo.html и pic18_chipinfo.html в каталоге docs компилятора
  9. Microchip. MPASM to MPLAB XC8 PIC Assembler Migration Guide (DS50002973B) — 4.8–4.9 — __CONFIG заменяется директивой CONFIG с парами «настройка = значение» или целым словом
  10. gputils. Device help: Configuration Bits (страницы PIC16F877A, PIC16F628A, PIC12F675, PIC16F84A, PIC16F690, PIC16F1827, PIC18F4550) — имена настроек и значений из базы устройств MPLAB X (8bit_device.info), по которым сверены имена #pragma config и слова в тестах
  11. Microchip. MPLAB Snap (DS50002787G) и MPLAB PICkit 5 (DS50003525C) User's Guides — Snap не выдаёт высокое напряжение программирования; PICkit 5 — высоковольтный и низковольтный вход

Где пригодится

Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/pic-config/" title="Генератор битов конфигурации PIC" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/pic-config/">Генератор битов конфигурации PIC</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено .

Нашли ошибку в расчёте?