PIC16 solo se ejecuta en el depurador

1

Estoy ejecutando un Hello World que alterna RB7:

#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

Esto se ejecuta perfectamente en el depurador MPLABX usando un PicKit3, pero no se ejecuta de otra manera.

Esto parece ser un problema común, pero un día de Google no ha resultado nada útil. Esto es lo que he aprendido:

  1. La mayoría de las personas no logran sacar MCLR alto. Tengo un 10k entre MCLR y VDD.

  2. El bit de configuración del reloj toma como valor predeterminado un reloj externo. Ponerlo en INTOSC no ayudó.

  3. Algunas personas sugieren establecer el bit! DEBUG, pero la hoja de datos afirma que el depurador se encarga totalmente de esto. Lo intenté de todos modos; no ayudó.

Cualquier sugerencia sería apreciada. Gracias

También: ¿Alguien sabe si es posible programar un PIC utilizando un Beaglebone mediante la conexión de I2C a ICSPDAT e ICSPCLK?

    

1 respuesta

3

Esto es más probable debido a que el temporizador de vigilancia (WDT) reinicia tu chip. El WDT está habilitado de forma predeterminada en todos los PIC, por lo que debe desactivarlo explícitamente si no tiene instrucciones específicas en su código para borrar el temporizador. Consulte la sección 9 en su hoja de datos para obtener más información sobre el WDT.

El WDT se configura en el registro CONFIG1, por lo que se convertirá en parte de su línea de código "__config CONFIG1".

La captura de pantalla siguiente es de la hoja de datos que muestra el registro CONFIG1. Observe que los valores predeterminados para WDTE son \ $ 11_2 \ $, que corresponde a "WDT Enabled".

    
respondido por el Dan Laks

Lea otras preguntas en las etiquetas