![]() |
microC®
Líder
en la programación de microcontroladores PIC
©2009-2012 |
|
Síguenos en
|
| 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ónEl 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).
Oscilador WDTEl 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 . ![]() Figura 6.2 Diagrama
de bloques del WDT (Postscaler es el prescaler de
8 bits del Timer0)
![]() Figura 6.3 Bits del registro WDTCON Control del PIC watchdog timer WDTCuando 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 PICEstos 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:
|
|
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. |