Código
;********************************************************************************************** ;********************************************************************************************** ; * ; 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
MSE_Delay.inc Este es el subprograma de Delay
Código
;************************************************************************************************************************ ; ; Autor: Mikel Etxebarria ; (c) Ingeniería de Microsistemas Programados S.L. ; ; ; ;Macro y rutina de temporización que se ajustan en función de la frecuencia de trabajo Fosc. En el programa principal ;se debe definir: ;a) La frecuencia de trabajo (en hz) mediante ... "#define Fosc xxxxxxxx" ;b) Inicio de las variables de temporización " MSE_Delay_V equ 0xXX " ; ;El usuario llama a la macro desde su programa principal mediante ... "Delay xxxx Milis" ; ;Se obtiene una precisión razonable con valores de temporización desde 1 hasta 2000 mS y a frecuencias Fosc ;que van desde 1MHz hasta 48MHz #define Milis * D'1000000' CBLOCK MSE_Delay_V ;Inicio de las variables. Será la primera MSE_Delay_1 ;direccón libre disponible MSE_Delay_2 MSE_Delay_3 ENDC Delay macro tiempo_ns ;tiempo_ns expresa en ns el tiempo de temporización deseado ifndef Fosc ;En el programa principal se ha definir la frecuencia de trabajo en Hz messg "ERROR !! - Establecer la frecuencia de trabajo (p.e. #define Fosc 4000000)" exitm endif radix dec ;Operaciones en base decimal variable ciclo_instruc_ns = (( 1000000000 ) / (Fosc / 4 )) ;Calcula ciclo de instrucción en función de la frecuencia Fosc variable ciclos = (tiempo_ns / ciclo_instruc_ns) ;Calcula el nº de ciclos necesarios para la temporización deseada movlw upper (ciclos/4)+1 movwf MSE_Delay_1 movlw high (ciclos/4)+1 movwf MSE_Delay_2 movlw low (ciclos/4) movwf MSE_Delay_3 ;Carga las variables de temporización con el nº de ciclos calculado call MSE_Delay endm MSE_Delay clrwdt ;Bucles de temporización decfsz MSE_Delay_3,f goto MSE_Delay decfsz MSE_Delay_2,f goto MSE_Delay decfsz MSE_Delay_1,f goto MSE_Delay return
Pues la duda que tengo es que lo ejecuto hace perfectamente la configuración de los puertos y el delay pero luego entra en el bluce Loop y sale que se desborda el Watchdog, y se ve en el registro Status que el bit 4 ha pasado a 0,hasta hay bien, pero vuelvo a ponerlo en marcha y no vuelve al principio del programa por lo tanto la parte de "Flash de 0.1 seg. sobre RB0. Reajustar el prescaler del WDT según las entradas RA3:RA0" no se ejecuta nunca porque no sale del bucle loop.
El profesor nos ha dicho que no hay que modificar ni cambiar nada del programa que nos ha dado.
La simulación la he hecho con el MPLAB Sim y el oscilador a 4MHz.
Gracias por la ayuda.