Control LCD F-51543NFU-LW-ADN / PWB51543C-2-V0 (de la biblioteca de cintas)



Hola de nuevo, Habr! Tras traducir el artículo sobre la administración del módulo LCD con un controlador, pero sin mi propia RAM de video, decidí traducir otra publicación sobre el mismo tema. Aquí el módulo ya es más simple, monocromo, pero para "revivir" no es menos interesante.

Control LCD con controlador, pero sin controlador


La pantalla con la que va a trabajar el autor se toma de una antigua biblioteca de cintas. El controlador no sobrevivió, pero una búsqueda de cualquier cosa relacionada con "263645-001" mostró que había un FPGA. Se cree que controla directamente dichos módulos LCD desde Arduino, etc. imposible, necesita un enlace intermedio: el controlador de la serie SEDxxxxx, que no es "amigable" con la placa de pruebas y tiene más entradas que el módulo en sí. Pero esto no es así. Aquí hay cuatro proyectos similares:

En el ATmega8515
En ella
En la foto
En ESP32

Y algunos generalmente controlan monitores AVR VGA de ocho bits ...

En general, el autor tuvo éxito, el software bajo la licencia MIT está aquí .

Imagen fija


Para asegurarse de que todo funciona, primero debe intentar generar una imagen ráster de un solo bit desde la memoria flash del microcontrolador. Para obtener un voltaje negativo, tomamos tres "Crones", el voltaje del divisor, que se utilizó como resistencia de sintonización, se aplicó al terminal V0. Y aquí en la pantalla está Lenna:



El autor todavía no puede entender cómo logró voltear la imagen (mira de qué lado está el cable). En cualquier caso, existe este ejemplo en la página del proyecto en GitHub.

Modo de texto


Pero la ROM de video es de poca utilidad, y no hay 9600 bytes para RAM de video en el Arduino. El modo de texto viene al rescate, en el que la ROM del generador de caracteres y la RAM de video combinada son más pequeñas que la RAM de video en el modo gráfico. Los partidarios de la República de Kazajstán y el "Especialista" pueden romper lanzas sin cesar sobre este tema.



Un breve ejemplo en lenguaje ensamblador AVR:

... lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ld r30, X+ swap r24; (CL2 rising edge) out %[data_port], r24 lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ... 

Hardware requerido




Para el módulo F-51543NFU-LW-ADN / PWB51543C-2-V0, el autor solicitó:

Arduino en AVR con una frecuencia de reloj de 16 MHz (probado en Uno, Leonardo y un clon similar a ProMicro).

Fuente de voltaje negativo. Para el autor, este es un convertidor CC-CC no estabilizado A0524S-1W con aislamiento de entrada y salida. Los convertidores para el MC34063 también son adecuados (este chip es muy fácil de encontrar, solo desmonte la carga USB más barata para un encendedor) o MAX749. No se requiere estabilización, el rango de voltajes permitidos en esta entrada para el módulo utilizado aquí es bastante amplio. El valor nominal es menos 24 V, el máximo es menos 30 en relación con el cable común y 35 entre Vdd y Vee. El consumo de corriente es de 6 mA.

Dos transistores MOS de canal N con control de nivel lógico. El autor usó IRL530n, el stock, por supuesto, es grande, pero ciertamente no se agotará. Un transistor controla la luz de fondo, el otro una fuente de voltaje negativo.

Resistencia de corte de 250 kΩ para suministrar voltaje a la entrada V0. Ajuste de modo que -16.8 V a una temperatura de +25 ° C en el contacto móvil. Esto es de una hoja de datos, por lo que, por supuesto, dicha precisión no es necesaria.

Varias resistencias de 10 kilo para tirar hacia abajo.

Diseño y puentes.

¿Qué harías ahora? Reloj QR? Pregúntale a kote:



Kote ofrece implementar una simulación de algunos LCD comunes con un controlador. Para que otro "pensamiento" que funcione con la pantalla en el HD44780, solo grande, se pueda conectar a este Arduino.

Fuente - también en RAM


Tomamos un ejemplo con EGA y VGA: allí, cuando se trabaja en modo texto, se hizo exactamente eso. Solo aquí había 64 caracteres en total, pero al menos todo entró en la RAM, a diferencia del modo gráfico. Es cierto que el ciclo principal de eventos se ha ralentizado, pero puede probar los gráficos de mosaico:



Modo gráfico y medios tonos


En Arduino en AVR no hay tanta RAM, y ese es el punto. Incluso en mega. 320x240 incluso con un bit por píxel: ya son 9600 bytes. Solo cuatro medios tonos requerirán el doble. Con RAM externa, por ejemplo, 23LC512 en modo SQI, puede intentar implementar algo similar a DMA, pero es más simple y rentable rehacer todo en ESP32, donde hay más RAM estática y DMA es más fácil.

Si solo desea conectar dicha pantalla a una PC a través de USB, puede intentar usar ATmega32u4 para esto: habrá suficientes recursos incluso para las gradaciones de brillo (usando FRC, lo que se describe en mi traducción anterior). Pero no con el "mega" utilizado como convertidor de interfaz, sino con una PC que escaneará la pantalla LCD sobre la marcha a una velocidad de 5.4 megabits por segundo.

Cuando el módulo todavía estaba en la biblioteca de cintas, había una GUI y gradaciones de brillo: todo estaba allí.

Las actualizaciones serán. Mientras tanto ...



Y esto no es un montaje fotográfico, sino el resultado del control desde una PC. Y cambiaremos de Hackaday.io a GitHub; todavía hay muchas cosas interesantes en README.md.

Señales para controlar dichos módulos.


FLM - Marcador de primera línea: marcador de primera línea, también se puede llamar MARCO, VSYNC, etc.
CL1: pulso de enclavamiento de fila: también se puede llamar pulso de cadena de escritura. CARGA, HSYNC, etc.
CL2: reloj de desplazamiento de píxeles: también se puede llamar pulso de cambio de píxeles. CP (cambiar píxel), etc.
M - la señal alterna, debido a que los píxeles están controlados por voltaje alterno, también se puede llamar BIAS (offset), etc.

D0-D3 es un bus de datos paralelo de cuatro bits.

Conductores para cable común, potencia de retroiluminación (por ejemplo, VLED ±), potencia del módulo (VEE y V0)

No descuides las hojas de datos. El módulo puede requerir otro voltaje negativo, o puede ser positivo, o el convertidor puede estar incorporado. La lógica puede diferir, por ejemplo, con una unidad en CL1 no habrá reacción en CL2. Puede haber una luz de fondo diferente (CCFL (con cuidado, el inversor es una "mordida") en lugar de LED), o no hay pinout en el tablero, entonces no lo sabrá sin una hoja de datos. No puedes conectar nada al azar.

Que hay para hacer


Transmita la cadena en trozos de cuatro bits, la grabación se realiza en la disminución en la línea CL2. Después de pasar la línea, anótelo en la recesión en la línea CL1 (sí, después de todo, un poco de RAM en el módulo está en una línea). La siguiente línea se seleccionará automáticamente. Después de transmitir toda la trama, regrese al principio utilizando la señal FLM. En una hoja de datos sobre LC79401 hay un ejemplo. Grabe a una velocidad suficiente, aplique pulsos a CL1 de manera uniforme. El controlador vaciló un poco: la pantalla parpadeó fea.

Después de cada cuadro, cambie el nivel lógico en la entrada M al opuesto, de modo que los píxeles estén controlados por voltaje alterno. De lo contrario, la pantalla se deteriora:


No puede confiar esta operación al microcontrolador, pero ponga un disparador contable. La entrada a FLM, la salida a M, en general, es comprensible.

Un ejemplo para generar imágenes desde la memoria flash (vea el comienzo del artículo) se llama clglcd_simple en este repositorio.

Como ya se mencionó, es imposible hacer lo mismo con RAM en Arduino en AVR; no será suficiente, por lo tanto ...

Y de nuevo - modo texto


Según la hoja de datos, puede transmitir datos en un bus de cuatro bits y "extraer" CL2 con una frecuencia de hasta 6 MHz. Por lo tanto, puede transferir rápida y rápidamente la línea, luego el microcontrolador resuelve un poco otras tareas, y cuando el temporizador lo "dice", "tira" de CL1 y repite el ciclo.

Al generar caracteres para una resolución horizontal de 320 píxeles, todo esto se puede hacer en 20 μs (320 píxeles / 4 bits = 80 pulsos, CL2 "pull" con una frecuencia de 4 MHz). Para las tareas restantes, quedan 39.5 μs. CL1 se “sacude” cada 59.5 μs y obtiene una velocidad de cuadro de 70 Hz. Bueno, habrá más procedimientos para manejar las interrupciones, etc., en general, el microcontrolador estará ocupado controlando la pantalla el 45% del tiempo. ¿"Entero" 45 o "total" 45? Probablemente el segundo: sobrescribir datos en la RAM de video puede ser lo suficientemente rápido.

¿Desea que el microcontrolador pase menos tiempo administrando el indicador y más en otras tareas? Puede reducir la velocidad de cuadros a 50 Hz, puede overclockear el microcontrolador a 20 MHz. Con cualquiera de estos métodos, se realizarán más ciclos de reloj entre las rutinas de interrupción.

Un temporizador de comparación de salida cambia la línea CL2 cada cuatro pulsos de reloj con un ciclo de trabajo del 50%. Al mismo tiempo, los datos van a las salidas del puerto PORTB, conectado al bus de datos de cuatro bits del módulo de tal manera que cambian en el momento en que el nivel sube a CL2, y en el momento de la disminución permanecen sin cambios. Por supuesto, esto no se puede hacer sin ensamblador:

 ... lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ld r30, X+ swap r24; (CL2 rising edge) out %[data_port], r24 lpm r24, Z ;---------- (CL2 rising edge) out %[data_port], r24 ... 

8 ciclos y se transmiten cuatro mordiscos. Y qué transmitir exactamente depende de qué símbolo está en la celda RAM de video correspondiente, qué píxeles correspondientes a este símbolo deben transferirse desde la ROM del generador de caracteres y qué se almacena en las celdas correspondientes de esta ROM.

Lo más inconveniente aquí es la necesidad de detener el temporizador después de exactamente 80 pulsos. Algunos temporizadores, como Timer4 en 32u4, no pueden.

Para obtener la señal suministrada a la línea CL1, el autor aplicó una salida diferente del microcontrolador, destinada tanto al temporizador como a PWM rápido. Cuál de esto se aplica aquí es comprensible. Cambia cada 952 medidas. O si cuenta después del divisor de reloj por 8, resulta que cada 119 pulsos. En este punto, comienza la rutina de procesamiento de interrupciones y obliga al microcontrolador a enviar nuevos datos a la línea de control que se requerirán durante el siguiente impulso a CL1. Bueno, el nivel en la línea M cambia con la mitad de la frecuencia. Y la pantalla LCD no se deteriora. Todas las señales juntas se ven así:



El generador de caracteres consta de 256 caracteres, suficiente para 866, KOI-8R o 1251. Se colocan 40xN caracteres en la RAM de video, donde N es el número de líneas dependiendo de la altura del carácter. El ancho del símbolo siempre es de 8 píxeles y la altura puede ser de 6, 8, 10, 12, 15, 16. Cuanto más pequeño es, menos ROM se requiere para el generador de caracteres y más RAM de video. Con una fuente de 8x8 (40 caracteres por 30 líneas) necesita 1200 bytes de RAM y 2048 bytes de ROM. Con una fuente de 8x16 (que se ve mejor en este módulo), RAM necesita 600 bytes y ROM 4096. Del traductor: puede almacenar la fuente en forma de 8x8, y escalarla verticalmente dos veces por programa, y ​​cuesta 600 bytes de RAM y 2048 ROM. Para almacenar varias fuentes en ROM, debe mantener la dirección de inicio de la fuente no en una constante, sino en una variable, pero no funcionará imprimir el texto en varias fuentes a la vez, a menos que, por supuesto, cambie esta dirección sobre la marcha mediante el procedimiento de procesamiento de interrupción justo durante la transferencia de píxeles a la pantalla.

La fuente se almacena así: primero las líneas superiores de los 256 caracteres, luego una línea debajo, y así sucesivamente. Hay una secuencia de comandos Python en la carpeta misc del repositorio, que convierte automáticamente la fuente TTF al archivo de encabezado clglcd_font.h con la matriz PROGMEM en el formato requerido. Las fuentes clásicas de píxeles para CC-BY-SA 4.0 se pueden encontrar aquí .

Y de nuevo: tome un ejemplo con EGA y VGA


Pero esta vez con detalles. El generador de caracteres en la RAM, como se indicó anteriormente, acomoda un total de 64 caracteres, se pueden identificar por números del 0 al n o del 255-n al 255. Se almacenan de la misma manera: las líneas superiores de todos los caracteres, luego los siguientes, y así sucesivamente. Solo todo esto se alinea teniendo en cuenta el hecho de que los caracteres no son 256, sino 64. Para caracteres de 8x16 píxeles de tamaño, se requieren 16 * 64 = 1024 bytes. El repositorio tiene un ejemplo de trabajo con el generador de caracteres en RAM.

Si se utilizan ambos generadores de caracteres al mismo tiempo: 256 caracteres en ROM y 64 caracteres en RAM, tendrá que aceptar que no solo habrá menos RAM, sino que también disminuirá la velocidad de transferencia de datos de las líneas en el módulo, en lugar de 8 ciclos de reloj, dos mordiscos necesitarán 12, es decir, no 20 microsegundos, sino 30, y en lugar del 45% del tiempo para el control LCD, tomará 60.

Modo gráfico de medios tonos


Como se indicó anteriormente, en este caso, el microcontrolador funciona simplemente como un convertidor de interfaz. Necesitará ATmega32u4, y aquí se describe qué hacer. Tenga en cuenta que el módulo puede dañarse debido a la congelación del programa en la PC.

