YoReparoMicrocontroladores y sistemas digitales → Problemas red i2c

Problemas red i2c

Hola a todos por favor necesito una ayuda con la red i2c, requiero conectar dos o mas pic en red i2c, uno master y como minimo uno slave, y que la comunicacion sea bidireccional, que el slave pueda enviar un dato en cualquier momento del codigo e igualmente reciba . El master tambien puede recibir o solicitar un dato desde el slave en cualquier momento.

por favor me ayudan con un cidigo que funcione pues yo he trabajado en ello pero no logro establecer una comunicion estable se me bloquea o no me envia nada.

gracias...
   
26/1/2012 08:39AM
oace50
¿Sabes la respuesta?
Buenas tardes, nunca he utilizado el modulo MSSP interno del pic porque he escuchado que es complicado y que genera retardos y problemas de sincronismo si no se configura bien. Te anexo el enlace para descargar una librería para controlar manualmente el I2C. En la misma librería se explica como utilizar cada rutina.

http://www.sendspace.com/file/cj0dnw

Saludos Cordiales!
Armando Almarales
   
26/1/2012 12:27PM
Fofo almarales
pero estoy trabajando con ccs
   
30/1/2012 12:25PM
oace50
Desarrollar mas la pregunta, formato de la trama (7 o 10 bits) y si es pooling o direccionamiento. Tambien cableado y codigo

Saludos y suerte
   
30/1/2012 08:39PM
daniel zanella
El formato es de 7 bits, lo quen me pasa es que envia bien desde master a slave, pero cuando envio desde el slave al master envia el dato pero el slave no envia ack, por ende se bloquea este slave.

Lo que necesito es establecer una comunicacion bidireccional entre minimo dos pic, que en cualquier momento el master pueda enviar o recibir un dato al slave con un pulsador o instruccion, y que los pics puedan realizar otras tareas.

no se como adjuntar un archivo, por ende copio los codigos y una imagen del circuito.

master:

#include <16F877A.h>
#device adc=10
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=Cool
#use i2c(MASTER,sda=PIN_C4,scl=PIN_C3,force_hw)
#fuses HS,NOWDT,NOPROTECT,NOLVP
#include <lcd_d.c>


int8 dato=50, data=0;

void main()
{
lcd_init();

while (true)
{

if(input(PIN_b0)==1)
{

i2c_start();
i2c_write(0xa0); // Dirección del dispositivo
//i2c_write(dato); // Envía el dato al dispositivo
delay_ms(500);
i2c_start(); // Reinicio
i2c_write(0xa1); // Cambia dirección del dispositivo
data=i2c_read(0); // Lee del esclavo
i2c_stop();

}

if(input(PIN_b1)==1)
{
delay_ms(1000);
i2c_start();
i2c_write(0xa0); // Dirección del dispositivo
i2c_write(dato); // Envía el dato al dispositivo
delay_ms(500);
i2c_stop();
dato=dato+10;
}


//-----------------
lcd_gotoxy(1,1);
printf(lcd_putc, "slave=%4u",data);
lcd_gotoxy(1,2);
printf(lcd_putc, "master=%4u",dato);

delay_ms(10);
}

}



slave:


#include <16F877a.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xA0)
//#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address = 0xa0,force_hw)
#include <lcd_d.c>
#use standard_io (b)
int8 master=0,adc_result=0;
int1 dato=0;

//--------------------------------------
#INT_SSP
void ssp_interupt (){
BYTE state;

state = i2c_isr_state();

if(state < 0x80) //Master is sending data
{
master=i2c_read();
}
if(state >= 0x80) //Master is requesting data
{
i2c_write(adc_result);
delay_us(20);

}
}
//-----------------------------------





//======================================
void main ()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);
adc_result = read_adc();
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
lcd_init();




while(1)
{


lcd_gotoxy(1,1);
printf(lcd_putc, "AN0 %4u \n\r", adc_result);
lcd_gotoxy(1,2);
printf(lcd_putc, "master%4u \n\r", master);
adc_result = read_adc();
delay_ms(1000);

}


}
   
09/2/2012 07:22AM
oace50

Bienvenido/a!

YoReparo es la mayor comunidad sobre tecnología. Colaboramos y compartimos información para solucionar todo tipo de problemas técnicos.

Para participar solo hace falta que te registres gratis aquí

Miembros / Expertos