Autor Tema: Problema escribiendo/leyendo la eeprom interna.  (Leído 2507 veces)

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

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Problema escribiendo/leyendo la eeprom interna.
« en: 25 de Septiembre de 2009, 16:16:52 »
Hola, qué tal?

Tengo un problema que no entiendo bien. Lo que intento hacer es escribir cuatro mensajes en la eeprom, después leerlos y mostrarlos en un lcd. La idea la saqué de vszener, en sus ejemplitos para 16F648A. En mi caso uso 16F887.

Código: C
  1. #include <16f887.h>
  2. #use delay (clock=1000000)
  3. #include <lcd.c>
  4.  
  5. void main()
  6. {
  7.      
  8.    char mensaje1[]="Uno.....";
  9.    char mensaje2[]="Dos.....";
  10.    char mensaje3[]="Tres....";
  11.    char mensaje4[]="Cuatro..";
  12.    char msjLeido;
  13.    int dirEeprom = 0;
  14.    
  15.    set_tris_d(0x00);
  16.    
  17.    lcd_init();
  18.    delay_ms(100);
  19.    
  20.    write_eeprom(dirEeprom,mensaje1); dirEeprom++; //dirEeprom++;
  21.    write_eeprom(dirEeprom,mensaje2); dirEeprom++; //dirEeprom++;
  22.    write_eeprom(dirEeprom,mensaje3); dirEeprom++; //dirEeprom++;
  23.    write_eeprom(dirEeprom,mensaje4); dirEeprom++; //dirEeprom++;
  24.    
  25.    while(1)
  26.    {
  27.       for(dirEeprom=0;dirEeprom<4;dirEeprom=dirEeprom+1) /*aca si pongo dirEeprom<8 y dirEeprom+2 y descomento tmb lo de arriba anda bien, pero no se por qué*/
  28.       {
  29.          lcd_putc("\f");
  30.          msjLeido = read_eeprom(dirEeprom);
  31.          delay_ms(100);
  32.          printf(lcd_putc,"%s",msjLeido);
  33.          delay_ms(1000);
  34.          
  35.       }
  36.    }  
  37.  
  38. }

Lo que me pasa es que en vez de ver:

"uno"
"dos"
"tres"
"cuatro"

veo..

"uno"
nada
"tres"
nada

Creo que el asunto está en los desplazamientos que hago en la dirección de memoria. Tanto para escribir como para leer. Ya que fui cambiando valores y llegué a ver bien los cuatro mensajes, pero no entiendo por qué. La solución fue poner eso que ahí aparece comentado, y poner en el for <8 en vez de <4.

Eso es.. gracias de antemano.
« Última modificación: 25 de Septiembre de 2009, 16:18:59 por _Maxi »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #1 en: 25 de Septiembre de 2009, 17:30:49 »
Prueba a poner un pequeño delay de uno 5 o 10 milisegundos detras de cada escritura en la EEPROM y coméntanos si te funciona.

La escritura en la EEPROM tarda un poco en fijarse electricamente y puede ser que le estés mandando los mensajes mas rápido de lo que tarda en grabarse, de ahí que los mensajes impares se graben y lo pares no.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #2 en: 25 de Septiembre de 2009, 21:39:49 »
Hola RedPic.

Probé con el delay, y nada.. sigue haciendo lo mismo.

Tendrá algo que ver con esto?

Citar
WRITE_EEPROM( )

--------------------------------------------------------------------------------

Syntax:
 write_eeprom (address, value)
 
Parameters:
 address is a (8 bit or 16 bit depending on the part) int, the range is device dependent, value is an 8 bit int
Quizás en el 16f887 maneja direcciones de 16bit  :?
No se, después de leer eso es que se me ocurrió sumarle 2 a la dirección, en vez de uno, y hacer lo mismo al leer, y empezó a funcionar, pero para mi es por alguna otra razón, anduvo de casualidad.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #3 en: 25 de Septiembre de 2009, 23:22:12 »
Hola

El error está en la comprensión de los arreglos de chars, te recomiendo que leas este tema...

Tutorial - Cadenas y arreglos de chars
http://www.todopic.com.ar/foros/index.php?topic=25785.0

Write_eeprom sirve para guardar datos de 8 bits en la eeprom interna del pic, no para guardar cadenas.

Cuando tú haces esto...

Código: [Seleccionar]
write_eeprom(dirEeprom,mensaje1);
... en realidad el dato que se está guardando es la dirección ram de 9 bits del primer char del arreglo mensaje1, pero recuerda que la eeprom interna tiene datos de 8 bits, por lo que estás perdiendo uno.

Después al querer recuperar la dirección ram del mensaje1 solo recuperarás 8 de 9 bits. Por suerte los mensajes 1 y 3 no requieren del bit perdido para ser recuperados pero los otros mensajes apuntan a direcciones de memoria desconocidas.

Ese es el problema que encuentro a tu programa, como recomendación deberías estudiar ensamblador para poder dominar el lenguaje C o reforzar tus conocimientos de cadenas.

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #4 en: 26 de Septiembre de 2009, 12:06:35 »
migsantiago, había descartado eso, ya que en el ejemplito de vszener lo hace justamente así, entonces ni siquiera pensé que eso pudiera ser lo que estaba mal.

Acá está: http://www.todopic.com.ar/foros/index.php?topic=4530.msg38923#msg38923

Sabía la teoría de strings, pero no le presté atención por lo anterior. Ahora me pego una refrescada leyendo tu post :)

Gracias.
« Última modificación: 26 de Septiembre de 2009, 12:09:26 por _Maxi »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #5 en: 26 de Septiembre de 2009, 18:11:04 »
Uff veo que el ejemplo de Vszener es similar al tuyo, también tiene los errores de strings. El problema es que solo guarda la dirección ram del string y no el string completo.

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #6 en: 26 de Septiembre de 2009, 22:28:08 »
Claro, pero guardar la dirección de memoria del string, es suficiente verdad?
Porque después cuando hago el printf, lo que necesito es la dirección de memoria del string, después se corta solo cuando encuentra el 0x00.

Si esto es así, la parte del problema no sería la manera en que guardo/leo el string.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #7 en: 26 de Septiembre de 2009, 22:44:52 »
Es suficiente, sí, pero debes guardar los 9 bits, no solo 8. Deberás usar 2 bytes de la eeprom interna para guardar los 9 bits de la dirección del string.

Desconectado _Maxi

  • PIC10
  • *
  • Mensajes: 34
Re: Problema escribiendo/leyendo la eeprom interna.
« Respuesta #8 en: 26 de Septiembre de 2009, 22:53:57 »
Ahh, ahora sí. Gracias.


 

anything