TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sistemasorp en 02 de Octubre de 2006, 15:53:04
-
Hola a todos, me estreno en este foro. Espero que este tema pertenezca a esta sección:
Resulta que tengo un PIC 16f84-A, un MAX232 y un LCD (PC1602-F)
compatible con el Hitachi HD44780.
El programa que tengo puesto en el PIC envía un mensaje al ordenador
por el puerto serie poniendo en el hyperterminal "Escriba su nombre".
El usuario lo escribe y cada caracter que tecle el PIC lo reenvia al
puerto serie de nuevo y lo muestra en el LCD (está configurado a 4
bits y usa retardos en vez del busy flag).
El problema es que todos los caracteres se visualizan bien en el LCD
excepto 'p','P',' ','0' y '@', los cuales provocan que la pantalla se
apague o muestre lineas. Cuando el usuario escribe otro caracter
distinto de los anteriores se vuelve a mostrar el contenido otra vez
incluyendo los carácteres problemáticos. Así, si el usuario escribe:
A
p
o
l
o
Cuando escribe la "p" desaparece el contenido y cuando escribo la "o"
aparece "Apo" y a partir de ahí todo correcto.
Fijándome en la tabla CGROM de caracteres, veo que los 4 bits
inferiores de los caracteres problemáticos son ceros. No se si ese
será el problema junto con el bus de datos de 4bits. ¿Sabeis que
puede ser y/o como se puede arreglar sin tener que modificar la
configuración de los pines del LCD y del PIC?
Muchas gracias y perdón por el tocho.
-
sistemasorp, si le envias los caracteres "conflictivos" sin mediar la pc de por medio, también te hace lo mismo?
Yo que tu pruebo un programita que mande un string al display pero que mande 1 caracter por vez por segundo.
De esa forma podrás ver si existe el parpadeo ese raro que comentas.
La idea es determinar si el problema lo tienes en la rutina del LCD o bien si en algo de la comunicación con la PC.
Saludos
-
sistemasorp, si le envias los caracteres "conflictivos" sin mediar la pc de por medio, también te hace lo mismo?
Yo que tu pruebo un programita que mande un string al display pero que mande 1 caracter por vez por segundo.
De esa forma podrás ver si existe el parpadeo ese raro que comentas.
La idea es determinar si el problema lo tienes en la rutina del LCD o bien si en algo de la comunicación con la PC.
Saludos
Acabo de probarlo, y ocurre igual. Para que podais echarle un vistazo he enviado un video a youtube para que veais lo que ocurre:
nombre_link (http://www.youtube.com/watch?v=cfGg_yTYcbs)
-
sistemasorp, si le envias los caracteres "conflictivos" sin mediar la pc de por medio, también te hace lo mismo?
Yo que tu pruebo un programita que mande un string al display pero que mande 1 caracter por vez por segundo.
De esa forma podrás ver si existe el parpadeo ese raro que comentas.
La idea es determinar si el problema lo tienes en la rutina del LCD o bien si en algo de la comunicación con la PC.
Saludos
Acabo de probarlo, y ocurre igual. Para que podais echarle un vistazo he enviado un video a youtube para que veais lo que ocurre:
nombre_link (http://www.youtube.com/watch?v=cfGg_yTYcbs)
OK ahi he visto, me huele a que es algo de la comunicación.
Por las dudas, los pines D0 a D3, debes dejarlos al aire, ni a masa ni a Vcc.
La librería que usas, es estándar o hecha por vos?
-
OK ahi he visto, me huele a que es algo de la comunicación.
Por las dudas, los pines D0 a D3, debes dejarlos al aire, ni a masa ni a Vcc.
La librería que usas, es estándar o hecha por vos?
Si, los pines D0 a D3 no tienen conexión a nada. La librería la he hecho yo, aunque me sorpende que solo 4 caracteres me dan problemas y el resto no :-?. Aqui le paso la librería (es muy cortita) por si les sirve de ayuda:
(los pines RA0 y RA1 esta conectados a RS y E respectivamente, RB7..RB4 estan conectados a D7..D4 respectivamente; las llamadas a Retardo_* esperan el tiempo que indican)
CBLOCK
caracter
ENDC
inicializaLCD4bits
bsf STATUS, RP0
bcf TRISA,0
bcf TRISA,1
bcf TRISB,7
bcf TRISB,6
bcf TRISB,5
bcf TRISB,4
bcf STATUS, RP0
bcf PORTA,0
bcf PORTA,1
;Esperar 15 ms
call Retardo_20ms
;Modo de 8 bits
movlw b'00110000'
call enviaComando
call Retardo_5ms
;Modo de 8 bits
movlw b'00110000'
call enviaComando
call Retardo_200micros
;Modo de 8 bits
movlw b'00110000'
call enviaComando
call Retardo_5ms
;Modo 4 bits
movlw b'00100000'
call enviaComando
;Modo 4 bits, 2 lineas y fuente de 5x7 (function set)
movlw b'00100000'
call enviaComando
movlw b'10000000'
call enviaComando
call Retardo_5ms
;display encendido, cursor apagado, cursor normal (display control)
movlw b'00000000'
call enviaComando
movlw b'11000000'
call enviaComando
call Retardo_5ms
; borra el display (clear display)
movlw b'00000000'
call enviaComando
movlw b'00010000'
call enviaComando
call Retardo_5ms
; incrementa posicion cursor y texto no se desplaza (entry mode set)
movlw b'00000000'
call enviaComando
movlw b'01100000'
call enviaComando
call Retardo_5ms
return
enviaComando
movwf PORTB
bsf PORTA,1
bcf PORTA,1
return
imprimeCaracter
movwf caracter
bsf PORTA,0
call enviaComando
swapf caracter,W
call enviaComando
call Retardo_50micros
bcf PORTA,0
return
Y por si les srive de algo aquí está el programa principal (aunque no es necesario creo):
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
indice
contador
direccion
ENDC
ORG 0
INICIO
call inicializaLCD4bits
clrf indice
movlw (finmensaje-mensaje)
movwf contador
masCaracteres
movf indice,W
call devuelveMensaje
call imprimeCaracter
call Retardo_1s
incf indice
decfsz contador,F
goto masCaracteres
movlw b'10000000'
movwf direccion
movimiento
movlw (finmensaje-mensaje)-d'16'
movwf contador
movimiento2
call Retardo_500ms
movlw b'00010000'
call enviaComando
movf direccion,W
call enviaComando
decfsz contador,F
goto movimiento2
movlw b'01000000'
xorwf direccion,F
call Retardo_1s
goto movimiento
devuelveMensaje
addwf PCL,F
mensaje
DT "ABC DEF PIN @O0U"
finmensaje
INCLUDE "RETARDOS.INC"
INCLUDE "LCDLIB.INC"
END
-
Mmm, no me puse a probarla en el simulador pero veamos de hacer algunos retoques rápidos a ver si tenemos suerte.
enviaComando
movwf PORTB
bsf PORTA,1
bcf PORTA,1
return
Dale un retardo después del portB, antes de enviar el enable.
También deja al enable un rato más en 1, es decir ponle algun retardo de un par de microsegundos entre el set del PORTA<1> y el clear.
imprimeCaracter
movwf caracter
bsf PORTA,0
call enviaComando
swapf caracter,W
call enviaComando
call Retardo_50micros
bcf PORTA,0
return
También agrega un retardo entre el envío del primer caracter y el segundo (antes del segundo enviaComando) . Quiero ver si hay algún problema con la velocidad o de ruido que pueda afectar a la transmisión.
Saludos
-
Finalmente achaco que es problema del LCD, puesto que he probado otro y no he tenido ningún problema. COsas que pasan :)
-
Finalmente achaco que es problema del LCD, puesto que he probado otro y no he tenido ningún problema. COsas que pasan :)
Ese otro que probaste es idéntico a este? Estoy pensando en que tal vez este que te falla tenga algún problema al inicializarse, tal vez no se resetea bien.
Eso lo podrías solucionar esperando un poco más al principio, y enviando la cadena de inicialización después de eso.
-
Ese otro que probaste es idéntico a este? Estoy pensando en que tal vez este que te falla tenga algún problema al inicializarse, tal vez no se resetea bien.
Eso lo podrías solucionar esperando un poco más al principio, y enviando la cadena de inicialización después de eso.
Pues es de distinta marca, eso y teniendo en cuenta que otros carácteres si se muestran sin problema en el lcd problemático me da que pensar que está defectuoso por alguna razón (ya que o funciona todo o no funciona nada pero que no se quede a medias).
Muchas gracias por tu ayuda.