Ver la versión completa : Otros Lenguajes ¿Cómo funciona una LCD de trama de puntos?
enkonsierto
08/03/2016, 17:32
Buenas, quiero hacer un proyectillo del que ya comentaré más detalles: la historia es que quiero saber a grosso modo, cómo funciona una lcd tipo "dot matrix" o calculadora. He estado buscando información pero no me aclaro.
El asunto es que tengo un cacharro con conector con una tira de pines donde supuestamente iba un lcd de estos. Lo que quiero hacer es ponerle algún lcd tipo los que hay para arduino.
No tengo el pinout del conector, pero dispongo de un osciloscopio para identificar las señales y sacar el pinado, pero claro no tengo ni idea de cómo funciona ni de qué pines necesito obtener. Tampoco sé si es compatible la señal o tendría que hacer una conversión con algún arduino, aunque ésto me importaría poco.
¿Alguien que me oriente?
JoJo_ReloadeD
08/03/2016, 17:44
Si quieres meterle un display de los tipicos de arduino (un 1602 p.ej) piensa que estos usan el bus i2c, un bus serie para comunicarse. Primero lo que hay que saber es que tipo de bus tenia el display antiguo:
La original es matriz de puntos o son varios displays de 7 segmentos ? Cuantos pines tenia ?
enkonsierto
08/03/2016, 17:49
Es de matriz de puntos creo que de 16x1 caracteres (aunque las letras eran bastante altas, no sé si usaba dos filas para mostrarlas).
No sé exactamente cuantos pines tenía porque en ese conector van mas cosas aparte de la información al LCD. :S
enkonsierto
08/03/2016, 19:19
He estado investigando un poco más y casi que puedo confirmar que es una pantalla de 16x1 con 14 pines de entrada (+2 para iluminación de la pantalla). No creo que pueda averiguar el tipo de bus, pero sí puedo analizar las señales de los pines para intentar averiguarlo.
Sería interesante saber qué tipo de comunicación tiene tu cacharro porque según el mismo necesitarás un osciloscopio normalito o uno que disponga de memoria.
Te podría decir distintos tipos de LCD que conozco, pero mi información anda algo desfasada, y sé que te fias de mi información menos que del "cuore", así que me limitaré a decirte que intentes averiguar si la señal de transmisión es tipo serie o paralela. Con 14 pines seguro que es serie, usando unos cuantos pines para transmitir la información en bloques. Tendrás un pin de alimentación, otro de masa y otro para sincronizar los datos.
Por otro lado, una pantalla "dot matrix" de 16x1, por definición sólo tiene 16 pixels. 16x1 caracteres no es una dot matrix, es por segmentos, como una calculadora... salvo que tenga una controladora que admita valores ASCII o un formato similar, por lo que volvemos al protocolo de comunicación.
Una dot matrix "a pelo" recibe lineas o columnas de bits, que indican si cada pixel debe estar iluminado o no, y usando la controladora que incorpora y la señal de sincronía, se va cambiando de fila/columna a "iluminar" en cada flanco de subida o de bajada (dependiendo del tipo de controladora), de la misma forma que la tele se va dibujando por lineas.
Pero ya digo, depende de muchos factores. He visto LCDs de calculadoras en el que se tiene un buffer de datos, y al LCD se le pasa sólo 1 bit en cada ciclo de reloj, ya que se ilumina sólo un segmento de la pantalla a cada ciclo, pero como funciona a varios MHz, la velocidad es tan rápida que parece que estén varios iluminados a la vez. Mientras que en el proyecto "Viciosa" buscábamos usar una controladora que ya te hace todo el trabajo, y sólo tienes que rellenar una matriz de datos, y automáticamente el HW se lo manda a la pantalla.
Sin más datos, es lo que te puedo decir. Ahora, me puedes creer o no.
enkonsierto
08/03/2016, 20:19
Sería interesante saber qué tipo de comunicación tiene tu cacharro porque según el mismo necesitarás un osciloscopio normalito o uno que disponga de memoria.
Te podría decir distintos tipos de LCD que conozco, pero mi información anda algo desfasada, y sé que te fias de mi información menos que del "cuore", así que me limitaré a decirte que intentes averiguar si la señal de transmisión es tipo serie o paralela. Con 14 pines seguro que es serie, usando unos cuantos pines para transmitir la información en bloques. Tendrás un pin de alimentación, otro de masa y otro para sincronizar los datos.
Por otro lado, una pantalla "dot matrix" de 16x1, por definición sólo tiene 16 pixels. 16x1 caracteres no es una dot matrix, es por segmentos, como una calculadora... salvo que tenga una controladora que admita valores ASCII o un formato similar, por lo que volvemos al protocolo de comunicación.
Una dot matrix "a pelo" recibe lineas o columnas de bits, que indican si cada pixel debe estar iluminado o no, y usando la controladora que incorpora y la señal de sincronía, se va cambiando de fila/columna a "iluminar" en cada flanco de subida o de bajada (dependiendo del tipo de controladora), de la misma forma que la tele se va dibujando por lineas.
Pero ya digo, depende de muchos factores. He visto LCDs de calculadoras en el que se tiene un buffer de datos, y al LCD se le pasa sólo 1 bit en cada ciclo de reloj, ya que se ilumina sólo un segmento de la pantalla a cada ciclo, pero como funciona a varios MHz, la velocidad es tan rápida que parece que estén varios iluminados a la vez. Mientras que en el proyecto "Viciosa" buscábamos usar una controladora que ya te hace todo el trabajo, y sólo tienes que rellenar una matriz de datos, y automáticamente el HW se lo manda a la pantalla.
Sin más datos, es lo que te puedo decir. Ahora, me puedes creer o no.
Si yo te creo hombre, siempre que no te pongas con elucubraciones. Se agradace el esfuerzo. :P
Visualmente la pantalla es de este tipo:
46344
Cuando dije 16x1 caracteres no me refería a 16x1 pixeles, sino a 16 recuadros de 5x7 pixeles cada uno. Como una calculadora no es, ya le comenté a jojo que no iba por segmentos.
La cuestión es que quiero obtener el pinout analizando la señal de los pines, pero claro, tengo la limitación que no sé que protocolo usa, pero aparentemente tiene que ser un standard de 14 pines.
He comprobado que un pinout compatible podría ser este:
46345
Si fuera así, ¿qué señales necesito encontrar? (visualmente hablando)
GND y VCC es sencillo, los buses de datos imagino que estarían pulsando constantemente, me faltaría analizar el resto.
Segata Sanshiro
08/03/2016, 20:35
Habría que ver qué controlador llevaba la pantalla original. Por lo visto uno popular para pantallas de ese estilo es el ST7066 y compatibles. Aquí puedes ver cómo se comunica uno con él https://www.sparkfun.com/datasheets/LCD/st7066.pdf Con eso puedes empezar a comparar los datos que se envían por el bus con lo que sale en la hoja de características y ver si son compatibles.
Si yo te creo hombre, siempre que no te pongas con elucubraciones. Se agradace el esfuerzo. :P
Visualmente la pantalla es de este tipo:
46344
Cuando dije 16x1 caracteres no me refería a 16x1 pixeles, sino a 16 recuadros de 5x7 pixeles cada uno. Como una calculadora no es, ya le comenté a jojo que no iba por segmentos.
La cuestión es que quiero obtener el pinout analizando la señal de los pines, pero claro, tengo la limitación que no sé que protocolo usa, pero aparentemente tiene que ser un standard de 14 pines.
He comprobado que un pinout compatible podría ser este:
46345
Si fuera así, ¿qué señales necesito encontrar? (visualmente hablando)
GND y VCC es sencillo, los buses de datos imagino que estarían pulsando constantemente, me faltaría analizar el resto.
Pues más elucubraciones que las que te he dicho en el anterior mensaje, imposible :lol:
Lo que te ha pasado Segata es interesante, porque te haces una idea de las señales que podrías tener, pero vamos, para este tipo de LCDs es lo más habitual.
Obviamente necesitas identificar todas las señales para saber qué LCDs le puedes añadir, pero no las necesitas todas para hacer que funcione. Es posible que una señal de lectura/escritura no te haga falta si no puedes leer la información del LCD, por poner un ejemplo.
Identificarlos puede ser sencillo si tienes control total de los valores de salida. No hace falta que envíes señales binarias (aunque ayudaría enormemente), pero sí que puedas setear que vas a escribir, activar la señal de envío... esas cosas.
Empieza por la alimentación, que es lo más obvio, pero ojo: la alimentación de la iluminación es diferente de las de las señales (en tu ejemplo, pines 1, 2, 15 y 16) ¡NO PUEDES MEZCLARLAS! Lo más sencillo es buscar un chip, y ver cuál es la linea de alimentación de señal en la placa, y seguirla hasta el conector.
Luego es ya ir modificando una señal, manteniendo fijas las otras. Si es un Arduino, hacer un programa para eso debería ser sencillo. Es más, incluso es posible que el pinout que has puesto sea el que tengas en el tuyo, los estandars no suelen ser muy diferentes, aunque modifiquen el orden para que les compres a una marca determinada. De nuevo, si usas un Arduino, les interesa seguir un estandar, y deberías tener información de ese conector en internet, y hasta un datasheet como el que ha puesto Segata.
Y me voy a repetir: no conozco los estándares de comunicación, por lo que no te puedo asegurar que el ejemplo que has puesto sean las señales que usan todos los LCD de este tipo (puede que existan otras señales o no). Es un punto de partida, y es bastante obvio qué hace cada señal (si no te queda claro, a continuación te digo como iría tu ejemplo). Son señales muy simples (o deberían) y no dependen del tiempo (hay señales que según lo que se envió unos ciclos atrás pueden significar una cosa u otra, pero no es tu caso), así que con el osciloscopio y un código sencillo que modifique el pin que estás buscando, identificarlos no te debería llevar mucho.
Sobre cómo funciona tu ejemplo: a groso modo, el read/write se pone a cero para mandarle un valor (de ahí la L junto a write), y en data/command se pone 5v para enviar un dato (H significa HIGH, que es un 1 binario, que en este caso son 5v), y luego se le manda un caracter ASCII o el que sea a través de los 8 pines de datos. Los comandos pueden ser cosas como borrar la pantalla, ponerla negra, desplazar los caracteres a la derecha... cada comando tiene un valor entre 0 y 255 (8bits, los 8 mismos pines de datos) y depende del LCD.
Por último, el ENABLE activa la toma de datos del LCD (lee los datos, según entiendo, cuando este valor pasa de 5v a 0v, o eso entiendo de la flecha de H.H -> L: es la señal de sincronía).
enkonsierto
08/03/2016, 22:01
Pues más elucubraciones que las que te he dicho en el anterior mensaje, imposible :lol:
Lo que te ha pasado Segata es interesante, porque te haces una idea de las señales que podrías tener, pero vamos, para este tipo de LCDs es lo más habitual.
Obviamente necesitas identificar todas las señales para saber qué LCDs le puedes añadir, pero no las necesitas todas para hacer que funcione. Es posible que una señal de lectura/escritura no te haga falta si no puedes leer la información del LCD, por poner un ejemplo.
Identificarlos puede ser sencillo si tienes control total de los valores de salida. No hace falta que envíes señales binarias (aunque ayudaría enormemente), pero sí que puedas setear que vas a escribir, activar la señal de envío... esas cosas.
Empieza por la alimentación, que es lo más obvio, pero ojo: la alimentación de la iluminación es diferente de las de las señales (en tu ejemplo, pines 1, 2, 15 y 16) ¡NO PUEDES MEZCLARLAS! Lo más sencillo es buscar un chip, y ver cuál es la linea de alimentación de señal en la placa, y seguirla hasta el conector.
Luego es ya ir modificando una señal, manteniendo fijas las otras. Si es un Arduino, hacer un programa para eso debería ser sencillo. Es más, incluso es posible que el pinout que has puesto sea el que tengas en el tuyo, los estandars no suelen ser muy diferentes, aunque modifiquen el orden para que les compres a una marca determinada. De nuevo, si usas un Arduino, les interesa seguir un estandar, y deberías tener información de ese conector en internet, y hasta un datasheet como el que ha puesto Segata.
Y me voy a repetir: no conozco los estándares de comunicación, por lo que no te puedo asegurar que el ejemplo que has puesto sean las señales que usan todos los LCD de este tipo (puede que existan otras señales o no). Es un punto de partida, y es bastante obvio qué hace cada señal (si no te queda claro, a continuación te digo como iría tu ejemplo). Son señales muy simples (o deberían) y no dependen del tiempo (hay señales que según lo que se envió unos ciclos atrás pueden significar una cosa u otra, pero no es tu caso), así que con el osciloscopio y un código sencillo que modifique el pin que estás buscando, identificarlos no te debería llevar mucho.
Sobre cómo funciona tu ejemplo: a groso modo, el read/write se pone a cero para mandarle un valor (de ahí la L junto a write), y en data/command se pone 5v para enviar un dato (H significa HIGH, que es un 1 binario, que en este caso son 5v), y luego se le manda un caracter ASCII o el que sea a través de los 8 pines de datos. Los comandos pueden ser cosas como borrar la pantalla, ponerla negra, desplazar los caracteres a la derecha... cada comando tiene un valor entre 0 y 255 (8bits, los 8 mismos pines de datos) y depende del LCD.
Por último, el ENABLE activa la toma de datos del LCD (lee los datos, según entiendo, cuando este valor pasa de 5v a 0v, o eso entiendo de la flecha de H.H -> L: es la señal de sincronía).
Aquí dices cosas interesantes. Desgraciadamente no tengo control de los datos que aparecen. Para que nos entendamos es una placa que aparte de todo manda esa información al LCD (tipo como los lcd de un pinball, por un lado el pinball hace sus cosas y aparte muestra las puntuaciones y otras cosas, imagenes por ejemplo en otros pinballs mas modernos).
Suponiendo que debería obtener las señales que he puesto antes, hasta el momento tengo esto:
PIN
Funcion
Señal esperada
1
GND
0v
2
VDD
5v
3
Contraste
0v-5v Según el contraste?
4
Select
?
5
Read/Write
0v? (Puesto que siempre estaremos escribiendo)
6
Enable
5v?
7
D0
Pulsos
8
D1
Pulsos
9
D2
Pulsos
10
D3
Pulsos
11
D4
Pulsos
12
D5
Pulsos
13
D6
Pulsos
14
D7
Pulsos
15
A Backlight +
5v?
16
A Backlight -
GND?
He puesto interrogante a lo que no estoy seguro, que opinais?
EDIT: Acabo de caer en la cuenta. También puedo ir camino atrás y ver de donde salen todas esas señales, (un bus de datos tiene que salir de un pin de datos de un IC, por ejemplo).
Segata Sanshiro
08/03/2016, 22:15
El de "select" sirve para elegir entre el registro de datos y el de instrucciones a la hora de leer y escribir, así que en ese también deberías ver pulsos. En el de R/W lo mismo: probablemente sí que se lea de la pantalla, concretamente el bit de "ocupado" que señaliza al usuario cuándo puedes enviar datos y comandos a la pantalla y cuando no porque está ocupada. En el de enable lo mismo: si enchufas los dos canales del osciloscopio deberías ver que todas las señales anteriores varían, y un pelín después de que hayan terminado de variar, la de enable tiene un flanco (no se si ascendente o descendente), indicando a la pantalla que dichas señales son válidas y que las procese.
eso tiene pinta de rular directamente con el controlador de lcd (¿LCD.h?)de arduino directamente si lo configuras con un bus de datos de 8 bits en vez de con uno de 16.
Puedes sacarle foto del otro lado?
enkonsierto
08/03/2016, 23:27
El de "select" sirve para elegir entre el registro de datos y el de instrucciones a la hora de leer y escribir, así que en ese también deberías ver pulsos. En el de R/W lo mismo: probablemente sí que se lea de la pantalla, concretamente el bit de "ocupado" que señaliza al usuario cuándo puedes enviar datos y comandos a la pantalla y cuando no porque está ocupada. En el de enable lo mismo: si enchufas los dos canales del osciloscopio deberías ver que todas las señales anteriores varían, y un pelín después de que hayan terminado de variar, la de enable tiene un flanco (no se si ascendente o descendente), indicando a la pantalla que dichas señales son válidas y que las procese.
Muchas gracias, lo revisaré tambien.
-----Actualizado-----
eso tiene pinta de rular directamente con el controlador de lcd (¿LCD.h?)de arduino directamente si lo configuras con un bus de datos de 8 bits en vez de con uno de 16.
Puedes sacarle foto del otro lado?
No es un arduino, es una pcb. Si voy avanzando daré más datos :)
No, si lo que digo es que lo podrias controlar con un arduino casi casi seguro, que los displays lcd son bastante standar
enkonsierto
08/03/2016, 23:47
No, si lo que digo es que lo podrias controlar con un arduino casi casi seguro, que los displays lcd son bastante standar
Eso sí, el asunto es que no conozco el standard que usa el conector.
si tiene 14 pines casi seguro que funciona como los de arduino. Por otra parte, supongo que habras mirado el modelo del LCD, verdad? lo pondra en la placa
Acabo de releer el primer post...lo que desconoces es el pcb... seguro que usa un lcd estandar
enkonsierto
09/03/2016, 15:06
si tiene 14 pines casi seguro que funciona como los de arduino. Por otra parte, supongo que habras mirado el modelo del LCD, verdad? lo pondra en la placa
Acabo de releer el primer post...lo que desconoces es el pcb... seguro que usa un lcd estandar
Cada vez estoy más seguro que usa algún standard, la cosa es saber qué protocolo.
He sacado el pinout del conector de marras (lo pondré por aquí cuando lo ponga bonito), basicamente el conector son 48 pines conectados a las salidas de 2 LS245 y 3 UNL2003A.
Un dato que no he dicho: Este conector sirve para controlar 2 pantallas lcd, 2 servos y alguna indicación luminosa también duplicada.
Buf, con 14 pines sin control, lo suyo es que te imprimas en un papel los valores de las señales con el tiempo, y luego intentes adivinar qué es lo que está pasando. Lo bueno es que la señal Enable Signal la vas a ver fácilmente, porque será prácticamente la única que cambie en ese momento, que es cuando el LCD lee los datos (y seguramente mantenga las señales un tiempo).
Lo demás... pues... sólo podemos intuir que los 8 bits de datos van a estar más o menos juntos, y que los de alimentación no varían nunca.
Pero si el conector tiene 48 pines... mal vamos. Tienes que separarlos. si has localizado los CI a los que van conectados, y sabes los modelos y las patillas, sólo tienes que buscar el datasheet de ellos y ver cómo funcionan, y su patillaje.
Ahora mismo tengo que salir, si no te los miraba yo mismo.
enkonsierto
10/03/2016, 22:23
Investigando el pinado más o menos tengo localizados los pines que necesito. He estado mirando con punta lógica y con osciloscopio y concretamente hay 12 pines que pulsan, 6 si dividimos entre dos. Me coinciden con los 6 pines que me faltaría por identificar en el lcd que son: pin 4 select, pin 6 enable y pines 11-14 las 4 líneas de buses.
De estas 6 señales, 5 salen del mismo integrado (un uln2003a, un array de transistores): una de esas 5 señales es diferente, la explicaré posteriormente como es. Nos quedamos con 4 señales que teóricamente son los buses de datos, sólo me faltaría saber el orden pero es cuestión de ir probando.
Nos quedan dos lineas por identificar: la que provenía del mismo integrado que los 4 buses de datos (el uln2003a) y la que estaba aparte. Una de ellas supuestamente sería enable y la otra sería select.
La señal diferente que comenté antes se parece a un reloj pero tiene pausas cada ciertos intervalos: explico mejor, siempre está alto y baja un momento 34 veces de forma constante, luego "descansa" y repite el ciclo.
Adjunto captura:
46395
La señal amarilla es la que digo, la verde es un bus de datos.
¿Esta señal sería enable o select?
Segata Sanshiro
10/03/2016, 22:55
Es un enable casi con total seguridad. Por cierto, creo que el canal 1 lo tienes configurado en x10, porque dice que la señal tiene 40 V pico a pico cuando deben ser unos 5 realmente.
enkonsierto
10/03/2016, 23:18
Es un enable casi con total seguridad. Por cierto, creo que el canal 1 lo tienes configurado en x10, porque dice que la señal tiene 40 V pico a pico cuando deben ser unos 5 realmente.
Anoto lo del enable :D Correcta la apreciación del x10, me puse a toquetear el zoom para que se viera bien para la captura y así quedó.
jduranmaster
11/03/2016, 00:22
Estos LCDs son bastante estandar. ¿pudiera ser el protocolo IC2?. No creo que sea el basado en el integrado KS0108 porque es para LCDs más grandes cómo los de 128x64.
enkonsierto
11/03/2016, 08:57
Estos LCDs son bastante estandar. ¿pudiera ser el protocolo IC2?. No creo que sea el basado en el integrado KS0108 porque es para LCDs más grandes cómo los de 128x64.
No conozco el protocolo pero tiene que ser el que mencionas o un similar basado en puerto paralelo.
Imposible que sea I2C, es un protocolo serie, haria inutiles a los d0-d7
https://es.wikipedia.org/wiki/I%C2%B2C
-----Actualizado-----
Yo diria que es un select, parece que a veces cambia para configurar registros (como mandar el cursor a inicio y cosas del estilo)
A ver, el uln2003a ese, el array de transistores es simplemente una etapa de salida, que amplifica las señales del interior del integrado (y las invierte, pero eso es tra historia) y protege el integrado de las corrientes inversas (es decir, por si se intenta meter corrientes de señales de entrada a esa salida). Es muy probable que esa sea parte de las señales de salida.
El LS245 es un array de puertas tri-estado. Sí, se puede tener otro estado aparte de 1 y 0. También se usa como etapa de salida, pero tiene más que ver con terminales de comunicación. Yo las he visto sólo para cuando se quiere conectar dos dispositivos, y se tienen que poner de acuerdo entre ellos.
Por eso, del ULN2003A vas a tener hasta 7 señales de salida (pero seguro que sólo se usan 4 para D0-D7, el resto es posible que sea para otros menesteres... si es que se usan), y probablemente puedas obtener la línea de masa de señales (terminal 9, COM) y la de alimentación de señales (terminal 8, E), que en tu ejemplo irían a los terminales 1 y 2 del LCD (la alimentación, pero no de la backlight).
Es más, deberias tener dos de estas en realidad, o una con al menos 8 señales de salida en lugar de 7.
Esa señal que pulsa es claramente el Enable, porque lo que te está dando son pulsos a 0, que es lo que hablábamos: H.H -> L. Además, dices que son 34, son poco más de el doble de letras que te caben en pantalla. Puede ser que dos señales, la primera y la última, sirvan de señal de sincronización (inicio y fin), y el resto se envíen por duplicado (por control de errores, porque tiene símbolos de 16 bits o vete tu a saber), o que las 34 señales sean los 16 caracteres, mas datos para CRC (comprobación de errores de transmisión, y posible corrección).
Que sea I2C, no lo creo. Es un protocolo antiguo que se utilizaba para comunicar procesadores entre sí, una especie de bus de datos como el que comunica la CPU con la RAM, pero entre dispositivos de diferentes máquinas (incluso creo recordar que tenían una señal para sincronizar los relojes de ambos equipos). Posteriormente se usó para otro tipo de comunicaciones entre dispositivos, porque es muy versátil, pero para este tipo de comunicaciones, entre una CPU y un microcontrolador básico (que ni será eso, el LCD llevará una simple lógica controladora) no se suele utilizar (al menos, en lo que yo he visto). Es otro protocolo de transmisión serie, pero no I2C porque ambos dispositivos comparten señal de alimentación y localización física. Aunque estoy especulando.
enkonsierto
13/03/2016, 13:36
Pues creo que he sacado el pinout con ciertas variantes que será cuestión de ir probando. He pedido un lcd supuestamente compatible y a ver si todas las elucubraciones son correctas. :D
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.