TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: xerex en 09 de Enero de 2013, 17:19:36

Título: Lo que no me pase a mi... write_eeprom [solucionado]
Publicado por: xerex en 09 de Enero de 2013, 17:19:36
Buenas!!!

aunque no posteo mucho os leo bastante, por desgracia tengo excesivos Hobbies...

Al grano, despues de utilizar 10000000 de veces la funcion write_eeprom... me ha dejado de funcionar ¿? al menos en mi programa, utilizo CSS 4.104. Tiene que ser una tonteria pero... llevo varios dias probando y no la encuentro.

Utilizo la eeprom para inicializar nuevos pics o bien restablecer valores de fabrica, el "individuo" un 16f688, esta es la inicializacion del programa:

......................
temp_rele1 =  read_eeprom (0x00);
temp_rele2 =  read_eeprom (0x01);
temp_rele3 =  read_eeprom (0x02);
histeresis =  read_eeprom (0x03);
if (((temp_rele1 == 0xff) && (temp_rele2 == 0xff) && (temp_rele3 == 0xff) &&(histeresis == 0xff)) || (fabrica == 1))
   {
   printf("Restaurados valores por defecto.");
   salto_linea();
   temp_rele1 = 90;
   temp_rele2 = 100;
   temp_rele3 = 103;
   histeresis = 5;
   write_eeprom (0x00, temp_rele1);
   write_eeprom (0x01, temp_rele2);  
   write_eeprom (0x02, temp_rele3);
   write_eeprom (0x03, histeresis);
   }
printf(" %u %u %u %u ",temp_rele1, temp_rele2, temp_rele3, histeresis);
...........


El caso es que al cargarlo en el pic, nunca, digo nunca, pone los valores de las variables correctamente en eeprom, los deja a 0xff con los pics nuevos o bien si intentas modificar la eeprom desde otro punto del programa (modificacion de variables o restore de fabrica...)

