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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #15 en: 08 de Junio de 2008, 15:40:36 »
Solo tiene un bus al que tiene conectado un RTC y una MEM (más el PIC) y cuando usa el RTC lo quiere hacer correr a velocidad lenta y cuando usa la MEM a velocidad alta.

Debe de funcionar, será una tonteria.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #16 en: 08 de Junio de 2008, 22:16:33 »
Solo tiene un bus al que tiene conectado un RTC y una MEM (más el PIC) y cuando usa el RTC lo quiere hacer correr a velocidad lenta y cuando usa la MEM a velocidad alta.

Debe de funcionar, será una tonteria.
Exacto. Solo que no es que quiera sino que es lo que me queda, ya que el RTC DS1307 su maxima velocidad de trabajo es de 100khz y el de la memoria 24LC512 llega hasta 400khz y en la memoria tengo que usarlo a esa velocidad. Pero la idea es poner ambos en un solo bus.

No encuentro la solucion  :?

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #17 en: 08 de Junio de 2008, 22:37:06 »
No se pueden poner en el mismo bus, se interfieren entre ellos.

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #18 en: 09 de Junio de 2008, 02:36:51 »
No entiendo Jesús, podrías explicar esto.

Si para activar uno lo direccionas por ejemplo con 0xA0 y para activar el otro lo direccionas con 0xA2 porqué tienen que interferir (caso de un pcf8583 y una MEM 24LC64 que son los que yo probé en su día).

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #19 en: 09 de Junio de 2008, 06:31:45 »
Al ser distintas las velocidades uno de ellos funcionará bien, pero el otro recibirá basura (el de menor velocidad) ya que no es capaz de seguir al de mayor velocidad, pudiendo responder o incluso bloquear el bus.   ¿Tu los probastes a distintas velocidades?

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #20 en: 09 de Junio de 2008, 09:11:35 »
No yo los probé a la misma velocidad. Me gustaría probarlo para salir de dudas, ya que jeremylf está cambiando de dispositivo y velocidad en tiempo de ejecución y no le va.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #21 en: 09 de Junio de 2008, 09:42:58 »
Jeremy he notado que estás forzando a hacer el i2c por hardware... estás usando la interrupción por i2c?
Si la respuesta es no, por qué no pruebas a hacerlo por software? Es, decir, quitar el Force_HW?
Bueno es una opción que se me ocurre en mi ignorancia...  :D
Qué te parece?
Si es una idea descabellada y ridícula pido a los más expertos en el foro que lo aclaren por favor...
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 #22 en: 09 de Junio de 2008, 12:25:42 »
Claro que fallaria si el bus se trabajara a una sola velocidad nada mas. Por eso, pense en que se podria setear o cambiar la velocidad de trabajo del hardware i2c del pic cada ves que necesito usar una funcion del RTC o la memoria; me dijieron que se podria, en RS232 se puede  :(

Firepic, creo haberlo probado tb por software solo por descartar, pero la idea es usar el hardware (almenos es lo que quiero) y hacerlo funcionar  :lol:


Gracias por las respuestas.
Salu2.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #23 en: 09 de Junio de 2008, 17:46:46 »
Hola, estube mirando las hojas de datos de los 2 chips y no le encuentro la vuelta, por la sencilla razon de que se tiene que trabajar a la máxima velocidad del más lento de los dispositivos, en este el DS1307, y como ninguno de los 2 tiene CS ( chip select ) si se te acabaron las posiblidades y te queda un port disponible porque no le reventas la tension de alimentación al DS1307. Por lo que estube mirando solo consume 1.5 mA en operacion normal ( 100 Khz en SCL ) suficiente para cualquier Port, entonces cuando necesitas "hablar" con la memoria le matas la VCC, este queda en stand-by, y trabajas  a 400 KHz. Cuando necesitas hablar con el DS le levantas la VCC. Es medio chancho pero deberia funcionar.
Saludos !

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #24 en: 09 de Junio de 2008, 17:53:42 »
Citar
Si la respuesta es no, por qué no pruebas a hacerlo por software? Es, decir, quitar el Force_HW?
Bueno es una opción que se me ocurre en mi ignorancia... 
Qué te parece?
Si es una idea descabellada y ridícula pido a los más expertos en el foro que lo aclaren por favor...

Las 3 formas de implementar IIC en un micrito que yo conozco son estas:

  • Simulación por software, en este caso se aplica a un micrito que no tiene el periferico en forma interna, todo se hace a pulmon
  • Por polling, se aplica cuando el micro tiene el periferico interno pero la implementación se basa en consultar por los diferentes estados de los registros de control, normalmente es mas facil de implementar y como contra requiere de tiempo de CPU esperando por estados.
  • Por interrupción, en este caso es lo más optimo, ya que el handler de la interrupción se encarga de manejar todos los diferentes estados de la comunicación, como contraparte es un poco más dificil de implementar.

Saludos !

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #25 en: 09 de Junio de 2008, 19:15:27 »
Claro que fallaria si el bus se trabajara a una sola velocidad nada mas. Por eso, pense en que se podria setear o cambiar la velocidad de trabajo del hardware i2c del pic cada ves que necesito usar una funcion del RTC o la memoria; me dijieron que se podria, en RS232 se puede  :(

Creo que estas confundiendo las cosas. La comunicación RS232 funciona cuando se separan los dos canales de comunicación por dos puertos distintos. Poner juntos dos RS232 por las mismas patillas y a distintas velocidades nunca a funcionado ni funcionará.

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

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #26 en: 09 de Junio de 2008, 23:18:29 »
jfh900 me refiero a cambiar la velocidad de trabajo, como la funcion set_uart_speed, algo similar pero que solo se entienda que es lo que intento lograr  :mrgreen:

Porcierto RICHI777 tu idea, la entiendo algo, pero el problema viene (creo yo) en el hex que me genera el ccs (v4.023) que, nose si sera un bug de dicho compilador, pero, a mi parecer, no esta setiando bien la velocidad para el clock (SCL) cuando quiero usar el DS1307 o la 24LC512 (dependiendo de cual de los dos #USE I2C (...) este primero o segundo, como lo he ilustrado, esa configuracion hace que uno funcione bien y el otro "no del todo").

Gracias.
Un saludo.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #27 en: 11 de Junio de 2008, 15:50:01 »
Hola Jeremy, lo que te quise decir, es una vez agotadas todas las instancias, de cambiar el RTC por uno más rápido, de manejarlo con otros ports, etc, etc, si no te queda mas vueltas, yo la alimentación del RTC ( VCC ) la manejaria por un PORT del micro, cuando quiero leer a altas velocidades del BUS solo le bajo el Port y en teoria el RTC deberia estar como desconectado, nose es chancho pero capaz que funciona.

Saludos !

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #28 en: 11 de Junio de 2008, 15:53:29 »
Hola jeremy.

Esta es la 2ª vez que escribo este mensaje, dita sea, la 1ª se ha quedado en el limbo.

Te lo he corregido y ahora sí que funcionan los 2 dispositivos a diferentes velocidades.

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 RS232 (Baud = 9600, xmit = Pin_C6, rcv = Pin_C7) //Pongo esta porque el PROTEUS no tiene 115200 baud

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

#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
#include "ds1307_modificado.c"      //Funciones para el uso del Real Time Clock del integrado DS1307.

#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)
#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;
*/  
   int8  DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA;
   int8 Buffer[256];
   int16 cont, i;  
  
   //delay_ms(1500);
   //printf("\r\n\n\n-----------jeremy-----------\r\n\n\n");

   #USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)
   init_ext_eeprom();      //Inicializo la EEprom externa.
  
#USE I2C (Master, Force_HW, Slow, SDA = Pin_B0, SCL = Pin_B1, Stream = RTC)
   ds1307_init();          //inicializamos el RTC (DS1307).

   ds1307_set_date_time(11, 6, 8, 3, 13, 32, 0); //día-més-año-día semana-horas-minutos-segundos
  
   cont = 0;
   delay_ms(300);

   while (TRUE)
   {
      delay_ms(50);
      /////////////////////////////
      #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);

      delay_ms(1000);
                  
#USE I2C (Master, Force_HW, Fast = 400000, SDA = Pin_B0, SCL = Pin_B1, Stream = ExtEEprom)
      printf("     Direcion[%Lu] -> %03u", cont, read_ext_eeprom(cont));
      putc('\r');
      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);
      //delay_ms(1000);
      printf(" Terminada:\r\n");
      
      for (i = 0; i <= 255; i++)
      {
         printf("%03u ", Buffer[i]);
      }  
      ////////////////////////////////////
*/
      for (i = 0; i <= 255; i++)
      {
       Buffer[i]=read_ext_eeprom(i);
         printf("%03u ", Buffer[i]);
      }  
      
   }
}

El fallo principal estaba en la función read_ext_eeprom_seq(Buffer, 0, 255); Con esta función solo sacaba el primer elemento de la memoria.

He usado la otra: read_ext_eeprom(i) y con esta si que funcionan los 2 dispositivos bien.

Si lo pruebas físicamente me gustaria que me dijeras si te ha funcionado.

Un saludo

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #29 en: 12 de Junio de 2008, 02:00:12 »
Hola Pocher. Antes que nada, agradesco el tiempo que te has dado por probar esto en proteus y todo  :mrgreen: Gracias.

Ahora, parece que no se me entendio del todo bien en mi 1er mensaje. Y es que esa funcion "read_ext_eeprom_seq" funciona perfectamente cuando esta sola la memoria (aunq nose cmo te habra ido en el proteus). Tambien, es preciso hacer uso de esta ya que necesito la mayor velocidad posible y, esa funcion, o mejor dicho, la funcion de lectura secuencial que tiene el 24LC512, me lo posibilita.

Ahora cuando dices que con esa funcion solo sacaba el 1er dato... Eso es cierto. Y para arreglarlo, basta con poner "su #USE I2C (...)" antes que el del RTC y sacara todos los primeros 256 datos correctamente (tal como se muestra en las imagenes que he colgado en mi 1er mensaje). Pero, asi, al leer el RTC, la lectura sera un tanto erronea por no decir completa.

No puedo asegurarte que todo esto suceda en el proteus pero en "la vida real" xD si que sucede =/

Tu codigo, el que propones, lo he probado, obteniendo los mismo resultados  :(

De todas maneras, nuevamente, gracias por el apoyo.
Un saludo  :P