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
Gracias por la ayuda
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú;**********************************************************************************************
;**********************************************************************************************
; *
; 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
;************************************************************************************************************************
;
; 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
;***** CONFIGURACIÓN ******************************************************
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;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
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x20
AUX equ 0x21
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000010' ;movemos el valor de la opción del preescale al registro W EN ESTE CASO A 8
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale al registro W
movwf INTCON
; Fin de la inicialización del programa.
;______________________________ACTIVACIÓN INICIAL DE LA SALIDA_________________________________________________________
ESPERAR BTFSS PORTA,0 ;PRIMERA VEZ QUE SE VA A VER SI ESTA ACTIVADO EL INTERUPTOR
GOTO ESPERAR
MOVLW b'0000001' ;SE ACTIVA LA SALIDALA PRIMERA VEZ QUE SE PONE EL INTERRUPTOR
MOVWF PORTB
MOVLW 0X01 ;INICIALIZO EL REGISTRO AUX PARA INDICAR QUE SE HA ACTIVADO EL INTERRUPTOR
MOVWF AUX
;__________________________________________________________________________________________________________
empezar
MOVLW .2 ;INICIALIZAR CONTADOR A 250 PARA SIMULAR PONER EL CONTADOR A 2
MOVWF CONTADOR
esperar2
CALL COMP_ENTRADA ;COMPRUEBA EL ESTADO DE LA ENTRADA
BTFSS AUX,0 ;SI EL RESULTADO DE LA LLAMADA HA DADO 0 NO SE SALTA UNA INSTRUCCIÓN POR TANTO TIENE QUE REINICIARSE EL PROGRAMA
GOTO ESPERAR
MOVLW d'252' ;INICIALIZAR TMR0 A 5 PARA QUE CUENTE HASTA 250 YA QUE DESBORDA A 256 para simular x ejemplo poner 252
MOVWF TMR0 ;CARGA EL VALOR DE 5 EN TMR0
CLRF INTCON ;POR SI MIENTRAS SE ESPERABA A QUE SE ACTIVARA EL INTERRUPTOR SE HA DESBORDADO
esperardes BTFSS INTCON,T0IF ;VERIFICAMOS CUANDO LLEGA A 256 MEDIANTE EL BIT 2 DEL REGISTRO INTCON CUANDO LLEGA SE DESBORADA DANDO UN 1
GOTO esperardes ;SI NO ES 1 HAY QUE ESPERAR
CLRF INTCON ;SE HA ALCANZADO DESBORDAMIENTO HAN PASADO 2000us SE BORRA EL DESBORDAMIENTO
DECFSZ CONTADOR,1 ;COMPROBAR QUE EL CONTADOR HA LLEGADO A 0 CUANDO OCURRE SALTA UNA INSTRUCCION
GOTO esperar2
GOTO activarsal ;EL CONTADOR ESTA A 0 , YA HAN PASADO 0,5 SEGUNDOS
activarsal
MOVLW b'0000001'
XORWF PORTB,F ;INVIERTE EL VALOR DE LA SALIDA
GOTO empezar
;_______________________SUBRUTINAS________________________________________________
COMP_ENTRADA NOP
esperar3 BTFSS PORTA,0
GOTO SALIDA0
RETURN
SALIDA0 CLRF PORTB
CLRF AUX ;AL APAGAR EL INTERUPTOR EN MITAD DEL PROCESO ENTRA AQUI Y SEÑALO CON UN 0 QUE SE HA APAGADO EN INTERRUPTOR ES COMO EN C PONER EL RESULTADO DE UNA FUNCIÓN
GOTO esperar3
end
;**************************************************************************
;***** CONFIGURACIÓN ******************************************************
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;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
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x20
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000010' ;movemos el valor de la opción del preescale al registro W EN ESTE CASO A 8
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale al registro W
movwf INTCON
; Fin de la inicialización del programa.
empezar MOVLW .250 ;INICIALIZAR CONTADOR
MOVWF CONTADOR
esperar BTFSS PORTA,0 ;comprobamos si en interuptor esta en ON
GOTO esperar
MOVLW d'5' ;INICIALIZAR TMR0 A 5 PARA QUE CUENTE HASTA 250 YA QUE DESBORDA A 256 para simular x ejemplo poner 252
MOVWF TMR0 ;CARGA EL VALOR DE 5 EN TMR0
CLRF INTCON ;POR SI MIENTRAS SE ESPERABA A QUE SE ACTIVARA EL INTERRUPTOR SE HA DESBORDADO
esperardes BTFSS INTCON,T0IF ;VERIFICAMOS CUANDO LLEGA A 256 MEDIANTE EL BIT 2 DEL REGISTRO INTCON
GOTO esperardes ;SI NO ES UNO HAY QUE ESPERAR
CLRF INTCON ;SE HA ALCANZADO DESBORDAMIENTO HAN PASADO 2000us SE BORRA EL DESBORDAMIENTO
DECFSZ CONTADOR,1 ;COMPROBAR QUE EL CONTADOR HA LLEGADO A 0 CUANDO OCURRE SALTA UNA INSTRUCCION
GOTO esperar
GOTO empezar ;EL CONTADOR ESTA A 0 , YA HAN PASADO 0,5 SEGUNDOS
end
;***** CONFIGURACIÓN ******************************************************
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;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
; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x10
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000110' ;movemos el valor de la opción del preescale al registro W
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale al registro W
movwf INTCON ;