Programació en mpasm 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:

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Retard1				; Definim dues variables de comptatge
Retard2
Visualit			; I una variable on guardem el que mostraran els LED
Bloqueig			; Variable que farà el bloqueig del programa
				; Si no val 0 es bloqueja
	endc
	org 0
Inici
	bsf	STATUS,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	b'10000000'	; El prescalat és per al timer 0
				; I resistències de pull-up desactivades (valor per defecte)
	movwf	OPTION_REG
	movlw	b'10010111'	; Activa el watchdog a 1/65536 
	movwf	WDTCON
	bcf	STATUS,RP0	; Tria el banc 0
	clrwdt			; Posem el watchdog a zero
	clrf	Bloqueig
	movlw	b'00001000'	; 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	STATUS,C	; 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	STATUS,C	; 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	STATUS,Z	; É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

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.

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.