miércoles, 5 de junio de 2019

I2C Utilizar un LCD con PCF8574

Modulo PCF8574x con el PIC16F

Antes que nada quiero agradecer tu visita a este blog relacionado con la programación de micro-controladores PIC, En esta ocasión veremos como utilizar la tan conocida pantalla LCD utilizando únicamente dos lineas para datos gracias al protocolo serial I2C y el chip PCF8574x.

El objetivo de esta sección enviar mensajes a la pantalla LCD utilizando las dos lineas de comunicación serial MSSP que posee el PIC16F887.

La programación se realizara utilizando el compilador XC8 y el entorno
MPLABX disponibles en la pagina de microchip de forma gratuita, ademas también necesitara de los siguientes archivos peripheral.h y peripheral.c que contienen procedimientos y funciones básicas para el PIC16F887, puede prescindir de ellos o incluso modificarlos a su criterio si posee conocimientos sobre los registros SFR y sus respectivo bits.
 
Al finalizar la sección les dejare el enlace para descargar la carpeta del proyecto que contiene todos los archivos citados.

Modulo PCF8574x con el PIC16F
 
Para establecer una comunicación serial con el chip PCF8574xlos microncontroladores PIC cuentan con el modulo MSSP(Master Sync Serial Port),  el cual posibilita implementar dos protocolos muy utilizados que son SPI(Serial Peripheral Interface) e I2C(Inter-Integrated Circuit). En nuestro programa utilizaremos los archivos i2c.h y i2c.c que poseen las funciones y procedimientos necesarios del protocolo I2C, y tambiénlos archivos pcf8574.h y pcf8574.c que incluyen los procedimientos necesarios para comunicarnos con el chip PCF8754.


Paso 1. Sobre el Modulo PCF8574x.

I2C es un protocolo serial desarrollado por Phillips Semiconductors en la década de los 80, y fue concebido principalmente para comunicar dispositivos que están montados en un mismo sistema o circuito impreso.



El chip PCF8574 fabricado por Texas Instrument es un expansor paralelo de 8 bits controlado por I2C que opera a una velocidad estándar de 100KHz, diseñados para proveer monitoreo y control serial de forma fácil y económica. Existen dos variantes de este chip que son el PCF8574 y PCF8574A que se diferencian únicamente por el rango o mapa de dirección que pueden utilizar conforme a los valores lógicos en sus pines A2:A0.
 

Una gran ventaja de este protocolo es que establece una interfaz bidireccional maestro esclavo de hasta 128 dispositivos, aunque en la practica cada dispositivo limita su rango de asignación a un determinado mapa que puede ser configurado de forma externa o mediante instrucciones sobre el mismo protocolo.



Implementar el bus I2C con el chip PCF es bastante simple, si observa la figura solo se requiere utilizar resistencias pull-up por cada pin del microcontrolador, establecer la dirección de cada dispositivo conectado y su respectiva alimentación.

Ahora si lo que se necesita es controlar una pantalla LCD sera necesario implementar el siguiente esquema de circuito.
 


Algo interesante es que este circuito esta disponible como un modulo genérico producido para aplicaciones de prototipado rápido, y goza de popularidad popular por su bajo costo económico($us. 3), incluso planteando comprar los elementos por separados no se justifica el precio por el trabajo y tiempo necesario para el montaje. Salvo que se trate de un producto final.

 

Por defecto este modulo tiene las lineas A2:A0 con nivel lógico alto que define una dirección de 27h (PCF8574) y 3Fh(PCF8574A); Si requiere agregar mas dispositivos o modificar la dirección necesitara soldar o conectar las siguientes lineas o pads en el circuito.


Otro detalle es que el modulo ya cuenta con las resistencias pull-up requeridas por la interfaz y no sera necesario agregar estas resistencias incluso si utiliza otros dispositivos o sensores I2C.


Paso 2. Conectar el Modulo al PIC16F.



Solo necesitara identificar y conectar las cuatro lineas que posee el modulo, dos corresponden a la alimentación(5V/GND), y dos para la comunicación SDA(datos) y SCL(reloj). Muchas pantallas LCD cuentan con una luz de retroiluminacion(Backlight) que puede ser controlador a través de la interfaz siempre que coloque un puente(jumper) en el conector J2. 
 
El modulo también posee un potenciómetro que permite ajustar el contraste que la pantalla, deberá establecer un valor adecuado al momento de ensayar el programa.


Paso 3. Programación y envió de mensajes.

A fin de facilitar la rápida implementación del modulo en nuestra aplicación, se crearon los siguientes procedimientos y funciones incluidas en el archivo pcf8574.h y pcf8574.c. Se deberá incluir la cabecera y las siguientes definiciones al inicio del programa:

  #include "peripheral.h"
  #include "i2c.h"
  #define PCFADDR 0b01001110 //Dirección 27h bit0=R/W
  #include "pcf8574.h"


El campo de dirección PCFADDR dependerá de los valores lógicos en los pines A2:A0 del chip PCF8574, y se obtendrá conforme al siguiente formato de direccionamiento I2C.
 1. Para un Modulo PCF8574A

 2. Para un Modulo PCF8574

