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



## Moyano Jonathan (Jul 24, 2009)

Hola a todos.     

Acá les traigo un mini aporte donde se muestra como se utiliza un PIC en i2c como esclavo. Para esto hemos creado 2 programas 1 para el microcontrolador como esclavo y otro programa para el microcontrolador que actua como master.

Ambos programas están comentados y la aplicación propuesta es sencilla para que todos los puedan entender.

También pongo el diagrama de conexionado para que prueben la aplicación (Yo lo he probado y funciona perfecto).

Todos los comentarios y criticas constructivas serán bienvenidas.

PD: Este proyecto es parte de una controladora de 3 o más motores PAP controlado por USB. 

1 Saludo !


----------



## DavidRMMGB (Oct 26, 2009)

gracias hermano por este pequeno aporte, ya habia leido sobre comunicacion ic2, lo voy a checar yo apenas estoy empezando con esto, ya habia empezado pero no logre comunicar mis micros, cheque rapido tu esquema, y pense que las resistencias pullup no hiban haa espero que eso haya sido mi error, Gracias


----------



## camilo9793 (Oct 27, 2009)

oye Jhonatan, me interesa aprender a utilizar bien el protocolo I2c para pic, en especial para el 16f877A, pero es que yo trabajo bien assembler y algo de basic, c no es de mi total agrado.. mi pergunta es en assembler es muy complejo??


----------



## Moyano Jonathan (Oct 28, 2009)

No en ensamblador no es complejo pero si aumenta el tamaño de código significativamente.


----------



## DavidRMMGB (Nov 17, 2009)

saludos yo de nuevo pasando a molestar, ya he hecho la comunicacion, gracias a tu ejemplo y buen aporte, tengo un duda..., para esto el esclavo tiene un direccion predifinida por software, y lo datos son recividos cuando hay una senal de cloclk por parte del maestro, creo que asi funciona este modelo, mi duda en especifico es como puedo enviar un dato de esclavo a maestro, se le asigna un direccion ?? si has hecho esta comunicacion ojala me puedas ayudar...


Gracias otra vez, saludos


----------



## Moyano Jonathan (Nov 17, 2009)

La verdad no he probado la bidireccionalidad en este tipo de comunicación, pero me parece que le tenés que asignar una dirección al master para poder enviar datos. 
Que alguien me corriga si me equivoco.


----------



## electronic2009 (Nov 18, 2009)

bueno el aporte muchas gracias.


----------



## kire (Feb 11, 2010)

una pregunta jonathan, estoy usanso dos micros 18f4550, me funciona tu codigo con el maestro y un cristal de 4 mhz, y el esclavo con uno de 20 mhz, pero la cuestion es si lo puedo hacer en forma inversa??
me explico, el sistema que tienes en tu codigo soslo le doy algunos cambios y me funciona con los dos micros, pero el esclovo debe de trabajar forsozamente a 4 mhz ya que le pongo un lcd grafico y a 20 mhz el lcd no funciona muy bien, entonces el cristal del esclavo siempre debe ser de 4mz, el del maestro lo puedo cambiar a culaquier frecuencia.
pero no me funciona con un esclavo a 4mhz y un maestro a 20 o 4mz.
cual sera el error?
o le tengo que cambiar alguna libreria??
en el maestro tienes
#use i2c(Master,Fast=400000,sda=PIN_B0,scl=PIN_B1,force_hw) // Utilizamos hardware I2C a 400Khz.Fast=400000

si la tengo que reducir.
el fuse de XT ya esta en HS y al contrariO

o algun otro detalle por lo que no se pueda dar esta funcion
saludos!!!


----------



## StrySG (Feb 12, 2010)

Tengo una pequeña pregunta acerca de como ampliar la longitud de separacion que debe haber entre los microcontroladores(los 2 cables que haran la cominicacion), en protocolo i2c, tengo el dato de que es de maximo 1 metro...

Ahora supongo que tendra que existir algun chip como el MAX 232 que ayuda en la cominicacion serial.

¿Alguno de ustedes sabe que chip o que método me puede ayudar a ampliar la distancia entre los microcontroladores usando el protocolo i2c?


----------



## Moyano Jonathan (Feb 13, 2010)

Para largas distancias es mejor usar protocolos como el RS485 ...I2C lo he probado máximo 50cm y funciona bien.. pero no es recomendable para largas distancias..


----------



## Vegetal Digital (May 23, 2010)

Hola, simule tu(s) programas en proteus y no me anda, no llegan datos al esclavo y el master manda cualquier cosa(lo veo con la herramienta i2c debugger). Adjunto el archivo para que lo revisen.
Saludos.


----------



## lordk (May 23, 2010)

Hola, moyano si puedes ayudame a configurar la usart del 18f4550 para controlar un servo. Te he querido mandar un mensaje pero no puedo porque soy nuevo. Gracias.

