Autor Tema: Dos velocidades distintas en un mismo bus i2c por hardware.  (Leído 12009 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Dos velocidades distintas en un mismo bus i2c por hardware.
« en: 04 de Junio de 2008, 00:37:59 »
Hola foro. Veran, tengo un RTC (DS1307) y una memoia serial (24LC512). Ambos, cmo sabran se comunican por i2c. Tambien (y cmo maestro) tengo al 18F2550 usando su i2c por hardware para comunicarme con esos dispositivos esclavos.

Lo que sucede, es que el RTC, su velocidad de trabajo (su linea de clock), alcanza como maximo a 100khz; mientras que la de la memoria llega hasta los 400khz. Pues cmo necesito la mayor velocidad en la memoria y cmo el hardware i2c del pic solo puede generar en su pin SCL una sola frecuncia, termine haciendo dos buses i2c: uno por hardware (para la memoria) y el otro por software (para el RTC). Eso hasta que me dijieron que se puede setear la velocidad o baudaje y ver cmo habia ejemplos que usaban varios #use i2c o rs232, etc (Si, estoy usando el CCS xD (el 4.023 porsiak =D)).

Asique me decidi por probar y, viendo unos ejemplos de lo mismo pero con rs232, pense que podria lograr hacerlo funcionar, ocea: hacar trabajar dos dispositovos (en este caso un RTC y una memoria EEPROM) con diferentes velocidad de trabajo (100khz y 400khz respectivamente segun el parentesis anterior xD) en un solo bus i2c por el hardware de un pic (el 18F2550).

Haciendo este codigo:
Código: [Seleccionar]
                                                                                                                     
#INCLUDE <18F2550.h>

#FUSES XTPLL      //Cristal mayor de 4Mhz y usando el PLL interno del pic para modificar aumentarlo/disminuirlo.
#FUSES NOWDT
#FUSES NOPROTECT  //No proteger el PIC contra lectura.
#FUSES PUT        //El Power Up Timer(PUT) espera unos nilisegundos antes de iniciarse el PIC.
#FUSES NOBROWNOUT //No uso reset automatico cuando se encuentra alguna baja tension especificada.
#FUSES NOLVP      //No usare programacion en bajo voltaje.
#FUSES PLL1       //Se divide entre 1 el oscilador(4Mhz) a la entrada del divisor porque el sistema necesita estos 4Mhz para generar 48Mhz para el usb.
#FUSES CPUDIV1    //Esto es para la velocidad conque el PIC trabajara. Esta dividido entre 1, entonces trabajara tambien a 48Mhz.


#USE Delay (Clock = 48 000 000)

#USE RS232 (Baud = 115200, xmit = Pin_C6, rcv = Pin_C7)


#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)


#INCLUDE "ds1307_modificado.c"      //Funciones para el uso del Real Time Clock del integrado DS1307.
#INCLUDE "24512_modificado.c"       //Funciones para el uso de la memoria volatil serial eeprom externa 24LC256.


void main(void)
{     
   unsigned int8  DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA;
   unsigned int8 Buffer[256];
   unsigned int16 cont, i;
   
   delay_ms(1500);
   printf("\r\n\n\n-----------jeremy-----------\r\n\n\n");

   ds1307_init();          //inicializamos el RTC (DS1307).
   //init_ext_eeprom();      //Inicializo la EEprom externa.

   ds1307_set_date_time(29, 5, 8, 4, 11, 8, 0);
   
   cont = 0;
   delay_ms(300);

   while (TRUE)
   {
      delay_ms(1000);
      /////////////////////////////
     
      ds1307_get_date(DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA);
      ds1307_get_time(DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
      printf("\n\r%02u/%02u/%02u  %u\n\r%02u:%02u:%02u", DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
                 
      printf("     Direcion[%Lu] -> %03u", cont, read_ext_eeprom(cont));
      cont++;
      //////////////////////////////////

      printf("\r\n\nEmpezando lectura secuencial de 24LC512...");
      read_ext_eeprom_seq(Buffer, 0, 255);
      printf(" Terminada:\r\n");
     
      for (i = 0; i <= 255; i++)
      {
         printf("%03u ", Buffer[i]);
      }   
      ////////////////////////////////////
   }
}

Y el problema aqui viene:



Como se ve, lo que es la fecha y hora, esta bien, perfecto. Pero lo que es la lectura secuencial echa a la memoria eeprom... Es una catrastrofe xD! Esos datos son erroneos. Ahora veran porque:


Esta imagen corresponde a un cambio que hice en el codigo anterior y que, ahora si, la lectura a la eeprom (por el modo secuencial (ver datasheet xD)), es correcta, ocea que esos 256 datos leidos si son los que estan ahi. PERO! que esta mal? la fecha y la hora, enrealidad los segundos si avanzan y "el numero del dia" (1 - 7) esta bien tambien, pero en si, esta mal lo que se lee... se entiende?

...Y lo peor de todo... Que lo que cambie del codigo para que pase eso? Pues simplmente los #USE I2C. Ocea que si el "#USE I2C" del RTC esta primero, el es el que funciona bien y la lecuta secuencial de la memoria falla (imagen 1). Si es alraves, es la lectura secuancial de la memoria la que funciona bien y la lectura del dia, mes, año, minuto y segundo del RTC falla (imagen 2).

Algo que agregar esque cuando es "el RTC el que va primero" el modo de lectura secuencial de la memoria falla, PERO su lectura normal o random funciona bien. Que lo muestra un printf del codigo, justo despues de mostrar la fecha y hora del RTC: "Direcion[ x ] -> ABC".

Bueno, espero se entiendo bien todo =D Q dicen? Acaso tiene que ver quien va primero o quien va despues? O si esque eso se puede? Que falta? Q sucede? oO!


Gracias por la leida x)
Un saludo!


PD: Dejo tambien los .c del ds1307 y 24lc512 que cmo bien dicen algo sus nombres, estan algo modificados, aunq enrealidad e agregado solo al 24lc512 lo de lectua secuencial. Bueno, de eso no me preocupo porque eso si funciona bien. Es eso de los #use  :x xD!



Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #1 en: 04 de Junio de 2008, 15:36:55 »
Perdon por mi ignorancia ( no conozco los Pics ) , pero no es posible cambiar la base de tiempo del reloj del SPI en run-time ?

Saludos !

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #2 en: 05 de Junio de 2008, 08:26:49 »
Yo utilize multivelocidad en RS232, con 4 declaraciones y el mismo patillaje, pero cada vez que estas cambiando debes definir la velocidad a la que trabajas...
Prueba poner la declaracion antes de utilizar cada chip... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #3 en: 05 de Junio de 2008, 16:36:27 »
Buena observación la que hace MGLSOFT, ayer quería comentar en este hilo pero justamente en ese momento la página murió  :D
La cosa Jeremy es que estás usando el mismo "patillaje" como dice MGLSOF, para ambos buffers... así que tienes dos opciones: o cambias los pines de uno de los buffers y así tienes dos buffers distintos sin problemas, o haces lo que dice el maestro MGLSOFT. Debería funcionarte sin problemas.
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #4 en: 06 de Junio de 2008, 00:14:25 »
No entiendo. Con "patillaje" se refieren a la velocidad? Pero en cada "#use i2c" uno esta puesto a 100khz (slow) y otro a 400khz (fast)  :?

Lo de cambiar un chip a otro bus, pues asi antes lo tenia. Pero la idea esq los dos chips, con comunicacion i2c, esten en un mismo bus. O almenos es lo q quiero lograr (si ay la posibilidad claro  :lol:).


Gracias por responder.
Salu2.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #5 en: 06 de Junio de 2008, 08:18:52 »
Nos referimos a que utilizes algo asi:
Código: [Seleccionar]
#INCLUDE <18F2550.h>

#FUSES XTPLL      //Cristal mayor de 4Mhz y usando el PLL interno del pic para modificar aumentarlo/disminuirlo.
#FUSES NOWDT
#FUSES NOPROTECT  //No proteger el PIC contra lectura.
#FUSES PUT        //El Power Up Timer(PUT) espera unos nilisegundos antes de iniciarse el PIC.
#FUSES NOBROWNOUT //No uso reset automatico cuando se encuentra alguna baja tension especificada.
#FUSES NOLVP      //No usare programacion en bajo voltaje.
#FUSES PLL1       //Se divide entre 1 el oscilador(4Mhz) a la entrada del divisor porque el sistema necesita estos 4Mhz para generar 48Mhz para el usb.
#FUSES CPUDIV1    //Esto es para la velocidad conque el PIC trabajara. Esta dividido entre 1, entonces trabajara tambien a 48Mhz.


#USE Delay (Clock = 48 000 000)

#USE RS232 (Baud = 115200, xmit = Pin_C6, rcv = Pin_C7)


#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)


#INCLUDE "ds1307_modificado.c"      //Funciones para el uso del Real Time Clock del integrado DS1307.
#INCLUDE "24512_modificado.c"       //Funciones para el uso de la memoria volatil serial eeprom externa 24LC256.


void main(void)
{     
   unsigned int8  DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA;
   unsigned int8 Buffer[256];
   unsigned int16 cont, i;
   
   delay_ms(1500);
   printf("\r\n\n\n-----------jeremy-----------\r\n\n\n");
#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)

   ds1307_init();          //inicializamos el RTC (DS1307).
   //init_ext_eeprom();      //Inicializo la EEprom externa.

   ds1307_set_date_time(29, 5, 8, 4, 11, 8, 0);
   
   cont = 0;
   delay_ms(300);

   while (TRUE)
   {
      delay_ms(1000);
      /////////////////////////////
     
      ds1307_get_date(DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA);
      ds1307_get_time(DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
      printf("\n\r%02u/%02u/%02u  %u\n\r%02u:%02u:%02u", DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
                 
      printf("     Direcion[%Lu] -> %03u", cont, read_ext_eeprom(cont));
      cont++;
      //////////////////////////////////

      printf("\r\n\nEmpezando lectura secuencial de 24LC512...");
#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)
      read_ext_eeprom_seq(Buffer, 0, 255);
      printf(" Terminada:\r\n");
     
      for (i = 0; i <= 255; i++)
      {
         printf("%03u ", Buffer[i]);
      }   
      ////////////////////////////////////
   }
}

Luego en forma mas organizada podras hacerlo como recomienda CCS, buscando en las FAQ en su sitio o en su foro... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #6 en: 06 de Junio de 2008, 10:31:26 »
No entiendo. Con "patillaje" se refieren a la velocidad? Pero en cada "#use i2c" uno esta puesto a 100khz (slow) y otro a 400khz (fast)  :?
No. Se refiere a las "patillas" que usas para el bus (para SDA, SCL). Que son las mismas en cada caso y corresponden a las que el pic tiene apartadas para esas funciones (ya que estás implementándolo por hardware).
Ya el maestro MGLSOFT te explicó bastante ilustrada cuál es la idea.  :P
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #7 en: 07 de Junio de 2008, 02:52:35 »
Que yo sepa esa directiva #Use i2c solo se puede usar al compilar, y no en tiempo de ejecucion... =/

Gracias igualmente por las respuestas.
Un saludo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #8 en: 07 de Junio de 2008, 08:43:13 »
Siquiera lo has probado?? :shock:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #9 en: 07 de Junio de 2008, 11:51:43 »
Yo de ti lo probaría al menos.
En este otro hilo pude comprobar cómo el #use i2c también funciona en tiempo de ejecución.
http://www.todopic.com.ar/foros/index.php?topic=21967.msg172416#msg172416

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #10 en: 07 de Junio de 2008, 12:06:56 »
Jeremy muchas directivas #use, como la 232, la i2c, la spi (bueno esas son las que yo he probado al menos) se pueden probar en ejecución tranquilamente.
Lo que tienes que hacer es colocar la directiva antes de la función que usa la característica declarada en el #use (en tu caso el i2c correspondiente)... y listo.
Nocturno lo ha probado también y funciona de maravilla.
Así que, a probar pues!  :D
Verás que te sale perfecto.
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #11 en: 07 de Junio de 2008, 12:23:56 »
Sí funcionan perfectamente en tiempo de ejecución, yo también lo comprobé con algunos programas.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #12 en: 07 de Junio de 2008, 19:19:57 »
Hola. Acabo de probarlo y tengo el mismo resultado =(

Asi tengo el codigo ahora:

Código: [Seleccionar]
#INCLUDE <18F2550.h>

#FUSES XTPLL      //Cristal mayor de 4Mhz y usando el PLL interno del pic para modificar aumentarlo/disminuirlo.
#FUSES NOWDT
#FUSES NOPROTECT  //No proteger el PIC contra lectura.
#FUSES PUT        //El Power Up Timer(PUT) espera unos nilisegundos antes de iniciarse el PIC.
#FUSES NOBROWNOUT //No uso reset automatico cuando se encuentra alguna baja tension especificada.
#FUSES NOLVP      //No usare programacion en bajo voltaje.
#FUSES PLL1       //Se divide entre 1 el oscilador(4Mhz) a la entrada del divisor porque el sistema necesita estos 4Mhz para generar 48Mhz para el usb.
#FUSES CPUDIV1    //Esto es para la velocidad conque el PIC trabajara. Esta dividido entre 1, entonces trabajara tambien a 48Mhz.


#USE Delay (Clock = 48 000 000)

#USE RS232 (Baud = 115200, xmit = Pin_C6, rcv = Pin_C7)

#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)


#INCLUDE "ds1307_modificado.c"      //Funciones para el uso del Real Time Clock del integrado DS1307.
#INCLUDE "24512_modificado.c"       //Funciones para el uso de la memoria volatil serial eeprom externa 24LC256.


void main(void)
{     
   unsigned int8  DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA;
   unsigned int8 Buffer[256];
   unsigned int16 cont, i;
   
   delay_ms(1500);
   printf("\r\n\n\n-----------jeremy-----------\r\n\n\n");
#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
   ds1307_init();          //inicializamos el RTC (DS1307).
   //init_ext_eeprom();      //Inicializo la EEprom externa.

   ds1307_set_date_time(29, 5, 8, 4, 11, 8, 0);
   
   cont = 0;
   delay_ms(300);

   while (TRUE)
   {
      delay_ms(1000);
      /////////////////////////////
      #USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
      ds1307_get_date(DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA);
      ds1307_get_time(DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
      printf("\n\r%02u/%02u/%02u  %u\n\r%02u:%02u:%02u", DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA);
     
      #USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)
      printf("     Direcion[%Lu] -> %03u", cont, read_ext_eeprom(cont));
      cont++;
      //////////////////////////////////

      printf("\r\n\nEmpezando lectura secuencial de 24LC512...");
      read_ext_eeprom_seq(Buffer, 0, 255);
      printf(" Terminada:\r\n");
     
      for (i = 0; i <= 255; i++)
      {
         printf("%03u ", Buffer[i]);
      }   
      ////////////////////////////////////
   }
}

Que puede estar mal? Es acaso un bug del CCS? O es que no se puede hacer funcionar dos velocidades diferentes en el hardware I2C del PIC18F2550 ?   :?

Gracias por todo.
Salu2.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #13 en: 07 de Junio de 2008, 21:36:55 »
Saludos jeremy!
Si colocas los #use i2c, no hace falta que agregues el STREAM=id.
Espero puedas solventar tu problema.
Sigue revisando el código, las dos i2c sí que funcionan.
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #14 en: 08 de Junio de 2008, 08:59:07 »
Haber, no puedes poner los mismos pines para los dos buses. Declara cada bus en pines distintos.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús


 

anything