Problema con LCD 16x02 por puerto B

Bueno un cordial a los mienbros del foro soy nuevo por aqui y bueno necesito de su ayuda lo que pasa es que estoy tratando de medir la temperatura con el lm35 y displayarla, mi codigo corre y lo simule en proteus logro visualizar la medicion y mando un mensaje como introduccion al inicio del programa tu bien hasta ahi ocurre que lo armo en el proto y no manda nada pense que el LCD estaba mal o que mi quemador estaba mal pero probe con otro programa y si funciona nose que pueda estar pasando si el error esat en mi codigo Help me!! por favor mi codigo esta en asembler y adjunto la simulacion en proteus y el .HEX aqui lo dejo gracias



Código:
; ZONA DE DATOS **********************************************************************

	LIST		P=16F877A
	INCLUDE		<P16F877A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	ORG 	0
pcl		equ	0x02		;Contador de programa (Parte baja)
estado	equ	0x03		;Registro de estados
ptoa	equ	0x05		;Puertos de E/S
ptob	equ	0x06
ptoc	equ	0x07
intcon	equ	0x0B		;Controlador de interrupciones
eedata	equ	0x0C		;Registro de datos de la EEPROM
eeaddr	equ	0x0D		;Registro de direccion de la EEPROM
adres	equ	0x1E		;Resultado de la conversión A/D (HIGH / LOW)
adcon	equ	0x1F		;Configuración del conversor A/D
uni		equ	0x20		;Usados para manejar los datos a mostrar en display
dec		equ	0x21
cen		equ	0x22
tiempo1	equ	0x23		;Usados para temporizar
tiempo2	equ	0x24
letra	equ	0x25		;Usado para apuntar la letra a colocar en el LCD
tempact	equ	0x26		;Temperatura de activación
corract	equ	0x27		;Corriente de activacion
buffer	equ	0x28		;Usado como registro temporal						; El contador a visualizar.
 
	#define	CARRY	estado, 0	;Bit de acarreo
	#define	CERO	estado, 2	;Flag indicador de resultado cero
	#define	R0		estado, 5	;Bit 0 selector de página de memoria
	#define	R1		estado, 6	;Bit 1 selector de página de memoria
	#define	ADGO	adcon, 	2	;Bit que inicia la conversión (1) / Indica finalización (0)
	#define	EEREAD	eedata, 0	;Bit que inicia la lectura de la EEPROM
	#define	EEWRITE	eedata, 1	;Bit que inicia la escritura de la EEPROM - Indica finalización
	#define	EEWREN	eedata, 2	;Bit que habilita la escritura en la EEPROM
	#define	EEAREA	eedata, 7	;Bit que selecciona el área de EEPROM a utilizar (0=AREA DE DATOS)
	#define	MINS	ptoa, 1		;Sube el punto mínimo
	#define	MINB	ptoa, 2		;Baja el punto mínimo
	#define	MAXS	ptoa, 3		;Sube el punto máximo
	#define	MAXB	ptoa, 4		;Baja el punto máximo
	#define	BUZZER	ptoc, 3		;Salida al aviso acústico
	#define	RELE	ptoc, 4		;Relé que maneja la carga (calefactor / enfriador)
	#define	LCDE	ptoc, 6		;Habilitación del LCD
	#define	LCDRS	ptoc, 7		;Selección de modo del LCD  
	
; ZONA DE CÓDIGOS ********************************************************************


Inicio
	bsf		R0						; Acceso al Banco 1.
	bcf		R1
	movlw	b'00011111'				;Configura puerto A
	movwf	ptoa							
	clrf	ptob					;Puerto B completo como salidas (bus del LCD)
	clrf	ptoc		;Puerto B completo como salidas
	movlw	b'10001110'	;Configura el coversor A/D ADCS1=1 AADCS0=0 => Fosc=/32
						;CHS2=0 CHS1=0 CHS0=1 Canal AN1 por donde entrara la señal
	movwf	adcon		;AN0 como única entrada análoga(ojo)
	bsf	R1				;Acceso al banco 3
	bcf	EEAREA			;Selecciona el banco de EEPROM de datos
	bcf	R1				;Acceso al banco 0
	bcf	R0
	movlw	b'01000001'	;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
	movwf	adcon
	clrf	ptoa		;Apaga todo
	clrf	ptob
	clrf	ptoc
	call 	LCD
	call	LECTURA		;llama a la lectura de la eeprom
	call	CICLO