En realidad todavia ni he podido configurar bien la usart. je
https://www.forosdeelectronica.com/f24/c18-pic-18f4550-35976/


----------



## Moyano Jonathan (May 23, 2010)

Disculpen ya voy a seguir con este tema pero por ahora no tengo internet ni el tiempo ni el dinero suficiente para hacer investigaciones por el momento....ya para más adelante sigo con esto.
Un saludo y disculpas !


----------



## Vegetal Digital (May 23, 2010)

No hay problema todos sabemos que a la mayoria de nosotros el tiempo no nos sobra.

Sobre la comunicacion I2C migre el codigo del master (18f2550) a un pic 16f877. Ahora funciona con los dos 16f877 siempre y cuando este enchufado la herramienta i2c debugger. Supongo que el problema era el pic 18f, que no se lleva bien con el isis.
Voy a seguir probando si puedo hacer andar en la simulacion y sino probare en la realidad.
Si alguien los quiere, subo los programas.
saludos


----------



## daveindigo (Jun 22, 2010)

Vegetal Digital dijo:


> No hay problema todos sabemos que a la mayoria de nosotros el tiempo no nos sobra.
> 
> Sobre la comunicacion I2C migre el codigo del master (18f2550) a un pic 16f877. Ahora funciona con los dos 16f877 siempre y cuando este enchufado la herramienta i2c debugger. Supongo que el problema era el pic 18f, que no se lleva bien con el isis.
> Voy a seguir probando si puedo hacer andar en la simulacion y sino probare en la realidad.
> ...



A mi me interesa, y te lo agradeceria mucho.


----------



## Moyano Jonathan (Jun 23, 2010)

Ahora ya tengo internet nuevamente y maquina nueva tambien asi que el que tenga problemas veremos de como solucionarlos 
un saludo !


----------



## daveindigo (Jun 23, 2010)

Moyano Jonathan dijo:


> Ahora ya tengo internet nuevamente y maquina nueva tambien asi que el que tenga problemas veremos de como solucionarlos
> un saludo !



No se si me podrias explicar que funcion es la q debo esperar, ya que al igual que otro usuario anterior simule en ISIS PROTEUS pero no funciona, ¿fisicamente tu lo desarrollaste? si jala al 100?te agradeceria la información.


----------



## Moyano Jonathan (Jun 24, 2010)

Si esto todo lo pobré en forma fisica usando de master un PIC16F818 y de esclavos 1 x PIC16F818, 1x PIC16F88 y una memoria 24C256 y funciona de maravilla. Ahora algo por lo que a muchos les falla es que no saben configurar bien el puerto serie sincronico par que trabaje en modo I2C , además hay que tener en cuenta la dirección de los registros según sea el micro y hacer las modificaciones pertinentes al código y fijarse si se están produciendo las interrupciones.


----------



## dalu (Jul 6, 2010)

que tal amigos somos nuevos pueden darme una mano con la configuracion I2C con el pic18f4550 y un dspic30f4013


----------



## Moyano Jonathan (Jul 7, 2010)

Dalu como estás !
Mirá primero nos tendría que decir que compilador estás usando ...yo todos mis desarrollos los he estado haciendo en CCS y con PIC de la línea 16 y 18...nunca he trabajado los DSpic :s


----------



## dalu (Jul 7, 2010)

estamos trabajando con el CCS Compiler pero nos dicen q se puede hacer el trabajo con el 16f877 y el 18f2550 o 4550


----------



## Moyano Jonathan (Jul 8, 2010)

Entonces baja mi programa y adaptalo a tus necesidades....no es muy complejo solo tenés que ver la hoja de datos de tu PIC y mirar las direcciones correspondientes el módulo serial sincrónico y cambiar algunos datos en los programas ...si tenés dudas de como se hace poné tu programa y lo vamos viendo.


----------



## dalu (Jul 8, 2010)

listo gracias por ese aporte no lo del modulo estabamos mirandolo por el lado que no era


----------



## Moyano Jonathan (Jul 8, 2010)

Ok ya sabes si se te presenta algún problema con la comunicación hacelo saber


----------



## ere (Jul 30, 2010)

baje el codigo que citaste antes peor me da error de version tengo isie 7.4 podrias volver a subirlo



Vegetal Digital dijo:


> No hay problema todos sabemos que a la mayoria de nosotros el tiempo no nos sobra.
> 
> Sobre la comunicacion I2C migre el codigo del master (18f2550) a un pic 16f877. Ahora funciona con los dos 16f877 siempre y cuando este enchufado la herramienta i2c debugger. Supongo que el problema era el pic 18f, que no se lleva bien con el isis.
> Voy a seguir probando si puedo hacer andar en la simulacion y sino probare en la realidad.
> ...


