Вы находитесь на странице: 1из 5

COMUNICACIN I2C TRES PIC //

// //
// Master //
// //
// RobotyPic 2012 (c) //
// //
////////////////////////////////////////////////////////////////////////////////
#include <16F876a.h>
#include <stdlib.h> //Archivo necesario para funcin rand()
#use delay(clock=4000000)
#fuses XT, NOWDT, BROWNOUT, NOPUT, NOPROTECT, NOLVP, NOCPD, NOWRT, NODEBUG
#use i2c(Master,fast,sda=PIN_C4,scl=PIN_C3,force_sw)
#use fast_io(a)
#use fast_io(B)
#use standard_io(C)

#define use_portb_lcd TRUE //Configuracin puerto b control lcd
#include <lcd.c> //archivo para control del lcd
byte dato=0;
byte direccion=0;
byte posicion=0;
byte dato_leido=0;
int8 n_aleatorio;
int1 flag=0;
/******************************************************************************/
/************** FUNCIN GENERACIN DE NMEROS ALEATORIOS **********************/
void aleatorio (){
srand(get_rtcc());
n_aleatorio=rand() % (256); //Numero aleatorio entre 0 y 255
}

/******************************************************************************/
/******************* FUNCIN ESCRITURA EN PICS ESCLAVOS ***********************/
void envio(direccion, posicion, dato){
i2c_start(); // Comienzo comunicacin
i2c_write(direccion); // Direccin del esclavo en el bus I2C
i2c_write(posicion); // Posicin donde se guardara el dato transmitido
i2c_write(dato); // Dato a transmitir
i2c_stop(); // Fin comunicacin
delay_ms(1000);
}
/******************************************************************************/
/******************** FUNCIN LECTURA DE PICS ESCLAVOS ************************/
void lectura (byte direccion, byte posicion, byte dato_leido) {
i2c_start(); // Comienzo de la comunicacin
i2c_write(direccion); // Direccin del esclavo en el bus I2C
i2c_write(posicion); // Posicin de donde se leer el dato en el esclavo
i2c_start(); // Reinicio
i2c_write(direccion+1); // Direccin del esclavo en modo lectura
dato_leido=i2c_read(0); // Lectura del dato
i2c_stop(); // Fin comunicacin
delay_ms(50);
if (flag==0){ //Muestra lectura del primer pic esclavo
printf(lcd_putc, "\fI2C=%x Pos.%d =%x" direccion, posicion, dato_leido);
flag=++flag;
}
else{ //Muestra lectura del segundo pic esclavo
lcd_gotoxy(1,2);
printf(lcd_putc, "I2C=%x Pos.%d =%x" direccion, posicion, dato_leido);
}
}
/******************************************************************************/
/*************************** FUNCIN PRINCIPAL ********************************/
void main(){
byte dato=0;
byte direccion=0;
byte posicion=0;
byte dato_leido=0;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //Configuracin timer0
enable_interrupts(INT_SSP); //Habilitacin interrupcin por I2C
enable_interrupts(global);
lcd_init(); //Inicializacin del lcd
port_b_pullups(TRUE); //Habilitacin resistencias pull ups puerto b
printf(lcd_putc, "\f En espera");
while(1){
if (input(pin_A0)==1) { //Cuando se pulsa comienza trasmisin

delay_ms(500);

//Envo a PIC esclavo direccin 0xA0 bus I2C
for (posicion=1; posicion<=10; posicion++){
delay_ms(1000);
direccion=0xA0;
aleatorio ();
dato=n_aleatorio;
printf(lcd_putc, "\f Enviando\n");
printf(lcd_putc, "%x Pos%d Dato=%x", direccion, posicion, dato);
envio(direccion, posicion, dato);
}
//Envo a PIC esclavo direccin 0xB0 bus I2C
for (posicion=1; posicion<=10; posicion++){
delay_ms(1000);
direccion=0xB0;
aleatorio ();
dato=n_aleatorio;
printf(lcd_putc, "\f Enviando\n");
printf(lcd_putc, "%x Pos%d Dato=%x", direccion, posicion, dato);
envio(direccion, posicion, dato);
}

printf(lcd_putc, "\f Enviado");
delay_ms(1000);

// Lectura del dato contenido en la posicin de memoria 5 del pic esclavo 0x
A0
direccion=0xA0;
posicion=0x05;
lectura(direccion, posicion, dato_leido);
delay_ms (2000);
// Lectura del dato contenido en la posicin de memoria 5 del pic esclavo 0x
B0
direccion=0xB0;
posicion=0x05;
lectura(direccion, posicion, dato_leido);
}

delay_ms(10);
}
}
ESCLAVO
COMUNICACIN I2C TRES PIC //
// //
// Esclavo 1 //
// //
// RobotyPic 2012 (c) //
// //
////////////////////////////////////////////////////////////////////////////////
#include <16F876A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE,fast, SDA=PIN_C4, SCL=PIN_C3, address=0xA0)
#define use_portb_lcd TRUE
#include <LCD.c>
typedef enum {NOTHING, CONTROL_READ,ADDRESS_READ} I2C_STATE;
I2C_STATE fState;
byte posicion, buffer[0x10];
short envio=0;
/******************************************************************************/
/***************** FUNCIN INTERRUPCIN POR RECEPCION I2C *********************/
#INT_SSP
void ssp_interupt (){
byte incoming; //es donde se recibe el byte que manda el maest
ro
fstate = i2c_isr_state(); //estado del bus tras la interrupcin
if (fstate == 0x80) { // Si no hay dato recibido=>lectura del esclavo por
el master

//Muestra por LCD valor en posicin de memoria solicitada por el master
printf (lcd_putc, "\fDireccion I2C=A0\n");
printf (lcd_putc, "Pos.%d Dato= %x" posicion, buffer[posicion]);
//Manda al maestro la informacin contenida en la posicin de memoria que le h
a solicitado
i2c_write (buffer[posicion]);
}
else { //Sino es que hay dato en el bus I2C..
.
incoming = i2c_read(); //... lo lee
if (fState == NOTHING){ //Informacin recibida es aviso de que v
a mandar algo master
fState = CONTROL_READ; //Siguiente informacin ser la posicin don
de guardar dato
}
else if (fState == CONTROL_READ) { //Informacin recibida corresponde a la
posicion
posicion = incoming; //Se guarda posicin
fState = ADDRESS_READ; //Siguiente informacin recibida ser el d
ato
}
else if (fState == ADDRESS_READ) { //Informacin recibida corresponde al da
to
buffer[posicion] = incoming; //Se guarda dato
fState = NOTHING; //Siguiente informacin ser aviso de nuev
o envo del master
envio=1;
}
}
}
/******************************************************************************/
/************************* FUNCIN PRINCIPAL **********************************/
void main (){
lcd_init();

fState = NOTHING;
for (posicion=0;posicion<0x10;posicion++)
buffer[posicion] = 0x00;
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);

