У меня есть 20-контактный 8-битный микроконтроллер PIC16LF1709 . Я программирую его с помощью PICkit 3 . Я могу успешно записать программу на чип и запустить ее, но всегда кажется, что она частично сбрасывается во время выполнения.
Во время программирования PIC я позволяю программатору подавать питание, но я также могу отключить программатор и запустить чип от собственного источника питания 5 В. В соответствии с рекомендациями я подключил подтягивающий резистор 50 кОм от MCLR к Vdd, чтобы предотвратить сброс устройства.
У меня есть пять светодиодов, подключенных к RC0-RC4, и я написал тестовую программу ниже, чтобы продемонстрировать проблемы, с которыми я сталкиваюсь:
#include <xc.h> /* XC8 General Include File */
#include <pic16lf1709.h> /* Definitions of I/O pins */
void main(void) {
TRISC = 0x0; // port C (all are LEDs or NC) is output
PORTC = 0x0; // turn on all LEDs
for(int i=0; i<500; i++) _delay(250); // delay for about a second
PORTC = 0xFF; // turn off all LEDs
while(1) {
// do nothing, forever
// lights should remain OFF.
}
}
Я ожидаю, что индикаторы ненадолго загорятся, затем погаснут и не будут гореть до тех пор, пока я не выключу и не выключу устройство. Вместо этого мигают лампочки. Это заставляет меня думать, что PIC сбрасывается примерно каждые 1-2 секунды.
Я попытался включить следующую строку конфигурации (кроме этой, я не указал никакой конфигурации) в попытке отключить некоторые функции, которые могут автоматически сбрасывать устройство. Поведение не изменилось.
#pragma config MCLRE = OFF, STVREN = OFF, LPBOR = OFF
Я также пытался запустить выполнение при питании от 3,25 В, подаваемого PICkit (в отличие от 5 В, подаваемого моим основным источником питания), но это также не имело видимого значения.
Что может быть причиной такого поведения?
Как Евгений Ш. верно указал. Наиболее вероятным виновником является сторожевой таймер. Если вы посмотрите на лист технических характеристик ( http://ww1.microchip.com/downloads/en/DeviceDoc/40001729A.pdf ), стр. 99, вы увидите, что время ожидания по умолчанию для сброса сторожевого таймера составляет 2 с. Кроме того, на странице 48 вы можете видеть, что биты конфигурации по умолчанию включают сторожевой таймер независимо от настроек программного обеспечения среды выполнения.
Ваша проблема может быть решена добавлением строки:
#pragma config WDTE = OFF
Если это не решит вашу проблему, вы можете получить источник последнего сброса, проверив значение регистров PCON и STATUS (см. раздел 5.12 Определение причины сброса в спецификации на стр. 58).
Евгений Ш.
WDT = OFF
. ИлиWDTE
...акольсмит
Энди ака
Вудро Барлоу