Está en la página 1de 4

/* *****************************************************************************

** Descripción : Uso del Watchdog


** Controlador : 40PIN PIC18F4620
** Compilador : Microchip C18
** IDE : Microchip MPLAB
** XTAL : 20MHZ
** Autor : Firtec
**
*******************************************************************************/

9
#include <p18f4620.h>
#pragma config OSC=HS,PWRT=ON,MCLRE=OFF,LVP=OFF,WDT=ON,WDTPS=256
#include <stdio.h>

#define WatchDog RCONbits.TO


Programa Principal
void main(void){
ADCON1 = 0X0F;
TRISA=0X01;
lcd_init();
lcd_gotoxy(1,1);
if(!WatchDog)
lcd_putrs("WDT detectado!!!");
else
lcd_putrs(" WDT Normal");
lcd_gotoxy(4,2);
stdout= _H_USER; Circuito del Proyecto
printf("-%08b-",RCON);

Bucle donde espera que se oprima el pulsador y el pin RA0 sea cero.
m:
if(PORTAbits.RA0){
ClrWdt();
}
goto m;
}

El Watch Dog Timer o Perro guardián es un artificio que se utiliza


casi desde el origen de los microprocesadores para evitar que un
error ya sea de soft o de hard deriven en que nuestro micro se
quede "colgado". No es extraño que se den circunstancias de
hardware o software no previstas por el diseñador en las que un
microcontrolador se quede en un estado indeterminado del que le
sea imposible salir sin una ayuda externa.
(Esto claro está no es muy bien visto por el cliente al que le
hemos construido un sistema X).
El WDT lo que hace fundamentalmente es resetear el micro tras un
periodo de tiempo, el WDT es en esencia un contador de tiempo que
luego de transcurrido dicho tiempo se activa. Su funcionamiento es
similar a una interrupción salvo que en el caso del WDT en lugar
de saltar un servicio de interrupción se genera un reset
automático.

1
Imaginemos la siguiente situación.
Tenemos un sistema que en una parte de su proceso debe esperar la
señal proveniente del sensor “X”,ahora bien, el sensor puede
dañarse y la señal nunca llegará quedando nuestro micro en una
espera infinita, a los efectos prácticos, a los ojos de nuestro
cliente, el dispositivo se “colgó”.
Como hemos desarrollado el sistema y desde luego conocemos el
proceso sabemos que ahí hay un punto de posible fallo, entonces
cuando nuestro programa llega a ese punto colocamos una marca,una
bandera que puede por ejemplo ser un número guardado en
determinada posición de la memoria EEPROM ese número puede ser
usado como indicativo del error.
Cuando nuestro micro arranca luego del reset por el WDT lo que
hago es mirar bajo que condiciones estoy arrancando, y si la
bandera del WDT está puesta entonces voy a mirar en la posición de
memoria establecida para ver el número de error, este número puedo
mostrarlo en un LCD o transmitirlo por algún medio o protocolo
establecido, el cliente vería algo como “ERROR 41”(No es lo mismo
que nuestro dispositivo haga algo a que se cuelgue sin mas datos).
Cuando el cliente nos llama indicando el tipo de error ya
tendremos una idea muy clara de donde está el problema pudiendo
incluso colocar en el propio LCD un aviso del tipo “Error sensor X
dañado”.
Esta claro que no podemos poner en el mercado un producto que no
tenga implementado el WDT, esto no evita que nuestro dispositivo
se cuelgue pero si permite recuperar el control de un programa que
se ha salido de curso.
El WDT se puede configurar en rangos que van desde los 4 miliseg.
a 2,18 minutos.
Veamos algunos detalles finos de esta historia.
El microcontrolador tiene un registro llamado RCON, los cinco bits
más bajos del registro indican que ha ocurrido un reset.

El estadode estos bit´s (flags)se puede leer para indicar el tipo


