Para capturar los datos que circulan entre el microcontrolador y el controlador gráfico utilicé un kit de desarrollo de Cypress con un micro PsoC 4245.
Se conectaron las líneas de datos, las líneas de control CS, A0, E y RESET y por supuesto la masa.
Desarrollé un firmware con el que poder capturar únicamente los datos correspondientes a la configuración del display, almacenarlos en un buffer y después enviarlos por el puerto serie a un programa terminal (Teraterm) en el PC.
En el siguiente listado se muestran los datos capturados.
----------------------------------------- >>>> Peugeot Type C display data capture. -----------------------------------------
---------- 40 ---------- [0] [ Column Address Set Direction: NORMAL] [0] [ Common Output Status Select: REVERSE] [0] [* Duty Set Command Static spot] [1] [15] [1] [2] [0] [ Built-in Oscillator Circuit ON/OFF: OFF] [0] [* LCD bias set] [1] [0] [0] [* Display Start Line Set] [1] [0] [0] [ Thermal sensor ON/OFF: ON] [0] [* Gray-scale Pattern Set] [1] [0] [0] [* Liquid Crystal Drive Voltage Select] [1] [0] [0] [* Electronic Volume Mode Set] [1] [0] [0] [* Built-in Oscillator Circuit Frequency Select] [1] [0] [0] [* n-line inversion Drive Register Set] [1] [0] [0] [* MLS drive selection] [1] [3] [0] [ Display Reverse] [0] [* Display Mode] [1] [0] [0] [* Temperature Gradient Select] [1] [0] [0] [ n-line ON/OFF: OFF] [0] [* Power Control Set] [1] [3] [0] [ Display All Lighting OFF] [0] [ Display ON/OFF: ON] [0] [ Display Data Input Direction Select Direction: PAGE] [0] [* Page Address Set] [1] [20] [0] [* Column Address Set] [1] [7] [0] [ Display ON/OFF: OFF] [0] [* Display Data Write]
******* Aquí se produce el RESET.
---------- 41 ---------- [0] [ Column Address Set Direction: NORMAL] [0] [ Common Output Status Select: REVERSE] [0] [* Duty Set Command Static spot] [1] [15] [1] [2] [0] [ Built-in Oscillator Circuit ON/OFF: OFF] [0] [* LCD bias set] [1] [0] [0] [* Display Start Line Set] [1] [0] [0] [ Thermal sensor ON/OFF: ON] [0] [* Gray-scale Pattern Set] [1] [113] [0] [* Liquid Crystal Drive Voltage Select] [1] [6] [0] [* Electronic Volume Mode Set] [1] [59] [0] [* Built-in Oscillator Circuit Frequency Select] [1] [6] [0] [* n-line inversion Drive Register Set] [1] [4] [0] [* MLS drive selection] [1] [11] [0] [ Display Reverse] [0] [* Display Mode] [1] [0] [0] [* Temperature Gradient Select] [1] [5] [0] [ n-line ON/OFF: ON] [0] [* Power Control Set] [1] [3] [0] [ Display All Lighting OFF] [0] [ Display ON/OFF: ON] [0] [ Display Data Input Direction Select Direction: PAGE] [0] [* Page Address Set] [1] [20] [0] [* Column Address Set] [1] [7] [0] [ Display Reverse] [0] [ Display ON/OFF: OFF] [0] [* Display Data Write]
******* envío de datos gráficos.
[0] [* Page Address Set] [1] [20] [0] [* Column Address Set] [1] [7] [0] [ Display Reverse] [0] [ Display ON/OFF: ON] [0] [* Display Data Write]
******* envío de datos gráficos.
[0] [* Page Address Set] [1] [20] [0] [* Column Address Set] [1] [7] [0] [ Display Reverse] [0] [ Display ON/OFF: ON] [0] [* Display Data Write]
******* envío de datos gráficos. |
En el momento de activar el display, el microcontrolador envía un bloque de comandos de configuración con sus datos al controlador S1D15712. A continuación, el microcontrolador activa la señal RESET para inicializar el controlador gráfico por lo que la utilidad de los comandos enviados anteriormente es nula.
Tras el reset, se repite el envío de los comandos de configuración. Los últimos comandos de este bloque indican al controlador cuál será la posición de memoria en la que se van a escribir los datos gráficos que se enviarán a continuación. Y estos últimos comandos se repiten a intervalos más o menos regulares.
De este comportamiento se deduce, que tras cada bloque de comandos se envían los datos gráficos a la posición de memoria indicada, y esto lo sabemos porque el último comando es de escritura en memoria gráfica ('Display Data Write).
Como veremos más adelante, el microcontrolador está enviando continuamente los datos gráficos al chip S1D15712, no importa si hay cambios en el contenido del display o no; el contenido de la memoria del controlador gráfico se está refrescando continuamente.
A la hora de analizar los comandos solo hay unos pocos que nos puedan interesar ya que el resto se refieren a la compensación de temperatura, al generador de las tensiones para el LCD y algunos otros parámetros que son específicos del chip S1D15712 y que no nos servirán cuando hagamos el cambio de display.
"Display mode" y "Gray-scale Pattern Set" tienen que ver con la capacidad que tiene el controlador S1D15712 para controlar el display en una escala de grises de 4 niveles.
En este caso, el display se configura para trabajar en escala de grises; es decir, cada pixel del LCD estará representado por dos bits.
"Column Address Set Direction" y "Display Data Input Direction Select Direction" están relacionados con la forma en como se direcciona la memoria gráfica del controlador.
En el controlador S1D15712 la memoria se divide en páginas y columnas y cuenta con dos registros contadores que se auto incrementan automáticamente según se reciben los bytes correspondientes a los gráficos. La forma en que estos registros se incrementan es configurable, y en este display se configuran para que a cada byte que se recibe se incremente el registro de página. Cuando el registro de página llega a su máximo valor, se incrementa el registro de columna y se pone a cero el registro de página. Al llegar a su valor máximo el registro de columna, los dos registros se ponen a cero.
Si te fijas en la figura siguiente te darás cuenta que, con esta configuración, el contenido del display se va "dibujando" por columnas; de arriba a abajo y de izquierda a derecha.
"Page address set" y "Column address set" programan el valor de los registros de página y de columna respectivamente y como se puede ver se actualizan con los valores 20 y 7 en cada refresco de pantalla.
¿Por qué los valores 20 y 7 si parece que apuntan a la parte de abajo del LCD? ¿Por qué empezar a escribir datos en la parte baja?
El chip S1D15712 está preparado para soportar LCDs con resolución de hasta 256x81 puntos, pero nuestro LCD tiene solo una resolución de 240x64 puntos. Aunque los diseñadores podrían haber construido el display de manera que la primera columna de la memoria se correspondiese con la primera columna del LCD, parece ser que decidieron dejar las líneas sobrantes repartidas a ambos lados del display. Ten en cuenta que cada columna de la memoria se corresponde con una línea de señal en el circuito.
Además, cada vez que se envía un bloque de datos gráficos a la memoria del S1D15712, el primer byte siempre será un byte no válido, es decir, ese byte no va a ser escrito en la memoria del integrado pero si provocará que se incrementen los valores de los registros de página y de columna.
En la figura anterior podemos ver que al recibir ese primer byte no válido, el valor del registro de columna que está programado en su máximo valor se pondrá a cero, a la vez que se incrementa el valor del registro de columna. Por este motivo, el segundo byte recibido, que será el primer byte gráfico válido se escribirá en la página 0, columna 8 de la memoria; que se corresponde con la esquina superior izquierda del LCD.
Hay mucho terreno avanzado ya. Ya conocemos la configuración del controlador gráfico, como se direcciona la memoria y que el microcontrolador está continuamente refrescando el display aunque no haya cambios en su contenido.
Siguiente paso: capturar los datos gráficos. En la parte 4.
0 comentarios:
Publicar un comentario