Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

21/10/2013 #1


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 ...
21/10/2013 #2

Avatar de Gudino Roberto duberlin

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.
21/10/2013 #3


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.
21/10/2013 #4

Avatar de Gudino Roberto duberlin

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.
21/10/2013 #5

Avatar de Saint_

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.
21/10/2013 #6


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
21/10/2013 #7

Avatar de Saint_

hola ajrob... es extraño que no funcione el código...
adjunto una imagen de un ejemplo espero te sirva.
Archivos Adjuntos
Tipo de Archivo: rar memoria_I2C.rar (57,9 KB (Kilobytes), 39 visitas)
21/10/2013 #8

Avatar de electroandres

Lo que te pasa es que estas usando variables de 8 bits que llegan al 255, tendras que usar una variable tipo long int y con eso va como piña
21/10/2013 #9

Avatar de albertoxx

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;
 }
}
22/10/2013 #10


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
26/10/2013 #11

Avatar de Meta

Si eres capaz de guardar 255, crea otra variable con otro nomobre y que pueda almacenar otro 255, así sucesivamente,
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

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