de reset que acaba de ocurrir.
El registro de RCON también tiene bits de control para elegir la
prioridad de la interrupción (IPEN) y del software de control del
BOR (SBOREN)
Cuando el micro inicia son varias las formas que puede hacerlo ya
sea por un arranque normal o por algún tipo de reset todas estas
situaciones quedan registradas en el RCON mediante banderas que
son puestas a cero cuando se activan, es de notar que las banderas
están normalmente en uno.
En este registro RCON<3> el bit TO es el encargado de avisarnos
que se está produciendo un re-arranque por desborde del WDT.
Este bit se pone a 1 con cada reset del contador interno de tiempo

2
o cuando el micro pasa a Sleep(),normalmente debemos borrar el
contador del WDT antes que este se desborde y provoque el reset,
para borrar el contador usamos la función ClrWdt().
C18 tiene varias funciones preestablecidas para verificar las
condiciones de inicio del microcontrolador, nuestro programa no
hace uso de estas funciones y simplemente se ha escrito un simple
código que verifica el estado del bit TO.

En nuestro programa tenemos la línea:


#define WatchDog RCONbits.TO. Donde estamos asociando una
etiqueta WatchDog a un bit específico TO, de un registro
específico RCON, cuando nuestro programa refiera a WatchDog esta
tratando con el bit TO del RCON.
m:
if(PORTAbits.RA0){
ClrWdt();
}
goto m;
}

Si observamos este trozo de código podemos ver que se ha


implementado un goto, el goto en C no es bien visto y se
desaconseja su uso, sin embargo en esta parte del programa podemos
tomarnos la licencia de su uso porque implementar un salto
incondicional de esta forma es interesante, en definitiva es un
bucle infinito que ejecuta ClrWdt() siempre que el botón no esté
apretado.
El pragma de configuración ha cambiado, ahora tenemos:
#pragma config OSC=HS,PWRT=ON,MCLRE=OFF,LVP=OFF,WDT=ON,WDTPS=256

WDT=ON Indica que el WDT esta activo y WDTPS nos dice cuanto
tiempo espera el WDT antes de provocar el reset, los posibles
valores son:
WDTPS = 1 WDTPS = 512
WDTPS = 2 WDTPS = 1024
WDTPS = 4 WDTPS = 2048
WDTPS = 8 WDTPS = 4096
WDTPS = 16 WDTPS = 8192
WDTPS = 32 WDTPS = 16384
WDTPS = 64 WDTPS = 32768

3
WDTPS = 128
WDTPS = 256
Cuando se oprime el pulsador, la línea if(PORTAbits.RA0) es la
encargada ver este cambio ya que evalúa si el pin 2 es “1” para
ejecutar ClrWdt() y solo es “1” si el pulsador no esta apretado (de
acuerdo a la electrónica de nuestro proyecto).
Si se pulsa el botón rápidamente y no se da tiempo el WDT a
disparar no sucede nada sin embargo si se mantiene el botón
pulsado por mas de un segundo el WDT provoca el reset del PIC.
Como comentario al margen puede ver aquí las funciones que se
mencionaron en el trabajo anterior para el manejo del LCD.
lcd_putrs(" WDT Normal");
lcd_gotoxy(4,2);
stdout= _H_USER;
printf("-%08b-",RCON);

El printf tiene asociado el carácter de formato %08b indicando que


el dato RCON lo queremos ver en binario y en 8 bit´s.

Componentes y partes para la aplicación.


• 1 Microcontrolador PIC18F4620.
• 1 Cristal de 20Mhz.
• 2 Condensadores de 18pF o 20pF.
• 1 Pantalla LCD 16x2 Hitachi 44780 o compatible
• 1 Resistencia de 270 Ohms y 10K.
• 1 Condensador de ,01uF y 10uF
• Protoboard.
• Cables de conexión.
• 1 Pulsador normal abierto
• Placa programadora de PIC´s.
• Fuente de alimentación de 5 voltios.

También podría gustarte