# Grabar dos variables tipo float(32 bits) en EEPROM interna utilizado CCS



## morris888 (Oct 23, 2009)

Hola estoy utilizando el compilador CCS C, estaba realizando un programa para mi proyecto de graduacion, y en una parte necesito grabar dos variables tipo Float (tamaño 32 bit), en la EEPROM interna del pic, la cual tiene un tamaño de 256 BYTES. Supongo que lo que hay que hacer es dividir la variable Float en 4 y guardarla en 4 posiciones de la memoria, pero no tengo idea de como hacer, ni de como puedo leer luego esta variable cuando la necesite.

El dato que necesito guardar proviene de una conversion A/D de 10 bits, entonces en caso de que no fuera posible guardarla como tipo Float, quisiera saber como podria guardar el valor de 10bits de la conversion en la EEPROM . No puedo realizar una conversion de 8bits, necesito que esta sea de 10 bits.


----------



## Ferny (Oct 23, 2009)

Las siguientes funciones escriben variables de 16 bits, que te sirve para guardar los 10 bits de tu AD, o bien puedes modificarlas para que guarden los 32 bits en float.


```
// Lee un número de 2 bytes de la EEPROM
unsigned long read_eeprom_16bits(unsigned char add) {
    unsigned long a1, a2, result;

    a1 = read_eeprom(add) & 0x00FF;
    a2 = read_eeprom(add+1) & 0x00FF;
    result = a1 | (a2 << 8);
    return result;
}

// Escribe un número de 2 bytes a la EEPROM
void write_eeprom_16bits(unsigned char add, unsigned long value) {
    write_eeprom(add, (value & 0x00FF));
    write_eeprom(add+1, ((value & 0xFF00) >> 8));
}
```


----------



## morris888 (Oct 26, 2009)

Gracias por la respuesta, me di cuenta tambien que PIC C trae una libreria con funciones para grabar este tipo de variables se llama "internal_eeprom.c"


----------



## 1Roland1 (Abr 5, 2011)

morris888 dijo:


> Gracias por la respuesta, me di cuenta tambien que PIC C trae una libreria con funciones para grabar este tipo de variables se llama "internal_eeprom.c"


 Amigo, veo que conseguiste guardar un dato tipo long32 en la memoria del pic, necesito tu ayuda pues estoy realizando mi tesis y necesito alamacenar en la memoria hasta un valor de 99999, solo he conseguido guardar hasta 64534
Espero alguna ayuda
Gracias

Hola a todos,

Estoy realizando mi tesis y necesito guardar un dato tipo long32 producto de un conteo, este conteo puede llegar hasta 99999 y solo he conseguido almacenar hasta 65434

Espero su ayuda

Saludos


----------



## darxin (Ene 27, 2012)

Hola amigos, tengo una gran duda, en el comando write_eeprom(address, value); address que rango de valores puede tomar(ejem 0-10000), value es el valor que queremos guardar, en ese caso puede ser un valor de una entrada AD del mismo pic, que se guarde directamente, y por ultimo si me pueden dar un sencillo ejemplo de como usar este comando, por ejemplo que guarde los datos, que provienen de un conversor análogo digital, gracias


----------



## arrivaellobo (Feb 4, 2012)

Es muy sencillo darxin, sólo tienes que tener en cuenta el tamaño del dato que quieres guardar. Si tienes configurado en el ADC una resolución de 8 bits, la solución sería:
*adc=read_adc();*
*write_eeprom(0x01, adc);*

En la dirección 0x01 de la eeprom tendrías el valor del ADC.

Pero si tienes una resolución de 10 bits, necesitas utilizar alguna función que lo lleve a cabo, como dice morris888, en el archivo <internal_eeprom.c> existe una función que lo realiza.

Un saludo


----------



## darxin (Feb 4, 2012)

muchas gracias arrivaellobo, por tu ejemplo, pero una consulta sobre la resolución de 8bits, se debe declarar esta o ya esta lista en picc, y cuando se lea este dato desde la memoria eeprom este valor saldra en 8 bit tambien o como un entero?, espero sus aportes y muchas gracias!


----------



## arrivaellobo (Feb 4, 2012)

Para la resolución de 8 bits tienes que declararlo al principio del código, con la sentencia
*#device adc=8*
Al leer el valor de la eeprom, puedes hacerlo así:
*int valor=0;
valor=read_eeprom(0x01);*

En "valor" tendrás los 8 bits leídos.

Un abrazo


----------



## darxin (Feb 4, 2012)

muchas gracias arrivaellobo por tus respuestas y consejos, mira es que intento hacer correr mi codigo con esta instrucción y no me funciona, lo otro que te queria preguntar es sobre tu ejemplo en la variable "valor" si yo quisiera enviarla a un printf y lo configuro para que salga como un numero entero, podría estar bien?, en verdad gracias pos tus consejos y tu tiempo, saludos!
#include <16f88.h>
#include <stdio.h>
#deviceADC=8 //aqui nose porque esta linea me presenta error?
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B5)//Quiero usar un Circuito Integrado max232 para descargar los datos  hasta el computador


----------



## arrivaellobo (Feb 4, 2012)

Ese error te lo muestra porque pones la línea *#deviceADC=8* "demasiado lejos". Debes ponerla justo después del #include.
Y para enviar "valor" por RS232 sería como un valor entero normal:

*printf("Valor = %d" ,valor);*

Un saludo


----------



## darxin (Feb 5, 2012)

muchas gracias arrivaellobo tus consejos siempre son de ayuda, lo unico en lo que me queda duda es sobre las direccion de la memoria eeprom, desde donde comienzan o como se puede utilizar, ya sabes los rangos en los cuales se pueden escribir cosas, muchas gracias por tus consejos, saludos! cuídate


----------

