PIC16 läuft nur auf Debugger

Ich führe ein Hello World aus, das RB7 umschaltet:

#include <p16f1509.inc>
    __config _CONFIG1, _FOSC_INTOSC

    udata
delay0  res 1
delay1  res 1
delay2  res 1
delay3  res 1
ledState res 1   

delay32 macro delay
    goto $+1
    goto $+1

    banksel delay3

    movlw   (delay - 1) & 0xFF
    movwf   delay0

    movlw   (delay - 1) >> 0x08 & 0xFF
    movwf   delay1

    movlw   (delay - 1) >> 0x10 & 0xFF
    movwf   delay2

    movlw   (delay - 1) >> 0x18 & 0xFF
    movwf   delay3

    call    doDelay32
    endm


rst code 0x00

start:
    clrf    PORTB
    banksel TRISB
    clrf    TRISB

    banksel ANSELB
    clrf    ANSELB

    movlw   0x80
    movwf   PORTB

    banksel ledState
    movlw   0x00
    movwf   ledState

loop:
    banksel ledState
    movf   ledState, 0
    xorlw   0x80
    movwf   ledState
    movwf   PORTB

    delay32 d'2500'

    goto loop


doDelay32
    movlw   0xFF

    addwf   delay0, F
    btfsc   STATUS, C
    clrw

    addwf   delay1, F
    btfsc   STATUS, C
    clrw

    addwf   delay2, F
    btfsc   STATUS, C
    clrw

    addwf   delay3, F
    btfsc   STATUS, C
    clrw

    iorwf   delay0, W
    iorwf   delay1, W
    iorwf   delay2, W
    iorwf   delay3, W

    btfss   STATUS, Z
    goto    doDelay32
    retlw   0

 end

Dies läuft perfekt auf dem MPLABX-Debugger mit einem PicKit3, aber sonst nicht.

Dies scheint ein häufiges Problem zu sein, aber ein Tag des Googelns hat nichts Nützliches ergeben. Folgendes habe ich gelernt:

  1. Die meisten Menschen schaffen es nicht, MCLR hoch zu ziehen. Ich habe eine 10k zwischen MCLR und VDD.

  2. Das Taktkonfigurationsbit ist standardmäßig auf einen externen Takt eingestellt. Die Einstellung auf INTOSC hat nicht geholfen.

  3. Einige Leute schlagen vor, das !DEBUG-Bit zu setzen, aber das Datenblatt behauptet, dass dies vollständig vom Debugger erledigt wird. Ich habe es trotzdem versucht; es hat nicht geholfen.

Irgendwelche Vorschläge würden geschätzt. Danke

Außerdem: Weiß jemand, ob es möglich ist, einen PIC mit einem Beaglebone zu programmieren, indem man I2C mit ICSPDAT und ICSPCLK verbindet?

Wenn Sie den Debugger nicht ausführen, haben Sie die MCU vom Zurücksetzen befreit, damit sie ausgeführt wird? Selbst mit einem externen Pull-up-Widerstand zieht das PICKit den Reset-Pin auf Low, es sei denn, Sie lassen ihn laufen (entweder im Debug-Modus oder im normalen Betrieb).
Es gibt eine Menge Sicherungen, die Sie noch nicht definiert haben, z. B. ob der Watchdog-Timer (WDT) eingeschaltet ist oder nicht. Es ist wahrscheinlich standardmäßig eingeschaltet, und der PIC setzt sich alle paar Millisekunden zurück. Oder die Brownout-Erkennung, wenn die Stromversorgung vom Debugger "gut" ist, Ihre Versorgung jedoch etwas niedriger ist. Sie werden am Ende alles mit einem feinen Kamm durchgehen ... können genauso gut jetzt beginnen.
Das ist ziemlich einfach, aber haben Sie Ihr Programm im Release-Modus und nicht im Debug-Modus neu kompiliert und dann das PICkit3 erneut ausgewählt, bevor Sie den Mikrocontroller programmieren?

Antworten (1)

Dies liegt höchstwahrscheinlich daran, dass der Watchdog-Timer (WDT) Ihren Chip zurücksetzt. Der WDT ist standardmäßig in allen PICs aktiviert, daher müssen Sie ihn explizit deaktivieren, wenn Sie in Ihrem Code keine spezifischen Anweisungen zum Löschen des Timers haben. Weitere Informationen zum WDT finden Sie in Abschnitt 9 Ihres Datenblatts.

Das WDT wird im Register CONFIG1 konfiguriert, sodass es Teil Ihrer Codezeile "__config CONFIG1" wird.

Der folgende Screenshot stammt aus dem Datenblatt, das das CONFIG1-Register zeigt. Beachten Sie, dass die Standardwerte für WDTE sind 11 2 , was „WDT aktiviert“ entspricht.

Geben Sie hier die Bildbeschreibung ein