Microcontroladores: LCD I2C para tus desarrollos (2)  

El circuito es un montaje clásico de conexión, con 4 líneas de datos, un control de contraste mediante P1, un control de tres niveles de iluminación backlight (0, 50 y 100%) para el LCD, controlado por PWM a través de T1 (ampliación a futuro), un conector ICSP para programar el PIC una vez concluido el montaje mecánico de la placa controladora, y algunos capacitores de desacoplo y resistencias de polarización. Como podrás observar, y tal como te habíamos adelantado, el costo adicional al LCD nunca alcanzará el valor comercial de un display LCD - I2C.

   


Podríamos utilizar el clock interno del microcontrolador, pero sería a una frecuencia baja (8 Mhz), tal vez insuficiente para obtener una transferencia de datos a 400 Khz a través del bus. Un cristal de 20 Mhz nos asegura una frecuencia de trabajo ideal para altas velocidades dentro del bus. El hardware es sencillo y no debería presentar demasiadas complicaciones. Además, con cualquier software sencillo puedes desarrollar y construir el circuito impreso (PCB) correspondiente. Generalmente, los modelos comerciales de display LCD con conexión serie traen una placa montada en forma paralela, con separadores plásticos de donde salen y llegan las conexiones de alimentación, tierra y datos, es decir, 5 Volts, GND, SDA y SCL.

El Firmware del PIC
Como es habitual en nuestro caso, no vamos a darte los archivos listos para utilizar y “customizar” a tu gusto. Vamos a compartir contigo los conocimientos que hemos empleado nosotros para lograr el objetivo, pero al trabajo deberás realizarlo tú mismo. En primera medida, porque no queremos que mueras en el desconocimiento de cómo llegar a realizar este diseño. Y en segundo término, porque queremos que lo mejores, lo modifiques, lo replantees desde otro punto de vista y puedas llegar a hacerlo a tu medida y gusto. Luego si lo deseas, puedes compartirlo con nosotros para que mostremos con orgullo tu trabajo de investigación a partir de la ayuda que aquí te brindamos.
No importa cuál sea el lenguaje de programación de microcontroladores que utilices habitualmente; puedes armar la estructura del programa partiendo de los conceptos que te explicaremos de la forma más didáctica que nos sea posible. Ten presente que un programa eficiente requiere de un ajuste de tiempos de transmisión y recepción que siempre deberás respetar. Por ejemplo: cuando le enviemos al LCD (ya transformado en I2C) una instrucción definida, como puede ser “Limpiar Pantalla” (CLS o CLEAR), debemos esperar (según nuestro ejemplo) 30 milisegundos hasta enviar la instrucción siguiente, para darle tiempo al LCD a que recepcione la orden y la ejecute. Debes tener en cuenta, además, que el ejemplo que te proponemos aquí sirve para los LCD que traen el controlador HD44780 o cualquiera display compatible con éste.

Lo primero a tener en cuenta es que utilizaremos dos microcontroladores: uno como maestro y otro como esclavo (Master – Slave). El esclavo es el mostrado en el circuito presentado; se trata del 16F819. Al microcontrolador maestro lo seleccionarás tú cada vez que realices alguna aplicación. Sólo deberás ocuparte de acoplarle apropiadamente un dispositivo I2C adicional que será, en realidad, el microcontrolador que utilizaremos: el 16F819.

Armando la estructura del programa
Recomendación inicial: Imprime o ten a mano el datasheet del PIC para poder comprender mejor este texto o para estar más seguro al armar la estructura de tu programa.

Luego de definir el dispositivo a utilizar, su frecuencia de clock y la conexión del LCD según el circuito propuesto, debes ordenar y configurar los registros que manejan el módulo SSP (los encontrarás en el datasheet del PIC, en la página 71, capítulo 10.0). El SSPCON es el registro con el que vas a determinar el funcionamiento del PIC en modo I2C – Slave, con un direccionamiento de 7 bits. Dentro de este registro también se programa el modo de evitar colisiones de datos dentro del bus, la habilitación de trabajo del bus (Enable) y otros parámetros importantes. El byte o palabra final del registro debe quedar (para un funcionamiento correcto) en ‘00110110. En la figura 2-3 del datasheet, que se encuentra en la página 11, podrás encontrar (en el Bank1, dirección 93h) el registro SSPADD. Este registro se utiliza para escribir en él, al momento de inicializar el sistema, la dirección que tendrá nuestro LCD dentro del Bus. En nuestro caso, hemos adoptado la posición 8, es decir ‘00001000, pero tú utiliza la que desees o te convenga, con tal de que vaya desde 0 a 15 (‘00000000 a ‘00001111) para evitar eventuales conflictos con otros dispositivos colgados al bus. Siempre es interesante dotar al sistema de un mensaje de bienvenida al inicializarlo para asegurar su funcionamiento y correcto arranque. Si lo deseas, puedes agregarle al circuito propuesto un pulsador de RESET ante eventuales arranques fallidos. En el ejemplo que puedes ver en el video, existe un mensaje de bienvenida de 2 segundos que nos sirve de aviso de un arranque seguro y efectivo. También deberás crear una variable BYTE que utilizarás de buffer (donde almacenarás cada palabra de 8 bits que ingrese por el bus) a la que volcarás en el registro SSPBUF (Bank 0, 13h) para su posterior impresión en el LCD.

