logo microc
    microC®
Líder en la programación de microcontroladores PIC
©2009-2012
Síguenos en    
logo facebook
Inicio La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | Mapa del sitio |

Perro guardián del PIC (en inglés PIC Watchdog Timer - WDT)

Extracto del Capítulo VI del libro Cómo programar en lenguaje C los microcontroladores PIC16F88, 16F628A y 16F877A. 2da edición. 2010

Regístrate aquí para descargar una muestra gratis de este libro

Introducción

El propósito de este módulo es producir un reset 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 genera un reset del dispositivo después del final de su período (período WDT). El reset puede evitarse si se reinicia el WDT 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 WDT ocasiona que se despierte el dispositivo 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 perro guardián (prescaler de 16 bits) y para el Timer0 (prescaler de 8 bits) al mismo tiempo. El período WDT puede extenderse hasta 268 s, 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 WDT).
  • Un postscaler es un circuito que reduce la frecuencia de generación de interrupciones (o reset por WDT) de un temporizador/contador.

Oscilador WDT

El perro guardián del PIC (en inglés PIC 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 PICs16.
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 watchdog (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 para 32 hasta 65536, dándole a la base de tiempo del WDT un rango nominal de 1ms   hasta 2,097s .

wdt
Figura 6.2 Diagrama de bloques del WDT (Postscaler es el prescaler de 8 bits del Timer0)


registro wdt_con
Figura 6.3 Bits del registro WDTCON

Control del PIC watchdog timer WDT

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.

Ejemplos de programación del perro guardián del PIC

Estos ejemplos corresponden al PIC16F88. El código fuente para los PICs 16F628A 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 (en inglés PIC watchdog timer) 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 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

  • Restet 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



Si esta información te ha sido útil
entonces considera la posibilidad
de hacer una contribución para microC.
Tu apoyo es muy importante para seguir adelante.
Muchas gracias.






Copyright © microC
Quito-Ecuador