tecmikro logo
Programación de microcontroladores PIC en mikroC PRO
Email: tecmikro@gmail.com   Cel. 098 743 8877   Telf. 243 0352 Quito-Ecuador


El watchdog timer de los microcontroladores PIC

 

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.

El propósito del watchdog timer (WDT) 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 entre en un lazo infinito (se “cuelgue”) o se quede en una espera muy prolongada por un determinado evento que no ocurre. Durante la operación normal, el watchdog timer (conocido en español como perro guardián) genera un reset del microcontrolador PIC después del final de su período (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 ocasiona que se despierte el microcontrolador PIC 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 Timer0 (prescaler de 8 bits) al mismo tiempo.

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 watch dog timer

El watch dog 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 (figura 6.2). Este prescaler es de 16 bits y puede ser programado con los bits WDTPS<3:0> del registro WDTCON (figura 6.3), 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 .

Watchdog timer del microcontrolador PIC
Figura 6.2 Diagrama de bloques del WDT (Postscaler es el prescaler de 8 bits del Timer0)
 


Control del watch dog timer del microcontrolador PIC
Figura 6.3 Bits del registro WDTCON

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

Estos ejemplos corresponden al microcontrolador PIC16F88 en mikroC PRO. El código fuente para los microcontroladores PIC16F628A y 16F877A se encuentra en las carpetas correspondientes que acompañan a este libro.
(16F88) 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.

(16F628A y 16F877A)  El prescaler está asignado inicialmente al WDT y se lo ha programado con un valor de 1:32 lo que da un período WDT=18x32=576 ms (aproximadamente 0,5 s). El WDT se debe encender por medio del bit WDTE de la palabra de configuración CONFIG.

Ejemplo-WDT1.c: El microcontrolador PIC se pone en modo de bajo consumo. El despertar se producirá cada vez que el WDT 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++;
}
}
Temas relacionados que también encontrarás en este libro:
  • Reset
  • Reset maestro #MCLR
  • Reset al encendido (Power-on Reset POR)
  • Temporizador de encendido (Power-up Timer  PWRT)
  • Temporizador de encendido del oscilador (Oscilator Start-up Timer OST)
  • Reset por desvanecimiento (Brown-out Reset BOR)
  • Secuencia general de encendido
  • Modo de bajo consumo (Sleep)
  • Despertar (Wake-up from Sleep)
  • Otros ejemplos de programación

 


eBook en formato PDF "Cómo programar microcontroladores PIC"

Guía básica para programar microcontroladores PIC en mikroC PRO. Disponible en formato PDF. A la venta por tan sólo US$12.00

¡Cómpralo ya!