Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Estoy tratando de comunicar dos PIC16F877 via I2C, utilizando lenguaje C para PIC (PICC), y hasta ahora no lo he logrado. 😕 no encuentro la manera que el PIC maestro se enlace con el PIC esclavo, necesito algún tipo de información, tutorial o enlace de alguna página que pueda ayudarme por favor. 😆
Hola:
No tengo mucha idea del I2C (todavía), pero tengo una pregunta: Las alimentaciones de las 2 skypics son independientes?
Si es así imagino que hay que unir las masas como referencia.
Un saludo
gONzAO
PD: Por otro lado puede que sea algo hardware? Has puesto los Jumpers J6 y 7 ?
Hola Mif,
Efectivamente el mundo del I2C es desesperante xD... pero sólo lo es en lenguajes de alto nivel, tipo C y demás... en ASM no tienes ningún problema porque sabes perfectamente cómo está configurado todo (ya que lo has tenido que hacer tú) y tienes un control total y absoluto de todos los registros... si no fuera por su incomodidad me quedaría con el ASM (de hecho, en el código que puse, hay una parte escrita en ASM).
No he probado el multimaestro pero estoy deseando probar en cuanto me quede un poco más libre. También quiero intentar probar a enviar más de 1 byte. En tu caso, y bajo mi punto de vista me decantaría más por la opción de 1 sólo maestro. La ventaja que tiene frente a dos maestros es que se evitan las colisiones en el bus. No obstante, no he probado el multimaestro, por lo que no sé qué grado de "incomodidad" supone tratar las colisiones.
Siempre tienes que usar el formato de envio del I2C, lo que implica que el bit de lectura escritura es obligatorio. Cuando envías el bit indicando una lectura lo que ocurre es que no "transmites dato" (desde el punto de vista del maestro)... sólo señal de reloj, a fin de recoger el dato del esclavo. Cuando es escritura se transmite el dato acompañado de la señal de reloj.
En la interrupción se puede entrar por varios motivos relacionados con la comunicación, si bien no estoy seguro si en C se pueden controlar dichos motivos o si sólo se salta por uno. Uno de los motivos es por detección de la dirección (y creo que es el que está definido en C) por lo que al detectar la dirección correcta se entra en la rutina de interrupción.
Espero que te sirva... si puedo ayudarte en algo más, no lo dudes 😀
Saludos
Hola.
He seguido estos hilos y sacado algunas conclusiones. Estoy comunicando un pic16f874a (maestro) y un pic16f873a (esclavo) y hasta ahora he logrado comunicación bidireccional pero, al igual que Rick, solo puedo regresar un byte al maestro. El código está por completo en C, nadita de ensamblador. Espero les sirva y me puedan sugerir cómo tomar más de un byte del esclavo. En cuanto lo logre, subo los ejemplos y le sigo con multimaestros, porque en realidad quiero colgar ahí mismo unos expansores pcf, que son la razón real de todo este asunto...
Saludos desde México.
Hola de nuevo.
Ya puedo mandar varios datos como respuesta al maestro :wink:, el asunto era meter un retardo después de cada i2c_write() en el esclavo. En realidad deberíamos esperar a que se enviara el dato, como bien dice Mosvack, pero no me funcionó hacer el bit_test(BF), se mantenía la línea de reloj bloqueada... El menor retardo que pude meter fue de 20 microsegundos con un cristal de 4MHz, eso funcionará para mí. El código completo está en el post anterior, las modificaciones quedaron:
// ESCLAVO
if(iEstadoI2C==4){ // El maestro pide un número flotante: fPrueba
for(i=0;i<4;i++){
i2c_write(*(&fPrueba+i));
delay_us(20); }
iEstadoI2C=0; }
// MAESTRO
i2c_start();
i2c_write(0xA0);
i2c_write(0x04);
i2c_start();
i2c_write(0xA1);
iEntraF[0]=i2c_read();
iEntraF[1]=i2c_read();
iEntraF[2]=i2c_read();
iEntraF[3]=i2c_read(0);
i2c_stop();
Cuando tenga avances, los subo.
Ciao 😀
El mundo del I2C es desesperante...
ya tengo dos pics que se comunican bastante bien (unidireccionalmente)... pero solo en el Proteus... al hacerlo con dos Skypic no funciona ni "patrás"
Ojalá algún alma caritativa me diga el truco.
os cuelgo los archivos, por si alguien tiene tiempo y ganas.
La idea es que el Master Mande al Esclavo un dato, al pulsar en A0 se mandara un 10, es decir algo como:
i2c_start();
i2c_write(Direccion); //Dirección del Esclavo + 0
i2c_write(10);
i2c_stop();
El esclavo lo unico que tiene que hacer es guardar el dato en una variable llamada comando y la direccion en otra llamada direccion...
Parece facil y encima funciona sin fallos en Proteus, pero luego...
¡¡¡Mil gracias!!!
hola Mif!!!!!!!!!!!!!!!!1
porfa sube tu cimulacion de proteus porfavor a me gusta esto y solo estoy aprendiendo y con tus codigos estoy realizando mu cimulasion peo no me keda a lo mejor no configure bien algo porfa subela