Autor Tema: Problemas con i2c 16f877a (master) a 16f88 (slave)  (Leído 2285 veces)

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

Desconectado b.stronger

  • PIC10
  • *
  • Mensajes: 45
Problemas con i2c 16f877a (master) a 16f88 (slave)
« en: 26 de Septiembre de 2011, 01:57:17 »
Que tal amigos! saludos nuevamente!! Estoy aqui con nuevas dudas.... ahora con comunicación la i2c.

En fin, ahora estoy intentando realizar la comunicación entre 2 pics, un master 16f877a y un slave 16f88. La idea de primer prueba es mandar 1 dato desde el master al slave.. cosa que ya he logrado realizar GRACIAS a un código que me encontré aqui mismo en TodoPic. PERO dicha comunicación solo puedo realizarla cada 1 segundo. Sé que estoy haciendo muchas cosas mal... y solo necesito que guien mis pasos... q alguno me diga q estoy haciendo mal?? Porque repito... si hace la comunición, simplemente que no puedo realizarla más rapida!!...

El propósito del siguiente programa es q el master envie datos cambiantes cada 1 segundo (tiempo que quiero reducir), y el slave debe de mostrar por el puerto A... pero si cambio el tiempo del master, es decir, cambio de "1000" a "500", los datos no son recibidos correctamente.. y no sé porq??

MASTER::
Código: [Seleccionar]
#include <16F877a.h>
#fuses xt,nowdt
#use delay (clock=4M)

#use rs232(baud=9600, xmit=pin_c6,rcv=pin_c7)
#use i2c(master, sda=pin_c4, scl=pin_c3, fast)

void main()
{
   int8 i;

   while (true)
   {
      for (i=0;i<=20;i++)
      {
            delay_ms(1000);                              // valor a CAMBIAR ... si es menor a 1000, el  slave no responde correctamente
            printf("Outputting: %x\n\r", i);
            i2c_start();
            i2c_write(0xa0);
            i2c_write(i);
            i2c_stop();
      }
   }
}


SLAVE::
Código: [Seleccionar]
#include <16F88.h>
#fuses xt,nowdt
#use delay (clock=4M)

#use rs232(baud=9600, xmit=pin_b5,rcv=pin_b2)
#use i2c(slave, sda=pin_b1, scl=pin_b4, address=0xa0, fast, force_hw)

#byte TrisA=0x85
#byte TrisB=0x86
#byte PortA=0x05
#byte PortB=0x06

byte datoA=0,datoB=0;
#INT_SSP
void ssp_interupt ()
{
   datoA = i2c_read();
   datoB = i2c_read();
   printf("Read byte 2: %x\n\r\n\r", datoB);
}


void main()
{
      TrisA=0x00;
      PortA=0;
      delay_ms(1000);
      printf("Running");

      enable_interrupts(global);
      enable_interrupts(int_ssp);
      while (true)
      {
          PortA=datoB;
       }
}


El código tal cual como está funciona!!.. Sin embargo... me gustaría saber .. qeu debo de hacer para q pueda recibir los datos más rapido...Por cierto el RS232, lo utilizo unicamente para monitoriar q reciba los datos!!

PD:: Y si no puedo disipar mis dudas.. espero que a alguien les sirva mis avances!! Saludos y gracias!!

Desconectado sicnet_dgo

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas con i2c 16f877a (master) a 16f88 (slave)
« Respuesta #1 en: 23 de Enero de 2013, 14:25:02 »
Hola B.Stronger,

Mira, esta misma circunstancia estoy resoviéndola para un proyecto donde voy a comunicar un maestro con 3 esclavos por medio del  bus I2C.
El primero punto a considerar es que tienes un maestro que deberá correr a una velocidad de 20Mhz y un esclavo que corre a una velocidad de 4Mhz, entonces estas diferencias las debemos compensar con retardos entre las instrucciones de escritura o lectura del master.
Te anexo una copia de la rutina de lectura que tengo yo en el master y que lee correctamente los datos desde el esclavo.
void lectura (byte direccion,byte posicion,byte dato_leido)
{
   i2c_start();            // Comienzo de la comunicación
   delay_ms(1);
   i2c_write(direccion);   // Dirección del esclavo en el bus I2C
   delay_ms(1);
   i2c_write(posicion);    // Posición de donde se leerá el dato en el esclavo
   delay_ms(1);
   i2c_start();            // Reinicio
   delay_ms(1);
   i2c_write(direccion+1); // Dirección del esclavo en modo lectura
   delay_ms(1);
   dato_leido=i2c_read(0); // Lectura del dato
   delay_ms(1);
   data2=dato_leido;
   i2c_stop();             // Fin comunicación
   
   if (flag==0)
      {                    //Muestra lectura del primer pic esclavo
         lcd_gotoxy(1,2);
         //lcd_putc(%c data2);
         printf (lcd_putc, "Pos.%d  Dato= %X" posicion,data2);
         flag=++flag;
      }
}

Los retardos de 1ms entre instrucciones, permiten al esclavo estar listo para responder a la siguiente instrucción dentro de la atención a interrupcion.

Espero que te sirva este ejemplo, saludos

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Problemas con i2c 16f877a (master) a 16f88 (slave)
« Respuesta #2 en: 23 de Enero de 2013, 20:54:45 »
Hola compañeros

hace unos meses logre comunicar varios pic por i2c
eran 1 maestro y dos esclavos,
la velocidad me dijeros no es la del clock del micro
sino la del bus,de comunicacion.

mira este hilo:

http://www.todopic.com.ar/foros/index.php?topic=38547.msg320771#msg320771
« Última modificación: 23 de Enero de 2013, 21:01:07 por pajaro »


 

anything