TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Sacahe en 05 de Abril de 2010, 01:23:21
-
Amigos necesito de su colaboracion. Estoy realizando un ejercicio con un LCD y un Pic16f877a y no se me desplega en el LCD nada de nada. Ya que lo estoy simulando en Proteus. Les comento que estoy utilizando el PuertoD del pic que va conectado al bus del LCD, los pines REO y RE1 como salidas de control de E y RS respectivamente. He tratado de diversas formas y no me funciona. Les dejo el Programa en ASM para que porfa me ayuden, ya he gastado mucho tiempo buscando el problema.
INCLUDE "P16F877A.INC"
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_ON & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
REG0 EQU H'22'
CONTA EQU H'23'
RESET ORG H'00'
GOTO INICIO
ORG H'05'
;****************************
TABLA_1 ADDWF PCL,1
RETLW " "
RETLW "S"
RETLW "A"
RETLW "M"
RETLW "U"
RETLW "E"
RETLW "L"
RETLW " "
RETLW "D"
RETLW "A"
RETLW "V"
RETLW "I"
RETLW "D"
;***********************************************************************
PANTALLAZO1 CLRF CONTA
OTRA MOVF CONTA,0
CALL TABLA_1
CALL DATO
CALL RET_LCD
INCF CONTA,1 ;SIGUE CON LA TABLA_1
MOVLW D'13'
XORWF CONTA,0
BTFSS STATUS,2 ;TERMINO MENSAJE?
GOTO OTRA ;NO
RETURN ;SI
;***********************************************************************
COMANDO MOVWF PORTD ;COLOCA EL COMANDO EN EL BUS DE 8BITS
BCF PORTE,1 ;RS=0 --> ES UN COMANDO
GOTO HABILITADOR
DATO MOVWF PORTD ;COLOCA EL CARACTER DEL MENSAJE EN EL BUS DE 8BITS
BSF PORTE,1 ;RS=1 --> ES DATO DEL MENSAJE
HABILITADOR BSF PORTE,0 ;E=1 ---> LCD HABILITADO
CALL RET_LCD
BCF PORTE,0 ;E=0 ---> LCD DESABILITADO
RETURN
;***********************************************************************
INI_LCD MOVLW B'00000001' ;LIMPIAR PANTALLA LCD Y REGRESA CURSOR AL INICIO
CALL COMANDO ;
RETURN
;***********************************************************************
RET_LCD MOVLW H'FF' ;RETARDO DEL LCD
MOVWF REG0 ;
LOOP DECFSZ REG0,1 ;
GOTO LOOP ;
RETURN
;***********************************************************************
INICIO CLRF PORTD
CLRF PORTE
BANKSEL TRISD ;SELECCIONAMOS BANCO 1
CLRF TRISD ;CONFIGURAMOS PUERTOD COMO SALIDA
CLRF TRISE ;CONFIGURAMOS PUERTOE COMO SALIDA
BANKSEL PORTD ;;SELECCIONAMOS BANCO O
;**************** CONFIGURACION DE TRABAJO DEL LCD *******************
LCD_CONFIG MOVLW B'00111000' ;INTERFACE 8 BITS, 4 LINEAS
CALL COMANDO
MOVLW B'00000110' ;INCREMENTA CURSOR, MENSAJE FIJO
CALL COMANDO
MOVLW B'00001101' ;DISPLAY ON, CURSOR ON Y PARPADEO CURSOR ON
CALL COMANDO
;***********************************************************************
CALL INI_LCD
CALL PANTALLAZO1
ACA NOP
GOTO ACA
;*******************************
END
-
Falta la inicialización del LCD, debes enviar el comando 0x30, esperar 5ms y repetir esto 3 veces, luego de eso fijar sistema y bus de datos a 8 bits.
Saludos!
-
SUKI gracias por tu ayuda pero no me funciona. hice tal como me dijistes y nada:
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_ON & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
REG0 EQU H'22'
REG1 EQU H'24'
CONTA EQU H'23'
RESET ORG H'00'
GOTO INICIO
ORG H'05'
;****************************
TABLA_1 ADDWF PCL,1
RETLW " "
RETLW "S"
RETLW "A"
RETLW "M"
RETLW "U"
RETLW "E"
RETLW "L"
RETLW " "
RETLW "D"
RETLW "A"
RETLW "V"
RETLW "I"
RETLW "D"
;***********************************************************************
PANTALLAZO1 CLRF CONTA
OTRA MOVF CONTA,0
CALL TABLA_1
CALL DATO
CALL RET_LCD
INCF CONTA,1 ;SIGUE CON LA TABLA_1
MOVLW D'13'
XORWF CONTA,0
BTFSS STATUS,2 ;TERMINO MENSAJE?
GOTO OTRA ;NO
RETURN ;SI
;***********************************************************************
COMANDO MOVWF PORTD ;COLOCA EL COMANDO EN EL BUS DE 8BITS
BCF PORTE,1 ;RS=0 --> ES UN COMANDO
GOTO HABILITADOR
DATO MOVWF PORTD ;COLOCA EL CARACTER DEL MENSAJE EN EL BUS DE 8BITS
BSF PORTE,1 ;RS=1 --> ES DATO DEL MENSAJE
HABILITADOR BSF PORTE,0 ;E=1 ---> LCD HABILITADO
CALL RET_LCD
BCF PORTE,0 ;E=0 ---> LCD DESABILITADO
RETURN
;***********************************************************************
INI_LCD MOVLW B'00000001' ;LIMPIAR PANTALLA LCD Y REGRESA CURSOR AL INICIO
CALL COMANDO ;
RETURN
;***********************************************************************
RET_LCD MOVLW H'FF' ;RETARDO DEL LCD
MOVWF REG0 ;
LOOP DECFSZ REG0,1 ;
GOTO LOOP ;
RETURN
;***********************************************************************
RETARDO MOVLW .5 ;El REG0 contiene el numero
MOVWF REG0 ; de milisegundos del retardo
LOOP3 MOVLW .110 ;
MOVWF REG1 ;
LOOP4 NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
DECFSZ REG1,1 ;
GOTO LOOP4 ;
DECFSZ REG0,1 ;
GOTO LOOP3 ;
RETURN
;***********************************************************************
INICIO CLRF PORTD
CLRF PORTE
BANKSEL TRISD ;SELECCIONAMOS BANCO 1
CLRF TRISD ;CONFIGURAMOS PUERTOD COMO SALIDA
CLRF TRISE ;CONFIGURAMOS PUERTOE COMO SALIDA
BANKSEL PORTD ;;SELECCIONAMOS BANCO O
MOVLW 0x30
CALL COMANDO
CALL RETARDO
MOVLW H'30'
CALL COMANDO
CALL RETARDO
MOVLW H'30'
CALL COMANDO
CALL RETARDO
MOVLW H'30'
CALL COMANDO
CALL RETARDO
;**************** CONFIGURACION DE TRABAJO DEL LCD *******************
LCD_CONFIG MOVLW B'00111000' ;INTERFACE 8 BITS, 4 LINEAS
CALL COMANDO
MOVLW B'00000110' ;INCREMENTA CURSOR, MENSAJE FIJO
CALL COMANDO
MOVLW B'00001101' ;DISPLAY ON, CURSOR ON Y PARPADEO CURSOR ON
CALL COMANDO
;***********************************************************************
CALL INI_LCD
CALL PANTALLAZO1
ACA NOP
GOTO ACA
;*******************************
END
-
Simulando el programa desde el mplab me doy cuenta que los pines de control de me funcionan, es decir, que RE0 y RE1 no me estan funcionando, no saca nada. Ahora pregunto: para configurar el puerto E como salida me hace falta algo?
-
Acabo de responder este tema en http://www.todopic.com.ar/foros/index.php?topic=30197.0;topicseen, no puede ser que hagan la misma pregunta dos veses :(
-
Hola Mariano, te comento que no son la misma pregunta, porque mi primera inquietud surgio porque no lograba desplegar el mensaje en un LCD 4x20 (simulado), debido a que los pines de control (RE0 y RE1) del puertoE no me estaban funcionando, no los tenia bien configurados gracias al ADCON1. La otra inquietud que puse en el post http://www.todopic.com.ar/foros/index.php?topic=30197.0;topicseen es diferente y tiene que ver con un LCD 4x24 donde si hice el montaje, si me desplega el mesaje, pero no como quisiera.
-
ok, pero no se puede negar la similitud :mrgreen:
-
Bueno este post es un poco antiguo pero para mi el problema era el RETARDO LCD.
RET_LCD MOVLW H'FF' ;RETARDO DEL LCD
MOVWF REG0 ;
LOOP DECFSZ REG0,1 ;
GOTO LOOP ;
RETURN
cambialo por esto
RET_LCD MOVLW H'FF' ;RETARDO DEL LCD
MOVWF REG0 ;
LOOP DECFSZ REG0 ; ;estabas decrementando un bit y no todo el byte, luego el retardo era demasiado corto.
GOTO LOOP ;
RETURN
Saludos
MaoPeR11
-
Hola maoper11.
Hay que leer bien el Instruction Set...
DECFSZ no soporta especificar bit. Solo soporta posicion de memoria a decrementar(7 bits de longitud) y destino ( WREG o la posicion de memoria misma).
Por lo tanto, el segundo parámetro es el que decide el destino y puede aceptar sólo dos valores: 0(WREG) o 1(FILE). También suele utilizarse las definiciones W(0) o F(1) para especificarlo.
En definitiva, estaba bien esa parte. En tu correción omitis el destino, por lo que el MPASM seguramente genere una advertencia y asuma que el destino es 1(F o FILE).
Saludos.