En aquest exemple veurem com funciona el temporitzador de vigilància (watchdog). El programa que farem servir és el següent:
PROCESSOR 16F690 #include <xc.inc> config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Visualit EQU 0x20 ; Una variable on guardem el que mostraran els LED
Bloqueig EQU 0x21 ; Variable que farà el bloqueig del programa
; Si val 1 es bloqueja
Retard1 EQU 0x22 ; Definim dues variables de comptatge
Retard2 EQU 0x23
PSECT code, class=CODE, delta=2, abs
main:
bsf RP0 ; Tria el banc 1
movlw 0xFF ; Posa l'acumulador a FFh (tot uns)
movwf TRISA ; Posa tots els bits del port A com a entrada
clrf TRISC ; Posa tots els bits del port C com a sortida
movlw 10000000B ; El prescalat és per al timer 0
; I resistències de pull-up desactivades (valor per defecte)
movwf OPTION_REG
movlw 10010111B ; Activa el watchdog a 1/65536
movwf WDTCON
bcf RP0 ; Tria el banc 0
clrwdt ; Posem el watchdog a zero
clrf Bloqueig
movlw 00001000B ; Activa el bit 3 al registre W
movwf Visualit ; Copia el valor de W a la variable Visualit
call RetM ; Fa un retard per evitar una mala lectura del polsador
Bucle:
clrwdt ; Posem el watchdog a zero
movf Visualit,w ; Copia la variable Visualit sobre el registre W
movwf PORTC ; Copia el valor de W al port C
call RetM ; Fa un retard per evitar rebots
bcf CARRY ; posa a zero el bit d'arrossegament
rrf Visualit,f ; Fa rodar els bits cap a la dreta
; el bit d'arrossegament entra per l'esquerra
; i el bit de la dreta passa a l'arrossegament
btfsc CARRY ; Comprova si s'ha activat l'arrossegament
; Si no s'ha activat, salta una instrucció
bsf Visualit,2 ; Si s'ha activat, activa el bit 2
btfss PORTA,3 ; Mira si s'ha premut el polsador
incf Bloqueig,f ; Si s'ha premut incrementa i, per tant, força el bloqueig
movf Bloqueig,f ; Copiem sobre ella mateixa per veure si és zero
btfss ZERO ; És zero?
goto $ ; Si no ho és, bloqueja
goto Bucle ; Repetim
; ; Funció de retard de 0,2 s ; RetM: decfsz Retard1,f goto RetM decfsz Retard2,f goto RetM return END main
Abans d'entrar en detalls, comentem què fa el programa. En el moment de posar en marxa, el programa encén el LED de més a l'esquerra (RC3) i comença una rotació de LED però cada cop que es desactiva el LED de la dreta (RC0) s'activa el segon LED (RC2). Això vol dir que el LED de l'esquerra (RC3) només s'activa en el moment de posar en marxa. Si proveu el programa tal com està, veureu que és així.
El programa té, a més, activat el temporitzador de vigilància. No l'hem activat a la configuració sinó al registre WDTCON. En aquest mateix registre hem configurat el prescalat específic a 1/65536. En el registre OPTION_REG hem desactivat el bit PSA, per tant no fem servir l'altre prescalador. En aquestes condicions, el temps establert al temporitzador de vigilància és de 2,11 s.
Si proveu d'enviar el programa sense la línia marcada en groc (o posant-li un punt i coma al davant) observareu que el programa fa inicialment el que s'espera però cada aproximadament dos segons es reinicia i això es veu clarament perquè el LED de l'esquerra (RC3) només s'activa a l'iniciar. Si habilitem la línia marcada en color, el temporitzador s'anirà actualitzant i no s'arribarà a reiniciar el microcontrolador.
El programa que hem creat té, però una trampa. Hi ha una variable anomenada Bloqueig que s'activa quan es prem el polsador (RA3). Quan la variable Bloqueig està activa el programa entra en un bucle del que no en pot sortir, és a dir queda bloquejat. Si ara enviem el programa complet (inclosa la línia que està en groc) veurem que quan es prem el polsador s'atura la rotació de LED però passats uns dos segons el temporitzador de vigilància provoca el reinici del programa.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.