Hola como va, ya logre comunicar 2 pic's ahora agregue un tercero..la comunicacion se da entre solo 2 pic's el otro esclavo no logro que me reconozca su direccion no se porque no da el ACK cosa q el otro si lo hace para el otro elegi 0xb0 y nada lei en la pag. 84 del data y dice de porque puede ser q no da el ACK este esclavo y dice:
There are certain conditions that will cause the MSSP
module not to give this ACK pulse. These are if either
(or both):
a) The buffer full bit BF (SSPSTAT<0>) was set
before the transfer was received.
b) The overflow bit SSPOV (SSPCON<6>) was set
before the transfer was received.
If the BF bit is set, the SSPSR register value is not
loaded into the SSPBUF, but bit SSPIF and SSPOV are
set. Table 9-2 shows what happens when a data transfer
byte is received, given the status of bits BF and
SSPOV. The shaded cells show the condition where
user software did not properly clear the overflow condition.
Flag bit BF is cleared by reading the SSPBUF register,
while bit SSPOV is cleared through software.
q por lo poco q entendi quiere decir q antes q se llene el buffer se han seteado el bit BF y el bit de overflow.. los limpie antes y nada sigue = alguna idea de lo q puede estar pasando?Grax.
#include <16f877a.h>
#fuses HS,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWDT
#use delay(clock=20000000)
#include <flex_lcd.c>
#use standard_io(c)
#use i2c(MASTER, SDA=PIN_C4, SLOW, SCL=PIN_C3, NOFORCE_SW)
int contador=0;
main()
{
lcd_init();
set_tris_b(0b00000111);
enable_interrupts(GLOBAL);
enable_interrupts(int_ext);
lcd_putc ("Enviando..");
while(TRUE)
{
if(!input(PIN_B1)) //Manda el dato en contador si se presiona 'enviar'.
{
while(!input(PIN_B1))
{
}
i2c_start();
if(i2c_write(0xa0))
{
i2c_stop();
}
else
{
i2c_write(contador-1);
i2c_stop();
}
}
if(!input(PIN_B2)) //Manda el dato en contador si se presiona 'enviar'.
{
#asm
bcf 3,5
bcf 91,6
bcf 94,0
#endasm
while(!input(PIN_B2))
{
}
i2c_start();
if(i2c_write(0xb0))
{
i2c_stop();
}
else
{
i2c_write(contador-1);
i2c_stop();
}
}
}
}
#int_ext
RSI()
{
while(!input(PIN_B0))
{
}
lcd_gotoxy(1,1);
printf(lcd_putc,"\fDato a enviar:%d",contador++); //Se muestra en pantalla la cuenta alcanzada cada vez q se actualiza.
}
Eslave1
#include <16f877a.h>
#fuses HS,PUT,BROWNOUT,NOLVP,NOWDT,NOPROTECT
#use delay(clock=20000000)
#include <flex_lcd.c>
#use standard_io(c)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0xa0, NOFORCE_SW)
int dato;
main()
{
lcd_init();
lcd_putc("Esperando");
while(1)
{
if(i2c_poll())
{
dato=i2c_read();
lcd_gotoxy(1,1);
printf(lcd_putc,"\fDato recibido:%d",dato);
}
}
}
Esclavo2
#include <16f877a.h>
#fuses HS,PUT,BROWNOUT,NOLVP,NOWDT,NOPROTECT
#use delay(clock=20000000)
#include <flex_lcd.c>
#use standard_io(c)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0xb0, NOFORCE_SW)
int dato;
main()
{
lcd_init();
set_tris_c(0xff);
lcd_putc("Esperando");
while(1)
{
#asm
bcf 3,5
bcf 91,6
bcf 94,0
#endasm
if(i2c_poll())
{
dato=i2c_read();
lcd_gotoxy(1,1);
printf(lcd_putc,"\fDato recibido:%d",dato);
}
}
}