//////////////////////////////////////////////////
// I2C master //
// PIC16F877A //
// PICmaster.C //
// Crea una comunicacion entre varios PICS //
// por i2c mandando lo leido al PC por el //
// el puerto serie. //
// //
// Realizado por Juan José Chica Barrera //
//////////////////////////////////////////////////
#include <16f877A.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(clock = 10000000) // reloj 10MHz
/*
Configuracion principal del I2C
Modo Maestro
Tasa de transferencia rapida, aunq puede tener problemas
I2c se hace por harwdware pa eso lo tenemos en el
*/
#use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,FAST,FORCE_HW)
/*
Configuracion principal del puerto serie
velocidad de 9600 baudios
sin paridad
con un bit de parada
*/
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
/*
Rutina de ESCRITURA a un dispositivo conectado al i2c
i2cdev --> Direccion del dispositvo
i2cdat --> Dato que le quiero enviar
*/
void i2cw(int i2cdev, int i2cdat){
i2c_start(); // Inicializo comunicación I2C
i2c_write(i2cdev); // Envio Dirección de dispositivo I2C + R/W
i2c_write(i2cdat); // Envio byte a escribir
i2c_stop(); // Cierro comunicacion
}
/*
Rutina de LECTURA a un dispositivo conectado al i2c
i2cdev --> Direccion del dispositvo del que quiero leer
*/
int i2cr(int i2cdev){ // Rutina de lectura I2C
int r=0x00;
i2c_start();
i2c_write(i2cdev);
r=i2c_read();
i2c_stop();
return(r);
}
unsigned int giro=80;
main()
{
output_float(PIN_C3); //I2C pin float
output_float(PIN_C4); //I2C pin float
while(1)
{
//COMUNICACION CON EL ESCLAVO 1
giro = i2cr(0x02); //Leo del dispositivo esclavo y lo muestro por el puerto B
printf("Prueba de i2c %U\n\r",giro); //Lo muestro por el puerto serie
delay_ms(1000); //Retardo de 1 segundo
giro = 0; //Reseteo la variable
}
}