lunes, 30 de marzo de 2015

Biblioteca LCD

Como se expuso en la entrada anterior, se ha implementado una biblioteca para el control de la LCD de Nokia (controlador PCD8544). En esta entrada voy a explicar las principales características de esta biblioteca, el trabajo realizado y el que queda por hacer.

Interfaz con el LCD

Comenzamos describiendo cómo nos comunicamos con el LCD. Los dos pines más importantes son los de MOSI (o data) y D/C (Datos/Comandos). El es por dónde el LCD recibe los datos mediante un protocolo SPI, el segundo pin indica cuando el dato enviado es un valor de un pixel o un comando de control del LCD. La pantalla tiene un pequeño conjunto de comandos sencillos para seleccionar la posición del pixel a escribir, variar el contraste, invertir o borrar la pantalla, etc.

Independencia

Esta biblioteca no depende del Hardware donde se utilice. Esto se consigue delegando la implementación de todas las funcionalidades dependientes del Hardware al usuario. Así, el uso de la biblioteca no está limitado a una Hardware en particular. Para adaptarlo a una u otra placa de desarrollo hay que implementar las funciones de la cabecera "lsd_bsp.h". Internamente, la biblioteca utilizará esta funciones para controlar la pantalla.

Las funciones principales que se delegan son las tres siguientes:
  • void LCD_BSP_send(uint8_t* data, uint16_t size): El envío de datos mediante protocolo SPI. Esta cabecera junto con las funciones de espera, permite al usuario una total libertad a al hora de elegir la forma de enviar los datos (SPI, SPI+DMA, bit banging...).
  • void LCD_BSP_waitUntilTXA(): Esperar hasta que se permita una nueva transmisión. Delegar las funciones de espera son el fundamento del soporte para RTOS.
  • void LCD_BSP_waitUntilTXC(): Esperar hasta que se haya completado la transmisión. Delegar las funciones de espera son el fundamento del soporte para RTOS.

También es necesario implementar las siguientes funciones para el manejo de pines e inicialización:
  • void LCD_BSP_init(): Permite al usuario inicializar los periféricos que vaya a necesitar: SPI, DMA, timer, etc
  • void LCD_BSP_RST(): Debido a que es necesario gernerar un pulso de una determinada duración, en un pin específico; se delega la implementación de esta acción.
  • void LCD_BSP_setCE(uint8_t state): Establecer el estado (voltaje alto o bajo) del pin CE es una acción dependiente del Hardware.
  • void LCD_BSP_setD_C(uint8_t state): Establecer el estado (voltaje alto o bajo) del pin D/C es una acción dependiente del Hardware.
  • void LCD_BSP_setLIGHT(uint8_t state): Muchas pantallas vienen con unos LEDs para iluminarla. Si se desea, se debe implementar el control de los mismos.

RTOS friendly

Como ya se ha comentado, esta biblioteca se puede integrar adecuadamente con un RTOS. Esto se consigue delegando la implementación de las funciones de espera. En ellas, el usuario podrá elegir qué hacer mientras espera utilizando las funcionalidades del RTOS (semáforos, mensajes, etc). Así se posibilita realizar un cambio de tarea durante las esperas, en lugar de hacer una espera activa.

Funcionalidades

La biblioteca no está completa y las funcionalidades que implementa ahora mismo son solamente de inicialización y control del LCD, y escritura y envío de un buffer a la pantalla. Ya se está trabajando en la implementación de una "biblioteca gráfica" con algoritmos para dibujar líneas, círculos, rectángulos y demás figuras geométricas.

¡Colabora!

Esta biblioteca es  libre con licencia GPL. Si estás interesado te animo a colaborar creando un fork del repositorio y haciendo un pull-request, o enviándome un parche a carlosfg <arroba> riseup <punto> net

No hay comentarios:

Publicar un comentario