Autor Tema: ¿Funciones en C30 para escribir la EEPROM?  (Leído 2096 veces)

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

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
¿Funciones en C30 para escribir la EEPROM?
« en: 10 de Diciembre de 2011, 16:51:27 »
¿Alguien me puede explicar por qué la función _write_eedata_word del C30 no me funciona como es debido? La estoy intentando usar en un programa para un PIC, y a veces me graba los datos, otras no, otras parcialmente, y no sé por qué es.

El código que uso es el siguiente:
Código: [Seleccionar]
//Inicialización de variables
_prog_addressT direccion=0x7FFC00;
int array_datos[16];
[....]  //Se rellena el array con los datos a almacenar
//Grabación de datos en la EEPROM
_erase_eedata_all(); //Borra la EEPROM completa
_wait_eedata(); //Esperamos hasta que la EEPROM ha sido borrada
for (contador=0;contador<16;contador++)  {
_write_eedata_word(direccion, array_datos[contador]);
_wait_eedata();
direccion+=2;
}
Eso es lo que intento hacer, y los resultados son, cuando menos, impredecibles. Por no decir que la mayor parte de las veces o no se graba nada, y otras sólo algunos datos (no el array completo). El PIC tiene 1 Kb de memoria (desde 0x7FC00 hasta 0x7FFF0), así que el espacio es más que suficiente. He estado buscando información sobre la función, y ejemplos, pero aparte de una pequeña mención en la ayuda de funciones del C30, no he encontrado nada más. ¿Alguien sabe qué es lo que estoy haciendo mal?
Por cierto, en el código no lo he especificado, pero deshabilito las interrupciones antes de intentar guardar el array, para asegurarme de que el código se ejecuta "sin sobresaltos".

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Funciones en C30 para escribir la EEPROM?
« Respuesta #1 en: 10 de Diciembre de 2011, 20:58:08 »
Vale, después de mucho buscar por Internet, creo que me falta algo así como inicializar variables en la EEPROM. Esto, por lo que he podido ver por ahí, se hace tal que así:

Código: [Seleccionar]
int _EEDATA(2) datosEEprom[16];

También he visto que en otros sitios hablan de declararlo de esta otra forma:
Código: [Seleccionar]
int __attribute__((space(eedata), aligned(_EE_4WORDS))) datosEEprom[_EE_4WORDS*4];
Y luego, antes de escribir en la EEPROM, hay que inicializarla tal que así:
Código: [Seleccionar]
_init_prog_address(direccion, datosEEprom);Sin embargo no entiendo qué es exactamente lo que se hace, ni por qué, ni qué significa. ¿Alguien podría explicármelo?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ¿Funciones en C30 para escribir la EEPROM?
« Respuesta #2 en: 10 de Diciembre de 2011, 21:08:32 »
nose q pic tienes, pero muchos dspic no llevan eeprom, se utiliza la memoria de programa, es decir, es como programar la flash, pero en una direccion determinada que tienen para emular la eeprom, de todas formas si tu pic no llevase eeprom al poner space(eedata) te daria error.

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Funciones en C30 para escribir la EEPROM?
« Respuesta #3 en: 10 de Diciembre de 2011, 21:21:57 »
Gracias, Merlin, pero sí tiene EEPROM. Dispone de 1 Kb de memoria EEPROM, así que el problema no puede venir por ahí.

Desconectado Pepin33

  • PIC10
  • *
  • Mensajes: 13
Re: ¿Funciones en C30 para escribir la EEPROM?
« Respuesta #4 en: 11 de Diciembre de 2011, 14:13:10 »
Bueno, si inicializo el espacio de memoria EEPROM sí que parece funcionar. Al menos al simularlo en el IDE de MPLab lo hace. Al final lo he dejado tal que así:
Código: [Seleccionar]
int __attribute__((space(eedata), aligned(_EE_WORD))) espacio[_EE_ROW]; //Defino array en la EEPROM (de tamaño una fila entera, 16 words)
_prog_addressT direccion=0x7FFC00;
int array_datos[16];
[...]
//Grabación de datos en la EEPROM
_erase_eedata_all(); //Borra la EEPROM completa
_wait_eedata(); //Esperamos hasta que la EEPROM ha sido borrada
_init_prog_address(direccion, espacio); //Obtener espacio en la EEPROM
for (contador=0;contador<16;contador++)  {
_write_eedata_word(direccion, array_datos[contador]);
_wait_eedata();
direccion+=2;
}
Como digo, aparentemente funciona. Aunque sigo sin saber muy bien lo que estoy haciendo. Especialmente lo que no entiendo es lo de la declaración de la variable "espacio": int __attribute__((space(eedata), aligned(_EE_WORD))) espacio[_EE_ROW];
¿Nadie ha usado estas funciones y puede explicármelo un poco?
« Última modificación: 11 de Diciembre de 2011, 14:17:13 por Pepin33 »


 

anything