;**********************************************************************************************
;**********************************************************************************************
; *
; Filename: _________.asm *
; Date: ___________ *
; File Version: vs0.0 *
; *
; Author: Mikel Etxebarria *
; Company: Ingeniería de Microsistemas Programados S.L. *
; Grade program: GIEA *
; Subject: *
; *
;**********************************************************************************************
; *
; Files Required: P16F886A.INC *
; *
;**********************************************************************************************
; *
; Descrpción: *
;El Watch Dog Timer (WDT)
;
;
;El WDT se alimenta a partir de un oscilador interno e independiente de 31KHz (periodo de 32uS). Dispone de un
;prescaler de 8 bits controlado mediante el OPTION_REG y, otro de 16 bits, que se controla mediante WDTCON. El tiempo
;total para debordar es de 32uS * OPTION_REG * WDTCON. En el presente ejemplo el prescaler de OPTION_REG es de 128.
;De esta forma el intervalo de desbordamiento es de 32uS * 128 * WDTCON. Por su parte WDTCON se carga con el valor
;binario procedente de las entradas RA3:RA0. De esta forma se obtienen desbordamientos a intervalos variables según
;la siguiente tabla:
;RA3:RA0 WDTCON TIEMPO RA3:RA0 WDTCON TIEMPO
;------- ------ ------ ------- ------ ------
;0000 32 0.13 s 0110 2048 8.45 s
;0001 64 0.26 s 0111 4096 16.91 s
;0010 128 0.52 s 1000 8192 33.82 s
;0011 256 1.05 s 1001 16384 67.65 s
;0100 512 2.11 s 1010 32768 135.30 s
;0101 1024 4.22 s 1011 65536 270.60 s
;*********************************************************************************************
;***** CONFIGURACIÓN *************************************************************************
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
#define Fosc 4000000 ;Velocidad de trabajo
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
MSE_Delay_V equ 0x70 ;Variables (3) empleadas por las macros de temporización
org 0x00 ;Vector de RESET
goto Inicio
org 0x05
include "MSE_Delay.inc" ;Incluir rutinas de temporización
;Rutina habitual de inicialización de los registros internos empleados en el ejemplo
Inicio_Reg clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0
bsf STATUS,RP1 ;Selecciona banco 3
clrf ANSEL ;Puerta A digital
clrf ANSELH ;Puerta B digital
bcf STATUS,RP0 ;Selecciona banco 2
bsf WDTCON,SWDTEN ;Activa por software el WDT
bsf STATUS,RP0
bcf STATUS,RP1 ;Selecciona banco 1
movlw b'11111111'
movwf TRISA ;RA3-RA0 entradas
movlw b'11110110'
movwf TRISB ;RB3 y RB0 salidas
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para el WDT
bcf STATUS,RP0 ;Selecciona banco 0
return ;Fin de la rutina de inicialización
;Determinar el origen del RESET
Inicio btfss STATUS,NOT_TO ;RESET provocado por el WDT ??
goto WDT_RESET ;Si, se realiza el tratamiento oportuno
;RESET provocado por MCLR o conexión de alimentación (Power On Reset).
RESET_POR call Inicio_Reg ;Inicialización habitual de registros
;Flash de 0.2 seg. sobre RB3
bsf PORTB,3 ;Activa RB3
Delay 200 Milis ;Temporiza 0.2 seg.
bcf PORTB,3 ;Desactiva RB3
goto Loop
;RESET provocado por desbordamiento del WDT. Iniciación habitual
WDT_RESET call Inicio_Reg ;Inicialización habitual de registros
;Flash de 0.1 seg. sobre RB0. Reajustar el prescaler del WDT según las entradas RA3:RA0
bsf PORTB,0 ;Activa RB0
Delay 100 Milis ;Temporiza 0.1 seg
bcf PORTB,0 ;Desactiva RB0
rlf PORTA,W ;Lee las entradas RA3:RA0
andlw b'00011110'
iorlw b'00000001'
bsf STATUS,RP1 ;Selecciona banco 2
movwf WDTCON ;Actualiza el prescaler del WDT con el nuevo valor según las entradas
bcf STATUS,RP1 ;Selecciona banco 0
;Este es el cuerpo del programa principal. Es un bucle cerrado en el que el WDT NO se refresca por lo que
;tarde o temprano desbordará y provocará un RESET
Loop nop
goto Loop
end ;Fin del programa fuente