Expansor I2C PIC - PIC PIC16F877A como esclavo y PIC18F2550 como maestro.

Hola a todos !

POR FAVOR: Todos aquellos que tienen duda con respecto al protocolo por favor revisen en google o en el mismo foro si hay explicaciones. Van a encontrar cientos...sino miles de explicaciones.

Con respecto a problemas de programación les quiero comentar lo siguiente:

1º - El proteus NO es la realidad. Hagan sus circuitos en protoboard y luego comentan sus problemas.

2º - Sean objetivos con lo que preguntan. No puedo ayudarles con preguntas al azar...tienen que explicarme lo que están haciendo con el mayor detalle posible..para poder brindarles la mejor respuesta.

3º - A veces no tengo tiempo para resolver los problemas de los demás, por favor tengan en cuenta que soy un humano más...con responsabilidades :D:D

4º - Con respecto a los ejemplos, los mismos fueron probados en la realidad y funcionan perfectamente. Si ustedes hacen uso de ello modificando correctamente su estructura, sus programas serán funcionales (teniendo en cuenta las limitaciones de dichos ejemplos).

5º - INVESTIGAR:Antes de hacer preguntas por favor, estudiar el problema, sacar conclusiones, seguir investigando, tratar de platear una solución.....luego preguntar.


Espero no les moleste lo que escribí, pero es mi humilde opinión ante casos repetidos de consulta que no cumplen con una o varias reglas.
 
Buenas moyano, primero que todo agradecerte por el tiempo dedicado en tu ejemplo. Estoy comenzando con esto y quiero entnder primero conceptualmente bien el tema este de la comunicación I2C, por lo cual me gustaría hacerte unas preguntas básicas:

1.- Según entiendo, este protocolo transmite principalmente dos líneas, los datos (SDA) y el reloj (SCL), por lo cual me imagino que sólo se pude implementar en microcotroladores que dispongan de estos puertos no? Es decir, no puedo transmitir desde un microcontrolador que tenga estos puertos a uno que no los tenga utilizando para este efecto cualquier entrada?

2.- No me termina de quedar claro como se conoce la dirección del esclavo al cual mandar los datos ni de donde se obtiene el hexadecimal del maestro (0xB8 en el ejemplo que publicaste). Porque claro de ahí en más mandas los 8 bits (7 de dirección y el modo R/W) y el dato, pero reitero, como se conoce la dirección del esclavo?

3.- Finalmente, en el esclavo rescatas el estado de la comunicación en esta línea: estado=i2c_isr_state(); Luego comparas de esta forma: if((estado>0)&&(estado<0x80)) mi duda aca es, ¿Qué retorna esa función? Es decir sé que lo que retorna es la representación del estado y por el código que si está entre 0 y 0x80 se está en condiciones de leer, pero como puedo pero una vez más ¿Cómo se determina el 0x80?

Bueno, espero tu respuesta, reitero mis agradecimientos.

Saludos cordiales,

Atte. Metallick
 
Según entiendo, este protocolo transmite principalmente dos líneas, los datos (SDA) y el reloj (SCL), por lo cual me imagino que sólo se pude implementar en microcotroladores que dispongan de estos puertos no? Es decir, no puedo transmitir desde un microcontrolador que tenga estos puertos a uno que no los tenga utilizando para este efecto cualquier entrada?

Este ejemplo que puse es para usarlo con 2 microcontroladores que tengan I2C por hardware, ya que usan interrupciones para gestionar las comunicaciones. Quizás modificando dicha gestión para que se haga en el bucle principal del programa puedas usar cualquier pin de cualquier micro...siempre que tengas la opción de crear un puerto I2C software con tu compilador.

No me termina de quedar claro como se conoce la dirección del esclavo al cual mandar los datos ni de donde se obtiene el hexadecimal del maestro (0xB8 en el ejemplo que publicaste). Porque claro de ahí en más mandas los 8 bits (7 de dirección y el modo R/W) y el dato, pero reitero, como se conoce la dirección del esclavo?

Si el esclavo es un microcontrolador la dirección se la das vos. Yo elejí darle la dirección 0xB8 pero podés darle cualquier dirección de 8 bits. Ahora si se trata de un dispositivo I2C...por ejemplo una memoria le tenés que ver la dirección del fabricante...a veces tienen pines para configurar la dirección, etc.

Finalmente, en el esclavo rescatas el estado de la comunicación en esta línea: estado=i2c_isr_state(); Luego comparas de esta forma: if((estado>0)&&(estado<0x80)) mi duda aca es, ¿Qué retorna esa función? Es decir sé que lo que retorna es la representación del estado y por el código que si está entre 0 y 0x80 se está en condiciones de leer, pero como puedo pero una vez más ¿Cómo se determina el 0x80?

