El propósito del watchdog timer (WDT) o perro guardián es producir un reset del microcontrolador PIC cada cierto período de tiempo con lo cual se reinicia la ejecución del programa, con la finalidad de evitar que el dispositivo quede bloqueado (por ejemplo, por alguna falla en la ejecución del programa) o permanezca en una espera muy prolongada por un determinado evento que no ocurre (por ejemplo, en un lazo infinito). Durante la operación normal, el watchdog timer (conocido en español como perro guardián) produce el reset del PIC al final del período WDT. El reset puede evitarse si se reinicia el watch dog timer por medio de la ejecución de la instrucción CLRWDT antes del final de su período. Si el dispositivo está en modo Sleep, el watch dog timer hace que el PIC se despierte y continúe con la operación normal (sin producir reset), esto se conoce como despertar WDT. El usuario tiene la posibilidad de emplear un prescaler para el watchdog timer (prescaler de 16 bits) y para el Timer 0 (prescaler de 8 bits) al mismo tiempo.
Nota: Los conceptos aqui explicados se basan en el PIC16F88 pero pueden aplicarse de forma general a cualquier microcontrolador PIC observando pequeños detalles tales como los nombres de algunos registros y la arquitectura del watchdog timer en la hoja de especificaciones particular.
¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos. ¡Cómpralo ahora y libera el increíble potencial de esta poderosa tecnología hoy mismo!
El período WDT puede extenderse hasta 268 segundos, usando el prescaler de 16 bits y el postscaler (prescaler de 8 bits) simultáneamente, cuando el bit PSA del registro OPTION_REG es igual a 1 (prescaler de 8 bits asignado al watch dog timer). Un postscaler es un circuito que reduce la frecuencia de generación de interrupciones (o reset por WDT) de un temporizador / contador.
Oscilador del watchdog timer
El watchdog timer obtiene su base de tiempo del oscilador INTRC de 31.25 kHz. El valor del registro WDTCON es ‘---0 1000’ (prescaler de 16 bits, 1:512) en todos los resets. Esto da una base nominal de 16,38ms, que es compatible con la base de tiempo generada en versiones anteriores de los microcontroladores PIC 16.
Cuando el OST es invocado, el WDT se mantiene en reset, debido a que el contador del WDT es empleado por el OST para realizar el conteo. Cuando finaliza el conteo OST, el WDT empezará a contar (si está habilitado).
Se ha añadido un nuevo prescaler para el perro guardián. Este prescaler es de 16 bits y puede ser programado con los bits WDTPS<3:0> del registro WDTCON, para dividir el oscilador RC desde 32 hasta 65536, dándole a la base de tiempo del WDT un rango nominal de 1ms hasta 2,097s .
Control del watchdog timer
Cuando el bit WDTEN de la palabra CONFIG1 es igual a 1 (WDT habilitado), el WDT funciona continuamente y el bit SWDTEN del registro WDTCON no tiene ningún efecto. Si se borra el bit WDTEN (WDT deshabilitado), entonces el bit SWDTEN puede ser empleado para encender y apagar el WDT en el instante deseado de forma muy precisa.
Ejemplo en mikroC PRO con el PIC16F88
Este primer ejemplo muestra cómo programar el WDT para que produzca un reset cada cierto tiempo. Debe notarse que el prescaler de 16 bits permanece en su valor inicial (1:512), por lo que la base de tiempo es de 16,38 ms, mientras que el prescaler de 8 bits (postscaler) se programa con un valor de 1:32, lo que da un período WDT = 16,38 x32 = 524,16 ms (aproximadamente 0,5 s). Otra característica importante de este ejemplo es cómo se puede añadir código ensamblador por medio de la declaración asm. El perro guardián permanece deshabilitado en la palabra CONFIG1 (WDTEN=0). Revisar por medio del comando Project>Edit Project y seleccionar Watchdog Timer: Off. Así el encendido/apagado del WDT se realiza de forma precisa por medio del bit SWDTEN del registro WDTCON.
Ejemplo-WDT1.c: El microcontrolador PIC se pone en modo de bajo consumo. El despertar se producirá cada vez que el perro guardián concluya su período, en ese momento se producirá un incremento de un contador que se visualizará en la pantalla y nuevamente volverá al modo de bajo consumo. El proceso debe repetirse cada medio segundo aproximadamente (circuito de la figura 3.2).
//WDT1.c //OPTION_REG tiene todos sus bits en 1 después de cualquier //reset y no cambia al despertar por WDT o interrupción, por lo tanto //el Timer0 actúa como contador, incrementa en transición //descendente y el prescaler está asignado al WDT. //Declaración de las 12 variables necesarias para la conexión //del módulo LCD. sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // Fin de declaración de variables de conexión. char texto[4], contador=0; void main(){ OSCCON=0x40; //Oscilador interno a 1MHz. while (OSCCON.IOFS==0);//Esperar mientras el oscilador está inestable. ANSEL=0x00; //Bits AN6:AN0 como E/S digital. Lcd_Init(); //Inicializa el LCD. Lcd_Cmd(_LCD_CLEAR); //Borra el display. Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor. WDTCON=0x08; //Prescaler 1:512 (Base de tiempo 16,38 ms). OPTION_REG=0xFD; //Postscaler 1:32 (Período WDT = 524,16 ms). SWDTEN_bit=1; //WDT encendido. while (1) { ByteToStr(contador,texto); Lcd_Out(1,6,texto); asm SLEEP //Modo de bajo consumo durante 524.16 ms. contador++; } }