Autor Tema: Duda acerca de EEPROM  (Leído 5727 veces)

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

Desconectado anneo

  • PIC10
  • *
  • Mensajes: 5
Duda acerca de EEPROM
« en: 09 de Enero de 2009, 14:36:26 »
Hola, a ver si alguien pudiera resolverme una dudilla algo tonta... si en la eeprom interna en una dirección sólo podemos guardar un byte... como es que podemos guardar variables tipo "char men1[]="Hola"; " en una sola direccion?? No deberíamos de tener que usar una para cada letra?

Sé que se pueden guardar, más que nada porque yo mismo lo he probado, y además viene así en ejemplos de este foro (como los de VsZener en C)... pero me ha surgido esa duda de por qué.

Un saludo.

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Duda acerca de EEPROM
« Respuesta #1 en: 09 de Enero de 2009, 14:41:14 »
Me imagino que esa será la dirección inicial a partir de la cual empiezan a guardarse tus datos uno a uno consecutivamente.

Javicho.

Desconectado anneo

  • PIC10
  • *
  • Mensajes: 5
Re: Duda acerca de EEPROM
« Respuesta #2 en: 09 de Enero de 2009, 15:20:48 »
Si miras el ejemplito de este link, por ejemplo, verás que en una direccion se guarda todo el mensaje y en la siguiente otro mensaje entero de nuevo...

  ejemplito de VsZener sobre EEprom interna
« Última modificación: 09 de Enero de 2009, 16:25:31 por anneo »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Duda acerca de EEPROM
« Respuesta #3 en: 09 de Enero de 2009, 16:06:12 »
Pues a mi me gustaría saber como también. Lamentablemente el link no funciona.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado WillyP

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 280
    • Sitiónica
Re: Duda acerca de EEPROM
« Respuesta #4 en: 09 de Enero de 2009, 16:14:40 »
La única forma es 1 byte por direccionamiento, si se escribe otro byte en la misma dirección el anterior es reemplazado por el nuevo. No hay otra.

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Duda acerca de EEPROM
« Respuesta #5 en: 09 de Enero de 2009, 16:25:46 »
No conozco el C, pero aplico el sentido común, es imposible que en una dirección puedas almacenar varios bytes y si indicas una dirección es lo mas probable que los siguientes bytes se guarden uno a continuación del otro, no les parece obvio?

Javicho.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Duda acerca de EEPROM
« Respuesta #6 en: 09 de Enero de 2009, 16:28:51 »
Pues si, para mi, es como lo dice Javicho. Ni modo si se lo guarda en ASCII, solo es posible una letra por pocición de memoria.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado anneo

  • PIC10
  • *
  • Mensajes: 5
Re: Duda acerca de EEPROM
« Respuesta #7 en: 09 de Enero de 2009, 16:33:10 »
Ya rula el link.

Está claro que solo puede ser un byte por dirección... pero entonces... una variable tipo char men1[]="Hola" ...es solo 1 byte? Porque lo escribe todo en una direccion, luego lo lee y lo saca por pantalla y funciona vaya... y a mi en otro programilla y otros tipos de mensajes también.. y no me explico por qué.

Luego en una EEprom externa intento hacer lo mismo y ya no funciona, hay que ir letra a letra. De hecho, se lo he preguntado a mi profesor y no me ha sabido contestar. ¿Tendrá algo que ver con direccionamiento a alguna parte de la RAM o algo así?

Que es imposible almacenar varios bytes está claro... por definicion solo puede guardarse uno por dirección...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Duda acerca de EEPROM
« Respuesta #8 en: 09 de Enero de 2009, 17:01:56 »
Para declarar Cadenas se usan arreglos de chars. Existen varias formas de declarar una Cadena:

Código: [Seleccionar]
//Cadena dinámica que no tiene tamaño en RAM pero si tiene un inicio
char *cadena;

//Cadena de tamaño fijo
char cadena[5];

//Cadena de tamaño que depende del contenido al declararla
char cadena[]="Cinco";
char *cadena="Cinco";

En todas las declaraciones cadena es un puntero.

Si se usa una cadena, el contenido de cadena será la posición ram en la que inicia el arreglo de chars. Para ubicar memoria para una cadena dinámica se puede usar malloc().

Por ejemplo:

Código: [Seleccionar]
//Entrega la dirección RAM en que la cadena comienza
printf("RAM en donde empieza la cadena: %u", cadena);

//Imprime el arreglo de chars desde el primer char hasta encontrar un NULL char (0x00).
printf("Contenido de la cadena: %s", cadena);

