desktop

Cómo guardar mas de 255 posiciones en una eeprom

Hola muy buenas,estoy trabajando con una eeprom 24lc256 ,en ella guardo datos de humedad y temperatura,y el problema en cuestión es...

Como es el algoritmo en C para que una vez grabados los 255 1os datos siga con el 256...257?? porque sino me sobreescribe de nuevo la posición 00..01..

aquí la parte hasta donde me funciona todo bien

Código:
for(i=0;i<=255;i++)
  {
  
   vout=read_adc(); 
   voltaje=(5*vout/1024);// ya que estamos trabajando con 8 bits
   humedad=(voltaje-0.958)/0.0307;  //  vout-(vsupply*0,16)/(vsupply*0,0062) vsupply=5v
   int sin_decimal=humedad;  //Convierto numero decimal en numero entero
   delay_ms(50); 
    
   
   i2c_start();
   delay_ms(50);            //Se inicia la comunicación I2C.
   i2c_write(0b10100000);   //dirección del dispositivo y último bit 0 de escritura.  
   delay_ms(50);
   i2c_write(direccion_alta);   //escribe el valor alto en ésta dirección.
   i2c_write(direccion_baja);   //escribe el valor alto en ésta dirección.
   i2c_write(sin_decimal);  // escribimos el dato que queremos almacenar.
   i2c_write(decimales_cero); //escribimos un 0 para evitar un error(humedad=-1)
  // delay_ms(10);//--->1seg
   i2c_stop(); // Finalizamos la comunicación I2C.
   direccion_baja=direccion_baja+2;
  
  
  }

Muchas gracias.Un saludo ...
 
Última edición por un moderador:
Hola Amigo, bueno lo que debe hacerse es almacenar la variable en 2 bloques de 8 bits. Por ejem tenemos una variable tipo long llamada valor_humedad:
Entonces almacenamos el byte LSB en la direccion 0x00. Por defecto el compilador solo toma los 8 bits de menor peso de la variable, cuando esta tiene una extension de mas de 8 bits, entonces quedaria de esta manera.
write_eeprom(0x00,valor_humedad);
Luego almacenas el byte de mayor peso en la sig. direccion. Lo que hacemos aqui es desplazar 8 posiciones hacia el menor peso.
write_eeprom(0x01,valor_humedad>>8);
Para recuperar la informacion completa el proceso es inverso. Es decir, lees la posicion de mayor peso, desplazas 8 lugares hacia el mayor peso, luego lees la posicion de menor peso y la sumas al dato anterior.
Pd/ el ejem, apunta a direccionamiento de memoria interna, veo que utilizas memoria externa serial. Pero basicamente el concepto de manipular bits es el mismo.
 
Última edición:
Muchas gracias por molestarte en contestarme. No entendí bien tu explicación. A ver si salgo de duda jejj, yo tengo "int sin_decimal" que son 8bits que me marca la humedad sin decimales,solo parte entera,y para "engañar" a la memoria escribo un 0 en la parte baja para que los decimales siempre sean 0.(int sin_decimales(0))

A la hora de guardarlo va corriendo las posiciones, (A0 00 A 00 DATO; A0 00 A 01 DATO..hasta 255...A0 00 A FF DATO y ahora el valor alto debería ser A0 01 A 00 DATO..)Y así sucesivamente.

Y en vez de esto vuelve a A0 00 00 DATO y escribe encima de lo guardado anteriormente.

Quizás ya me respondió con lo escrito anteriormente pero sigo sin entenderlo bien.. piedad jejej.

Una vez mas gracias por atenderme.Un saludo.
 
Bien, si tu tienes configurado el ADC en 10 bits, necesitas declarar una variable tipo long para albergar los 8 bits de menor peso + 2 bits de mayor peso en dicha variable. Luego es cuestion de almacenar el bloque LSB (8 bits) en una posicion de memoria y el bloque MSB (2 bits) restantes en otra direccion de memoria.
Viendo mas minuciosamente los comentarios que haces en las lineas de programa, dices que el ADC esta configurado para 8 bits.
Pues de esta manera solo existen 256 posibles valores de una lectura. Lo cual obviamente, puedes almacenar perfectamente en un byte.
 
Última edición:
hola ajrob, en el codigo que tienes no veo donde incrementas la variable direccion_alta cuando direccion_baja se desborda (254->00). Por otro lado, si tu interés es guardar una variable de 8 bits con signo (int sin_decimal) no veo la necesidad de guardar otro byte con 0, podrías utilizar ese espacio de memoria para otro dato, al menos asi lo "veo", una sugerencia para solucionar tu problema si hacer muchos cambios seria...

unsigned int16 direccion=0; // declaramos la variable direccion de 16 bits
unsigned int8 direccion_alta;
unsigned int8 direccion_baja;
void main()
{
.
.
.
direccion_alta=direccion>>8; //Recuperamos el byte alto
direccion_baja=direccion; //recuperamos el byte bajo
.
.
.
i2c_write(direccion_alta); //escribe el valor alto en ésta dirección.
i2c_write(direccion_baja); //escribe el valor alto en ésta dirección.
i2c_write(sin_decimal); // escribimos el dato que queremos almacenar.
i2c_write(decimales_cero); //escribimos un 0 para evitar un error(humedad=-1)
// delay_ms(10);//--->1seg
i2c_stop(); // Finalizamos la comunicación I2C.
direccion=direccion+2; //incrementamos la direccion
.
.
.
}

también debes verificar que la variable dirección no exceda la dirección máxima de la memoria.
 
Hola saint,no tengo puesto lo de dirección_alta++ ya que aunque ponga: if(i=255){dirección_alta++;} no responde y sigue sobrescribiedo.He probao lo que me dijiste y no veo tampoco efecto.

No se cual puede ser el algoritmo que me salve pero llevo todo el dia con ello y estoy quemado ya! jej

muchas gracias por perder tu tiempo conmigo.un saludo
 
hola ajrob... es extraño que no funcione el código...
adjunto una imagen de un ejemplo espero te sirva.
 

Adjuntos

  • memoria_I2C.rar
    57.9 KB · Visitas: 44
Ojo tambien con tu variable con la que controlas los ciclos tu "i" que tambien sea long int y que tu ciclo sea
Código:
direccion_alta = 0;
direccion_baja = 0;
for(i=0;i<=500;i++) //500 o mas
{
  //aqui pones la rutina para leer y amacenar
  direccion_baja++;
  if( direccion_baja = 255 ){ 
     direccion_alta++;
     direccion_baja = 0;
 }
}
 
Muchas gracias a todos!! Ya he resuelto mi problema!! Me fije en la imagen que adjuntó saint.Puse las direcciones como indicabas,de 16 bits,los valores de humedad de 8 bits y va todo como la seda.
Un millón de gracias y ya consultaré alguna vez mas,ya que veo que la gente aquí tiene nivel jjej :aplauso:
 
Atrás
Arriba