TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QIQE en 30 de Septiembre de 2007, 17:38:20

Título: Eeprom interna no graba bien
Publicado por: QIQE en 30 de Septiembre de 2007, 17:38:20
Hola amigos estoy intentando meter unos valores para una variables en una eeprom interna en un 16f876A pero no hay manera se que  llegan bien los datos al pic por que los veo por el puerto serie pero cuando apago y vuelvo a encender... nada hay unos valores rarisimos que no corresponden, esta es la rutina de grabado
Código: [Seleccionar]
Cte_Propor=((cbuff[2]-48)*10)+cbuff[3]-48;
         Cte_Propor_dec=((cbuff[5]-48)*10)+((cbuff[6]-48));
         Cte_Int=((cbuff[8]-48)*10)+cbuff[9]-48;
         Cte_Int_dec=((cbuff[11]-48)*10)+((cbuff[12]-48));
         Cte_Der=((cbuff[14]-48)*10)+cbuff[15]-48;
         Cte_Der_dec=((cbuff[17]-48)*10)+((cbuff[18]-48));
         
         ref=((cbuff[20]-48)*10)+cbuff[21]-48;
         ref_dec=((cbuff[23]-48)*10)+((cbuff[24]-48));
         
         write_eeprom(0x2100,Cte_Propor);
         delay_ms ( 200 ) ;
         write_eeprom(0x2101,Cte_Propor_dec);
         delay_ms ( 200 ) ;
         write_eeprom(0x2102,Cte_Int);
         delay_ms ( 200 ) ;
         write_eeprom(0x2103,Cte_Int_dec);
         delay_ms ( 200 ) ;
         write_eeprom(0x2104,Cte_Der);
         delay_ms ( 200 ) ;
         write_eeprom(0x2105,Cte_Der_dec);
         delay_ms ( 200 ) ;
         write_eeprom(0x2106,ref);
         delay_ms ( 200 ) ;
         write_eeprom(0x2107,ref_dec);
         delay_ms ( 200 ) ;
         
         Cte_Propor=Cte_Propor+(Cte_Propor_dec/100);
         Cte_Int=Cte_Int+(Cte_Int_dec/100);
         Cte_Der=Cte_Der+(Cte_Der_dec/100);
         ref=ref+(ref_dec/100);

y este para leerlo

Código: [Seleccionar]
   Cte_Propor=read_EEPROM (0x2100);
   Cte_Propor_dec=read_EEPROM (0x2101);
   Cte_Int=read_EEPROM (0x2102);
   Cte_Int_dec=read_EEPROM (0x2103);
   Cte_Der=read_EEPROM (0x2104);
   Cte_Der_dec=read_EEPROM (0x2105);
   ref=read_EEPROM (0x2106);
   ref_dec=read_EEPROM (0x2107);
   
   Cte_Propor=Cte_Propor+(Cte_Propor_dec/100);
   Cte_Int=Cte_Int+(Cte_Int_dec/100);
   Cte_Der=Cte_Der+(Cte_Der_dec/100);
   ref=ref+(ref_dec/100);

muchas gracias un saludo
Título: Re: Eeprom interna no graba bien
Publicado por: MGLSOFT en 30 de Septiembre de 2007, 23:39:42
Estas seguro que es 0x2100 el inicio de la EEPROM en es PIC?? :shock:
Título: Re: Eeprom interna no graba bien
Publicado por: Nocturno en 01 de Octubre de 2007, 04:34:07
Efectivamente como anuncia Marcos, el problema lo tienes en la dirección que has usado. Aunque la dirección de la eeprom sea la 0x2100, el comando write_eeprom ya lo da por hecho y empieza a contarlas a partir de la 0.
Por tanto, si pones write_eeprom (0,Cte_Propor) verás como funciona.
Título: Re: Eeprom interna no graba bien
Publicado por: QIQE en 02 de Octubre de 2007, 17:38:29
hola muchas gracias por las respuestas, ya lo habia probado asi y tampoco funcionaba hasta que me di cuenta que estaba buardando en una posicion de la eeprom una variable float con lo que guardaba lo que queria.... en fin visto el problema y solucionado ya lo solucioné... que tiempo de accesoa  la eprom soleis usar?? unos 20 ms?? muchas gracias
Título: Re: Eeprom interna no graba bien
Publicado por: RedPic en 03 de Octubre de 2007, 08:35:15
Yo antes esperaba 5 ms y me iba perfecto.  :P

