TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
No tendrás la variable Fabrica en 1 ??
-
no, si fuera asi, no leeria de eeprom siempre 0xff :.(
-
No tendrás el bit de protección de escritura en eeprom activado ??
Me refiero al bit de la palabra de configuración...
-
#FUSES NOCPD //No EE protection
:(
-
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??
-
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... :?
-
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....
-
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.
-
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....
-
Estas haciendo la prueba en hardware? Si es así, probaste con otra dirección en la memoria?
Saludos!
-
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.... :.(
-
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 :(
-
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.