comunicación vía i2c entre dos pic

Upload: uziel82

Post on 12-Jul-2015

639 views

Category:

Documents


5 download

TRANSCRIPT

Comunicacin va I2C entre dos 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 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 emplearemos 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 emplearemos la funcin i2c_poll(). Esta funcin devuelve un 1 cuando se ha recibido el dato en el buffer. Comprobando su estado ciclicamente sabremos cuando hay que procesar la informacin recibida.

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

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

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

//////////////////////////////////////////////////////////////////////////////// // // // // // // // // (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

#fuses XT,HS,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

//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);

} } }

//////////////////////////////////////////////////////////////////////////////// // // // // // // // // (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

#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

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 } } }