Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple WD - Temporitzador de vigilància (watchdog)

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.

 

 

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