Autor Tema: I2c master slave  (Leído 1737 veces)

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

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
I2c master slave
« en: 13 de Julio de 2005, 11:52:00 »
Hola todopic! Llevo tiempo intentando sin exito la comunicacion i2c con un pic 16f877 (maestro) y un 16f876 (esclavo). El esclavo se encarga de captar distina informacion a traves de sensores, y el maestro ha de sacar esta informacion por un LCD. Por lo tanto lo que necesito es que el master lea el valor de distintas variables del slave a traves de i2c. La verdad es que he visto varios ejemplos pero ando muy perdido. ALguien me puede explicar como hacer esta transmision de datos?? Salu2 y gracias de antemano.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: I2c master slave
« Respuesta #1 en: 14 de Julio de 2005, 12:22:00 »
Bueno, que os parece si os dejo el codigo que estoy intentando?? Seguro que esta lleno de disparates pero es que no tengo los conceptos claros. COn esto pretendo leer la informacion que hay en el buffer del slave.

Codigo:

#include <16f877.h>
#use delay (clock=4000000)
#include <lcd.c>
#use i2c (master, sda=pin_C4, scl=pin_c3)
#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8
#byte port_e=9

#org 0x1F00, 0x1FFF void loader16F877(void) {}
static int a,b,c=25,d=15,e,f;

void main()
{
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
set_Tris_d(0);
port_a=0;
lcd_init();
   while(1)
      {
lcd_putc("f"Giño;
printf(lcd_putc," c=%i a=%i ",c,a);
delay_ms(5000);
i2c_start();
i2c_write(0xa0); //direccion de slave
a=i2c_read(0x00); //leo buffer
delay_ms(10);
b=i2c_read(0x01);
delay_ms(10);
c=i2c_read(0x02);
delay_ms(10);
d=i2c_read(0x03);
delay_ms(10);
e=i2c_read(0x04);
delay_ms(10);
f=i2c_read(0x05);
i2c_stop();
printf(lcd_putc," c=%i a=%i",c,a);
      }
}
///////////////////////////////////////////////////////////////////////////////////// slave

#include <16f876.h>
#org 0x1F00, 0x1FFF void loader16F876(void) {}
#use delay (clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)

typedef enum {NOTHING, CONTROL_READ,
              ADDRESS_READ, READ_COMMAND_READ} I2C_STATE;

I2C_STATE fState;
BYTE address, buffer[0x10];


#INT_SSP
void ssp_interupt ()
{
   BYTE incoming;

   if (i2c_poll() == FALSE) {
      if (fState == ADDRESS_READ) {  //i2c_poll() returns false on the
         i2c_write (buffer[address]);//interupt receiving the second
         fState = NOTHING;           //command byte for random read operation
      }
   }
   else {
      incoming = i2c_read();

      if (fState == NOTHING){
         fState = CONTROL_READ;
      }
      else if (fState == CONTROL_READ) {
         address = incoming;
         fState = ADDRESS_READ;
      }
      else if (fState == ADDRESS_READ) {
         buffer[address] = incoming;
         fState = NOTHING;
      }
   }
}

int i;
void main ()
{
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
 
 
   fState = NOTHING;
   address = 0x00;
   for (i=0;i<0x10;i++)
      buffer = 0x00;

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);

   while (TRUE)
   {
   buffer[0x00]=1;
   buffer[0x01]=2;
   buffer[0x02]=3;
   buffer[0x03]=4; //doy valores al buffer para luego poder leerlos
   buffer[0x04]=5;
   buffer[0x05]=6;
   buffer[0x06]=7;
   buffer[0x07]=8;
   buffer[0x08]=9;
   }
   
}




Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: I2c master slave
« Respuesta #2 en: 17 de Julio de 2005, 09:57:00 »
Nadie le puede echar un vistazo?? Es que de esto no tengo mucha idea, y en clsase de I2c master-slave no vamos a dar nada. Para aprender solo me queda confiar en su buena voluntad.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: I2c master slave
« Respuesta #3 en: 29 de Agosto de 2005, 11:25:00 »
Con los gurus que hay en el foro, nadie ha enviado la info recogida por un slave hacia un master?? no me lo creo....Llorica

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: I2c master slave
« Respuesta #4 en: 07 de Septiembre de 2005, 03:15:00 »
Vi por otro post que lo resolviste Sonrisa Gigante Haber si pegas el codigo por este hilo, ya me tenias intrigado por que no iva, y sobre todo explica el porque Sonrisa

Fijo que era cualquier chorra, como siempre pasa ... Avergonzado
Si juegas contra el mejor, pierdes como los demás.

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: I2c master slave
« Respuesta #5 en: 07 de Septiembre de 2005, 06:50:00 »
A ver, estos dias he estado leyendo sobre i2c y me he enterado mejor de como funciona el protocolo, a parte que viendo varios ejemplillos he podido ver como hacerlo. El problema estaba en la forma de acceder al buffer del slave, ya sea para leer o escrivir, en mi caso la escritura no era el problema, el problema era de lectura.
Para leer correctamente el buffer debe d hacerse de esta forma
   i2c_start();
   i2c_write(address);  // direccion de slave
   i2c_write(pos);        
   i2c_start();
   i2c_write(address+1);
   a=i2c_read(0);
   i2c_stop();

Para escribir debe hacerse de esta forma
   
   i2c_start();
   i2c_write(address); // direccion de slave
   i2c_write(pos);        // posicion del buffer
   i2c_write(data);      //dato
   i2c_stop();