TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Santiako en 26 de Febrero de 2023, 14:11:35

Título: Ayuda perro guardian
Publicado por: Santiako en 26 de Febrero de 2023, 14:11:35
Necesito ayuda para configurar el perro guardian en el pic12f508...mplab
Título: Re:Ayuda perro guardian
Publicado por: DominusDRR en 26 de Febrero de 2023, 16:01:16
Necesito ayuda para configurar el perro guardian en el pic12f508...mplab

Deberías indicar que lenguaje de programación deseas usar (asm o XC8)
Título: Re:Ayuda perro guardian
Publicado por: Santiako en 27 de Febrero de 2023, 18:04:31
Amigo estoy usando xc8.....ya tengo todo el programa pero no sé bien cómo establecer el perro guardian para que vigilé al programa
Título: Re:Ayuda perro guardian
Publicado por: DominusDRR en 27 de Febrero de 2023, 18:45:23
Amigo estoy usando xc8.....ya tengo todo el programa pero no sé bien cómo establecer el perro guardian para que vigilé al programa

Lo más simple que puedes hacer es colocar la instrucción de reinicio del WDT en el lazo principal, algo similar a esto:

Código: C
  1. void main(void)
  2. {
  3.     ...
  4.     ...
  5.     while (1) //lazo principal
  6.     {
  7.         CLRWDT();
  8.         ....
  9.     }
  10. }

Me imagino que sabes que en los bits de configuración o fuses debes habilitar a dicho temporizador (bit WDTE de la palabra de configuración), como también el escalamiento (bits PS<2:0> del registro OPTION)que sirve para determinar que momento el WDT reinicie el CPU del MCU.




Título: Re:Ayuda perro guardian
Publicado por: Santiako en 02 de Marzo de 2023, 17:31:47
Mire le comparto el código de mi proyecto...utilizo el Pic 12f508 y es un sistema que detecta el agua de un tinaco y dependiendo si tiene agua o no lo llena a través de una bomba. En mi país lo conocen como electronivel.

// PIC12F508 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection off)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 4000000     // 4 Mhz OSC
#define INPUT1 GPIObits.GP0       // Asignamos al puerto A1 la etiqueta de "INPUT2"
#define INPUT2 GPIObits.GP1       // Asignamos al puerto A1 la etiqueta de "INPUT2"
#define INPUT3 GPIObits.GP2       // Asignamos al puerto A1 la etiqueta de "INPUT3"
#define INPUT4 GPIObits.GP3       // Asignamos al puerto A1 la etiqueta de "INPUT3"
#define OUT1 GPIObits.GP4         // Asignamos al puerto B1 la etiqueta de "OUT2"
#define OUT2 GPIObits.GP5         // Asignamos al puerto B2 la etiqueta de "OUT3"

void main(void) {
   
    TRISGPIO = 0b001111;           //GP0,GP1,GP2,GP3 CONFIGURADOS COMO ENTRADA....GP4,GP5 CONFUGURADOS COMO SALIDA
    GPIO = 0b000000;               // INICIALIZAR EL PUERTO EN CERO
    OPTION = 0b11001111;           // apaga timers para usar correctamente el puerto
   
   

   
    __delay_ms(200);              // Delay de  200 ms, tema de inicialización
   
   while(1)
       
    {
 
   if (INPUT1 == 0 && INPUT2 == 0 && INPUT3 == 1)
        {
        OUT1 = 1;
        OUT2 = 0;//LED INDICANDO CISTERNA LLENA
        }
   if (INPUT1 == 0 && INPUT2 == 0)
        {
        OUT2 = 0;//LED INDICANDO CISTERNA LLENA
        }
 

           
   if (INPUT4 == 0)
        {
        OUT1 = 0;

        }   
     
  if (INPUT1 == 1 )
        {
        OUT1 = 0;
        OUT2 = 1;//LED INDICANDO CISTERNA VACIA
        } 
   
 
    }                               // Bucle infinito 
 return;
}
Título: Re:Ayuda perro guardian
Publicado por: DominusDRR en 02 de Marzo de 2023, 17:48:49
Para habilitar al perro guardián sería así:

Código: C
  1. #pragma config WDT = ON        // Watchdog Timer Enable bit (WDT enabled)
  2.  
  3. ....
  4.  
  5. while(1)
  6.        
  7. {
  8.     CLRWDT(); // LIMPIO AL WDT
  9.  
  10.     if (INPUT1 == 0 && INPUT2 == 0 && INPUT3 == 1)
  11.     {
  12.         OUT1 = 1;
  13.         OUT2 = 0;//LED INDICANDO CISTERNA LLENA
  14.     }
  15.     if (INPUT1 == 0 && INPUT2 == 0)
  16.     {
  17.         OUT2 = 0;//LED INDICANDO CISTERNA LLENA
  18.     }
  19.        
  20.     if (INPUT4 == 0)
  21.     {
  22.         OUT1 = 0;
  23.  
  24.     }  
  25.      
  26.     if (INPUT1 == 1 )
  27.     {
  28.         OUT1 = 0;
  29.         OUT2 = 1;//LED INDICANDO CISTERNA VACIA
  30.     }
  31.  
  32. }

El preescaler por defecto del WDT es de 1, esto implica según las hojas de datos que se desbordaría en 18 ms.

Si todo lo que está luego de la instrucción CLRWDT(); se demora más de 18 ms, el CPU se reiniciaría, pero en tu caso no creo que tome tanto tiempo en ejecutar todos esos if que has puesto.

Para determinar si el WDT funciona correctamente, podrías aumentar el pre escalamiento ha digamos unos 2 segundos y comentar la línea CLRWDT(); y podrás ver que  luego de ese tiempo tu microcontrolador se reinicia.
Título: Re:Ayuda perro guardian
Publicado por: Santiako en 02 de Marzo de 2023, 17:57:14
Muchas gracias...has salvado mi dia... :)...
Entonces no pongo ningún registro de option lo dejo como tume dices así nadamás.
Nadamás activo el perro guardian en los fuses y escribo al inicio esto.
CLRWDT ( )
Cómo tú me pones.
Gracias de verdad, gracias. Te aviso como me fue gracias...
Título: Re:Ayuda perro guardian
Publicado por: DominusDRR en 02 de Marzo de 2023, 18:06:02
Muchas gracias...has salvado mi dia... :)...
Entonces no pongo ningún registro de option lo dejo como tume dices así nadamás.
Nadamás activo el perro guardian en los fuses y escribo al inicio esto.
CLRWDT ( )
Cómo tú me pones.
Gracias de verdad, gracias. Te aviso como me fue gracias...

Si, tienes que considerar que el WDT es un temporizador que nunca debes permitir que se desborde. Si llega a suceder eso es porque el CPU se ha quedado en un bucle infinito.

Esto puede suceder por una mala escritura del código por parte del programador, o una interferencia electromagnética que hizo que el contador de programe salte a una región donde no existe código.

Cuando se cuelga tu sistema, sin el WDT necesitarías que alguien vaya a donde este el hardware y apague y vuelva a encenderlo.

Hay muchos métodos para proteger a un sistema embebido, y otros tipos de WDT y temporizadores de protección en microcontroladores más complejos.

Un video sobre las interferencias electromagnéticas que pueden afectar a sistemas digitales: