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