TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
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
-
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...
-
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
-
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.
-
Las rutinas que postea MGLSOFT yo las implementé en un proyecto real y trabajan a la perfección y en una memoria externa. 24LC16B.
-
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.
-
Pues sí, es q aún no me aclaro mucho con esto de los punteros.