buen día.
acudo a ustedes con esta duda:
estoy empezando con i2c y he logrado la comunicación uno a uno sin problemas con estos pics, ahora bien mi problema se sale de control cuando intento hacer una simple petición de lectura a 2 esclavos desde un maestro.
el problema es que no envían datos los esclavos, lo he estado probando mediante un osciloscopio en proteus y resulta que los esclavos jamas contestan D:, tienen ustedes alguna idea del por qué?
adjuntando aquí el código del maestro:
y aquí el del primer esclavo: (NOTA: los esclavos solo tienen de diferencia el address y el dato
que envían.)
a continuación el segundo esclavo:
cualquier pregunta o atención al código o tema queda agradecida desde antemano.
acudo a ustedes con esta duda:
estoy empezando con i2c y he logrado la comunicación uno a uno sin problemas con estos pics, ahora bien mi problema se sale de control cuando intento hacer una simple petición de lectura a 2 esclavos desde un maestro.
el problema es que no envían datos los esclavos, lo he estado probando mediante un osciloscopio en proteus y resulta que los esclavos jamas contestan D:, tienen ustedes alguna idea del por qué?
adjuntando aquí el código del maestro:
Código:
#include <18F4550.h>
#use delay (clock = 4M)
#use i2c (MASTER,SDA = pin_c0, SCL = pin_c2)
#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b0, rcv = pin_b1)
void main () {
unsigned int x,y=0,r;
while (true)
{
i2c_start();
i2c_write(0xA1);//direccion del esclavo "a" con bit r/w "1" de lectura.
x = i2c_read(); //lee sclavo 1
i2c_stop();
//delay_ms(10);
/*
i2c_start();
i2c_write(0xB1);//direccion del esclavo "b" con bit r/w "1" de lectura.
y = i2c_read(); //lee esclavo 2
i2c_stop();*/
printf("\rSlave A = %d ",x);
printf("\rSlave B = %d ",y);
printf("\rVuelta ============> %d ",r);
delay_ms(1000);
r++;
}
}
que envían.)
Código:
#include <18F4550.h>
#use delay (clock = 4M)
#use i2c (SLAVE,SDA = pin_b0, SCL = pin_b1, ADDRESS = 0XA0,force_hw)
unsigned int c = 0,state = 0;
#INT_SSP
void sspinterupt()
{
state = i2c_isr_state();
if(state == 0x80)
{
output_high(PIN_d5);
delay_ms (500);
output_low(PIN_d5);
delay_ms(500);
i2c_write(c);
//delay_ms(10);
//i2c_write(data1);
// delay_ms(10);
}
}
void main()
{
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
while (true)
{
delay_ms(1000);
c++;
}
}
Código:
#include <18F4550.h>
#use delay (clock = 4M)
#use i2c (SLAVE,SDA = pin_b0, SCL = pin_b1, ADDRESS = 0XA0,force_hw)
unsigned int c = 0,state = 0;
/// Envio de 3 datos por I2C
#INT_SSP
void sspinterupt()
{
state = i2c_isr_state();
if(state == 0x80)
{
i2c_write(c);
// delay_ms(10);
}
}
void main()
{
//enable_interrupts(INT_SSP);
//enable_interrupts(GLOBAL);
while (true)
{
output_high(PIN_d3);
delay_ms (500);
output_low(PIN_d3);
delay_ms (500);
c++;
}
}
Última edición por un moderador: