Autor Tema: guardar en la eeprom un numero de 16 bits  (Leído 20273 veces)

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

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
guardar en la eeprom un numero de 16 bits
« en: 12 de Septiembre de 2009, 13:37:11 »
hola amigos, una consulta.
estoy guardando numeros de 16 bits en la memoria eeprom interna del 18f4550, por ejemplo en la posicion 2,  y resulta que cuando leo solo me lee la parte baja, es decir los 8 primeros bits del numero.
fecha=65500;
write_eeprom(fecha,var_pos);
fecha5=read_eeprom(var_pos);
printf(lcd_putc,"\f%Lu",fecha5);
delay_ms(200);

se puede guardar numeros de 16 bits en la eeprom, si no es asi como haria para guardar este dato. muchas gracias por sus respuestas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #1 en: 12 de Septiembre de 2009, 13:53:00 »
La eeprom interna es de 8 bits por eso el resultado obtenido. Puedes usar make8() para dividir la variable de 16 bits en 2 de 8 bits y guardarlos en la eeprom.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #2 en: 12 de Septiembre de 2009, 14:12:37 »
muchas gracias amigo suky, si interesante, no habia visto la funcion,  make8(), voy a ver como lo acomdo.
otra posibilidad que estoy analizando es
1-------------> transformar el numero de 16 bits en string, y guardarlo en la eeprom
2-------------> leer el string de la eeprom
3------------->transformar el string en un int

seria factible asi amigo, voy a ver las dos posibilidades.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #3 en: 12 de Septiembre de 2009, 14:19:26 »
Es factible pero ocupas mucha mas memoria  :tongue:
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #4 en: 12 de Septiembre de 2009, 14:27:43 »
Puedes usar punteros considerando que los datos en CCS se guardan con little endian.

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #5 en: 12 de Septiembre de 2009, 14:35:21 »
Otra alternativa es trabajar con desplazamiento de bits y mascaras:

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
    write_eeprom( (int8) (dato>>8 & 0x00FF), direccion); //parte alta
    write_eeprom( (int8) (dato & 0x00FF), direccion+1);   //parte baja
}

Convertirlo en string no va a ayudar porq vas a tener un byte por cada cifra decimal, y va a ocupar mucha mas memoria.
saludos!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #6 en: 12 de Septiembre de 2009, 14:49:04 »
Otra alternativa es trabajar con desplazamiento de bits y mascaras:

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
    write_eeprom( (int8) (dato>>8 & 0x00FF), direccion); //parte alta
    write_eeprom( (int8) (dato & 0x00FF), direccion+1);   //parte baja
}

Convertirlo en string no va a ayudar porq vas a tener un byte por cada cifra decimal, y va a ocupar mucha mas memoria.
saludos!!!

Gera, eso es exactamente lo que la macro make8 hace  ;-)

Código: [Seleccionar]
Function:
Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #7 en: 12 de Septiembre de 2009, 17:33:29 »
Las cosas q uno se entera. Tenian q hacer una macro para algo tan simple? jeje.
Gracias por el dato, es bueno saberlo por si en el futuro me encuentro con un pedazo de codigo jeje.
Hay alguna macro o funcion "unmake"? porq si no a la larga vamos a tener q hacer desplazamiento de bits y mascara para recuperar el valor.
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #8 en: 12 de Septiembre de 2009, 17:53:31 »
si ahora me doy cuenta, cada digito se guardaria en una posicion de memoria si estuviera en string.
con respecto a

write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}

esta instruccion:
write_eeprom((int8)dato, direccion);
lo que hace es guardar el byte bajo, se entiende perfectamente, pues al convertirlo en int8 solo alcanza para el primer byte, y el ccs no hace nada(algun redondeo).
 la siguiente instruccion es la que no esta muy claro

write_eeprom(*(&dato+1), direccion+1)
 por (&dato+1) entiendo que dato es un puntero, y lo que hacer es escribir en la direccion mas uno apuntado por dato?
 es esto asi amigos


y la lectura seria algo parecido?






Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #9 en: 12 de Septiembre de 2009, 17:56:28 »
Exactamente, lo que hace esa linea es apuntar la dirección del byte alto de dato.
No contesto mensajes privados, las consultas en el foro

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #10 en: 12 de Septiembre de 2009, 18:12:51 »
micronet3, me parece q tenes mal el concepto de string. Un string es un arreglo de caracteres, o sea q un numero se representaria a traves de los caracteres '1' 2' '3', etc...
Lo q vos decis es simplemente un arreglo de enteros de 8 bits. Q seria algo parecido a lo q estamos haciendo cuando apuntamos a la posicion de memoria baja y alta donde esta el numero.
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #11 en: 12 de Septiembre de 2009, 18:13:50 »
para el proceso de lectura de datos de la eeprom, ahorita lo que se me ocurre hacer lo siguiente, ya que se tiene que unir los byte alto y bajo


numero_escrito en la eeprom=BYTE(bajo)+b8*2(8)+b9*2(9)+b10*2(10)+ b11*2(11)+ b12*2(12)+ b13*2(13)+ b14*2(14)+ b15*2(15).

este seria la forma o existe alguna funcion predefinida que realiza la lectura de un numero de 16bits

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #12 en: 12 de Septiembre de 2009, 18:15:53 »
Leer los 2 bytes y utilizar make16  :mrgreen:

Cita de: ayuda CCS
i16 = MAKE16(varhigh, varlow)



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #13 en: 12 de Septiembre de 2009, 18:21:09 »
gera, mi concepto de string es el siguiente por ejemplo y bueno lo que entendi de ustedes

por ejemplo tenemos un numero grande 11625.
si lo convierto a string quedaria de la siguiente manera

num1[0]='5'
num1[1]='2'
num1[2]='6'
num1[3]='1'
num1[4]='1'
num1[5]='0x00'

 para guardarlo lo haria de la siguiente manera, o se guardaria

for(i=0;i<6;i++)
write_eeprom(i);


ese es mi concepto si estoy equivocado por favor corregirlo. el caracter nulo me entra una duda, es la siguiente, si se tiene que guardar tambien en la eeprom?



Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #14 en: 12 de Septiembre de 2009, 18:23:06 »
disculpen se me paso
 for(i=0;i<6;i++)
write_eeprom(i, num1);


 

anything