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 Mosvack y Rick_rs!!Espero que me podais ayudar con un problema que tengo...Estoy intentando comunicar dos dispositivos pic mediante i2c. La comunicación la realiza pero es en la interrupción del dispositivo q se comporta como Slave que solo me coje el primer "i2c_write" que envia el dispositivo Master. Como puedo cojer todos los demas "i2c_write"??os pongo el codigo para aclarar un poco el tema 😛
DISPOSITIVO MASTER
BYTE data;
data=5;
i2c_start(); // Condicion de Start
i2c_write(0xa0); // Device address
i2c_write(data); // Device data
i2c_stop(); // Stop condition
DISPOSITIVO SLAVE
#int_ssp
void i2c_isr()
{
int a;
if(i2c_poll()){ //¿he recibido alguna trama de master
a=i2c_read();
}
printf("%i",a);
}
Porque solo me coje el valor 0xa0 y no me coje el valor 5 (data=5)??
Que es lo que hago mal??
Y una ultima cosa, trabajar en modo multimaster es muy complicado?hay algun ejemplo por aqui??Alguien me podria poner algun ejemplo sencillo??
Muchisimas gracias!!!
Hola Kristian Miranda...
También tuve ese problema al momento de realizar el programa de comunicación I2C, para ese momento necesitaba enviar 5bytes y tan solo recibía el 1er byte... La manera como se resolvió el problema fue colocando un contador en el Pic esclavo, el cual se incrementaba cada vez que el pic maestro enviaba un nuevo byte.... ese ejemplo sale en la página anterior (pag.2) de este tema, espero que te sirva de algo ese ejemplo... 🙂
Hola como estan??? tengo un problema y espero m puedan ayudar. Estoy tratando de implementar un protocolo i2c en modo multimaster. Uso el compilador CCS PICC v 3.249. Un PIC escribe en la memoria y el otro lee un valor q el primero ha escrito y lo muestra en una LCD, estoy usando #use i2c(multi_master, sda=EEPROM_SDA, scl=EEPROM_SCL, force_hw, SLOW) en la subrutina que usan para la memoria 24512 q la adapte para multimaestro guiandome por el driber q tienen para la 2408 q esta en multimaster. El problema es q logro hacer algunas iteraciones pero luego de eso se guinda el programa. he probado de todo y ya no se que inventarme. Si pueden darme alguna ayuda se los agradezco.javascript:emoticon(':cry:')
Llorando o Muy triste
¡Muy buenas compañeros!
Este hilo lo suguí cuando estaba muy activo, pero más por curiosidad que con fines prácticos... y claro, ahora me ha llegado la hora de poner en práctica todo lo que retuve.
Ccomo algunos sabéis estoy trabjando con TupperBot 2.0 estos días, y una de las novedades básicas es que he usado dos 16F876 para repartir todas las tareas... que empiezan a ser bastantes.
Quiero comunicar los dos Pics por I2C, pero tengo varias dudas:
-Un Pic está destinado a comunicación con el PC, motores y PWMs varios básicamente, y el otro trabaja con un GPS, y varios sensores de todo tipo.
en principio había pensado hacer que el primero fuese el Master del I2C y el segundo un Esclavo más, pero creéis que es lo más recomendable? o por otro lado sería más inteligente guardar prioridades sensoriales y hacer del segundo el master...
-¿Y si trabajo con los dos pics en Modo Multimaster? Tengo varios dispositivos esclavos como un TC74, un LCD03 y algun otro sensorcillo más.
-todos los ejemplos de que veo en este hilo están hecho con ASM, ¿tenemos alguno hecho al 100% en C con CCS?
-Aunque he leido un monton sobre el tema, aun no entiendo el tema de la direccion y el bit de escritura en el CCS... tengo que usar el bit de escritura/lectura? supongo que si., pero por eso me pierdo un poco.
-Al entrar en la interrupción, sabe ya el micro que la información es para el? quiero decir, el esclavo ha leido y aceptado la direccion enviada por el master una vez que entra en la interrupción?
Creo que de momento es suficiente... como ya he dicho, un ejemplito básico en C sería de gran ayuda... y ahora por experiencia os digo que quien haga un tutorial cortito y comprensible sobre este tema será alabado por toda la comunidad robotera 🙂
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!!!