LECTURA bsf	 R1		;Acceso al banco 2
	clrf eeaddr		;Direcciona la primera posición de la EEPROM
	bsf	 R0		;Pasa a la página 3 de memoria
	bsf	 EEREAD		;Inicia la lectura de la EEPROM
	bcf	 R0		;Acceso al banco 2
	movf	eedata, 0	;Dato Leído de la EEPROM -> W (eedata,0 mueve el valor de eedata en w (0 indica en w))
	movwf	tempact		;Guarda el dato leído de la EEPROM en tempact (punto de activación del relé x temperatura)
	incf	eeaddr		;Direcciona a la segunda posición de la EEPROM
	bsf	R0		;Pasa a la página 3 de memoria
	bsf	EEREAD		;Inicia la lectura de la EEPROM
	bcf	R0		;Vuelve a la página 3 de memoria
	movf	eedata, 0	;Dato Leído de la EEPROM -> W
	movwf	corract		;Guarda el dato leído de la EEPROM en corract (punto de desactivación del relé x corriente)
	bcf	R1		;Acceso banco 0
	return
LCD
	movlw	b'00111000'	;Comunicación con el LCD a ocho bits - Dos líneas de texto
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00000110'	;Mensaje estático, se desplaza el cursor hacia la derecha
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00001100'	;Enciende el display - Oculta el cursor - Caracter fijo
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00000001'	;Limpia la pantalla y pone cursor en posición inicial
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	clrf	letra		;Coloca el título en el LCD
	call	OTRA
	call	OTRA2
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	call	Retardo_500ms
	movlw	b'00000001'	;Limpia la pantalla y pone cursor en posición inicial
	call	CONTROL
	return
OTRA	movf	letra, 0	;Letra actual -> W
	call	LINEA1		;Obtiene el caracter a colocar desde la tabla
	call	DATO		;Envía el caracter al LCD
	incf	letra, 1
	movf	letra, 0	;Comprueba si ya envió los 16 caracteres del título
	sublw	d'16'
	btfss	CERO
	goto	OTRA		;Si no llego a la letra 16 sigue enviando
	movlw	0xC0		;Posiciona el cursor en la 2da. linea
	call	CONTROL
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	clrf	letra		;Coloca el título en el LCD
	return
OTRA2	movf	letra, 0	;Letra actual -> W
	call	LINEA2		;Obtiene el caracter a colocar desde la tabla
	call	DATO		;Envía el caracter al LCD
	incf	letra, 1
	movf	letra, 0	;Comprueba si ya envió los 16 caracteres del título
	sublw	d'16'
	btfss	CERO
	goto	OTRA2		;Si no llego a la letra 16 sigue enviando
	
    return
CICLO	bsf	ADGO		;Inicia la conversión A/D
	btfsc	ADGO		;Espera que termine de convertir
	goto	$ -1
	
	bsf		R0			;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
	movf	adres, 0	;Resultado de conversión -> W
	bcf		R0			;Pasa a página 1

	movwf	buffer		;Guarda el dato obtenido de ADRESL en el buffer temporal
	bcf		CARRY		;Limpia el CARRY
	btfsc	adres, 0	;Mira el bit menos significativo de ADRESH (Bit 8)
	bsf		CARRY		;Si está en 1 pone en uno el carry
	rrf		buffer, 1	;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL


	movf	buffer, 0	;Dato digitalizado -> W
	call	DECIMAL		;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
	
	movlw	0x8D		;Coloca el cursor en la posición 0Dh de la pantalla.
	call	CONTROL

	movf	cen, 0		;Coloca en el LCD las centenas
	call	DATO
	movf	dec, 0		;Coloca las decenas
	call	DATO
	movf	uni, 0		;Coloca las unidades
	call	DATO

	goto	CICLO		;Vuelve a medir y mostrar