Entonces, ¿qué es este bucle de cuatro hilos? Resulta que desde el sensor resistivo.


Donde conectar


Como se indicó anteriormente, se requiere un voltaje negativo, que en los primeros experimentos se puede eliminar de tres "Crones", y luego montar el convertidor, por ejemplo, en el MAX749. Las señales de control de potencia, así como la señal DISPOFF (esta es una señal inversa, el módulo se enciende a la una), bajan las resistencias. Durante la actualización y el reinicio del microcontrolador, la aparición de unidades lógicas allí es inaceptable.

Aplique voltaje negativo después del voltaje + 5V, y una unidad lógica a la línea DISPOFF, cuando los datos ya estén presentes en las líneas de control: al menos una unidad en el bus de datos, unidad en CL1. De lo contrario, el módulo puede fallar.

Las entradas D0-D3 se pueden conectar a las salidas del mismo puerto del microcontrolador, por ejemplo, Px4-Px7, mientras que las salidas Px0-Px3 no se pueden usar como GPIO. Puede asignarles otras funciones, por ejemplo, usarlas como salidas de temporizadores, interfaces seriales, etc. Si los usa como entradas, tenga cuidado: las resistencias pull-up incorporadas pueden cambiar arbitrariamente si no están deshabilitadas (PUD - pull-up deshabilitado).

Entrada M - a la salida del temporizador de comparación o PWM.

Entrada CL1 - a otra salida del mismo temporizador.

Entrada CL2 - a la salida de otro temporizador de comparación.

FLM - a cualquier salida digital.

DISPOFF - a cualquier otra salida digital.

El resto depende de cómo encienda el módulo. El autor prefiere controlar la luz de fondo y Vee por separado.

Cómo usar el firmware


Coloque los archivos clglcd.h y clglcd.cpp en el boceto.

Haga una copia de seguridad del archivo clglcd_config.h y edítelo teniendo en cuenta lo que está conectado y las funciones que necesita: un generador de caracteres en RAM, etc. Atención, el código no indica los nombres de los pines Arduino, sino los nombres de los pines del microcontrolador de acuerdo con la hoja de datos. Los nombres de las salidas de los domadores de comparación se descifran de la siguiente manera: por ejemplo, 2, B es OC2B, que en el Arduino Uno corresponde a PD3. Los ejemplos muestran las opciones de conexión que ha obtenido el autor.

Genere el archivo de fuente clglcd_font.h con un script Python en la carpeta misc (ver arriba).

Vea en ejemplos cómo inicializar, encender y apagar la pantalla. Coloque en la matriz de pantalla el texto que desea mostrar para su verificación.

Compila y rellena el boceto. Verifique con un analizador lógico que las señales correctas irán a la pantalla y con un voltímetro que todos los voltajes de suministro son normales. Solo entonces conecte la pantalla.

Agregue un código al boceto que haga algo, por ejemplo, reciba texto en un puerto serie y muéstrelo.

Mostrar interrupciones


La pantalla debe actualizarse constantemente, que es lo que hacen los procedimientos de manejo de interrupciones. Si las interrupciones se detienen durante más de 30 microsegundos, la pantalla parpadeará y, si hay más de 60 microsegundos para una unidad en la línea FLM, puede fallar. Si necesita detener las interrupciones durante mucho tiempo, primero apague la pantalla con la señal DISPOFF (repito, esta es una señal inversa, el módulo se enciende a la una). Por supuesto, si se apaga durante dos segundos cada vez que necesite procesar datos de un sensor de humedad y temperatura, a pocos les gustará, pero es mejor que arruinar el módulo. Mejor aún, cargue el resto en un microcontrolador separado. El intercambio de información por el mismo microcontrolador con dispositivos que funcionan con el protocolo de 1 cable y los LED de dirección es especialmente inaceptable. Los clones Arduino Pro Micro son lo suficientemente económicos como para comprar dos.

Comunicación


Pero las interfaces implementadas en hardware funcionarán perfectamente: puertos seriales, bus I 2 C, SPI en modo maestro. En el esclavo: solo si el maestro permite una "reducción" periódica del esclavo en 25-35 μs. Por supuesto, aún depende de cuántas "patas" quedan desocupadas después de conectar la pantalla.

USB en 32u4 funciona bien si no interroga el punto final de administración con demasiada frecuencia (código de rutina de interrupción lenta). El controlador CDC y sus API fueron lo suficientemente rápidos.

Luego, en el archivo README.md en GitHub, se repite la lista de proyectos similares, igual que en la página del proyecto en Hackaday.io

Gracias por su atencion!

Source: https://habr.com/ru/post/444912/


All Articles