Estoy desarrollando un proyecto en el cual implemento control de un motor, interfaz de usuario, y el codigo ya esta muy grande. Estoy utilizando un PIC 16F877 y se me quedo corto por lo cual necesito de otro y comunicarlos mediante I2C, para en el ejecutar algunas funciones. Nunca he manejado este sistema de comunicación y por lo que he investigado hice el siguiente programa para probar la comunicación entre los 2 PIC, pretendo enviar un dato al esclavo y que el luego me retorne el mismo dato enviado yel maestro lo muestra en el LCD.
Para el PIC Maestro
#include <16f877.h>
#include <lcd.c>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=20000000)
#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3)
main() {
int Aux;
byte Entra,Sale;
SET_TRIS_C(0x18); // configura pines PIN_C4 y PIN_C3 como salida
lcd_init(); //Inicializa el LCD
lcd_putc("f"); // Borra el LCD
printf(LCD_PUTC, "Inicio"
;
Delay_ms(3000);
Sale =0;
while (TRUE) {
Sale += 1;
i2c_start(); //Condicion de inicio
i2c_write(0x02); //Esta es la direccion del esclavo
i2c_write(Sale); //Envia algun dato a el esclavo
i2c_stop(); //Condicon de parada
aux = Sale;
printf(LCD_PUTC, "Dato enviado = %d", Aux);
delay_ms(2000);
i2c_start(); //Condicion de inicio
i2c_write(0x02); //Esta es la direccion del esclavo
Entra = i2c_read(); //Espera a que el esclavo responda
i2c_stop(); //Condicon de parada
Aux = Entra;
lcd_gotoxy(1,1);
printf(LCD_PUTC, "Dato Recivido= %d",Aux);
delay_ms(2000);
if (Sale==11)
Sale=0;
}
}
Para el PIC esclavo
#include <16f877.h>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=20000000) //,RESTART_WDT)
#use i2c(slave, SDA=PIN_C4, SCL=PIN_C3, address=0x02)
#define Led_1 PIN_B5
#define Led_2 PIN_B6
main() {
byte Entra, Sale;
int Aux;
SET_TRIS_C(0x18);
while (TRUE) {
i2c_start(); //Condicion de inicio
Entra = i2c_read(); //Espera a que el esclavo responda
i2c_stop(); //Condicon de parada
Sale = 22;
i2c_start(); //Condicion de inicio
i2c_write(Sale);
i2c_stop(); //Condicon de parada
if (Entra == 5) { // Si el dato recivido es 5 enciendo unos LED
output_low(Led_1);
output_high(Led_2);
delay_ms(2000);
output_high(Led_1);
output_low(Led_2);
delay_ms(2000);
}
}
}
Para las conexiones coloque una resistencia pull-up de 10K a VCC y un condensador de 40 pF a tierra, (lo vi en el datasheet del PIC)
Lo pruebo y no me manda ni recive ningun dato, no se que mas consideraciones halla que tener en cuenta.
Les agradesco las sugerencias.