Grabar dato int32 en eeprom interna

Hola a todos, estoy comenzando a usar el compilador ccs y me tope con un proyecto en el que tengo que grabar un dato del tipo int32 en la eeprom interna de un 16f873, utilizando las funciones write_eeprom() y read_eeprom() descubri que todo iba bien mientras mi dato valiera menos de 255, entonces busque por todo internet y encontre esta solucion que parecia resolver mi problema:(muestro la parte del programa que me interesaba)

write_eeprom(direccion,cont2>>8); //Escribes primer byte (parte mas significativa del int16)
write_eeprom(direccion+1,cont2); //Escribes segundo byte (parte menos significativa del int16)
valor_leido = read_eeprom(direccion);
valor_leido = valor_leido<<8;
valor_leido = read_eeprom(direccion+1);
printf(lcd_putc, "Dato: %Lu",valor_leido);

Sin embargo esto no me funciono, ya que por lo visto esto sirve para un tipo de dato int16, de ahi intente hacer variaciones del programa anterior (hscer desplazamientos del tipo <<16 y <<24) para adaptarlo a un int32, pero no obtuve ningun buen resultado. Si alguno de Uds. tiene algo mas de experiencia y puede ayudarme se los agradeceré mucho
 
Podrias probar con uniones, ej:

Código:
...
union Partir_dato{
  unsigned int numero; // 2 bytes
  unsigned char num_partido[2]; // 2 char de 1byte en forma continua
}
...

void mi_funcion(unsigned int convertir)
{
  union Partir_datos partir;
  partir.numero=convertir;
  write_eeprom(direccion,partir.num_partido[0]); // Parte alta
  write_eeprom(direccion+1,partir.num_partido[1]); // Parte baja
}

La idea de la union, es que 2 o mas variables compartan el mismo espacio en memoria, osea que la variable int ocupa 2bytes, mientras que las variables char ocupan 1 byte c/una en el mismo lugar que lo hacen los 2bytes de la variable int.

Despues podrias hacer la funcion contraria, es decir cuando tengas que leer de la eeprom:

Código:
...
unsigned int mi_funcion(void)
{
  union Partir_datos unir;
  unir.num_partido[0]=read_eeprom(direccion);
  unir.num_partido[1]=read_eeprom(direccion+1);
  return unir.numero;
}
...

De ahi, solamente deberias realizar la modificacion al tipo de variable que necesitas.
 
Última edición:
Atrás
Arriba