Autor Tema: Dos velocidades distintas en un mismo bus i2c por hardware.  (Leído 12015 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 #30 en: 17 de Junio de 2008, 05:42:26 »
Supongo que esto que te voy a poner ya lo habrás probado, pero por si acaso te lo pongo:

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


//¡¡¡Sin el Force_HW va bien!!!
#USE I2C (Master, SDA = Pin_B0, SCL = Pin_B1, Slow, Stream = RTC) //1º el RELOJ, 2º la EEPROM
#USE I2C (Master, SDA = Pin_B0, SCL = Pin_B1, Fast = 400000, Stream = ExtEEprom)


/*
//¡¡¡Sin el Force_HW va bien!!!
#USE I2C (Master, SDA = Pin_B0, SCL = Pin_B1, Fast = 400000, Stream = ExtEEprom) //1º la EEPROM, 2º el RELOJ
#USE I2C (Master, SDA = Pin_B0, SCL = Pin_B1, Slow, Stream = RTC)
*/

/*
//¡¡¡Con el Force_HW va mal!!! --> La EEPROM solo lee la primera posición
#USE I2C (Master, Force_HW,SDA = Pin_B0, SCL = Pin_B1, Slow, Stream = RTC) //1º el RELOJ, 2º la EEPROM
#USE I2C (Master, Force_HW,SDA = Pin_B0, SCL = Pin_B1, Fast = 400000, Stream = ExtEEprom)
*/

/*
//¡¡¡Con el Force_HW va mal!!! --> El reloj no va bien
#USE I2C (Master, Force_HW,SDA = Pin_B0, SCL = Pin_B1, Fast = 400000, Stream = ExtEEprom) //1º la EEPROM, 2º el RELOJ
#USE I2C (Master, Force_HW,SDA = Pin_B0, SCL = Pin_B1, Slow, Stream = RTC)
*/

#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)
{     
   int8  DS1307DiaA, DS1307MesA, DS1307AnoA, DS1307DSA, DS1307HoraA, DS1307MinutoA, DS1307SegundoA;
   int8 Buffer[256];
   int16 cont, i;   
   
   init_ext_eeprom();      //Inicializo la EEprom externa.
   
   ds1307_init();          //inicializamos el RTC (DS1307).

   ds1307_set_date_time(17, 6, 8, 4, 9, 00, 00); //día-més-año-día semana-horas-minutos-segundos
   
   cont = 0;
   delay_ms(300);

   while (TRUE)
   {
      delay_ms(50);

      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);
                 
      printf("     Direcion[%Lu] -> %03u", cont, read_ext_eeprom(cont));
      putc('\r');
      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]);

/*
      for (i = 0; i <= 255; i++)
      {
      Buffer[i]=read_ext_eeprom(i); //Otra forma
         printf("%03u ", Buffer[i]);
      }   
*/
     
   }
}


Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #31 en: 17 de Junio de 2008, 11:13:34 »
Hola pocher! Eso que sugieres (hacer i2c por software) no lo probe por eso mismo: Por que la idea era lograrlo hacer con el hardware que tiene implementado el pic. Pero, ya que parece no haber solucion, me di por probar y q crees... Como bien pones en tu codigo, estando el RTC o la memoria arriba o abajo (entiendase la instrucion I2C en el software) funciona de maravilla!  :D

Ahora, la pregunta seria: ¿Porq ****** no funciona con el hardware del pic?  :? O si todo eso esta corriendo a puro software creado por el CCS?

Muchas gracias pocher!  :mrgreen:

Salu2.

PD: Se q me comentaron que haga esto de hacerlo por software pero por el mismo motivo que he descrito no lo hice y q aun intento hacerlo correr xP

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #32 en: 30 de Abril de 2009, 11:28:30 »
Hola a todos xD

HA pasado tiempo en este tema!

Ahora me ocurre el mimo problemilla-

Parece que se me bloquea el RTC con la MEMORIA!

Estoy probando programas separados y luego los combino.

Mas tarde probare las opciones propuestas xD aunque ya las hallan experimentado saber que pasa ahi,