----------



## Vegetal Digital (Jul 31, 2010)

ere dijo:


> baje el codigo que citaste antes peor me da error de version tengo isie 7.4 podrias volver a subirlo


Hola, el programa anda bien, tu problema debe ser la version, yo lo realize en 7.6 SP0


----------



## ere (Ago 1, 2010)

como obtengo la actualizacion, o podrias guardarlo en una version anterior, y subirlo.



Vegetal Digital dijo:


> Hola, el programa anda bien, tu problema debe ser la version, yo lo realize en 7.6 SP0


----------



## Vegetal Digital (Ago 2, 2010)

ere dijo:


> como obtengo la actualizacion, o podrias guardarlo en una version anterior, y subirlo.


Hola, no puedo hacer el circuito en una version mas vieja, lo que puedo hacer es adjuntarte un JPG del circuito y tú lo armas en el isis que tenes.
Saludos

PD: te recuerdo que aun no he tenido tiempo (ni pics) para probarlo fisicamente.


----------



## ere (Ago 9, 2010)

probe el codigo tal como ud lo subieron y si hay comunicacion pero ciertos datos se pierden, en la imagen que subo del I2C Debug, se puede ver que va aunmentando B1, B2... pero aqui se salta porque se pierde la comunicacion y luego sigue con el B4. Lo cual para el ejemplo no es problema porque lo que se muestra es el conteo, Pero si seria problema si son datos que se van a procesar. Y con mas de un esclavo la comunicacion se corta. ¿Que podria hacer para asegurarme que todos los datos lleg?

Otra cosa que me llamo la atencion es que se ve como que no recibe la address del esclavo lo cual si se me hizo raro, en el dibujo lo marco con azul.


----------



## Moyano Jonathan (Ago 9, 2010)

podrías hacer un checksum o implementar un CRC para ver el estado de las transmisiones i/o recepciones.


----------



## ere (Ago 9, 2010)

esos terminos son nuevos para mi, como podria hacer esto guiame


----------



## Moyano Jonathan (Ago 9, 2010)

Un algoritmo CRC o código de redundancia cíclica es un algoritmo que permite comprobar la fiabilidad y _la no alternación_ de los datos, en programación  se utiliza para comprobar si existe corrupción de datos.

Por lo tanto tenes que ver que los datos que te hayan llegado sean correctos....igual esto se aplica a sistemas complejos ...con un simple checksum es decir mirás que por ejemplo la longitud de datos sea correcta o comparas los datos con otros puestos en memoria ,etc.

CCS tiene un ejemplo de CRC usado en RS485.


----------



## inaths (Oct 6, 2010)

hola moyano...
soy nueva en el foro.. y creo que tienes bastante idea acerca de pics... la vdd quiero aprender sobre la comunicacion I2C pero no encuentro ni pies ni kbeza!! espero me puedas hechar la mano... aunq sea un tema viejito...


----------



## Moyano Jonathan (Oct 6, 2010)

@inaths no entiendo tu consulta, si querés aprender sobre la comunicación I2C tendrías que leer como funciona el protocolo. Ahora si lo que vos querés es implementar una comunicación I2C en C para PIC acá puse un ejemplo.
Saludos y que andes bien !


----------



## kakashito (Nov 7, 2010)

Hola moyanoo, soy nuevo y pasaba por acá y parece ser que tu sabes mucho sobre el tema de I2C con los pics,  y ps la verdad yo soy nuevo en eso, almenos con el ccs compiler.

Mira la idea es que tengo 3 pics 16f873a dos como slaves y uno como master, y lo que quiero hacer es a los slaves les pongo un dato en el puerto B como entrada (diferente para cada slave) y con el maestro escojo cual de los dos leer, lo leo y muestro en algun puerto del master el dato que leí.

Tengo un GRAN problema, según varios ejemplos que he visto voy entendiendo como funcionan las sentencias y los comandos que necesito, y he podido hacer un programa para el maestro, que creo que funciona, almenos en lógica, mira: 


----------------------------------------------------------------------------------------------------
   #include <16f873a.h>
   #fuses XT, NOWDT, PUT, NOPROTECT
   #use delay (clock= 4000000)
   #byte PORTB = 0X06
   #byte PORTA = 0X05
   #use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW)
   #byte    SSPCON = 0x14      //espacio de memoria, variable


  int x=1, recibe;

  void main (void)
  {

   set_tris_b(0XFF);
   set_tris_a(0X01);
   do
   {

   if (bit_test(PORTA,0)==1)
      {
         delay_ms(10);
         bit_set(PORTA,1);
         delay_ms(10);
         i2c_start();           // inicio
         i2c_write(0x0A);       // direccion de slave1
         i2c_write(0X06);        // direccion del registro a buscar (puerto B)
         i2c_start();           // re inicio
         i2c_write(0x0A+1);     // modo lectura
         recibe=i2c_read(0);
         i2c_stop();            // parada
         delay_ms(20);
         bit_clear(PORTA,1);
      }  
   else
      {
          bit_set(PORTA,2);
          delay_ms(10);
          i2c_start();           // inicio
          i2c_write(0x0B);       // direccion de slave2
          i2c_write(0X06);        // direccion del registro a buscar (puerto B)
          i2c_start();
          i2c_write(0x0B+1);
          recibe=i2c_read(0);
          i2c_stop();  
          delay_ms(20);
          bit_clear(PORTA,2);
      }

   PORTB = recibe;

   }
   while(x==1);

  }
---------------------------------------------------------------------------------------------------
 No se si le falte alguna instruccion importante o algo así. Y crees que está bien? enviar primero la direccion del esclavo y luego la del registro? 

Y mi problema mas grande es el de hacer el programa para los slaves, no entiendo como funciona la interrupción para hacer la comunicacion y en la mayoria de los que he leido, la vdd no entiendo como hacerlo, se del modulo I2C y los registros que tienen las 16F87X, pero no entiendo ni 5 de como hacer el programa para los slaves.
 Cualquier ayuda te l oagradeceria muchisiimo!!


----------



## Moyano Jonathan (Nov 7, 2010)

Por favor fijate si te anda en la realidad ...en caso de que no te esté funcionando posteas las dudas


----------



## kakashito (Nov 7, 2010)

Lo que pasa es que urgente moyano, tu me podrías ayudar? jajaja es que toy MUY perdido, ese programa lo hice como de retasos... Tu no me podrias ayudar a ver como lo harías? 
Gracias por tu ayuda en serio!!


----------



## pollo rangel (Feb 18, 2011)

soy_nuevo en esto de i2c ojala i me puedan ayudar no e podido realizar la comunicación estos son mis programas

-------------------------------------------------------
maestro 

# include <16f887.h>
#fuses INTRC,NOPROTECT,NOLVP,NOWDT
#use delay(clock=8000000)
#USE I2C (MULTI_MASTER,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0XA0,FAST,FORCE_HW)
void main(void)
{
i2c_start();
i2c_write(0XA1);
i2c_write(0b00111111);
i2c_stop();
delay_ms(1000);
i2c_start();
i2c_write(0XA1);
i2c_write(0b11111111);
i2c_stop();
delay_ms(1000);
i2c_start();
i2c_write(0XA2);
i2c_write(0b00111111);
i2c_stop();
delay_ms(1000); 
i2c_start();
i2c_write(0XA2);
i2c_write(0b11111111);
i2c_stop(); 
}



-------------------------------------------------------
esclavo 

# include <16f887.h>
#fuses INTRC,NOPROTECT,NOLVP,NOWDT
#use delay(clock=8000000)
#USE I2C (SLAVE, SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0XA1,FAST,FORCE_HW)


void main(void)
{
INT R1;



   R1=i2c_read();

      if(R1==(0b00111111))
      {
        output_b(0B00001111); 
      R1=i2c_read();
      }

      if(R1==(0b00111111))
      {   
      output_b(0B00001111); 
       R1=i2c_read();
      }
}


----------



## Moyano Jonathan (Feb 18, 2011)

Para los que quieran saber como implementé la comunicación , vean en el ejemplo que puse en la primer página.


----------



## mikamen (Abr 18, 2011)

Hola amigos soy nuevo en este tipo de conexion la i2C ,hice un sensor de tempreatura con el lm35 y el pic16f877 con salida a una lcd se me ha pedido utilizar el i2c me podria alguien explicar como fuinciona y como podria hacer esto por que no tengo ni dea de lo que se me pidio :/


----------



## Moyano Jonathan (Abr 18, 2011)

*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 

*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.


----------



## hernancho007 (Mar 1, 2012)

Buen día, tienes este mismo ejemplo pero para hi-tech c??


----------



## Moyano Jonathan (Mar 1, 2012)

> Buen día, tienes este mismo ejemplo pero para hi-tech c??



Nop disculpá , vas a tener que portar el código a tu compilador.

Un saludo !


----------



## Metallick (Abr 23, 2012)

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


----------



## Moyano Jonathan (Abr 24, 2012)

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


----------



## Metallick (Abr 24, 2012)

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 .

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 .

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


----------



## astervin688 (Ago 2, 2012)

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.!


----------



## Moyano Jonathan (Ago 2, 2012)

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


----------



## pokajontas (Feb 6, 2013)

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.


----------



## Moyano Jonathan (Feb 7, 2013)

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


----------



## gusvar (Feb 24, 2013)

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.


----------



## pokajontas (May 30, 2013)

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


----------

