TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pikman en 06 de Mayo de 2005, 22:50:00
-
Hola, estoy enrredado con esto, debo guardar una estructura de datos similar a esta en la memoria eeprom.
struct timbrado_ {
int horas;
int minut;
int16 legajo;
int time;
}timbrado;
Debo guardar byte, como puedo hacerlo, pues creo que deberia implementar un bucle, pero con la variable int16?, hay unos ejemplos para guardar estas, creo que deberia ser un bucle, pero lo que no tengo claro es, el bulce deberia ir desde 0 hasta la cantidad de bytes de la estructura?, el dato inicial a grabar seria timbrado.horas + i , donde i seria el puntero del bucle,
entonces, puede ser esto, guardaria la estructura desde la direccion 0x00 de
la memoria externa,
for (i=0;i<6;i++){
write_ext_eeprom(i + 0, *(&timbrado.horas + i));
}
Bueno no lo he probado, desde ya gracias por la ayuda, y espero sugerencias, no se me ocurre algo ams sencillo, ni tampoco se si funciona.
saludos
ARIEL
-
Creo que lo mejor es que construyas sendas rutinas de lectura y escritura,a las que por ejemplo se les puede mandar como parametros una posicion de memoria,un desplazamiento índice para acceder a elementos concretos de la estructura si quisieras hacerlo así.
Cada estructura la conforman 5 bytes,por lo que el parametro de entrada "posicion de memoria" lo podrias multiplicar por 5 dentro de la rutina para acceder a la posicion exacta cada vez.Podría ser algo así para guardar el byte minutos en su lugar correspondiente a partir de la posicion 0 de eeprom:
void escribe_memoria(int posicion,int indice,int minutos,int16 dato16)
{
write_ext_eeprom((posicion*5)+indice,minutos);
{
...la llamada:
escribe_memoria(0,1,dato1,dato2);
Aunque no se use uno de los dos últimos parametros de la cabecera,siempre habrá q mandar una variable obligatoriamente,por lo que tb se podría hacer usando variables globales,asi te ahorrarías tener q mandar parametros en la llamada
-
OK, si habia pensado en eso de hacer rutinas de escritura y lectura, pero se complica el codigo, la cantidad de datos es siempre la misma, el tema si es recargar la estructura de nuevo, el puntero de memoria disponible lo guardo en el fin de la memoria, entonces uan vez que tengo compuesta la estructura, leo la posicion y grabo, las variables Int16 son dos bytes consecutivos, por lo tanto para leer los datos deberia poder hacer el proceso inverso, la rutina que expuse es viable?, funcionaria asi, pues lo que estoy haciendo es un proceso de direccionamiento indirecto, comienzo a transferir desde la ram a la eeprom desde la posicion de memoria timbrado.horas, esto esta bien hecho o como lo puedo hacer,
gracias de antemano,
ARIEL
-
Bueno,si.
La forma mas eficaz es la que usas.
Tal y como está te vale para guardar una única estructura.Para poder guardar mas variables de ese tipo tendrias que añadir una variable de desplazamiento.
Para leer la variable int16 te podría valer leer sus dos bytes,volcar el menos significativo en la variable destino y sumarle el más significativo desplazado 8 bits, multiplicándolo por 256
-
O podrias usar la funcion MAKE16()..... copio y pego:
MAKE16()
Syntax:
i16 = MAKE16(varhigh, varlow)
Parameters:
varhigh and varlow are 8 bit integers.
Returns:
A 16 bit integer
Function:
Makes a 16 bit number out of two 8 bit numbers. If either parameter is 16 or 32 bits only the lsb is used. Same as: i16 = (int16)(varhigh&0xff)*0x100+(varlow&0xff) except it is done with two byte moves.
Availability:
All devices
Requires
Nothing
Examples:
long x;
int hi,lo;
x = make16(hi,lo);