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

Почему PIC не работает после прошивки?

Обновлено Редакция GAW

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

Чистый кристалл PIC16F877A

НастройкаВ стёртом кристалле (3FFFh)Что получитсяКак надо
FOSCRCкварц не возбуждаетсяFOSC = HS для 20 МГц
WDTEвключёнсброс примерно раз в 2,3 сWDTE = OFF или CLRWDT в цикле
LVPвключёнRB3 — вход PGM, не портLVP = OFF, если программатор с VPP
PWRTEвыключенбез задержки стартаPWRTE = ON

Значения — DS39582C, регистр 14-1. Наш расчёт периода сторожевого таймера: после сброса предделитель отдан WDT с коэффициентом 1:128, а типичный период WDT — 18 мс, то есть около 2,3 с; с разбросом параметра 7–33 мс — от 0,9 до 4,2 с.

Ещё три причины

  • MCLR висит. Если MCLRE = ON, вывод MCLR должен быть подтянут к питанию; Microchip для PIC16F87XA советует RC-цепь, а не прямое соединение с VDD.
  • Висит PGM. При LVP = 1 высокий уровень на RB3/PGM переводит кристалл в режим программирования, поэтому вывод держат в нуле.
  • MCLRE = OFF и INTOSC. Кристалл работает, но перестаёт видеть программатор — см. «Можно ли перепрошить PIC после MCLRE = OFF».

Как исправить

Соберите строки #pragma config для своего кристалла в генераторе битов конфигурации PIC — он покажет и слово в hex, и предупреждения. Для PIC16F877A с кварцем 20 МГц типовое слово — 0x3F72. Подключение программатора и разъём ICSP описаны в статье «Программирование PIC через ICSP», обзор семейства — на странице «Микроконтроллеры PIC».

Похожие вопросы

Как понять, что PIC сбрасывает сторожевой таймер?

По периодичности: программа начинается заново через одинаковые промежутки, у PIC16F877A после сброса это около 2,3 с при предделителе 1:128 (наш расчёт по типичному периоду 18 мс). Проверка — выключить WDT строкой #pragma config WDTE = OFF; если перезапуски пропали, причина найдена. Регистр STATUS после сброса хранит бит TO, по которому сброс от WDT отличают от других.

Почему PIC работает с программатором, а без него нет?

Программатор держит MCLR и линии ICSP в определённых уровнях. Без него вывод MCLR может висеть, если не подтянут к питанию, а при LVP = 1 висящий вывод PGM может перевести кристалл в режим программирования. Microchip требует держать PGM в нуле и подключать MCLR к VDD через RC-цепь.

Где найти правильные значения для своего кристалла?

В разделе Special Features of the CPU даташита и в окне Configuration Bits среды MPLAB X, которое выдаёт готовые строки #pragma config. Те же строки с проверкой опасных сочетаний собирает генератор битов конфигурации PIC.

Источники

  1. Microchip. PIC16F87XA Data Sheet (DS39582C) — регистр 14-1 — стёртое слово конфигурации 3FFFh: FOSC = RC, WDT включён, LVP включён; параметр 31 — период сторожевого таймера без предделителя 7, 18, 33 мс (мин., тип., макс.) при 5 В; OPTION_REG — PSA и PS2:PS0, предделитель до 1:128 для WDT; 14.4 — MCLR рекомендуют подключать к VDD через RC-цепь, а не напрямую; 14.19 — при LVP = 1 вывод RB3/PGM нельзя оставлять висящим
  2. Microchip. MPLAB XC8 Getting Started Guide (DS50002173A) — биты конфигурации задают строками #pragma config; советы: проверить генератор, выключить сторожевой таймер и защиту кода, пока они не нужны

Нашли ошибку?