Problemas con comunicación I2C

#1
EStimados, los saludo a todos ya que es laprimera vez que escribo en el foro y de paso les cuento un poco lo que estoy haciendo antes de introducir mis dudas.

Estoy tratando de comunicar mediante I2C dos pic´s, uno (PIC18F4550 a 48MHz) y el otro (PIC16F876A a 20MHz) y un tercero que por el momento no me intereza. Una ves que resuelva esto plantearé como seguir con él. (que es idéntico al segundo)
Esta comunicción esta orientada a la comunicación de los parámetros y referencias de dos controladores que manejan diferentes partes de un robot móvil autónomo... ya les contare mas si les interesa....

Ah, los estoy programando en CCS y simulando en Proteus..

Bueno mi problema con la comunicación redica en el momento de pedir un dato al esclavo, este lo envía y luego no se puede hacer nada mas. Mediante el debugger de I2C veo que la primera peticien se transfiere correctamente y si se le vuelve a pedir al esclevo el mismo dato (ya que por el momento solamente envia el 0x21 == 33) ya no reconoce la dirección, ya que aparece un NO_ACK.... ¿?¿? ¿qué puede estar sucediendo??

Los micros involucrados son los de arriba (U1 y U2 en la simulación) y los botones son los dos de mas arriba (ya que son tres) el primero es para pedir desde el maestro un dato y el segundo para enviar un dato al esclavo, que se incrementa en cada pulso.

Adjunto los archivos .c y .h y los del Proteus para que puedan revisarlos ya que me parece mas conveniente que pegar el còdigo acá (lo que además no se hacer).....


Saludos
Guille

PD: creo que se adjunto el archivo, cualquier cosa avisen....
 

Adjuntos

#2
Buenas tarde,
gracias por las respuestas y el interez

Espero que nadie sepa nada de I2c, porque sino no entiendo para que existe este foro, si nadie se digna a decir al menos.. Che ni idea de eso...


saludos
Guille
 
#3
El problema con la programación en C es que uno deja de tener control sobre el microcontrolador y CCS toma el control pero sin saber nosotros exactamente que hace y a la hora de tener un problema, se vuelve difícil solucionarlo o saber exactamente que esta pasando.

Yo he usado el I2C en ensamblador con la nota de aplicación AN976 de microchip. Sin ningún problema.

Tal vez ese documento te pueda servir como guía.


Saludos!
 
#4
que tal. yo estoy en el mismo problema, intento comunicar 2 pics 16f877a, el maestro solo lee el primer dato del esclavo, pero cuando intento leer el segundo dato, ya no lo hace. lo que intento es que el maestro este monitoreando cada cierto tiempo al esclavo.
 
#5
hola! mcpiebot,

PHP:
Yo he usado el I2C en ensamblador con la nota de aplicación AN976 de microchip.
gracias, me fijaré en la nota de aplicación y luego les cuento...

tejon1424118, si resuelvo el problema los cuelgo para que sepas que sucede...

Saludos
Guillex
 
#7
Hola::aplauso:
después de algunas idas y vueltas creo que logre que funcione la comunicación I2C.

Ya puedo enviar y recibir datos por el protocolo I2C sin problemas.... (y)
Creo que mi problema recidia en los fusibles de configuración del PLL, lo tenia configurado como "#FUSE XTPLL " y no estaba funcionando a 48MHz como creia, ahora esta con "#FUSES HSPLL" y todo anda bien..

Incognita: el proteus aun continua diciendo NOACK al momento de recibir el dato pedido al esclavo, no se porque?¿?¿? Pero lo probe fisicamente enviando los datos al pueto b del esclavo y al pueto d del maestro y todo anda joya... Además, cuando el esclavo escribe monitoreo el dato que devuelve el i2c_write en el puerto b y no aparece 1 (1 == NOACK) sino que un cero...

¿si alguien sabe que sucede por favor le agradecería que lo comente?

acá dejo los archivos del maestro y del esclavo en CCS y los archivos de simulación para el proteus... recuerden que con los primeros dos botones se pide y envia información... cuando se envía en el esclavo aparece en auto fantastico... jeje

Saludos
Guillex

PD: espero que te sirva tejon1424118, cualquier cosa avisa....
 

Adjuntos

#8
Mira, yo me aburri de tener problemas con I2C en pics y 8051 cuando el I2C lo genera el compilador, por lo que, consegui un fuente de alguien que habia hecho una libreria de I2Cpara 8051, luego la adapte para pic, y hasta hoy en dia vengo usandola sin ningun problema.

Te adjunto la libreria, en una de esas te ahorras los problemas armando vos los paquetes de datos y no dejando al compilador que lo haga, a mi me funciono asi
 

Adjuntos

#9
Hola. ¿Alguien tuvo algún problema por usar un pic a 16Mhz y tener error por I2C?
Me puso un error proteus, que de seguro si lo armo, capaz falle y que de seguro es por la velocidad en la que estoy trabajando.
¿Se puede corregir eso? Pone un mensaje de Start time...
Código:
#include <18F46K22.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV22                   //Brownout reset at 2.2V
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
//#FUSES PROTECT                  //Code protected from reads
//#FUSES CPB                      //Boot Block Code Protected
//#FUSES CPD                      //Data EEPROM Code Protected
//#FUSES WRT                      //Program Memory Write Protected
//#FUSES WRTC                     //Configuration registers write protected
//#FUSES WRTB                     //Boot block write protected
//#FUSES WRTD                     //Data EEPROM write protected
//#FUSES EBTR                     //Memory protected from table reads
//#FUSES EBTRB                    //Boot block protected from table reads

