Problema con LCD en 20 Mhz con 16F877A

Hola ¿Cómo les va?
He estado buscando por todos lados y no pude encontrar la solución, tengo hecho un programa en PBP 2.6 que anda bien en 4 MhZ pero al cambiar a 20 MhZ el LCD de 16x2 muestra los píxeles en negro en lugar de las letras como corresponde.
En el programa puse:

DEFINE OSC 20
DEFINE LCD_BITS 8 'LCD bus 8
Define LCD_DREG PORTC ;bit de datos del LCD empezando en c
Define LCD_DBIT 0 ;por c.0 ,c.1, c.2 y c.3
Define LCD_RSREG PORTA ;bit de registro del LCD en puerto a
Define LCD_RSBIT 4 ;en el puerto a.5
Define LCD_EREG PORTA ;bit de Enable conectar en el
Define LCD_EBIT 5 'puerto a.5
DEFINE LCD_COMMANDUS 4000
DEFINE LCD_DATAUS 250

También en el grabador pongo High speed pero no lo logro hacer andar. Debe ser algo que esté enviando los comandos a mayor velocidad al LCD y por éso no funciona ¿Se les ocurre algo? También he probado en desactivar el Watch dog timmer
Muchas gracias.
 
si trabajo bien en 4 Mhz debe funcionar con 20Mhz lo único que tienes que hacer es bajarle velocidad de transferencia para darle tiempo al lcd para que reaccione o utiliza el bit de lectura/escritura para saber cuando le puedes enviar información al LCD. no conozco esa programación solo un poco en ASM
 
Si fen2006, yo creo que la cosa anda por ahí. Sino me equivoco he leído que en la versión 3 de PBP este problema no existe. El bit de lectura escritura visto desde el LCD está puesto en 0 o a tierra ya que no utilizo la función de lectura.

Aclaro que quiero usar 20MhZ en lugar de 4 porque tengo que mandar una serie de pulsos y pausas de 16 uS y para 4 MhZ no me da el tiempo mínimo. He leído que se puede hacer con assembler pero no quiero probar esa opción.
 
Última edición por un moderador:

D@rkbytes

Moderador
Sino me equivoco he leído que en la versión 3 de PBP este problema no existe. El bit de lectura escritura visto desde el LCD está puesto en 0 o a tierra ya que no utilizo la función de lectura.
Ese problema también existe en la versión 3 de PBP al usar el bus de 8 bits para la pantalla.

Aclaro que quiero usar 20MhZ en lugar de 4 porque tengo que mandar una serie de pulsos y pausas de 16 uS y para 4 MhZ no me da el tiempo mínimo.
Utiliza el bus de 4 bits para los datos de la pantalla de esta forma:
Código:
Define LCD_DREG PORTC        ; Puerto de datos.
Define LCD_DBIT     4        ; Bits de inicio de datos.
Define LCD_RSREG PORTA        ; Puerto de RS (Register Select)
Define LCD_RSBIT    4        ; Pin para RS
Define LCD_EREG PORTA        ; Puerto de E (Enable)
Define LCD_EBIT     5        ; Pin para E
Con el bus a 4 bits no existe problema para trabajar a 20MHz.

Date cuenta que en la configuración que posteaste anteriormente estás usando el pin RA4 para el pin RS de la pantalla y el pin RA4 es Open Drain (Drenador Abierto)
Si piensas usar ese pin debes colocar una resistencia Pull-Up para obtener los dos estados lógicos.

Suerte.
 
Muchas gracias por la información, te cuento que tengo una resistencia de 10kohm en forma de pull-up. Ni me imaginé que era así el pin, busqué en la hoja de datos del 16f877a TQFP y decía que era de ese tipo, siempre se aprende algo nuevo.
Con respecto al modo de 4-bits y que iba a ser una solución tampoco me imaginé pero es lógico. Lo que voy a hacer es cortar las pistas en las plaquetas de D4 a D7 y probar como me dijiste.

Resultados:
Lo probé cortando las pistas, me avivé que había metido la pata, entonces las arreglé, corté los bits bajos como correspondía y los puse a tierra, aparecen los puntitos negros al principio pero... ¡¡¡Anda!!! La verdad que buenísimo, te lo agradezco mucho como también a fenn2006 por su ayuda. Ahora voy a poder seguir con el proyecto.

Les dejo el circuito para que lo miren si quieren. Lo uso para macrofotografía.
 

Adjuntos

D@rkbytes

Moderador
aparecen los puntitos negros al principio pero... ¡¡¡Anda!!!
Los cuadros negros al principio se deben a una inicialización tardía de la pantalla.
Prueba inicializando la pantalla escribiendo algo antes de ejecutar el programa principal.

Por ejemplo:
LCDOut $FE,1,"INICIANDO LCD"

O tan solo LCDOut $FE,1

Y no coloques retardos antes de escribir en la pantalla.

Saludos.
 

Arriba