PIC-Mikrochip wird immer wieder zurückgesetzt

Ich habe eine PIC16LF1709 20-Pin-8-Bit-Mikrochip-MCU . Ich programmiere es mit einem PICkit 3 . Ich kann ein Programm erfolgreich auf den Chip brennen und ausführen, aber es scheint immer während der Ausführung zurückgesetzt zu werden.

Während ich den PIC programmiere, lasse ich den Programmierer die Stromversorgung liefern, aber ich kann den Programmierer auch ausstecken und den Chip mit seiner eigenen 5-V-Versorgung betreiben. Wie empfohlen, habe ich einen 50-kOhm-Pullup-Widerstand von MCLR zu Vdd betrieben, um zu verhindern, dass das Gerät dadurch zurückgesetzt wird.

Ich habe fünf LEDs an RC0-RC4 angeschlossen und habe das folgende Testprogramm geschrieben, um die Probleme zu demonstrieren, die ich habe:

#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.
    }

}

Ich erwarte, dass sich die Lichter kurz einschalten, dann ausschalten und aus bleiben, bis ich das Gerät aus- und wieder einschalte. Stattdessen blinken die Lichter. Dies lässt mich denken, dass der PIC etwa alle 1 - 2 Sekunden zurückgesetzt wird.

Ich habe versucht, die folgende Konfigurationszeile einzufügen (außer dieser habe ich keine Konfiguration angegeben), um einige der Funktionen zu deaktivieren, die das Gerät möglicherweise automatisch zurücksetzen. Das Verhalten war unverändert.

#pragma config MCLRE = OFF, STVREN = OFF, LPBOR = OFF

Ich habe auch versucht, die Ausführung laufen zu lassen, während sie mit 3,25 V vom PICkit versorgt wird (im Gegensatz zu den 5 V, die von meiner Hauptstromversorgung geliefert werden), aber das machte auch keinen offensichtlichen Unterschied.

Was könnte dieses Verhalten verursachen?

Ein Watchdog-Timer? Versuchen Sie, hinzuzufügen WDT = OFF. Oder WDTE...
Hast du Bypass-Kondensatoren? 0,1 uF und 1 uF direkt (oder so nah wie möglich) über die Stromversorgungsstifte. Ich hatte kürzlich etwas Ähnliches, weil mein einziger Bypass-Kondensator (platzbeschränktes System) nicht festgelötet war.
Versuchen Sie auch eine 100n-Kappe auf mclr zu gnd
@akohlsmith Wir haben eine 100-nF-Entkopplungskappe über der Stromversorgung. danke aber für den vorschlag.

Antworten (1)

Als Eugen Sh. richtig hingewiesen. Der wahrscheinlichste Übeltäter ist der Watchdog-Timer. Wenn Sie sich das Spezifikationsblatt ( http://ww1.microchip.com/downloads/en/DeviceDoc/40001729A.pdf ) auf Seite 99 ansehen, können Sie sehen, dass das Standard-Timeout für das Zurücksetzen des Watchdog-Timers 2 Sekunden beträgt. Außerdem können Sie auf Seite 48 sehen, dass die Standardkonfigurationsbits den Watchdog-Timer unabhängig von der Einstellung der Laufzeitsoftware aktivieren.

Ihr Problem kann durch Hinzufügen der Zeile gelöst werden:

#pragma config WDTE = OFF 

Wenn dies Ihr Problem nicht löst, können Sie die Quelle des letzten Resets ermitteln, indem Sie den Wert der PCON- und STATUS-Register überprüfen (siehe Abschnitt 5.12 Bestimmung der Ursache eines Resets im Spezifikationsblatt auf Seite 58).