TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: robertml en 23 de Noviembre de 2004, 20:51:00

Título: Escribir en EEPROM datos de tipo long
Publicado por: robertml en 23 de Noviembre de 2004, 20:51:00
Hola, necesito escribir y leer de la EEPROM interna de un 16F877A datos de tipo long (2 bytes cada variable).

Las instrucciones "read_eeprom" y "write_eeprom" sólo sirven para escribir datos de tipo int, ¿q modificación habría q hacer para poder leer y grabar otro tipo de datos?

O si no, ¿hay alguna función en C q entrando un dato long me devuelva dos datos int, uno con la parte alta y otro con la parte baja?
Y naturalmente tb necesitaría la función opuesta.
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: kruskal en 24 de Noviembre de 2004, 01:53:00
pues si hay funciones de la librerias del CCS que te permiten hacer eso:
aqui hay dos pequeñas rutinas que hice para leer y guardar un valor de 16 bit en dos posiciones consecutivas de la eeprom, muy simples espero te sirvan.

int16 leer_valor16(int posicion)
{
int ptr_L;
int ptr_H
int16 ptr;
       ptr_L=read_eeprom(posicion);
       ptr_H=read_eeprom(posicion+1);
       ptr=make16(ptr_H,ptr_L);
       return ptr;
}

void guardar_valor16(int posicion,int16 valor)
{
int ptr_L;
int ptr_H;
         ptr_L=make8(valor,0);
         ptr_H=make8(valor,1);
         write_eeprom(posicion,ptr_L);
         write_eeprom(posicion+1,ptr_H);
}


salud2
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: MGLSOFT en 24 de Noviembre de 2004, 05:36:00
Sacado de la ayuda de CCS...



How do I write variables to EEPROM that are not a byte?
 

The following is an example of how to read and write a floating point number from/to EEPROM.  The same concept may be used for structures, arrays or any other type.

 

n is an offset into the eeprom.  

For floats you must increment it by 4.  

For example, if the first float is at 0 the second one should be at 4 and the third at 8.

 

WRITE_FLOAT_EXT_EEPROM(long int n, float data) {

   int i;

   for (i = 0; i < 4; i++)

     write_ext_eeprom(i + n, *(&data + i) ) ;

}

 

float READ_FLOAT_EXT_EEPROM(long int n) {

   int i;

   float data;

   for (i = 0; i < 4; i++)

     *(&data + i) = read_ext_eeprom(i + n);

   return(data);

}





Los ejemplos son para escribir en EEPROM externa, pero solo cambiando la instruccion por la que escribe en EEPROM interna tienes la solucion que buscas...Sonrisa GiganteSonrisa Gigante
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: kruskal en 24 de Noviembre de 2004, 09:32:00
Habia olvidado que lo mejor es primero recurrir a los tipos de CCS las funciones trabajan muy bien cambiando las instrucciones correspondiente para la eeprom interna.

salud2
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: robertml en 24 de Noviembre de 2004, 10:16:00
Gracias a los 2, el código de kruskal lo entiendo a la perfección, no sabía de la existencia de esas funciones make8, make16 y make32, muy útiles.

Sin embargo el código de MGLSOFT, el q sale en la ayuda del CCS ya lo había leído y no le veo el sentido, por ejemplo:

WRITE_FLOAT_EXT_EEPROM(long int n, float data) {
int i;
for (i = 0; i < 4; i++)
write_ext_eeprom(i + n, *(&data + i) ) ;
}

Supongamos q digo "WRITE_FLOAT_EXT_EEPROM(0x0000,0x04030201)", según lo veo yo:

en 0x0000 escribirá 01 ó 04 dependiendo de si coge el de mayor o menos peso
en 0x0001       "       02 ó 04         "                       "                          "
en 0x0002       "       03 ó 04         "                       "                          "
en 0x0003       "       04

Vamos q en ningún momento veo donde hace la partición del float en 4 números de tipo int.

Ostia ahora q veo lo q he escrito si se cumpliría, pero pq da la casualidad del número q he puesto de ejemplo, si ponemos escribir el 0xFF00FF00 ya no se cumple.
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: gfp en 24 de Noviembre de 2004, 14:22:00
Las rutinas que postea MGLSOFT yo las implementé en un proyecto real y trabajan a la perfección y en una memoria externa. 24LC16B.

Sonrisa
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: pacalaconcurso en 25 de Noviembre de 2004, 07:28:00
a ver, si declaras un puntero a float, al incrementarlo apuntaría al siguiente float....
parece lógico declarar un puntero a int8 apuntando al inicio de nuestro float...para copiar los 4 bytes.Idea
Título: RE: Escribir en EEPROM datos de tipo long
Publicado por: robertml en 25 de Noviembre de 2004, 09:50:00
Pues sí, es q aún no me aclaro mucho con esto de los punteros.