¿Cómo me despierto del modo de espera en PIC10F200 a través del perro guardián?

2

Hasta ahora he trabajado con muchos otros microcontroladores pero no con la familia PIC. Estoy teniendo problemas para despertarme del sueño mediante el watchdog en un PIC10F200. Lo estoy programando en C usando el MPLAB X IDE v2.35. Todas las funciones y macros son parte de las bibliotecas de línea de base de microchip para el procesador.

Aquí hay un ejemplo mínimo de cuál es mi problema:

#include <xc.h>
#pragma config CP    = OFF   // Code protection off
#pragma config MCLRE = OFF   // GP3/MCLR pin fuction is digital I/O
#pragma config WDTE  = ON    // Watchdog Timer enabled
#define _XTAL_FREQ 4000000

void main(void) {
    OPTION = 0 | nGPWU | nGPPU & ~T0CS & ~T0SE | PSA | PS2 | PS1 | PS0;    // bits: 7: no wake-up on pin change; 6: no weak pullups; 5: internal clock; 4: incremnt low to high; 3: prescale on wdt (Timer0 if cleared); 2-0: clock division by 128
    TRISGPIO = 0b00000000; // set all to output

    while(1) {
        GP0 = 1;   GP1 = 1;   GP2 = 1;   SLEEP();  // set all high and sleep a bit
        GP0 = 0;   GP1 = 0;   GP2 = 0;   SLEEP();  // set all low  and sleep a bit
    }
}

Básicamente, este es un ejemplo clásico de pin-toggle (parpadeo del LED) que usa el perro guardián. Sólo los pines son altos todo el tiempo. ¿Qué hice mal?

    
pregunta con-f-use

1 respuesta

3

La respuesta finalmente vino a mí en forma de Howardlong. El watchdog causa un reinicio cada vez que se ingresa al modo de suspensión. Sin embargo, se pueden preservar las variables entre los restablecimientos después del sueño utilizando la palabra clave persistent en la declaración de variable.

El retén es, de esta manera la variable no puede inicializarse de la manera normal. Para darle un valor inicial, la mejor manera es detectar un reinicio de encendido e inicializarlo únicamente en ese reinicio. Inicializarlo normalmente daría lugar a un tipo de problema de huevo y gallina, en el que desea conservar el valor, pero configurarlo en reinicio. Tenga en cuenta que algunos registros también se restablecen mediante un restablecimiento de WDT y, por lo tanto, deben configurarse cada vez que se

Aquí hay un ejemplo:

#include <xc.h>
#include <stdbool.h>
#pragma config CP    = OFF   // Code protection off
#pragma config MCLRE = OFF   // Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)
#pragma config WDTE  = ON   // Watchdog Timer enabled
#define _XTAL_FREQ 40000000

static persistent bool _bState; // Persistent so the C startup code doesn't initialise

void main(void) {   
    // Check STATUS bits for type of reset
    if ( ! ( GPWUF==0 && nPD==0 && nTO==0 ) ) {
        // NOT a WDT wakeup from sleep, so treat as a power on reset
        _bState=false;
        OSCCALbits.FOSC4=0;
    }
    // These SFRs must be re-written after every reset
    OPTION = 0b11001100; // WDT is div-by-32 prescaled
    TRISGPIO = 0b1011;   // GP2 output

    GP2=_bState;
    _bState=!_bState;
    SLEEP();                
}
    
respondido por el con-f-use

Lea otras preguntas en las etiquetas