Una vez que todo esto esté listo, ya tienes el sistema en condiciones de comenzar a recibir datos a través del bus. Luego de recibir un dato válido (que corresponda a nuestra dirección), se levantará la bandera de interrupción SSPIF del registro PIR1 (PIR1.3), y el dato se volcará dentro del registro SSPBUF de manera automática. Luego tú lo transportarás dentro de la variable que hayas creado y lo imprimirás en pantalla. Recuerda que por cada dato recibido y válido debes bajar la bandera SSPIF. Cada byte enviado al LCD (luego de ser cargado en la variable que hace las veces de buffer) será un caracter ASCII, lo que significa que lo que se verá en pantalla es una seguidilla de caracteres apropiadamente enviados. Ten cuidado con esto ya que no todos los displays de las distintas marcas utilizan el mismo mapa de memoria en los símbolos que se encuentran más allá de la dirección 127 del código ASCII. También deberás experimentar con ello al programar el controlador maestro del sistema, leyendo bien la hoja de datos del LCD que uses. Otra alternativa válida es desarrollar un pequeño soft en el controlador maestro, que te devuelva todos los caracteres que posee tu LCD y que te indique en qué posición se encuentran. (Mira el video de demostración). Encontrarás un ejemplo muy útil de cómo lograr el funcionamiento que te estamos explicando en la siguiente página, con su correspondiente código (BASIC). El código realizado por nosotros difiere bastante del mostrado allí, pero puede serte muy útil para ver todos los registros que intervienen en la habilitación y el uso del módulo SSP.

Funciones “extras”
Además de la función elemental de poder escribir en la pantalla del LCD los caracteres recibidos, puedes utilizar caracteres “no útiles” dentro de las direcciones del código ASCII. Nosotros hemos utilizados los números del 1 al 7 para desarrollar las acciones que figuran en la imagen y que también se aprecian en el video. Si el PIC detecta un “1” en la entrada de datos, limpiará la pantalla mediante la impresión de la instrucción CLS. Si recibe un “2”, se ubicará en el primer espacio del primer renglón (o fila). Con un “3” lo hará en el primer espacio del segundo renglón; con un “4”, en el tercer renglón; y con un “5”, en el primer caracter de la cuarta fila. Un byte cargado con el número “6” hará aparecer el cursor de forma intermitente, y un “7” se encargará de borrar el mencionado cursor. ¿Notaste que hablamos de cuatro renglones o filas? Esto significa que el programa que te vamos a dejar para que practiques y para que lo instales en un PIC 16F819 te servirá para construir tu propio LCD / I2C con cualquier tipo de display (compatible con el controlador HD44780). Tendrás la posibilidad de utilizar cualquier display, independientemente de la cantidad de renglones que el mismo posea (1, 2, 3 o 4).

 

 
Montajes  


Con el monitor cardíaco que te presentamos puedes controlar, escuchar y ver tu ritmo cardíaco.


Funciones aplicables al LCD mediante una instrucción de un solo BYTE
 



En este artículo vamos a descubrir que podemos escuchar mucho más que un poco de música en algunas estaciones de FM.



El medidor que te mostramos hoy es capaz de medir dispositivos de pocos pico Faradios hasta varios faradios, con la ventaja de utilizar una única escala que se ajustará en forma automática





 

PIC Maestro
Cuando desarrolles el programa a utilizar en el microcontrolador maestro, ten en cuenta “cómo y cuándo” enviarle los datos a tu nuevo display LCD / I2C. Si utilizas Basic, recuerda que lo hacemos con la siguiente estructura:
 

  • BSTART ‘Abrimos el bus

  • BUSOUT Dirección, [Dato] ‘Enviamos la dirección y luego el dato

  • BUSTOP ‘Cerramos el bus

    Con esta sencilla estructura podremos manejar el LCD. Un ejemplo de uso de la instrucción BUSOUT sería la siguiente:
     

  • BUSOUT %00001000, [“Hola Mundo”]

    Podemos ver que es muy sencillo escribir un texto, es decir, un dato o una cadena de datos. Luego, para limpiar la pantalla, enviaremos el siguiente comando:
     

  • BUSOUT %00001000, [1]

    El “1” enviado significa que el programa del 16F819 debe limpiar la pantalla del LCD. Observa también la estructura diferente al enviar un dato numérico o un string, el cual debe encerrarse entre comillas. Ten en cuenta que, luego de enviar un dato numérico, tendrás que agregar un retardo de 30 milisegundos hasta enviar la siguiente instrucción, ya que en el programa que te dejamos hemos determinado esa condición. Y el último punto importante a tener en cuenta es que cada vez que escribas un renglón, deberás hacerlo ocupando 40 espacios (a pesar que tu LCD sea de 8, 16 o 20 caracteres). Es decir, si deseas escribir “Hola NeoTeo”, deberás hacerlo de la siguiente forma:

  • BUSOUT %00001000, [“ Hola NeoTe

 

Ejemplo de cómo se vería una secuencia de instrucciones hacia el LCD-I2C
 


Debes dejar 40 espacios entre las comillas. ¿Por qué lo hacemos así? Pues muy sencillo. Con el programa que te brindamos, puedes utilizar cualquier tipo de display, hasta incluso los de 4 filas y 40 caracteres. Si hubiésemos limitado las filas a sólo 2, y los caracteres a 16, habría muchos desarrollos en los que no te sería útil el sistema que te brindamos. En cambio, de esta forma, puedes utilizar el LCD que sea, en la aplicación que sea, sin restricciones.

 

 
 
 
 
 
 
 
 
 

Importante: Si lo que encuentras aquí te resulta útil,  ayúdanos a mantener este sitio. Cualquier donación es bienvenida. Tu apoyo nos permitirá acceder a nuevos materiales y a montajes más interesantes y útiles. Gracias por ayudarnos a hacer Servisystem cada día mejor. Tu ayuda será muy importante para nosotros. Gracias.

 

 

 
     
    Pagina Anterior// Servisystem