Autor Tema: Despertar PIC32MM del estado de sueño usando WDT  (Leído 174 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado YOANMESA

  • PIC10
  • *
  • Mensajes: 5
Despertar PIC32MM del estado de sueño usando WDT
« en: 20 de Septiembre de 2019, 17:53:34 »
Buenas, espero se encuentren bien

Soy nuevo en el campo de la programación y mas con el dispositivo PIC32MM0064GPL028.
Actualmente estoy desarrollando un sistema de bajo consumo, para lo cual necesito estar llevando al pic a un estado de sleep ó ahorro de energía, actualmente he desarrollado una programación en la cual uso el WDT para sacarlo del estado de sleep, el problema que estoy presentando es que cuando programo el PIC, este funciona normalmente (de maravilla) con el pickit (pickit 4) conectado puesto que sale del estado de sueño y continua con la instrucción que llevara antes de entrar en dicho estado, pero cuando desconecto el pickit se resetea constantemente al desbordarse el WDT y no continua con la secuencia, no logro entender que esta sucediendo.

adjunto el codigo para ilustrarme un poco mejor, espero me puedan ayudar. :(

include <p32xxxx.h>
#include <sys/attribs.h>
#include <stdio.h>
#include <xc.h>
#include <stdbool.h>
#include "Math.h"
#include "string.h"
//******************************************************************************
//* Bits de configuracion del PIC.
//******************************************************************************

#

//#pragma config JTAGEN = OFF, ICS = PGx1, FWDTEN = OFF, POSCMOD = XT , FNOSC = PRI, SOSCEN = OFF, SOSCSEL = ON
#pragma config SOSCHP = OFF // Secondary Oscillator High Power Enable bit->SOSC operates in normal power mode.
// FICD
#pragma config JTAGEN = OFF // JTAG Enable bit->JTAG is disabled
#pragma config ICS = PGx1 // ICE/ICD Communication Channel Selection bits->Communicate on PGEC1/PGED1
// FPOR
#pragma config BOREN = BOR2 // Brown-out Reset Enable bits->Brown-out Reset enabled only while device active and disabled in Sleep; SBOREN bit disabled
#pragma config RETVR = ON // Retention Voltage Regulator Enable bit->Retention regulator is enabled and controlled by RETEN bit during sleep
#pragma config LPBOREN = ON // Low Power Brown-out Enable bit->Low power BOR is enabled, when main BOR is disabled
// FWDT
#pragma config SWDTPS = PS8192 // Sleep Mode Watchdog Timer Postscale Selection bits->1:4096
#pragma config FWDTWINSZ = PS25_0 // Watchdog Timer Window Size bits->Watchdog timer window size is 25%
#pragma config WINDIS = OFF // Windowed Watchdog Timer Disable bit->Watchdog timer is in non-window mode
#pragma config RWDTPS = PS8192 // Run Mode Watchdog Timer Postscale Selection bits->1:4096
#pragma config RCLKSEL = LPRC // Run Mode Watchdog Timer Clock Source Selection bits->Clock source is LPRC (same as for sleep mode)
#pragma config FWDTEN = OFF // Watchdog Timer Enable bit->WDT is disabled
// FOSCSEL
#pragma config FNOSC = FRCDIV// Oscillator Selection bits->Fast RC oscillator (FRC) with divide-by-N
#pragma config PLLSRC = FRC // System PLL Input Clock Selection bit->FRC oscillator is selected as PLL reference input on device reset
#pragma config SOSCEN = OFF // Secondary Oscillator Enable bit->Secondary oscillator (SOSC) is disabled
#pragma config IESO = ON // Internal/External Switch-over Enable bit->Internal/External Switch-over is enabled
#pragma config POSCMOD = OFF // Primary Oscillator Selection bit->Primary oscillator is disabled
#pragma config OSCIOFNC = OFF // System Clock on CLKO Pin Enable bit->OSCO pin operates as a normal I/O
#pragma config SOSCSEL = OFF // Secondary Oscillator External Clock Enable bit->Crystal is used (RA4 and RB4 are controlled by SOSC)
#pragma config FCKSM = CSECME // Clock Switching and Fail-Safe Clock Monitor Enable bits->Clock switching is enabled; Fail-safe clock monitor is enabled
// FSEC
#pragma config CP = OFF // Code protect



//******************************************************************************
//* Creación y Definicion de variables.
//******************************************************************************
//------------------------ Lock/Unlock Sequence --------------------------------
#define KEY1                0xAA996655
#define KEY2                0x556699AA
#define KEYLock             0x00
//---------------------------- Pin SLEEP XBee ----------------------------------
#define SLEEP_XBEE_CONFIG   TRISBbits.TRISB5
#define SLEEP_XBEE_LAT      LATBbits.LATB5
//----------------------------- Pins for PWM -----------------------------------
#define PWM_GREEN_CONFIG    TRISBbits.TRISB8
#define PWM_GREEN_LAT       LATBbits.LATB8
#define PWM_RED_CONFIG      TRISBbits.TRISB9
#define PWM_RED_LAT         LATBbits.LATB9
#define PWM_BLUE_CONFIG     TRISAbits.TRISA0
#define PWM_BLUE_ANALOG     ANSELAbits.ANSA0
#define PWM_BLUE_LAT        LATAbits.LATA0
//----------------------------- Variables --------------------------------------
typedef enum{ ZERO, ONE } digital;
typedef enum{ FALSE, TRUE }Boolean;
Boolean Bool = FALSE;
//******************************************************************************
//* Definición de funciones auxiliares.
//******************************************************************************
void Delay( unsigned int, unsigned int );
void StandbyRetenMode (void);
void PerecitaMode (void);
//******************************************************************************
//* Funcion principal "main"
//******************************************************************************
int main( void )
{
    SLEEP_XBEE_CONFIG = ZERO;
    PWM_GREEN_CONFIG = ZERO;           
    PWM_BLUE_CONFIG = ZERO;
    PWM_BLUE_ANALOG = ONE;   
    PWM_RED_CONFIG = ZERO;   
    PWM_GREEN_LAT = ZERO;
    PWM_RED_LAT = ZERO;
    PWM_BLUE_LAT = ZERO;
   

//           
//               
    while(1)
    {       
            SLEEP_XBEE_LAT = ZERO;
            PWM_GREEN_LAT = ONE;
            Delay(1000,1000);
            PWM_GREEN_LAT = ZERO;

            SLEEP_XBEE_LAT = ONE;
            PWM_GREEN_LAT = ONE;
            Delay(1000,1000);
            PWM_GREEN_LAT = ZERO;   
           
            PerecitaMode ();
            StandbyRetenMode ();
            RNMICONbits.WDTS = 1;
         
            WDTCONSET = 0x8001;
            asm volatile ("wait"); 
           
            SLEEP_XBEE_LAT = ZERO;
            PWM_BLUE_LAT = ONE;
            Delay(1000,1000);
            PWM_BLUE_LAT = ZERO;

            SLEEP_XBEE_LAT = ONE;
            PWM_BLUE_LAT = ONE;
            Delay(1000,1000);
            PWM_BLUE_LAT = ZERO;
            PerecitaMode ();
            StandbyRetenMode ();
            RNMICONbits.WDTS = 1;

            WDTCONSET = 0x8001;
            asm volatile ("wait");
           
   

            SLEEP_XBEE_LAT = ZERO;
            PWM_RED_LAT = ONE;
            Delay(1000,1000);
            PWM_RED_LAT = ZERO;

            SLEEP_XBEE_LAT = ONE;
            PWM_RED_LAT = ONE;
            Delay(1000,1000);
            PWM_RED_LAT = ZERO;
            PerecitaMode ();
            StandbyRetenMode ();
            RNMICONbits.WDTS = 1;

            WDTCONSET = 0x8001;
            asm volatile ("wait");
           
                     

         

    }
   
    return 0;
}
//******************************************************************************
//* Funciones auxiliares.
//******************************************************************************
void Delay(unsigned int DelayLow, unsigned int DelayHigh) {
    //Variables para el control de retardo
    unsigned int i, j;
    for (i = 0; i < DelayHigh; i++) {
        for (j = 0; j < DelayLow; j++) {
            asm("NOP");    // "nop" en assembler "no operation" comando para no hacer nada.
        }
    }
}

void StandbyRetenMode (void)
{
    SYSKEY = KEY1;
    SYSKEY = KEY2;
    PWRCON = 0x02; // Standby-retention mode
    SYSKEY = KEYLock;
}

void PerecitaMode (void)
{
 // Xbee OFF (in ONE)
// SLEEP_XBEE_LAT=ONE;
// Delay(100,100);
 //sequence KEY
 SYSKEY = KEY1;
 SYSKEY = KEY2;   
 // TUN Center frequency;
 OSCTUN = 0x0;
 
 // PLLODIV 1:1; PLLMULT 3x; PLLICLK FRC;
 SPLLCON = 0x10080;
 // SWRST disabled;
 RSWRST = 0x0;
 // WDTO disabled; GNMI disabled; CF disabled; WDTS disabled; NMICNT 0; LVD disabled; SWNMI disabled;
 RNMICON = 0x0;
 

 // SBOREN disabled; VREGS enabled; RETEN disabled;
 PWRCON = 0x1;
 // CF No Clock Failure; FRCDIV FRC/1; SLPEN Device will enter Sleep mode when a WAIT instruction is issued; NOSC FRCDIV; SOSCEN disabled; CLKLOCK Clock and PLL selections are not locked and may be modified; OSWEN Complete;
 OSCCON = 0x10;
 
 //Wrong sequence KEY to lock configuration
 SYSKEY = KEYLock;
 // WDTO disabled; EXTR disabled; POR disabled; SLEEP disabled; BOR disabled; PORIO disabled; IDLE disabled; PORCORE disabled; BCFGERR disabled; CMR disabled; BCFGFAIL disabled; SWR disabled;
 RCON = 0x0;
 // ON disabled; DIVSWEN disabled; RSLP disabled; ROSEL SYSCLK; OE disabled; SIDL disabled; RODIV 0;
 REFO1CON = 0x0;
 // ROTRIM 0;
 REFO1TRIM = 0x0;
 // SPDIVRDY disabled;
 CLKSTAT = 0x0;

Desconectado YOANMESA

  • PIC10
  • *
  • Mensajes: 5
Re:Despertar PIC32MM del estado de sueño usando WDT
« Respuesta #1 en: 23 de Septiembre de 2019, 14:28:10 »
Para el que le pueda interesar, revisando nuevamente la errata del dispositivo identifique que cuenta con Dual WatchDog Timer; el cual si se desborda en estado de ahorro de energía despierta el micro sin reiniciarlo, pero si se desborda cuando el micro esta despierto lo reinicia, para lo cual habilito el WDT antes de dormir el micro y lo inhabilito cuando sale del estado de sueño, garantizando que no cuente cuando este despierto, solo dormido.