Mi rtc tambien va a 100KHz, y la mwmoria a 400KHz.

Quiero aprovechar la maxima velocidad de la memoria porque de ahi saco el dato para la simagenes del GLCD.Asi que en Teoria , seria 4 veces mas rapido.

Bueno, un saludo.

YA estaremos ocntando que paso!

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #33 en: 01 de Mayo de 2009, 00:03:54 »
Ya no se bloquea la memoria xD no estoy seguro el porque.

Primero lo tenia por Software , pero eso de nada me sirve si yo uso el bus HARd  ademas quiero aprovechar las ventajas de este y dejar al micro trabajar liviano , y tener un buen rendimiento.


Estoy seguro que se puede , pero hay que meterle mano al asm , y configurar directo cada vez que usemos determinado módulo.

Por ahora tengo esto para el DS1307 y la eeprom 24LC256

Código: [Seleccionar]
#ifndef RTC_SDA
#define RTC_SDA  PIN_C4
#define RTC_SCL  PIN_C3
#endif

#use i2c(i2c1,master,FORCE_HW)

  Extraido de las especificacion para el pic18F252

SSPADD register holds the slave device address
when the SSP is configured in I2C Slave mode. When
the SSP is configured in Master mode, the lower
seven bits of SSPADD act as the baud rate generator
reload value
.




La siguiente tabla xD no la entiendo.



Voy a probar , aunque de Inicio ya tengo mal el circuito porque tengo resistencias de 10K ohms , y recordando el post de Cryn sobr eel valor y cálculo de ellas creo que hablaban de un maximo de 3.3K ohms. con el ds1307   :cry:

Y para la velocidad de 400Khz de la eeprom 24LC256 debo cambiar las resistencias tambien , estan muy altas. En ambos caso marca 10pf en las lineas como maximo.

Ahora una imagen de lo que me marcan las especificaciones de la memoria.  :( La regué feo al poner esas de 10K ohms . Con eso ya estoy limitando la velocidad.




ahora para enmendar mi gran error , esta laborioso desoldar las resistencias :*(






Un saludo!

« Última modificación: 01 de Mayo de 2009, 02:54:07 por AKENAFAB »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Dos velocidades distintas en un mismo bus i2c por hardware.
« Respuesta #34 en: 01 de Mayo de 2009, 06:35:36 »

No tengo como revisar la frecuencia , pero segun yo , xD funciona.

Veo que la usar #use i2c(i2c1,master)   <--- Lo pone como Slow osea 100KHz , lo que dice el CSS

#use i2c(i2c1,master,FAST)    <--- Lo pone a 400KHz todo bien.


Pero si usamos 2 dispositivos , esto al hacer el init_eeprom e init_rtc.

Escribe el primer valor , luego al encontrar el segundo init. lo sobrescribe , y si pones la declaracion en otro lado antes de usar , no marca error , pero no lo toma en cuenta.

Asi que revise que registros afecta y lo modifico directamente.


Al usar la libreria del RTC , en cualquier función , Cargo el valor en el registro SSADD = 0x4F.

Asi que siguiendo la formula y teniendo un afreq de operacion de 32 MHz

32MHz/(4*SSADD+1) = 100Khz

y al llamar cualquier función de la eeprom , dentro de ella cargo el valor al registro SSADD=0x13

32MHz/(4*SSADD+1)=400KHz

Y con esto cambianmos de velocidad de acuerdo al dispositivo que usemos.

Lo estoy probando y no he tenido fallos.(por ahora).

En cada libreria defico el registro

Código: [Seleccionar]
#use i2c(I2C1,master,FORCE_HW)

#byte SSPADD  = 0xFC8        // <--- Direccion del Registro

#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   32768

void init_ext_eeprom()
{
      SSPADD=19;              //    Fosc/(4*SSADD+1)  = 32MHz/(4*20)= 400 000 Hz
   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);

}

Y asi en cada funcion y libreria i2c.


Un saludo!

Y creo que por ahora xD no más problemas con las velocidades xD