Toda cadena que ha de ser modificada por la mayoría de funciones de String.h deberá tener un NULL char al final. Si la cadena no tiene un NULL char al final, las funciones leerán la memoria RAM en forma sucesiva hasta encontrar un 0x00 o hasta que el programe falle por no tener acceso a una sección de memoria.

Si quieres usar una eeprom externa para leer cadenas tienes que crear tus propias funciones o buscar las que tu compilador ya incluye. Las funciones de String.h están enfocadas a arreglos de chars ubicados en RAM, no en otros lugares.

Lo más fácil es volcar el contenido de cada byte de la eeprom externa en una cadena ubicada en RAM...

Código: [Seleccionar]
#define tamano 30
char cadena;
int16 dircadena;
int16 i;

...

//Leer una cadena desde eeprom externa
for(i=0;i<dircadena+tamano;i++)
{
cadena[i]=read_ext_eeprom(i+dircadena);
}

//Imprimir lo que se sacó de la eeprom
printf("La eeprom contiene esta cadena: %s",cadena);


Hay que tener cuidado al escribir la cadena en la eeprom externa, no olvidar incluir el NULL char en el último caracter.

Acabo de escribir ese programita, por favor dale una checada en caso de que me haya equivocado en algo  :mrgreen:

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda acerca de EEPROM
« Respuesta #9 en: 19 de Enero de 2009, 02:01:11 »
Uy, que casualidad!
Justo ahora estoy con el mismo problema que comenta anneo!
Lo simule en proteus y en mplab y en los 2 funciona "bien", y lo mejor es que en solo 1 byte escribe TODA la cadena! :shock:
Solo habria que montar el circuito y ver que pasa en la realidad... pero debe ser un bug o algo se nos esta pasando, y lo raro es que de verdad escribe solo 1 byte, ya que en el mapa de la eeprom solo aparece 1 byte escrito.
Lo curioso es que si lo hago con un int16 no funciona  :?
raro raro raro
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Duda acerca de EEPROM
« Respuesta #10 en: 19 de Enero de 2009, 11:18:26 »
Consulta, ¿álguien puede subir el hex para analizarlo con el ICPROG y ver como guarda el dato en la EEPROM?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda acerca de EEPROM
« Respuesta #11 en: 19 de Enero de 2009, 11:48:51 »
Poco veras en el hex, ya que la eeprom se graba y se lee en tiempo de ejecucion.
Puedes ver el ejemplito de Vszener aqui: http://www.todopic.com.ar/foros/index.php?topic=4530.msg38923#msg38923
Esta en C
Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Duda acerca de EEPROM
« Respuesta #12 en: 19 de Enero de 2009, 12:56:19 »
Uy, que casualidad!
Justo ahora estoy con el mismo problema que comenta anneo!
Lo simule en proteus y en mplab y en los 2 funciona "bien", y lo mejor es que en solo 1 byte escribe TODA la cadena! :shock:
Solo habria que montar el circuito y ver que pasa en la realidad... pero debe ser un bug o algo se nos esta pasando, y lo raro es que de verdad escribe solo 1 byte, ya que en el mapa de la eeprom solo aparece 1 byte escrito.
Lo curioso es que si lo hago con un int16 no funciona  :?
raro raro raro

Cadena es un apuntador a char y como apuntador ocupa 1 byte de memoria.

Lo único que están guardando es la dirección de donde empieza la cadena, no la cadena completa.

Habría que ver el código en c para interpretar lo que realmente se está guardando en la eeprom.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda acerca de EEPROM
« Respuesta #13 en: 19 de Enero de 2009, 13:30:54 »
Entonces tiene bastante sentido...

char Cadena[] = "Hola";
write_EEPROM(0x00, Cadena);

Al hacer read_eeprom(0x00) en estamos leyendo el puntero que en relidad nos lleva a leer la RAM que tiene la cadena
si no declaramos Cadena, al leer la eeprom nos llevara a un lugar de la memoria donde no hay nada.
Gracias migsantiago! Esto de los punteros nos puede traer de cabeza si no lo tenemos muy claro  :z)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Duda acerca de EEPROM
« Respuesta #14 en: 19 de Enero de 2009, 13:37:09 »
Exacto, si grabas la dirección de cadena en la eeprom y luego apagas el pic. Luego lo enciendes y recuperas la dirección, el contenido de cadena se habrá perdido completamente.

Checa este código en el que puedes guardar la cadena completa...

http://www.todopic.com.ar/foros/index.php?topic=24384.msg198263#msg198263