TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: danilog79 en 21 de Agosto de 2013, 01:36:51
-
Hola compañeros, espero me puedan ayudar con la siguiente consulta; tengo un programa en asm básico solo para probar las salidas de un 16f877, solo tiene un led conectado en cada salida
En proteus funciona bien, a través del debug del mplab (8.83) también funciona bien pero cuando tiene que funcionar "solo" no lo hace.
El cristal es de 4Mhz y los condensadores asociados de 22p.
Muchas gracias u abrazo
A continuación el código;
CONTADOR_A EQU 0X20 ; DEFINE DIRECCIÿÓN DE MEMORIA RAM
CONTADOR_B EQU 0X21 ; DONDE SE UBICAN LOS REGISTROS DEL
CONTADOR_C EQU 0X22 ; CONTADOR PARA EL RETARDO
CONTADOR_D EQU 0X23
list p=16F877
include "p16f877.inc"
__CONFIG b'11111110110001'
CONF_ADCON1 equ b'00000110' ; Configuracion PORTA E/S digital
org 0x000 ; Origen del codigo
nop ; No operacion
nop ; No operacion
;=========================================
;-----CONFIGURACION DE PUERTOS------------
bsf STATUS,RP0 ; Ir banco 1
bcf STATUS,RP1 ; Ir banco 1
movlw CONF_ADCON1 ; Configurar el PORTA como digital
movwf ADCON1 ; Configurar el PORTA como digital
clrf TRISA ; PORTA como salida
clrf TRISB ; PORTB como salida
clrf TRISC ; PORTC como salida
clrf TRISD ; PORTD como salida
CLRF TRISE ; PORTR como salida
bcf STATUS,RP0 ; Ir banco 0
bcf STATUS,RP1
;-----FIN DE CONFIGURACION DE PUERTOS------
;==========================================
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;-----INICIO DE PROGRAMA PRINCIPAL------------
clrf PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
START
MOVLW B'11111111'
MOVWF PORTA
MOVLW B'11111111'
MOVWF PORTB
MOVLW B'11111111'
MOVWF PORTC
MOVLW B'11111111'
MOVWF PORTD
MOVLW B'11111111'
MOVWF PORTE
CALL RET01
clrf PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
CALL RET01
GOTO START
;-----FIN DE PROGRAMA PRINCIPAL---------------
;/////////////////////////////////////////////
;=============================================================
;----------RUTINAS DE RETARDO---------------------------------
RET01;PIC Time Delay = 0.25000200 s with Osc = 4000000 Hz
movlw D'2'
movwf CONTADOR_B
movlw D'69'
movwf CONTADOR_C
movlw D'169'
movwf CONTADOR_D
loop decfsz CONTADOR_D,1
goto loop
decfsz CONTADOR_C,1
goto loop
decfsz CONTADOR_B,1
goto loop
RETURN
;-----------FIN RUTINAS DE RETARDO----------------------------
;=============================================================
;===============================================================================================;
; ORG 0x2007 ; DIR. DE MEM. ROM DE LA PALABRA DE CONFIGURACION
; DATA H'3FB1' ; VALOR PARA LA PALABRA DE CONFIGURACION
;===============================================================================================;
END ; Fin del programa
-
Lo primero que noto, antes de irme a dormir, es que tiene el bit LVP activado (bit 7 de la palabra de configuracion), cuando este bit este activado debe asegurarse de poner una resistencia a tierra en el pin RB3.
Otra cosa es que se asegure que el pin de reset este bien conectado.
Saludos
-
Cuando un programa funciona en debug, y no lo hace sin debug, suele ser porque están mal definidos los fuses, normalmente el relacionado con el modo de funcionamiento del oscilador.
Yo hace "mil años" que no uso el ensamblador, un lenguaje inhumano y de muy díficil lectura, que no recomendaría ni al peor de mis enemigos, pero es que tú aún lo haces más ilegible, al definir los fuses en binario, cuando podrías usar las definiciones que tienes en el .INC, y poner algo del estilo:
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
(Ojo, que no digo que esta sea la traducción de tu binario, es solo un ejemplo para hacer el código más legible)
En el p16f877.inc tienes todas las deficiones para los fuses
;==========================================================================
;
; Configuration Bits
;
;==========================================================================
_CP_ALL EQU H'0FCF'
_CP_HALF EQU H'1FDF'
_CP_UPPER_256 EQU H'2FEF'
_CP_OFF EQU H'3FFF'
_DEBUG_ON EQU H'37FF'
_DEBUG_OFF EQU H'3FFF'
_WRT_ENABLE_ON EQU H'3FFF'
_WRT_ENABLE_OFF EQU H'3DFF'
_CPD_ON EQU H'3EFF'
_CPD_OFF EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
-
Estimados compañeros, muchas gracias por las respuestas.
Finalmente fue solucionado siguiendo el primer consejo de Sander, cambiando el valor del config a 3F31.
Saludos