Pero ahora uso la interrupción de fin de escritura y me va mejor aún, porque tarda lo que tiene que tardar, ni mas ni menos de lo necesario ...  :mrgreen:

Código: C++
  1. #int_eeprom
  2. /** \brief Interrupción por : Fin escritura EEPROM interna.
  3.   */
  4. void interrupt_service_rutine_eeprom(void) {
  5.    flag_Writing_INTERNAL_EEPROM=0;
  6. }
  7.  
  8. /** \brief Función para la escritura de un byte dando su valor y su dirección absoluta.
  9.   *
  10.   * Esta función utiliza la interrupción INTEEPROM en main.c que indica cuando ha finalizado la escritura de la EEPROM.
  11.   *
  12.   * \param memAddress Dirección absoluta de 8 bits a escribir (rango de 00h a FFh).
  13.   * \param data Valor del byte a escribir (rango de 00h a ffh).
  14.   *
  15.   * \return int1 0 Write Ok, 1 Write Error
  16.   */
  17. int1 writeByteINTEEPROM(int8 memAddress, int8 data){
  18.  
  19.    int1 ret;
  20.    int8 datatest;
  21.  
  22.    ret=0;
  23.    flag_Writing_INTERNAL_EEPROM=1;
  24.    enable_interrupts(int_eeprom);
  25.    write_eeprom (memAddress, data);
  26.    while(flag_Writing_INTERNAL_EEPROM==1){/*Do nothing, Only wait for write finish*/}
  27.    disable_interrupts(int_eeprom);
  28.    datatest = readByteINTEEPROM(memAddress);
  29.    if(datatest != data) ret = 1;
  30.    return ret;
  31. }

Y por supuesto compruebo que efectivamente lo que he enviado a escribir es lo que he escrito.
Título: Re: Eeprom interna no graba bien
Publicado por: Marttyn en 17 de Enero de 2009, 18:44:50
Si quiero escribir en la eeprom con la directiva #ROM tengo que poner las direcciones a partir de 0x2100, pero si lo hago con write_eeprom empiezo desde el 0.
Esto me genero algunos problemas, e intente encontrar en el datasheet donde ponia que la eeprom esta en la dir 0x2100 y no encontre nada  :?
Sabeis donde lo dice?

Por cierto, en el ejemplo de CCS hace algo asi:
#rom  0x2100={1,2,3,4,5,6,7,8}

pero podria hacer asi?
#rom 0x2104={1,2,3,4,5,6,7,8,9,10,11,12,13,14}

Es decir, podria empezar en cualquier direccion, y escribir mas de 8 valores?
Título: Re: Eeprom interna no graba bien
Publicado por: sander en 17 de Enero de 2009, 20:41:10
La cantidad de valores que puedes escribir en la EEPROM dependera del tamaño de tu EEPROM y si pones #rom 0x2104 comenzaras a escribir en la posicion 0x04 , la 0x00, 0x01, 0x02, 0x03, 0x04, quedarian en blanco


Saludos
Título: Re: Eeprom interna no graba bien
Publicado por: Marttyn en 18 de Enero de 2009, 14:45:03
Genial! Gracias Sander!
Solo me queda saber donde viene especificado que la memoria EEPROM comienza en la direccion 0x2100. Pero es solo por curiosidad  :mrgreen:
Salu2
Título: Re: Eeprom interna no graba bien
Publicado por: sander en 18 de Enero de 2009, 19:59:34
Si no me equivoco esa informacion esta en la especificaciones de programacion de los PICs, es la informacion que se utiliza para hacer los programadores de PIC


Saludos