Autor Tema: LIBRERIA I2C XLCD C18  (Leído 3594 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
LIBRERIA I2C XLCD C18
« en: 01 de Septiembre de 2013, 11:52:54 »
Hola a todos!

He creado un post nuevo porque no sé muy bien donde meter esto, así que si este no es el sitio que le corresponde hacedmelo saber.


Hace algún tiempo me dejé escrita una librería para poder operar el típico lcd 2x16 (en realidad cualquiera que venga controlado con un HD44780) a través del bus I2C, utilizando los módulos de ampliación de puertos mediante I2C que puedes comprar de ebay, de tal forma que cualquiera que necesite manejar un LCD por I2C, sólo tenga que comprar el módulo(que además es el más barato que hay en ebay) y a funcionar!

Aquí os dejo el link de mi aporte:

LIBRERÍA I2C XLCD

Por cierto, tengo alguna otra librería más de periféricos I2C, las iré colgando conforme las deje un poco más arregladas, que funcionan, pero están a medias.
Además querría decir que busco colaboradores para acabar las librerías que tengo a medias, cualquera que quera ayudar que lo comente !

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: LIBRERIA I2C XLCD C18
« Respuesta #1 en: 01 de Septiembre de 2013, 15:01:40 »
Cuenta conmigo,dime que librerias te falta terminar y si es posible pasamelo a mi correo:
keydarkman@hotmail.com.

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
Re: LIBRERIA I2C XLCD C18
« Respuesta #2 en: 06 de Septiembre de 2013, 09:08:08 »
Cuenta conmigo,dime que librerias te falta terminar y si es posible pasamelo a mi correo:
keydarkman@hotmail.com.

Si puedes échale un vistazo dentro de la librería I2CXLCD al archivo delayI2CXLCD, que no está tan bien como podría.
Mientras prepararé el resto de las librerías que tengo para que sean un poco más manejables ok?

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: LIBRERIA I2C XLCD C18
« Respuesta #3 en: 08 de Septiembre de 2013, 11:15:48 »
Cuenta conmigo,dime que librerias te falta terminar y si es posible pasamelo a mi correo:
keydarkman@hotmail.com.

Si puedes échale un vistazo dentro de la librería I2CXLCD al archivo delayI2CXLCD, que no está tan bien como podría.
Mientras prepararé el resto de las librerías que tengo para que sean un poco más manejables ok?

No hay dentro de la CARPETA I2CXLCD ningun ARCHIVO llamado delayI2CXLCD verifica tu libreria.
Si tienes alguna simulacion en proteus de como funciona el PC8574, pasamelo para hacer un debugger de todos los archivos .c, saludos.

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
Re: LIBRERIA I2C XLCD C18
« Respuesta #4 en: 09 de Septiembre de 2013, 07:34:19 »
Hola!

Respecto al PCF8574, al menos en la versión de PROTEUS que tengo yo está el modelo completo funcionando perfectamente.
Y sobre el archivo que no está bien del todo me confundí, no lo tenía delante y me equivoqué de nombre, me refería a BusyI2cXLCD.c

Desconectado electroipod

  • PIC16
  • ***
  • Mensajes: 166
Re: LIBRERIA I2C XLCD C18
« Respuesta #5 en: 09 de Septiembre de 2013, 22:23:26 »
Hola!

Respecto al PCF8574, al menos en la versión de PROTEUS que tengo yo está el modelo completo funcionando perfectamente.
Y sobre el archivo que no está bien del todo me confundí, no lo tenía delante y me equivoqué de nombre, me refería a BusyI2cXLCD.c

Por lo que he visto si flag es 1 o 0 siempre va hacer lo mismo entonces mejor seria ponerlo dentro de una funcion, y al retornar que retorne el mismo flag, haber que te parece esta modificacion:

// Written by Raúl Quesada Navarro on 13/07/2013
// Visit: www.Raquena.com

# include<p18cxxx.h>
# include<i2c.h>
# include<delays.h>
# include"I2CXLCD.h"

// La función BusyI2cXLCD se encarga de averiguar si el LCD se encuentra
// ocupado realizando operaciones internas, para evitar interrumpirlo.

void Proceso(void);//Prototipo.
   
unsigned char BusyI2cXLCD()
{

    char flag = 0;
    char i2cData = 0;
          // Creamos una variable donde irá el flag de ocupado del XLCD

    i2cData = i2cData | 0b00100000;     // activamos el pin R/W
    i2cData = i2cData & 0b10111111;     // desactivamos el bit de RS
    WritePCF8574(i2cData);

    DelayFor18TCY();

    i2cData = i2cData | 0b00010000;     // activamos el pin E
    WritePCF8574(i2cData);

    DelayFor18TCY();

    flag = ReadPCF8574();

    flag = flag & 0x08;                     // Nos quedamos sólo con el valor del busy flag.


    // ESTO SE PUEDE ARREGLAR !!!
    // PARA QUE OCUPE MENOS !!!
    // LA ÚNICA PARTE DIFERENTE ES EL RETURN, SE DEBERÍA UNIFICAR.

    Proceso();

    Delay100TCYx(2);
    return flag;

}

void Proceso(void)
{
        i2cData = i2cData & 0b11101111;     // Desactivamos el pin E
        WritePCF8574(i2cData);
        DelayFor18TCY();                    // Esperamos

        i2cData = i2cData | 0b00010000;     // Activamos el pin E
        WritePCF8574(i2cData);
        DelayFor18TCY();                    // Esperamos

        i2cData = i2cData & 0b11101111;     // Desactivamos el pin E
        WritePCF8574(i2cData);

        i2cData = i2cData & 0b11011111;     // Desactivamos el pin R/W
        WritePCF8574(i2cData);

}

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
Re: LIBRERIA I2C XLCD C18
« Respuesta #6 en: 10 de Septiembre de 2013, 11:08:20 »
Hola!

Respecto al PCF8574, al menos en la versión de PROTEUS que tengo yo está el modelo completo funcionando perfectamente.
Y sobre el archivo que no está bien del todo me confundí, no lo tenía delante y me equivoqué de nombre, me refería a BusyI2cXLCD.c

Por lo que he visto si flag es 1 o 0 siempre va hacer lo mismo entonces mejor seria ponerlo dentro de una funcion, y al retornar que retorne el mismo flag, haber que te parece esta modificacion:

// Written by Raúl Quesada Navarro on 13/07/2013
// Visit: www.Raquena.com

# include<p18cxxx.h>
# include<i2c.h>
# include<delays.h>
# include"I2CXLCD.h"

// La función BusyI2cXLCD se encarga de averiguar si el LCD se encuentra
// ocupado realizando operaciones internas, para evitar interrumpirlo.

void Proceso(void);//Prototipo.
   
unsigned char BusyI2cXLCD()
{

    char flag = 0;
    char i2cData = 0;
          // Creamos una variable donde irá el flag de ocupado del XLCD

    i2cData = i2cData | 0b00100000;     // activamos el pin R/W
    i2cData = i2cData & 0b10111111;     // desactivamos el bit de RS
    WritePCF8574(i2cData);

    DelayFor18TCY();

    i2cData = i2cData | 0b00010000;     // activamos el pin E
    WritePCF8574(i2cData);

    DelayFor18TCY();

    flag = ReadPCF8574();

    flag = flag & 0x08;                     // Nos quedamos sólo con el valor del busy flag.


    // ESTO SE PUEDE ARREGLAR !!!
    // PARA QUE OCUPE MENOS !!!
    // LA ÚNICA PARTE DIFERENTE ES EL RETURN, SE DEBERÍA UNIFICAR.

    Proceso();

    Delay100TCYx(2);
    return flag;

}

void Proceso(void)
{
        i2cData = i2cData & 0b11101111;     // Desactivamos el pin E
        WritePCF8574(i2cData);
        DelayFor18TCY();                    // Esperamos

        i2cData = i2cData | 0b00010000;     // Activamos el pin E
        WritePCF8574(i2cData);
        DelayFor18TCY();                    // Esperamos

        i2cData = i2cData & 0b11101111;     // Desactivamos el pin E
        WritePCF8574(i2cData);

        i2cData = i2cData & 0b11011111;     // Desactivamos el pin R/W
        WritePCF8574(i2cData);

}

Cierto! De hecho ya ni me acordaba, pero el comentario que hay escrito en mayúsculas es justo eso lo que significa.
Pero el problema en este caso no es de optimización, la cosa está en que no funciona correctamente, y por eso lo comenté todo y lo sustituí por un Delay.

P.D. Habría que buscar un nombre un poco menos genérico que proceso()...