InicioCiencia EducacionComunicación I²C en los PIC y su programación
BIENVENIDOS A ESTE POST SOBRE ELECTRÓNICA DIGITAL INTRODUCCIÓN AL BUS I²C El bus de comunicaciones I²C se basa en la transmisión de datos a través de 2 hilos. Todos los dispositivos que integran un sistema de este tipo tienen una dirección asignada. Los hilos que conforman este bus transportan una señal de datos y otra de reloj, si los dispositivos que van a comunicarse están en un mismo circuito no es necesario la tercera línea de masa. Si estos dispositivos están en diferentes placas es necesaria la línea de tierra (GND). Las dos líneas principales del bus tienen los siguientes nombres asignados: _SDA: Linea que maneja datos. _SCL: Linea que maneja la señal de reloj. En el caso del pic 16f877 el bit SDA está conectado al bit 4 del puerto C En el caso del pic 16f877 el bit SCL está conectado al bit 3 del puerto C Estas dos señales necesitan resistencias de Pull-up para trabajar. Resistencias de Pull - up conectadas a las líneas SDA y SCL Si estamos hablando de comunicación a dos hilos entre microcontroladores PIC, el maestro es el dispositivo que general la señal de reloj y da principio a la transmisión de datos, pero si alguno de ellos tiene la capacidad de asumir el rol de maestro, este puede configurarse y así tener una red multimaestro. En el momento de iniciar la transmisión, el maestro envía por el bus la dirección asignada al esclavo con el cual quiere comunicarse. Tras enviar la dirección este envía un bit de R/W lectura por alto o escritura por bajo. Cuando el maestro termina de enviar sus datos, el esclavo envía una señal de reconocimiento ACK. ENTRANDO EN MATERIA EL BUS I²C EN LENGUAJE C En la cabecera de nuestro programa en lenguaje C hay que utilizar la siguiente configuración... #use I2C (.......) Dentro del paréntesis debemos colocar las opciones de configuración general del bus. En el programa de ejemplo que vamos a desarrollar hacemos una configuración típica para un maestro. #use i2c (MASTER, SDA= PIN_C4, SLOW, SCL= PIN_C3, NOFORCE_SW) Establecemos el modo maestro, el pin de comunicación SDA, la velocidad baja y el pin de comunicación SCL... FUNCIONES ASOCIADAS AL BUS I²C I2C_START() En el modo maestro inicializa la transmisión de datos, después de esta función se escriben los datos de la dirección del esclavo con el cual se quiere comunicar y luego el dato a enviar, todo esto antes de un stop... I2C_STOP() Esta función se utiliza también en el modo maestro, después de enviar el dato al esclavo para finalizar la transmisión. I2C_WRITE() Este comando sirve para enviar un dato de 8 bits por el bus, esta función genera la señal de reloj en modo maestro y en modo esclavo espera la señal de reloj por parte del maestro. I2C_READ() Este comando permite leer un dato entero de 8 bits del bus, con las señales de reloj especificadas en la instrucción anterior según el modo de operación. I2C_POLL() Este comando devuelve un alto si ha recibido un dato en el buffer y un bajo si no ha recibido datos aún. EJEMPLO COMUNICACIÓN ENTRE 2 PIC A TRAVÉS DEL BUS DE COMUNICACIÓN I²C Se aprende fácilmente cuando se aplica el conocimiento a la práctica, en este caso diseñaremos un circuito que tenga dos pics, uno configurado como maestro y otro como esclavo. El microcontrolador maestro tendrá conectado un teclado matricial y enviará la tecla presionada a través del bus de comunicación al esclavo que tomara este dato y lo desplegará en una pantalla LCD pequeña. Como se puede analizar el microcontrolador de la izquierda que tiene conectado el teclado es el maestro y el microcontrolador de la derecha que tiene conectado la pantalla es el esclavo. Ya el circuito tiene todas sus conexiones definidas y sus correspondientes resistencias de pull-up en las líneas del bus. PROGRAMA PARA EL MICROCONTROLADOR MAESTRO (TECLADO CONECTADO) #include <16f877.h> #fuses XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOWDT #use delay(clock = 4000000) #use i2c (MASTER, SDA= PIN_C4, SLOW, SCL= PIN_C3, NOFORCE_SW) // Configuración global del bus a dos hilos. #define use_portb_kbd TRUE //Se utiliza el puerto B para conectar el teclado #include //Se declara la libreria de teclado #use standard_io(b) #use standard_io(c) #byte porta = 0x05 //Se declaran las direcciones de los puertos y el registro TRIS #byte trisa = 0x85 #byte portb = 0x06 #byte trisb = 0x86 #byte portc = 0x07 #byte trisc = 0x87 #byte portd = 0x08 #byte trisd = 0x88 int8 comando; //La variable de tipo entero donde se guardara el dato obtenido del teclado void main () { trisd = 0x00; portd = 0x00; comando =0; portc=0x00; kbd_init(); //Inicia configuración de teclado port_b_pullups(true); //Activa resistencias de pull-up en el puerto b while(1){ comando=kbd_getc(); //Guarda el dato obtenido del teclado en la variable comando if(comando!=0){ i2c_start(); //Empieza transmisión de datos en el bus i2c_write(0xa0); //Se envía la dirección del esclavo al cual se quiere comunicar i2c_write(comando); //Se escribe el dato obtenido del teclado i2c_stop(); //Finaliza la transmisión en el bus delay_ms(100); //Retardo para eliminar posibles errores } } } PROGRAMA EL MICROCONTROLADOR ESCLAVO #include <16f877.h> #include #fuses XT #use delay(clock = 4000000) #use i2c (SLAVE, SDA= PIN_C4, SLOW, SCL= PIN_C3, ADDRESS = 0xa0, NOFORCE_SW) #define use_portd_lcd TRUE #include #use standard_io(c) #byte porta = 0x05 #byte trisa = 0x85 #byte portb = 0x06 #byte trisb = 0x86 #byte portc = 0x07 #byte trisc = 0x87 #byte portd = 0x08 #byte trisd = 0x88 void main () { trisc=0x00; portc=0x00; trisc=0xff; lcd_init(); int comando2; comando2 = 0; lcd_gotoxy(1,1); lcd_putc("ESPERANDO" ) ; while(true){ if(i2c_poll()){ //Si recibio el dato del bus devuelve verdadero comando2 = i2c_read(); //Guarda el dato del bus en la variable comando2 lcd_putc("f" ) ; //Borra la LCD lcd_putc(comando2); //Escribe en la LCD el dato obtenido del bus } } } Una vez terminado el sistema es hora de verlo en funcionamiento, existen dispositivos que funcionan con I2C como pantallas LCD y memorias, pero todos funcionan bajo el mismo principio... link: https://www.youtube.com/watch?v=sxpla8SAHsE Aqui les dejo mi canal en youtube https://www.youtube.com/channel/UCWlhjuOP-JQfT9qG6H0WV_Q Espero que me visiten y se suscriban!! No te vayas sin comentar y si puedes compartir el conocimiento, me ayudaría y me motivaría para seguir haciendo mas trabajos.. Gracias!! Bryan Tejada A. Electrónica y control industrial Cali - Colombia
Datos archivados del Taringa! original
61puntos
1,289visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

B
Usuario
Puntos0
Posts18
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.