You are on page 1of 6

Comunicacin I2C entre 2 PIC.

Se trata de comunicar mediante bus I2C dos pic. Uno ser el maestro, que enviar la informacin al pic esclavo para que la gestione. En concreto, en este ejemplo, el pic maestro toma el valor introducido por un teclado numrico. El valor de la tecla pulsada se enviar va I2c al pic esclavo que la presentar en una pantalla lcd. Pulsando la tecla del asterisco (*), la informacin mostrada en la pantalla se borrar.

Para este tipo de comunicacin se emplea la directiva...

#use I2C

...en la que se establecen las condiciones de la trasmisin como velocidad, pines del bus en el PIC, direccin del PIC esclavo, etc.

Por ejemplo, en este caso:

#use I2C(SLAVE, SDA=PIN_C4 , SCL=PIN_C3, SLOW, ADDRESS=0xa0)

Se est indicando que se establece al PIC como esclavo (SLAVE) , el pin C4 es la linea SDA del bus , el pin C3 es la linea SCL, se utiliza la velocidad de transmisin baja (SLOW) y la direccin como esclavo ser A0h.

En el caso del PIC maestro, en la directiva se indica MASTER en lugar de SLAVE, y se ignora la opcin ADDRESS:

#use I2C(MASTER, SDA=PIN_C4 , SCL=PIN_C3, SLOW)

Para enviar la informacin con el PIC maestro empleamos este grupo de instrucciones:

i2c_start();

//Comienzo de la comunicacin I2C ...

i2c_write(0xa0); //...con la direccin del PIC esclavo... i2c_write(tecla); // Enva dato i2c_stop(); //Finalizacin de la transmisin

Para saber cuando el PIC esclavo recibe informacin utilizamos la funcin i2c_poll(). Esta funcin devuelve un "TRUE" (valor 1) cuando se ha recibido el dato en el buffer. Comprobando su estado ciclicamente sabremos cuando hay que procesar la informacin recibida. El dato recepcionado lo podremos recuperar con la funcin i2c_read().

if(i2c_poll()) { dato=i2c_read(); }

// Si se ha recibido informacin... //...la guarda en la variable "dato"

La lnea de datos SDA y la lnea de seal de reloj SCL del bus, son lneas a colector abierto. Esto implica que se deben utilizar resistencias externas o pull-up que aseguren el estado alto cuando no haya dispositivos conectados al bus. Si no fueran usadas, las lneas podran encontrarse en un momento dado en un estado indeterminado. Si uno de los componentes del bus intenta poner la lnea en estado bajo a la vez que otro en estado alto, esto llevara a conflicto al bus y podra daar a los componentes.

Los valores tpicos de estas resistencias pueden ser, a modo de orientacin, de 4k7 para velocidades del bus inferiores o en torno a 100kbps, de 2k2 para velocidades alrededor de 100kbps y de 1k para velocidades en torno a 400kbs o superiores.

Esquema comunicacin I2C entre dos PIC Haz clic en la imagen para ampliarla

Los programas de los PIC van a ser dos, uno para el maestro...

[+/-] Ver / Ocultar programa MASTER en C

//////////////////////////////////////////////////////////////////////////////// // // // // // // // // (c) RobotyPic Aplicacin para PIC MAESTRO // El PIC maestro lee teclado y enva el dato al PIC esclavo via I2C // que lo mostrar en un lcd. // // // COMUNICACIN I2C EN TRE DOS PIC // // //

////////////////////////////////////////////////////////////////////////////////

#include <16F876a.h>

#fuses XT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWDT

#use delay (clock=4000000) #use i2c(MASTER, SDA=PIN_C4, SLOW, SCL=PIN_C3, NOFORCE_SW)

#define use_portb_kbd TRUE #include <kbd.c>

//Configuracin puerto b para lectura teclado

//Carga archivo para control de teclado

#use standard_io(b) #use standard_io(c)

int tecla;

//Dato a transmitir

/******************************************************************************/ /***************************** Envo I2C **************************************/

void envio_I2C (){

i2c_start();

//Comienzo de la comunicacin I2C ... //...con la direccin del PIC esclavo...

i2c_write(0xa0);

i2c_write(tecla); // Envia dato i2c_stop(); } //Finalizacin de la transmisin

/******************************************************************************/ /*************************** FUNCIN PRINCIPAL ********************************/

void main(){

kbd_init();

//Inicializa funcin de teclado

port_b_pullups(TRUE);

while (true){

// Lectura del teclado tecla=kbd_getc(); if(tecla!=0){ envio_I2C(); //En "tecla" valor de la tecla pulsada //Si se pulsa teclado... //...se enva el dato

delay_ms(100); } } }

...y otro para el PIC esclavo.

[+/-] Ver / Ocultar programa SLAVE en C

//////////////////////////////////////////////////////////////////////////////// // // // // // // // // (c) RobotyPic Aplicacin para PIC ESCLAVO // El PIC maestro lee teclado y enva el dato al PIC esclavo via I2C // que lo mostrar en un lcd. // // // COMUNICACIN I2C EN TRE DOS PIC // // //

////////////////////////////////////////////////////////////////////////////////

#include <16F876a.h>

#fuses XT

#use delay (clock=4000000)

#use standard_io(c)

#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0xa0, NOFORCE_SW)

#define use_portb_lcd TRUE #include <lcd.c>

void main() {

int dato; lcd_init();

while (1) {

// Recepcin por comunicacin I2C if(i2c_poll()) { dato=i2c_read(); lcd_putc(dato); //Muestra dato recibido por pantalla

if (dato=='*') lcd_putc("\f"); //Si es * borra la pantalla lcd } } }