Duda sobre programa PIC

Iniciado por Fox_Neo, 17 Abril 2013, 10:24 AM

0 Miembros y 1 Visitante están viendo este tema.

Fox_Neo

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:
Código (asm) [Seleccionar]
;**********************************************************************************************
;**********************************************************************************************
; *
; 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 (asm) [Seleccionar]
;************************************************************************************************************************
;
; 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.



Tokes

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.

Fox_Neo

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