LINEA1	addwf	pcl, 1		;Suma el contenido de W al contador de programa (para explorar la tabla)
	retlw	"R"
	retlw	"E"
	retlw	"L"
	retlw	"E"
	retlw	" "
	retlw	"E"
	retlw	"L"
	retlw	"E"
	retlw	"C"
	retlw	"T"
	retlw	"R"
	retlw	"O"
	retlw	"N"
	retlw	"I"
	retlw	"C"
	retlw	"O"

LINEA2	addwf	pcl, 1		;Suma el contenido de W al contador de programa (para explorar la tabla)
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	"U"	
	retlw	"C"
	retlw	"S"
	retlw	"M"
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "

CONTROL	bcf	LCDRS		;Pone en bajo la línea de modo del LCD (Control)
	goto	ENVIAR		;Se saltea la sig. línea
DATO	bsf	LCDRS		;Pone en alto la línea de modo del LCD (Dato)
ENVIAR	movwf	ptob		;Coloca el dato o control a enviar en el bus del LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	bsf	LCDE		;Habilita el LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	bcf	LCDE		;Deshabilita el LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	return

DECIMAL	movwf	uni		;Convierte el dato presente en W en UNI, DEC y CEN
	clrf	dec
	clrf	cen
	movlw	d'100'		;Determina la cant. de centenas
CENTENA	subwf	uni, 1
	btfss	CARRY
	goto	CIEN
	incf	cen, 1
	goto	CENTENA
CIEN	addwf	uni, 1
	movlw	d'10'		;Determina la cant. de decenas
DECENA	subwf	uni, 1
	btfss	CARRY
	goto	DIEZ
	incf	dec, 1
	goto	DECENA
DIEZ	addwf	uni, 1		;Uni queda con la cant. de unidades (sin decenas ni centenas)

	movlw	0x30		;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
	addwf	uni, 1
	addwf	dec, 1
	addwf	cen, 1
	return
	
DEMORA	movwf	tiempo2		;Demora tantos milisegundos como valor en w
TOP2	movlw	d'110'
	movwf	tiempo1
TOP1	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	tiempo1, 1
	goto	TOP1
	decfsz	tiempo2, 1
	goto	TOP2
	return

CBLOCK
	R_ContA						; Contadores para los retardos.
	R_ContB
	ENDC
Retardo_500ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'500'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardos_ms
	movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop							; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno 		; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 		; Aporta (M-1)x2 ciclos máquina.
	return
		
	;org	0x2100		;Guarda los parámetros por default en la EEPROM
	;data	0x28		;Punto de activación: 40 grados
	;data	0x32		;Punto de desactivación: 50 grados

	end



Bueno amigos buscando y buscando e intentando encontre la falla es la cabecera de los fusibles que estaba usando para este modelo de PIC debia de ser
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF

estaba usando la cabecera mal debido a que me guiaba en el libro del pic16f84 de Enrique Palacios buenoa terminar mi rele electronico y cuando lo termine lo subire para que lo puedan mejorar saludos!!!
 

Adjuntos

  • releelectronico.rar
    18.4 KB · Visitas: 7
Última edición:
Como estás usando la pantalla por el puerto B, debes incluir el fuse LVP y establecerlo en OFF.
De esta forma por ejemplo:
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

Eso es porque en el puerto B se encuentra el pin de programación por bajo voltaje (RB3/PGM),
y si no lo declaras en la palabra de configuración, el compilador lo dejará en ON por default.

Saludos.
 
Como estás usando la pantalla por el puerto B, debes incluir el fuse LVP y establecerlo en OFF.
De esta forma por ejemplo:
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

Eso es porque en el puerto B se encuentra el pin de programación por bajo voltaje (RB3/PGM),
y si no lo declaras en la palabra de configuración, el compilador lo dejará en ON por default.

Saludos.
gracias D@rkbytes por responder ya lo solucione (y) y con esta explicacion mejor aun!!!!
 
Atrás
Arriba