Hola gracias por leer mi duda, tengo un programa que nos ha dado el profesor y tenemos que explicar como funcionan los distintos reset Hay algo que no entiendo:
;**********************************************************************************************
;**********************************************************************************************
; *
; 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
;************************************************************************************************************************
;
; 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.
Hola, compañero:
¿Qué te parece si le agregas a tu programa en la parte inicial un CBLOCK para delimitar la zona utilizable para las variables?
Algo así:
CBLOCK 20H
ENDC
Esto lo harías, por ejemplo, después de las líneas de _config (antes de la declaración equ).
Espero haberte ayudado. Saludos.
Gracias por responder ya lo he solucionado, era que en el MPLAB tenia que configurar el watchdog en modo reset esa parte nos la dijo luego el profesor :¬¬
Gracias por la ayuda