Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

26/08/2010 #1


Problemas con comunicación I2C
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....
02/09/2010 #2


Respuesta: COMUNICACION I2C PROBLEmas!!
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
02/09/2010 #3


Respuesta: COMUNICACION I2C PROBLEmas!!
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!
02/09/2010 #4


Respuesta: COMUNICACION I2C PROBLEmas!!
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.
02/09/2010 #5


Respuesta: COMUNICACION I2C PROBLEmas!!
hola! mcpiebot,

Código 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
02/09/2010 #6


Respuesta: COMUNICACION I2C PROBLEmas!!
ok, yo tambien ando en eso
08/09/2010 #7


Respuesta: COMUNICACION I2C PROBLEmas!!
Hola:
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....
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....
Archivos Adjuntos
Tipo de Archivo: rar comm_I2C.rar (201,9 KB (Kilobytes), 161 visitas)
09/09/2010 #8


Respuesta: COMUNICACION I2C PROBLEmas!!
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
Archivos Adjuntos
Tipo de Archivo: txt i2c.txt (3,3 KB (Kilobytes), 181 visitas)
19/10/2016 #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)
Enviado desde mi XT1058 mediante Tapatalk
Imágenes Adjuntas
Tipo de Archivo: png Error1.png (165,3 KB (Kilobytes), 7 visitas)
Archivos Adjuntos
Tipo de Archivo: rar lcd420_dcs.rar (1,9 KB (Kilobytes), 1 visitas)
19/10/2016 #10
Moderador

Avatar de D@rkbytes

Yo no veo errores, únicamente advertencias.
Si en verdad tienes errores, con lo que adjuntas no es posible determinarlos.
19/10/2016 #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

Enviado desde mi XT1058 mediante Tapatalk

dcsalg dijo: Ver Mensaje
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?

Enviado desde mi XT1058 mediante Tapatalk


Enviado desde mi XT1058 mediante Tapatalk
19/10/2016 #12
Moderador

Avatar de D@rkbytes

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.
20/10/2016 #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

Enviado desde mi XT1058 mediante Tapatalk
20/10/2016 #14

Avatar de juanma2468

En la rutina de i2c_Enviar me parece que falta un else luego del return false

Enviado desde mi SM-J710MN mediante Tapatalk
20/10/2016 #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 ......
20/10/2016 #16
Moderador

Avatar de D@rkbytes

A mi no me aparecen las advertencias que mencionas.


Ú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:
Código 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.
Imágenes Adjuntas
Tipo de Archivo: jpg Test I2C 16 MHz.jpg (393,3 KB (Kilobytes), 41 visitas)
20/10/2016 #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?



Enviado desde mi XT1058 mediante Tapatalk
Archivos Adjuntos
Tipo de Archivo: zip librerias 01.zip (2,3 KB (Kilobytes), 5 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.