while(1){
while (envio==1) {
printf(lcd_putc, "\f Recibido ... \n");
printf(lcd_putc, "Pos.%d Dato= %x ", posicion, buffer[posicion]);
envio=0;
}
}
}
ESCLAVO
COMUNICACIN I2C TRES PIC //
// //
// Esclavo 2 //
// //
// RobotyPic 2012 (c) //
// //
////////////////////////////////////////////////////////////////////////////////
#include <16F876A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE,fast, SDA=PIN_C4, SCL=PIN_C3, address=0xB0)
#define use_portb_lcd TRUE
#include <LCD.c>
typedef enum {NOTHING, CONTROL_READ,ADDRESS_READ} I2C_STATE;
I2C_STATE fState;
byte posicion, buffer[0x10];
short envio=0;
/******************************************************************************/
/***************** FUNCIN INTERRUPCIN POR RECEPCION I2C *********************/
#INT_SSP
void ssp_interupt (){
byte incoming; //es donde se recibe el byte que manda el maest
ro
fstate = i2c_isr_state(); //estado del bus tras la interrupcin
if (fstate == 0x80) { // Si no hay dato recibido=>lectura del esclavo por
el master

//Muestra por LCD valor en posicin de memoria solicitada por el master
printf (lcd_putc, "\fDireccion I2C=B0\n");
printf (lcd_putc, "Pos.%d Dato= %x" posicion, buffer[posicion]);
//Manda al maestro la informacin contenida en la posicin de memoria que le h
a solicitado
i2c_write (buffer[posicion]);
}
else { //Sino es que hay dato en el bus I2C..
.
incoming = i2c_read(); //... lo lee
if (fState == NOTHING){ //Informacin recibida es aviso de que v
a mandar algo master
fState = CONTROL_READ; //Siguiente informacin ser la posicin don
de guardar dato
}
else if (fState == CONTROL_READ) { //Informacin recibida corresponde a la
posicion
posicion = incoming; //Se guarda posicin
fState = ADDRESS_READ; //Siguiente informacin recibida ser el d
ato
}
else if (fState == ADDRESS_READ) { //Informacin recibida corresponde al da
to
buffer[posicion] = incoming; //Se guarda dato
fState = NOTHING; //Siguiente informacin ser aviso de nuev
o envo del master
envio=1;
}
}
}
/******************************************************************************/
/************************* FUNCIN PRINCIPAL **********************************/
void main (){
lcd_init();

fState = NOTHING;
for (posicion=0;posicion<0x10;posicion++)
buffer[posicion] = 0x00;
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);

while(1){
while (envio==1) {
printf(lcd_putc, "\f Recibido ... \n");
printf(lcd_putc, "Pos.%d Dato= %x ", posicion, buffer[posicion]);
envio=0;
}
}
}