Entendiendo el funcionamiento del temporizador de vigilancia PIC32

2

Soy nuevo en el desarrollo de Estados Unidos y he estado jugando con la serie PIC durante aproximadamente 6 meses. Recientemente comencé a trabajar con el compilador XC32 C ++ de PIC32 y Microchip. No sé si tengo un malentendido fundamental de cómo funciona el WDT en la serie PIC, o si hay una advertencia de la que no tengo conocimiento, sin embargo, tengo un código que creo que debería encender un LED en RA0, luego gire se apaga y, después de 512 ms, el WDT debe restablecer la unidad de control y el proceso debe comenzar de nuevo. Lo que realmente está sucediendo es que el LED se enciende momentáneamente, luego se apaga y nunca se vuelve a encender. No sé si esto significa que el WDT está configurado incorrectamente o qué. Aquí está mi código:

#include <xc.h>

#define LED _LATA0

/*
 * 
 */
int main(int argc, char** argv) {

    WDTCONbits.WDTPS = 0b1001; //512ms postscaler
    WDTCONbits.WDTCLR = 1; // feed the watchdog

    WDTCONbits.ON = 1; // enable the watchdog


    TRISAbits.TRISA0 = 0; //output on RA0
    ANSELAbits.ANSA0 = 0; // digital only


    LED = 1; //led on
    int i = 100000;
    while(i--);
    LED = 0; // led off
    while(1); // hang up and let WDT reset us

    return 0;
}

¿Qué parte del uso exitoso de WDT me estoy perdiendo?

    
pregunta Jacob Calvert

1 respuesta

2

Después de cavar un poco más, creo que encontré la respuesta. Según este documento , el registro WDTCONbits.WDTPS es solo una instantánea de los bits postscaler. Para establecer el valorador de publicaciones que tuve que agregar en mi archivo principal #pragma config WDTPS = PS512 . Mi código exitoso ahora lee:

#define LED _LATA0
#pragma config WDTPS = PS512 // this is the magic line

/*
 * 
 */
int main(int argc, char** argv) {


    //WDTCONbits.WDTPS = 0b1001; //512ms postscaler

    WDTCONbits.WDTCLR = 1; // feed the watchdog



    WDTCONbits.ON = 1; // enable the watchdog


    TRISAbits.TRISA0 = 0; //output on RA0
    ANSELAbits.ANSA0 = 0; // digital only


    LED = 1; //led on
    int i = 100000;
    while(i--);
    LED = 0; // led off
    while(1); // hang up and let WDT reset us

    return 0;
}
    
respondido por el Jacob Calvert

Lea otras preguntas en las etiquetas