Codigo I2c maestro-Esclavo

Muy buenas a todos, soy estudiante de Barcelona (España) y me gustaría preguntar sobre que errores podría tener en la programación de mi comunicación i2c que trato de realizar. Os situo:
Trato de hacer la comunicación de un master/slave por i2c. El Slave recoge datos de 8 pulsadores que le entran por el puertoB. A la vez que va recogiendo los datos los transmite directamente al puerto D del mismo Slave (por confirmar que funciona la comunicación correctamente). El maestro solicita la información del slave sobre el estado de los pulsadores para sacarlo por el puertoB suyo, con lo cual lo que quiero es ver lo mismo en el puerto D del slave y en el puertoB del master. Hasta ahí lo he conseguido, ahora lo que quiero para probar la bidireccionabilidad de la comunicación es mediante un simple pulsador en el master, lograr que se enciendan todos los leds del puerto D del slave. Os cuelgo aquí el programa como lo tengo en la actualidad:

Código:
#include "C:\Users\Cristian\Desktop\Prueba CCS\I2c Puertas\MAESTRO MANOLO\MAESTRO\maestro manolo.h"
#byte trisb=0x86
#byte portb=0x06
#byte trisd=0x88
#byte portd=0x08

BYTE luces;
int8 dato=255;

void leer_esclavo()
   {
   i2c_start();
   i2c_write(0xA0);
   i2c_write(0x02);
   i2c_stop();
   
   i2c_start();  
   i2c_write(0xA0+1);
   luces = i2c_read(0);
   i2c_stop();
   }

void escribir_esclavo(void)
{
   i2c_start();
   i2c_write(0xA0); // como son 2 cifras hexadecimales 
   i2c_write(dato); // ponemos XXXXYYYY donde XXXX es el 
   i2c_stop();      // dispositivo y YYYY es el codigo 
                    // de lectura o escritura.
}

void main()
{
set_tris_b(0x00);
set_tris_d(0xFF);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
while(1)
{
 leer_esclavo();
 delay_ms(20);
 portb=luces;
 if(input_state(PIN_D1)==1)
   {
   escribir_esclavo();
   delay_ms(20);
   }
 
}
}

ESCLAVO:

Código:
#include "C:\Users\Cristian\Desktop\Prueba CCS\I2c Puertas\MAESTRO MANOLO\ESCLAVO\esclavo manolo.h"

#byte trisb=0x86
#byte portb=0x06
#byte trisd=0x88
#byte portd=0x08
#byte trisa=0x85
#byte porta=0x05

BYTE luces,estado,rdato,dato,direccion;
#int_SSP
void  SSP_isr(void) 
{
   estado = i2c_isr_state();
   if(estado<0x80)        //Maestro escribiendo en el esclavo
   {
       dato=i2c_read();
       if(estado==1)
       {
         direccion=dato;
       }
       if(estado==2)
       {
         rdato=dato;
         portd=rdato;
       }
       
   }
   else if(estado>=0x80)        //Maestro solicitando datos del esclavo
       i2c_write(luces);
       
}



void main()
{
set_tris_b(0xFF);
set_tris_d(0x00);
set_tris_a(0x00);
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
while(1)
 {
 luces=portb;
 portd=luces;
 }
}


Os adjunto el archivo del esquema proteus. Con estos codigos que os he pegado, lo que le ocurre es que se encienden todos los leds del puerto B del master le de o no al button, es decir estan encendidos continuamente. Agradeceria una ayuda a la hora de detectar los errores que esten escritos, ya que mi conocimiento con este tipo de comunicación no es nada extenso.

Muchas gracias.

Saludos.
 
Atrás
Arriba