fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

I2C para PIC16F877
 
Avisos
Vaciar todo

I2C para PIC16F877

31 Respuestas
8 Usuarios
0 Reactions
22.2 K Visitas
rick_rs
Respuestas: 24
Topic starter
(@rick_rs)
Eminent Member
Registrado: hace 18 años

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

Responder
30 respuestas
gonzao
Respuestas: 218
(@gonzao)
Estimable Member
Registrado: hace 19 años

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 ?

Responder
mosvack
Respuestas: 126
(@mosvack)
Estimable Member
Registrado: hace 19 años

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

Responder
lcmitru
Respuestas: 2
(@lcmitru)
New Member
Registrado: hace 17 años

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.

Responder
lcmitru
Respuestas: 2
(@lcmitru)
New Member
Registrado: hace 17 años

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 😀

Responder
danashelyn
Respuestas: 2
(@danashelyn)
New Member
Registrado: hace 16 años

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

Responder
Página 6 / 7
Compartir: