Autor Tema: BUS i2c pic16f876 y pic16f819  (Leído 2085 veces)

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

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
BUS i2c pic16f876 y pic16f819
« en: 29 de Mayo de 2013, 09:05:52 »
Hola Amigos , estoy tratando de usar esta libreria (creditos de Angelgris) en xc8 con un pic 16f819...mirando un poco me encuentro que el chip que uso AngelGris ..pic16f876 tiene los registros muy parecidos ...por ejemplo el SSPSTAT Y EL SSPCON son identicos , mi problema viene con el SSPCON2 QUE NO ESTA EN EL PIC819 ...ALGUEIN ME DA UNA MANO POR FAVOR

Muchas gracias

Código: [Seleccionar]
   /**************************************************************************
    *      Libreria para protocolo I2C Master por HardWare para HiTech        *
    ***************************************************************************
    
    ***************************************************************************
    *                                                                         *
    * Antes de incluir este archivo en nuestro programa hay que definir       *
    * algunos parametros. Estos son                                           *
    *                                                                         *
    * PIC_CLK        (se usa para calcular el valor de SSPADD)                *    
    * I2C_BAUD       (velocidad de transferencia)                             *
    *                                                                         *
    ***************************************************************************
    
    ***************************************************************************
    *                                                                         *
    * En esta libreria se encuentran las siguientes funciones                 *
    *                                                                         *
    * setup_i2c(char)               (inicializa el puerto I2C)                *
    * start_i2c()                   (envia start, inicia transmision)         *
    * rstar_i2c()                   (envia restart, reinicia transmision)     *
    * stop_i2c()                    (envia stop, termina transmision)         *
    * write_i2c(char)               (envia un byte)                           *
    * read_i2c(char)                (recibe un byte y envia ack o noack)      *
    *                                                                         *
    *  La funcion write_i2c() devuelve 0 si el dispositivo responde o 1 si el *
    * dispositivo no responde.                                                *
    *                                                                         *
    *  A la funcion read_i2c() hay que pasarle 0 si se quiere responder al    *
    * disipositivo o 1 si no se quiere responder                              *
    *                                                                         *
    *  En esta libreria estan definidos los parametros I2C_MASTER, I2C_SLAVE, *
    * I2C_10BIT_ADDRESS. Eston son utilizados en la funcion setup_i2c(char)   *
    *                                                                         *
    *  Tambien estan definidos ACK y NOACK que son los utilizados para        *
    * responder o no al dispositivo                                           *
    *                                                                         *
    ***************************************************************************
    
    /* Ejemplo de configuracion y utilizacion
    
    #define PIC_CLK   10000000   // cristal 10MHz
    #define I2C_BAUD  100000     // velocidad 100 KHz
    #include "HardI2c.c"
    
    void main (void);
    {
      unsigned char respuesta;
      unsigned char dato;  
    
      ......
      ......
      ......
      setup_i2c (I2C_MASTER);
      start_i2c();
      respuesta = write_i2c (0b10101110);    // comunicacion para escribir en una 24C02C
      if (respuesta == ACK)
      {
        write_i2c (0x00);                    // indico la direccion a escribir
        write_i2c (0xF5);                    // escribo el dato F5
        write_i2c (0x06);                    // escribo el dato 06
      }
      stop_i2c();
    
      // colocar un delay necesario para que termine de grabar la memoria
    
      start_i2c();
      respuesta = write_i2c (0b10101110);    // comunicacion para escribir en una 24C02C
      if (respuesta == ACK)
      {
        write_i2c (0x00);                    // indico la direccion de memoria
        rstart_i2c();                       // reinicio la transmisión
        respuesta = write_i2c (0b10101111);  // comunicacion para leer en una 24C02C
        if (respuesta == ACK)
        {
          dato = read_i2c (ACK);             // leo el dato y respondo
          dato = read_i2c (NOACK);           // leo el dato y no respondo
        }
      }
      stop_i2c();
    }
    
    */
    
    #if defined (PIC_CLK) && defined (I2C_BAUD)
    
     #define I2C_MASTER          0x38
     #define I2C_SLAVE           0x26
     #define I2C_10BIT_ADDRESS   0x01
    
     #ifndef ACK
       #define ACK   0
     #endif
     #ifndef NOACK
       #define NOACK 1
     #endif
    
    
     void setup_i2c (char x)
     {
       TRISC3 = 1;
       TRISC4 = 1;
       SSPSTAT = 0;
       SSPCON = x;
       SSPCON2 = 0;
       if (SSPM3 == 1) SSPADD = (unsigned char)((PIC_CLK/(4*I2C_BAUD)) - 1);
     }
    
     char start_i2c (void)
     {
       while (( SSPCON2 & 0x1F ) || RW );
       SEN = 1;
       return !BCLIF;
     }
    
     void rstart_i2c (void)
     {
       while (( SSPCON2 & 0x1F ) || RW );
       RSEN = 1;
     }
    
     void stop_i2c (void)
     {
       while (( SSPCON2 & 0x1F ) || RW );
       PEN = 1;
     }
    
     char write_i2c (unsigned char data)
     {
       if (SSPM3 == 1)
       {
         while (( SSPCON2 & 0x1F ) || RW );
         SSPBUF = data;
         while (RW == 1);
         return ACKSTAT;
       }
       else
       {
         SSPBUF = data;
         CKP = 1;
         return 0;
       }
     }
    
     unsigned char read_i2c (unsigned char respuesta)
     {
       unsigned char dato;
    
       if (SSPM3 == 1)
       {
         while (( SSPCON2 & 0x1F ) || RW );
         RCEN = 1;
         while (( SSPCON2 & 0x1F ) || RW );
         dato = SSPBUF;
         while (( SSPCON2 & 0x1F ) || RW );
         ACKDT = respuesta;
         ACKEN = 1;
         return dato;
       }
       else
       {
         dato = SSPBUF;
         return dato;
       }
     }
    #else
     #error Faltan definir parametros
    #endif
