Почему PIC не работает после прошивки?
Обновлено Редакция GAW
Биты конфигурации PIC читаются при подаче питания и задают генератор, сторожевой таймер, сброс и режим программирования ещё до первой команды. Если в исходнике нет строк #pragma config, в HEX-файл попадают значения стёртого кристалла — а они для работы почти никогда не подходят.
Чистый кристалл PIC16F877A
| Настройка | В стёртом кристалле (3FFFh) | Что получится | Как надо |
|---|---|---|---|
| FOSC | RC | кварц не возбуждается | 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.
Источники
- 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 нельзя оставлять висящим
- Microchip. MPLAB XC8 Getting Started Guide (DS50002173A) — биты конфигурации задают строками #pragma config; советы: проверить генератор, выключить сторожевой таймер и защиту кода, пока они не нужны
Нашли ошибку?
Смотрите также
- Биты конфигурации PIC#pragma config XC8, слова CONFIG в hex и обратно, опасные LVP, MCLRE и CP
- PIC (Microchip)PIC10/12/16/18, dsPIC33, PIC32: ядра, классические кристаллы, MPLAB
- Программирование PIC (ICSP)Выводы ICSP, VPP и LVP, ключ MCHP, схема у MCLR, PICkit 5, Snap, IPE
- Можно ли перепрошить PIC после MCLRE = OFF?Да, высоким напряжением: сначала Vpp на MCLR, потом питание