Ahí lo analicé de la ayuda que me da el compilador CCS. En un apartado explica a que se deben esas constantes. También tenés que leer la hoja de datos del microcontrolador en particular que estés utilizando para saber realmente a que se refiere el apartado de CCS...es la única manera que hay.

Saludos y que estés bien !
 
Buena moyano, primero que todo muchas gracias por tu respuesta, ahora voy tratando las tres respuestas por separado

La primera: la verdad, creo que pese al riesgo de que queden sobredimencionado los N micros a un determinado proyecto, valdría más la pena usar micros que vengan con I2C soportado por hardware para evitar problemas, aún que te confieso que me gustan los desafíos y sería interesante intentar hacer funcionar un sistema de comunicación con un I2C por software, aún que como te comente, recien vengo entrando en el mundo de los microcontroladores, pero como soy informático, mis ideas de programación van bastante mas adelante que mis capacidades de diseño electrónico :LOL:.

Lo segundo: Si!!! tienes razón, despúes de la n-ésima mirada que le heche a lo que publicaste me di cuenta que en el esclavo declaras justamente esa dirección en la línea:

#use i2c(Slave,sda=PIN_C4,scl=PIN_C3,address=0xB8,force_hw

Ahora ya me cuadra todo esto, es muy parecido a como se envian los datos en las redes computacionales, de hecho cuando hablaste de checksum y CRC en una respuesta anterior, me acordé de la materia "Redes de computadores" de la universidad, jajaja se me paso por la cabeza OSI, criptografía, seguridad y mil cosas :LOL:.

Lo tercero: Bueno entonces eso me toca estudiarlo más en profundidad.

Muchisimas gracias nuevamente por tu respuesta.

Sin otro particular, se despide cordialmente,

Atte. Metallick
 
Una pregunta compañero, no tengo el conocimiento suficiente en cuanto a la comunicación I2C, pero necesito ayuda; crees que se pueda implementar un PIC18F452 como maestro y un 16F628 como esclavo. Mi pregunta surge ya que me quede sin memoria en el PIC18F452, estoy creando un control difuso por lo que quisiera saber si es factible ingresar e imprimir datos por medio del 16f628 y enviar las señales de control desde el 18f452; se podría compartir datos entre los microcontroladores. Espero tu respuesta. Gracias.!
 
Última edición:
Una pregunta compañero, no tengo el conocimiento suficiente en cuanto a la comunicación I2C

En internet hay muchos PDF que explican el funcionamiento del puerto I2C. También hay videos y bibliografía específica del tema.

crees que se pueda implementar un PIC18F452 como maestro y un 16F628 como esclavo.

Ambos microcontroladores tienen puerto I2C implementado en hardware, por lo cuál los ejemplos que puse en la primera página, con las correspondientes modificaciones, te tendrían que andar bien.

se podría compartir datos entre los microcontroladores.

Si, se pueden compartir los datos entre los microcontroladores.

Saludos y que estés bien !
 
espero que alguien pueda ayudarme soy nueva en esto pero tengo que conectar dos pic16f877a en proteus y programar la entrada y salida en pic-c.

Vos tenés que empezar con las pruebas, el montaje del circuito, etc. Luego que hayas realizado esos pasos, te vamos a poder ayudar. Te recomiendo que leas el mensaje #41, en esta página.
 
Gracias por el ejemplo Jonathan; me fue de mucha ayuda pero el proyecto que tengo esta en assembler mi duda si te interesa responderla XD alguien mas puede hacerlo : Es si al depender el esclavo del maestro este(maestro) ordena el start(al leer esta recibiendo datos en un registro temporal dedicado al cual yo le denomino buffer de bytes con respecto de SCL en bits y AL ESCRIBIR ESTA ENVIANDO DATOS AL BUFFER del esclavo direccion de registro "x" definido previamente.)

Parte de los sistemas que diseño lo hago comprendiendo todo el modus operandus y solucinando los errores gracias... espero comprendan que eso es basico.
 
Hola buen día tengo dudas sobre las interrupciones externas de como funcionan tengo poco en esto asi que me confundo un poco. Tengo un pic16f877a conectado a un ds1307 un lcd y un teclado 4x4 y despues se conectará todo esto con un pic16f877a esclavo pero voy paso por paso y la verdad no entiendo muy bien sobre las interrupciones aunque estuve leyendo pero alguien que me pueda orientar porfis :(
 
Atrás
Arriba