Guardar dato de 32 bits en eeprom externa c/ccs

Colegas,,
Estoy tratando de guardar un dato mayor a 65535 (> 16 bits), en la eeprom externa 24lc512, para ello utilizo la libreria que incluye el ccs "24512.c". pero esta libreria solo guarda datos de un byte.:confused:, he buscado en el foro y por la web , y solo hay ejemplos de como guardar datos grandes (> 16bits) en la eeprom interna del Pic utilizando la libreria "Lib_Int_EEProm.c". "la cual he utilizado y funciona, pero requiero guardar los datos en una externa"
Alguien tiene modificada la libreria del ccs para poder guardar datos mayores a 16 bits osea int32 o tipo float en una eeprom externa. :cry:
He leido por ahi que se puede guardar en 4 variables e ir recorriendo >> pero no se como hacerlo.
 
Utiliza esto:

Creas una funcion :

Código:
void EEPROM_STORE_32BITS(long VALUE){

EEPROM_WRITE(0,(24>>VALUE));
EEPROM_WRITE(1,(16>>VALUE));
EEPROM_WRITE(2,(8>>VALUE));
EEPROM_WRITE(3,255&VALUE);

}

asi guardas variables de 32 bits.

Saludos!
 
Gracias , george.manson.69 , dos preguntas al realizar la lectura hago lo mismo ?

v
Código:
Void EEPROM_READ_32BITS(long VALUE){

EEPROM_READ(0,(24>>VALUE));
EEPROM_READ(1,(16>>VALUE));
EEPROM_READ(2,(8>>VALUE));
EEPROM_READ(3,255&VALUE);

}

La otra pregunta y que tal vez no mecione al principio necesito mostrarlo en el lcd, como haria? solo con esto:

printf(lcd_putc,"Kms : %03.1f ",VALUE);
 
Gracias , george.manson.69 , dos preguntas al realizar la lectura hago lo mismo ?

v
Código:
Void EEPROM_WRITE_32BITS(char position,long VALUE){

EEPROM_WRITE(position,(24>>VALUE));
EEPROM_WRITE(position+1,(16>>VALUE));
EEPROM_WRITE(position+2,(8>>VALUE));
EEPROM_WRITE(position+3,255&VALUE);

}

La otra pregunta y que tal vez no mecione al principio necesito mostrarlo en el lcd, como haria? solo con esto:

printf(lcd_putc,"Kms : %03.1f ",VALUE);

Código:
long EEPROM_READ_32BITS(unsigned char postion){

    long rvalue=0;

rvalue |= (24<<EEPROM_READ(postion));
rvalue |= (16<<EEPROM_READ(postion+1));
rvalue |= (8<<EEPROM_READ(postion+2));
rvalue |= EEPROM_READ(postion+3);

return rvalue;
}

Algo asi, modifique lo que te habia dicho antes y le puse una variable position.

para imprimirlo en el lcd solo tienes que usar %l , y no %f.

Saludos!
 
Última edición:
george.manson.69, este código para leer la eeprom no me funciono :confused:

Código:
long EEPROM_READ_32BITS(unsigned char postion){

    long rvalue=0;

rvalue |= (24<<EEPROM_READ(postion));
rvalue |= (16<<EEPROM_READ(postion+1));
rvalue |= (8<<EEPROM_READ(postion+2));
rvalue |= EEPROM_READ(postion+3);

return rvalue;
}

También intente así, pero por ejemplo si escribo en la eeprom un valor de 980 que distribuidos en la eeprom seria algo así 00 00 03 D4: con el código que esta abajo y mostrando su valor en una lcd 2 X 16 solo me aparece el valor de D4 = 212, es decir el primer desplazamiento.

Código:
  data=24<<i2c_read();
   data=16<<i2c_read();
   data=8<<i2c_read();
   data=i2c_read();
   i2c_stop();
   return(data);
}
:confused:

Vuelvo a recordar lo que estoy haciendo, necesito guardar un dato de 32 bits en la eeprom externa 24LC512 " ya lo hice - funciona perfecto" , después quiero leer ese dato de 32 bits el cual esta repartido como el ejemplo de arrima que mostré o cualquier otro: 00 00 03 D4 y esto mostrarlo en un lcd.

dentro de mi codigo inicio con una variable llamada conteo la cual después se actualiza

Código:
conteo=980;
leer_eeprom=1; variable para leer la eeprom al energizar

write_ext_eeprom(0,conteo);  //la guardo en la eeprom - esto funciona :aprobacion:

if (leer_eeprom==1)
  {
   leer_eeprom=0;
   conteo=(read_ext_eeprom(0));
   metros=conteo;
   lcd_gotoxy(1,2);   
   printf(lcd_putc,"Kms : %3.1f ",metros); // utilizo f por q metros lo tengo como float
   Lcd_putc( "\b");
   }

resto del programa

Que estoy haciendo mal :cry:, si yo lee posicion por posicion , si me visualiza en la lcd lo que hay en cada posicion. Tambien intente leer cada posicion y luego sumarlas pero no resulto.

En la eeprom externa 24LC512 escribo de la siguiente forma, con el siguiente código el cual modifique de la librería #include "24512.c":

Código:
void write_ext_eeprom(long int address, long long data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   [COLOR="Red"]i2c_write(data>>24);
   i2c_write(data>>16);
   i2c_write(data>>8);
   i2c_write(data);[/COLOR]
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
    i2c_start();
    status=i2c_write(0xa0);
   }
   i2c_stop();
   }
 
Estoy tratando de guardar un dato mayor a 65535 (> 16 bits), en la EEPROM externa 24LC512, para ello utilizo la librería que incluye el CCS "24512.c", pero esta librería sólo guarda datos de un byte.
He buscado en el foro y por la web, y sólo hay ejemplos de como guardar datos grandes (> 16bits) en la EEPROM interna del PIC utilizando la librería "Lib_Int_EEProm.c", "la cual he utilizado y funciona, pero requiero guardar los datos en una externa".
¿Alguien tiene modificada la librería del CCS para poder guardar datos mayores a 16 bits osea int32 o tipo float en una eeprom externa?
Puedes utilizar la librería "external_eeprom.c" conjuntamente con la librería "24512.c"
Esta librería tiene las rutinas para escribir y leer 32 bits. (Viene incluida con PIC C Compiler de CCS.)

Adjunto un ejemplo de su uso.
 

Adjuntos

  • 16F648A 24LC512 32 Bits R-W.rar
    28.2 KB · Visitas: 135
Última edición:
Atrás
Arriba