#use delay(internal=8MHz)
#define int00  PIN_B0
#define int01  PIN_B1
#define int02  PIN_B2
#define ADC    PIN_C2
#define SCL1   PIN_C3
#define SDA1   PIN_C4
#define mclr   PIN_E3

#use i2c(MASTER,SLOW,sda=SDA1,scl=SCL1,FORCE_HW, stream=I2CM)
 

Adjuntos

#11
Ahh bueno, vos decís que funcionaría el I2C a esa velocidad??? Justamente eso es las advertencias como no las conozco capaz no funcione y me asuste



dcsalg dijo:
Ahh bueno, vos decís que funcionaría el I2C a esa velocidad??? Justamente eso es las advertencias como no las conozco capaz no funcione y me asuste. En el proteus se ve que funciona la hora por ejemplo con el DS1307 pero como vi esos mensajes que nose de que son capaz es algo malo?


 
#12
No he dicho que funcione.
Para saber si realmente funciona, habría que verse el código y determinar qué produce las advertencias, o que hagas una prueba en físico.
 
#13
Ahh, bueno la cabecera es esa a esa frecuencia en el día subo como utilizo el I2c que no es ni más ni menos algo sencillo

Código:
int1 i2c_envia(char addr,char data)
{
      int1 ack;
      i2c_start();
      ack=i2c_write(addr);
      if(ask!=0)
           return FALSE;

   i2c_write(data);
   i2c_stop();
   return TRUE;
}
Código:
unsigned int8 i2c_recibe(char addr)
{
      char data;
      i2c_start();
      ack=i2c_write(addr);
      data=i2c_read();
   i2c_stop();
   return data;
}
Para envío utilizo esto, y el de lectura es algo así pero con i2c_read(); donde pero con esto como se ve me pone esos mensajes y bueno con esa función la utilizo para enviar y otra para recibir. Y salta eso que viste en proteus.

Escribo así medio poco porque estoy utilizando un celular y no es muy práctico jeje pero, necesitas más datos los subiré después cuando esté con computadora, pero es la cabecera esa y función de enviar y recibir con i2c

 
#15
hola juanma2468, la realidad si ves por ejemplo el return FALSE es para el if , todo lo demas esta fuera del if, el inconveniente que tengo es unos mensajes que tura proteus cuando utilizo los pic a 8 o 16MHz en frecuencias bajas no.

if(ask!=0)
return FALSE;
te pone un error como "SDA setup time violated ......
 
#16
A mi no me aparecen las advertencias que mencionas.
Test I2C 16 MHz.jpg

Únicamente esas dos que son comunes, e información sobre la inhabilitación del modo esclavo por falta de dirección.

Usé lo poco del código que subiste:
PHP:
#include <18F46K22.h>
#device ADC=10

#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV22                   //Brownout reset at 2.2V
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
//#FUSES PROTECT                  //Code protected from reads
//#FUSES CPB                      //Boot Block Code Protected
//#FUSES CPD                      //Data EEPROM Code Protected
//#FUSES WRT                      //Program Memory Write Protected
//#FUSES WRTC                     //Configuration registers write protected
//#FUSES WRTB                     //Boot block write protected
//#FUSES WRTD                     //Data EEPROM write protected
//#FUSES EBTR                     //Memory protected from table reads
//#FUSES EBTRB                    //Boot block protected from table reads

#use delay(internal = 16MHz)
#define int00  PIN_B0
#define int01  PIN_B1
#define int02  PIN_B2
#define ADC    PIN_C2
#define SCL1   PIN_C3
#define SDA1   PIN_C4
#define mclr   PIN_E3

int1 ack,ask;

#use i2c(MASTER,SLOW,sda=SDA1,scl=SCL1,FORCE_HW, stream=I2CM)

int1 i2c_envia(char addr,char data)
{
   i2c_start();
   ack=i2c_write(addr);
   
   if(ask != 0)
      return FALSE;

   i2c_write(data);
   i2c_stop();
   return TRUE;
}

unsigned int8 i2c_recibe(char addr)
{
   char data;
   i2c_start();
   ack=i2c_write(addr);
   data=i2c_read();
   i2c_stop();
   return data;
}

void main (void)
{
   while (true)
   {
      if(!input(PIN_D2))
      {
         i2c_envia(0x01,0x0A);
         while(!input(PIN_D2));
         i2c_recibe(0x01);
      }
   }
}
Tal vez el problema es debido a otra causa en tu programa o hardware.
 
#17
Sabes cuando salta el error cuando usas por ejemplo alguna libreria que controle I2C, un ejemplo #include <DS1307_dcs.c>, luego la inicializas en el main ds1307_init(); y comienza esos mensajes , lo estoy probando ahora eso, tambien por la libreria #include <mcp23017_dcs.C> , te paso las dos para que las agregues y vas a ver que aparece apenas los colocas e inicializas listo esos mensajes

[I2CMEM TIMING]SDA setup time violated. Last change on SDA ....

Aqui hay un problema de tiempos o algo todo surge cuando uno comienza a utilizar los datos por I2C, sea con un reloj o los MCP23017 que en mi caso es lo que estoy usando pero seguro con alguna otra cosa tambien. pero como controlo eso?



 

Adjuntos

Última edición:

Temas similares

Arriba