Autor Tema: Escribir en EEPROM datos de tipo long  (Leído 2688 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado robertml

  • PIC10
  • *
  • Mensajes: 4
Escribir en EEPROM datos de tipo long
« 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.

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Escribir en EEPROM datos de tipo long
« Respuesta #1 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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Escribir en EEPROM datos de tipo long
« Respuesta #2 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
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Escribir en EEPROM datos de tipo long
« Respuesta #3 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

Desconectado robertml

  • PIC10
  • *
  • Mensajes: 4
RE: Escribir en EEPROM datos de tipo long
« Respuesta #4 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.

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Escribir en EEPROM datos de tipo long
« Respuesta #5 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

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Escribir en EEPROM datos de tipo long
« Respuesta #6 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

Desconectado robertml

  • PIC10
  • *
  • Mensajes: 4
RE: Escribir en EEPROM datos de tipo long
« Respuesta #7 en: 25 de Noviembre de 2004, 09:50:00 »
Pues sí, es q aún no me aclaro mucho con esto de los punteros.