las variables temp_releX e histeresis son int, aunque tambien lo he probado con unsigned int.... tambien he cambiado el pic por si estuviera averiado... y sigo igual :(

¿Alguna idea de que me puede estar pasando?

Gracias de antemano.

Saludos.
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: MGLSOFT en 09 de Enero de 2013, 17:54:03
No tendrás la variable Fabrica en 1 ??
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 09 de Enero de 2013, 18:33:43
no, si fuera asi, no leeria de eeprom siempre 0xff :.(
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: MGLSOFT en 09 de Enero de 2013, 18:40:23
No tendrás el bit de protección de escritura en eeprom activado ??
Me refiero al bit de la palabra de configuración...
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 09 de Enero de 2013, 18:53:34
#FUSES NOCPD                    //No EE protection

:(
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: MGLSOFT en 09 de Enero de 2013, 19:09:09
Tienes claro que en ese trozo de código, si el valor esta en 0XFF al leerlo primero, y después grabarlo, solo vas a mostrar el 0xFF de todos modos, ya que no vuelves a leerlo después de escribirlo??
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 09 de Enero de 2013, 19:15:41
no, porque tengo una asignacion directa a las variables antes de grabar en eeprom...

temp_rele1 = 90;
temp_rele2 = 100;
temp_rele3 = 103;
histeresis = 5;
write_eeprom (0x00, temp_rele1);
write_eeprom (0x01, temp_rele2);  
write_eeprom (0x02, temp_rele3);
write_eeprom (0x03, histeresis);

Asi que si leo 0xff en todas las posiciones, asigno valores por defecto y los grabo en eeprom eliminando 0xff... :?
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: ppyote en 09 de Enero de 2013, 20:41:58
dime una cosa.... la variable histeresis puede ser que su valor sea diferente de 0xFF en algun momento del programa?

if (((temp_rele1 == 0xff) && (temp_rele2 == 0xff) && (temp_rele3 == 0xff)) || (fabrica == 1)){
   printf("Restaurados valores por defecto.");
   salto_linea();
   temp_rele1 = 90;
   temp_rele2 = 100;
   temp_rele3 = 103;
   write_eeprom (0x00, temp_rele1);
   write_eeprom (0x01, temp_rele2); 
   write_eeprom (0x02, temp_rele3);
}
temp_rele1 =  read_eeprom (0x00);
temp_rele2 =  read_eeprom (0x01);
temp_rele3 =  read_eeprom (0x02);
histeresis =  read_eeprom (0x03);
printf(" %u %u %u %u ",temp_rele1, temp_rele2, temp_rele3, histeresis);

prueba asi de momento....
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 09 de Enero de 2013, 20:51:29
Veamos, el problema no es la asignacion de 0xff en las variables, histeresis podria valer en un momento determinado e hipoteticamente 255 pero no es asi y no sera el caso.

El problema es que write_eeprom, no escribe el valor de las variables en la eeprom, osea si yo quiero escribir 0x10 y pongo:

Escribe en la direccion 0x00 el valor 0x10: write_eeprom(0x00, 0x10)

no lo escribe, lo deja en 0xff y no se porque   :oops:

mañana probare a hacer otro programa por si fuera algo del fichero de proyecto del css que este dañado :(

Gracias a todos.
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: ppyote en 09 de Enero de 2013, 21:03:58
Veamos, el problema no es la asignacion de 0xff en las variables, histeresis podria valer en un momento determinado e hipoteticamente 255 pero no es asi y no sera el caso.

El problema es que write_eeprom, no escribe el valor de las variables en la eeprom, osea si yo quiero escribir 0x10 y pongo:

Escribe en la direccion 0x00 el valor 0x10: write_eeprom(0x00, 0x10)

no lo escribe, lo deja en 0xff y no se porque   :oops:

mañana probare a hacer otro programa por si fuera algo del fichero de proyecto del css que este dañado :(

Gracias a todos.
yo tengo la version del CSS 4.104. y la grabacion en la eeprom interna del 18f2550 y 4550 va bien...
haz algo simple, graba... delay de 1 seg... lee la eeprom y muestrala con el sprintf, y asi sucesibamente, usa proteus para depurar y te sacara de dudas....
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: Suky en 09 de Enero de 2013, 21:56:40
Estas haciendo la prueba en hardware? Si es así, probaste con otra dirección en la memoria?


Saludos!
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 10 de Enero de 2013, 17:34:41
Bueno a vuestros comentarios,

si he probado otra direccion de memoria y... pasa lo mismo pero como a veces es mejor dejar las cosas y cogerlas un poco mas tarde, he estado ampliando el programa y...... con este codigo a ver si adivinais que a pasado...


if ((restart_cause() !=  NORMAL_POWER_UP) && (restart_cause() !=  WDT_TIMEOUT))
   {
   printf("Sistema Reseteado por software");
   salto_linea();
   }
else if (restart_cause() !=  WDT_TIMEOUT) //Contamos las veces que se ha reseteado el equipo por WDT
   {
   i = read_eeprom(0x14);
   i++;
   write_eeprom(0x14,i);
   }
temprele1 =  read_eeprom (0x00);
temprele2 =  read_eeprom (0x01);
temprele3 =  read_eeprom (0x02);
histeresis =  read_eeprom (0x03);
if (((temprele1 == 0xff) && (temprele2 == 0xff) && (temprele3 == 0xff) &&(histeresis == 0xff)) || (fabrica == 1))
   {
   printf("Restaurados valores por defecto.");
   salto_linea();
   temprele1 = 90;
   write_eeprom (0x00, temprele1);
   delay_ms(100);
   temprele2 = 100;
   write_eeprom (0x01, temprele2);  
   delay_ms(100);
   temprele3 = 103;
   write_eeprom (0x02, temprele3);
   delay_ms(100);
   histeresis = 5;
   write_eeprom (0x03, histeresis);
   delay_ms(100);
   }
printf(" %u %u %u %u %u",temprele1, temprele2, temprele3, histeresis,read_eeprom(0x14));


Resulta que si se escribe en la posicion 0x14 (resets) pero en el resto no (0x00 a 0x03..), he probado con mas por supuesto con el mismo resultado :5]

Por cierto tambien he cambiado el nombre a las variables... por si acaso... pero nada  :5]

y una de las ultimas pruebas, escribir solo una variable temprelex en otro sitio y la direccion 0x04.... y la 0x04 tambien la escribe...

ahora si que estoy desesperado... voy a ver si puedo instalar proteus que no lo suelo usar.... :.(
Título: Re: Lo que no me pase a mi... write_eeprom
Publicado por: xerex en 10 de Enero de 2013, 17:46:53
la ultima...

cambio de compilador al 4.084 y pruebo... aparte de que me salta que he excedido la ROM.... una vez lo soluciono temporalmente.. hago la prueba y.... solo escribe temprele1 y temprele2.... el resto las deja a 0xff...

pienso que es problema del compilador con esta prueba :(
Título: Re: Lo que no me pase a mi... write_eeprom [solucionado]
Publicado por: xerex en 10 de Enero de 2013, 20:10:02
pues si lo he solucionado, me he bajado la version 4.140d y he cambiado la referencia a las posiciones de memoria de la eeprom por etiquetas:

temprele1 =  read_eeprom (temp1_eeprom);
temprele2 =  read_eeprom (temp2_eeprom);
temprele3 =  read_eeprom (temp3_eeprom);
histeresis =  read_eeprom (histeresis_eeprom);
if (((temprele1 == 0xff) || (temprele2 == 0xff) || (temprele3 == 0xff) || (histeresis == 0xff)) || (fabrica == 1))
   {
   printf("Restaurados valores por defecto.");
   salto_linea();
   temprele1 = 90;
   write_eeprom (temp1_eeprom, temprele1);
   delay_ms(100);
   temprele2 = 100;
   write_eeprom (temp2_eeprom, temprele2);   
   delay_ms(100);
   temprele3 = 103;
   write_eeprom (temp3_eeprom, temprele3);
   delay_ms(100);
   histeresis = 5;
   write_eeprom (histeresis_eeprom, histeresis);
   delay_ms(100);
   }

Asi, si funciona  :5], comprobado porque he compilado lo mismo en la 4.104 y seguia igual :(

Gracias a todos.

Saludos.