« Última modificación: 29 de Mayo de 2013, 09:08:25 por Rseliman »
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #1 en: 29 de Mayo de 2013, 15:27:10 »
Estoy un poco ocupado pero trataré de estudias el datasheet del PIC en cuestión y ver en que puedo ayudarte.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #2 en: 29 de Mayo de 2013, 15:37:05 »
Estoy un poco ocupado pero trataré de estudias el datasheet del PIC en cuestión y ver en que puedo ayudarte.


Muchas gracias Angel Gris , me estoy volviendo loco !!!!!
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #3 en: 29 de Mayo de 2013, 16:03:52 »
  Recién paré un momento y le pequé una hojeada al datasheet. El PIC que quieres utilizar no tiene I2C Master por HardWare y por lo tanto sos vos y tu programa quien tiene que ocuparse de todo.

  El programa se tiene que ocupar de generar los pulsos adecuados en los pines SDA y SCL para la transmisión. Por supuesto tiene que cumplir con los tiempos del protocolo I2C.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #4 en: 29 de Mayo de 2013, 16:30:47 »
 Recién paré un momento y le pequé una hojeada al datasheet. El PIC que quieres utilizar no tiene I2C Master por HardWare y por lo tanto sos vos y tu programa quien tiene que ocuparse de todo.

  El programa se tiene que ocupar de generar los pulsos adecuados en los pines SDA y SCL para la transmisión. Por supuesto tiene que cumplir con los tiempos del protocolo I2C.

El problema es que no existe nada de info para este pic en i2c  , estoy pensando seriamente en cambiar de pic !!! antes de volverme loco
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #5 en: 29 de Mayo de 2013, 18:20:47 »
  Es que al tener que ocuparse el programa de hacer todo no necesariamente tiene que ser para un pic en particular.

  Básicamente la idea es que te tienes que ocupar de ver como es que se genera un Start. Luego generar manualmente tanto el pulso en SCL como el dato en SDA.

  Sería implementar I2C por SoftWare.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #6 en: 29 de Mayo de 2013, 22:28:07 »
  Es que al tener que ocuparse el programa de hacer todo no necesariamente tiene que ser para un pic en particular.

  Básicamente la idea es que te tienes que ocupar de ver como es que se genera un Start. Luego generar manualmente tanto el pulso en SCL como el dato en SDA.

  Sería implementar I2C por SoftWare.

Disculpame sigo sin entender ....el hecho de que el integrado tenga bus de i2c , significa que hace mucho por hardware verdad ?? dejandole a l usuario lo mas facil , no como los casos de los pics que no tienen bus i2c y que hay que programar toda la secuencia completa del trabajo de i2c ...ahora en este caso ...que es lo que tengo que programar ?? para que tiene bus i2c este integ ??

Gracias y disculpa la ignorancia ...no tengo demasiada experiencia en pics ...y menos en i2c

Saludos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: BUS i2c pic16f876 y pic16f819
« Respuesta #7 en: 30 de Mayo de 2013, 09:12:56 »
  Tiene bus I2C pero según el datasheet sólo tiene hardware para la implementación como esclavo. La implementación como maestro hay que hacerla a mano.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything