Микрочип PIC продолжает перезагружаться

У меня есть 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 В, подаваемого моим основным источником питания), но это также не имело видимого значения.

Что может быть причиной такого поведения?

Сторожевой таймер? Попробуйте добавить WDT = OFF. Или WDTE...
У вас есть шунтирующие конденсаторы? 0,1 мкФ и 1 мкФ напрямую (или как можно ближе) к контактам источника питания. У меня недавно было что-то подобное, потому что мой единственный байпасный конденсатор (система с ограниченным пространством) не был припаян.
Также попробуйте 100n cap на mclr на землю
@akohlsmith у нас есть развязывающий колпачок на 100 нФ на блоке питания. спасибо за предложение, однако.

Ответы (1)

Как Евгений Ш. верно указал. Наиболее вероятным виновником является сторожевой таймер. Если вы посмотрите на лист технических характеристик ( http://ww1.microchip.com/downloads/en/DeviceDoc/40001729A.pdf ), стр. 99, вы увидите, что время ожидания по умолчанию для сброса сторожевого таймера составляет 2 с. Кроме того, на странице 48 вы можете видеть, что биты конфигурации по умолчанию включают сторожевой таймер независимо от настроек программного обеспечения среды выполнения.

Ваша проблема может быть решена добавлением строки:

#pragma config WDTE = OFF 

Если это не решит вашу проблему, вы можете получить источник последнего сброса, проверив значение регистров PCON и STATUS (см. раздел 5.12 Определение причины сброса в спецификации на стр. 58).