Ahora mostraremos la lista de los procedimientos que podemos utilizar para enviar mensajes a nuestra pantalla LCD.
  • PCFSetupLCD(char mode): Inicializa el modulo y la pantalla, como parámetro obligatorio deberá especificar el modo de operación en LINES1(una linea) o LINES2(multi-linea) .
  • PCFSetLCD(char cmd): Este procedimiento sirve para ejecutar las siguientes instrucciones del controlador de pantalla:  
           - DON/DOFF: Enciende y Apaga la Pantalla            
           - CURSOR_ON/CURSOR_OFF: Oculta o muestra el cursor
           - BLINK_ON/BLINK_OFF: Activa o desactiva el destello del puntero
           - CLEAR: Limpia la pantalla
           - HOME: Retorno el cursor a la posición inicial
  • PCFWritecharLCD(char data): Este procedimiento mostrara un dato o carácter en la posición actual del cursor.
  • PCFWriteLCD(char *str): Muestra en la pantalla una cadena o arreglo de caracteres almacenados en la memoria de datos, el mensaje iniciara desde la posición del cursor. Puede utilizar la variante PCFPutsLCD para cadenas almacenadas en la memoria de programa.
  • PCFGotoLCD(char addr): Posiciona el cursor en la dirección GCADDR de la pantalla LCD, puede usar la variante PCFGotolnLCD para indicar la posición inicial de cada linea o fila de la pantalla LCD. 
        Las direcciones iniciales de la pantalla son las siguientes:
        - 0x00: Linea 0 Posición inicial de la primera fila
        - 0x40: Linea 1 Posición inicial de la segunda fila
        - 0x14: Linea 2 Posición inicial de la tercera fila
        - 0x54: Linea 3 Posición inicial de la cuarta fila
Por ejemplo si deseo escribir el mensaje hola al inicio de la segunda linea (0x40 linea 1) puedo codificar lo siguiente:
PCFGotolnLCD(1); //Seg
    PCFWriteLCD("Ḧola");
 
Ahora si deseo escribir el mensaje al centro de la linea, debo    considerar que la palabra "Hola" posee cuatro letras y la pantalla permite visualizar hasta 16 posiciones, entonces podría codificar los siguiente:
    PCFGotoLCD(0x46); //0x40 + 6 posiciones
    PCFWriteLCD("Hola");
  • PCFSetLED(char mode): Permite encender o apagar la luz de fondo de la pantalla, si el parámetro es 1= Activa y si es 0=desactiva.


Paso 4. Prueba y Simulación.


Ahora escribiremos un pequeño programa para poner en practica y demostrar el uso de una pantalla LCD con este modulo utilizando los procedimientos previamente descritos.

El siguiente código describe un programa que muestra un mensaje inicial en la primera linea y el valor de un contador de segundos en la segunda linea.
  #pragma config FOSC = INTRC_NOCLKOUT, WDTE = OFF, LVP = OFF
  #include <xc.h>
  #include <stdio.h>
  #define _XTAL_FREQ 4000000
  #include "peripheral.h"
  #include "i2c.h"
  #define PCFADDR 0b01001110 //Dirección PC8574 27h
  #include "pcf8574.h"
  char seg = 0, msg[16];
  void main()
  {
    OSCSetup();
    ANSEL = 0;
    ANSELH = 0;
    I2CSetup(I2CSTD); //Inicializa el MSSP
    PCFSetupLCD(LINES2); //Inicia el LCD
    PCFSetLED(1); //Enciende la luz de fondo
    PCFGotoLCD(0x02); //Coloca el cursor en la posición 2 de la fila 0
    PCFPutsLCD("** U.E.B **"); //Muestra el mensaje
    PCFSetLCD(DON & CURSOR_ON & BLINK_OFF);  //Muestra el cursor
    while(true)
    {
        __delay_ms(1000);
        seg = seg + 1; //Incrementa el contador de segundos
        if(seg > 59) seg = 0; //Reinicia el contador de segundos
        PCFGotoLCD(0x40); //Coloca el cursor en la posición 0 de la fila 2
        sprintf(msg, "SEG:%02u", seg); //Cadena personalizada
        PCFWriteLCD(msg); //Muestra la cadena con valores del segundo
    }
}

3.Ensayo del programa con un PIC16F886


Paso 5. Conclusiones y Recomendaciones.

Luego de hacer la demostración del programa podemos concluir que podemos implementar fácilmente este modulo I2C para ahorrarnos entre 4 y 6 lineas o pines del PIC. Si bien la librería solo contiene procedimientos básicos para mostrar mensajes, con un mayor conocimiento de las instrucciones del controlador LCD es posible realizar modificaciones que permitan efectuar operaciones menos frecuentes como ser desplazamientos y generación de caracteres personalizados.
 
Este es el enlace para descargar el ejemplo P8574P16F (MPLABX v5.45 compilador XC8 v1.45)

Esperando que este pequeño aporte te pueda servir de algo, agradezco una vez mas tu visita al blog.

Pablo Zárate Arancibia
Ingeniero Electrónico
pablinzte@gmail.com

3 comentarios: