Autor Tema: Se me borra la EEPROM interna!  (Leído 4962 veces)

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Se me borra la EEPROM interna!
« en: 06 de Mayo de 2016, 09:02:51 »
Hola!
Tengo varios proyectos para diferentes aplicaciones que usan el PIC 12F1840 (incluso alguno mas antiguo que usaba el PIC 12F683) y este guarda unos valores de configuracion en la EEPROM interna del PIC.

En un inicio "normal" se leen los valores de la EEPROM, pero como el programa no puede funcionar sin esos valores, si los valores no entran dentro del rango de lo esperado, entonces se borran los anteriores y se almacenan los valores por defecto.

Estos valores tambien se pueden modificar manteniendo un pulsador antes de alimentar el circuito, y antes del loop principal, si se lee que el pulsador esta presionado, entonces entra en modo configuracion y se pueden almacenar nuevos valores en la EEPROM.

Cada tanto me encuentro que el programa tiene los valores por defecto y si bien todo funciona, hay que configurarlo nuevamente para adaptarlo a la aplicacion concreta, ya que los valores por defecto no son operativos.

Mis sospechas:
-Estos circuitos estan pensados para usar a pilas o baterias recargables, por lo que si estas estan muy descargadas podrian llevar al micro a una situacion de no tener alimentacion suficiente para funcionar correctamente, por lo que en algun funcionamiento erratico podria saltar el programa a la posicion de poner los valores por defecto de la EEPROM.
-Muchos circuitos usan servomotores, que pueden producir picos de voltaje y podria ocurrir lo mismo que en el caso anterior.

Soluciones:
-Hago una triple comprobacion antes de borrar la memoria, para estar seguro de que es algo que se esta haciendo deliberadamente.
-El primer valor de la EEPROM lo uso como "proteccion contra escrituras". Si el valor no es uno determinado, entonces la rutina que borra/escribe la eeprom no puede continuar. El valor este lo modifico desde otra posicion del programa ya que si lo hago en la misma rutina, y el programa salta entoces es como si no hubiera hecho nada.
-Configurar el Brownout Reset para que el micro no funcione por debajo de cierto voltaje.

Ha funcionado?
Pues en parte... Ya no ocurre tan a menudo, pero sigue ocurriendo  :(
Si el problema es que el programa salta, da igual cuantas comprobaciones ponga... ya que si salta justo al pundo de borrar la EEPROM no se me ocurre que poder hacer.
Por otro lado, me parece raro, pero no se me ocurren ni mas motivos ni mas soluciones.

A algien le ha pasado algo asi? Alguna solucion?

Lamento no poder poner el codigo, ya que son diferentes proyectos, y ademas con codigos largos. Si hace falta puedo poner algun fragmento de codigo que pueda ser relevante.

Un saludo!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Se me borra la EEPROM interna!
« Respuesta #1 en: 06 de Mayo de 2016, 09:25:00 »
Hola Martty.
El error puede estar durante el funcionamiento NORMAL del programa y del circuito. Con normal me refiero a que toda la electrónica y tensión de la fuente anda perfecto y no recibe ruido eléctrico.

Tu mencionaste que el circuito va modificando los valores de configuración según valla trabajando. Pues bien, debe haber un evento que haga modificar la configuración y lleva al PIC a cargar un valor que no es el recomendado.
Una solución a esto, es que pongas una rutina de "control de calidad", en el que asegure que los valores a modificar estén dentro del rango correcto; así, en un inicio, el pic no tenga que modificar los valores de la EEPROM a valores por defectos (*); y puedes guardar un valor en la EEPROM con el rango superior o inferior mas cercano. Por ejemplo, tu rango de valores van de 0Ah a 1Ah. El evento quiere guardar el valor 08h; por lo tanto, la rutina de control evitaría guardar dicho valor y guardaría en su defecto, el valor 0Ah.

Lamento que hablo en forma general, pero no se que es esa configuración, que eventos pueden modificar dichos valores, y cuales son los rangos necesarios para un correcto funcionamiento.

(*) En modo depuración, puedes hacer detener el programa y que el PIC te avise que cosa generó un error y con qué valor iba a grabar la eeprom. Esto te podrá ayudar a encontrar que cosa puede estar generando un error.
Cuando el PIC esté en su funcionamiento definitivo, si tienes los medios, puedes generar un LOG DE ERROR, así en futuras consultas o mantenimiento, puedes saber que cosas están fallando.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Se me borra la EEPROM interna!
« Respuesta #2 en: 06 de Mayo de 2016, 11:25:19 »
Gracias Leon por tus consejos!
Lo de generar un log de error lo veo complicado, ya que habria que incluirlo en todos los circuitos a nivel hardware y software, y sinceramente no sabria ni por donde empezar  :oops:

Con respecto a mi programa, el funcionamiento es el siguiente:

-inicializo PIC
-Si se esta presionando un boton entro en modo configuracion, sino en modo normal

En modo CONFIGURACION:
-puedo modificar los valores de la EEPROM, los valores que se graban ya se han comprobado que sean validos. Una vez terminado reinicio el PIC

En modo NORMAL:
-Leo EEPROM
-Si los valores son validos los asigno a unas variables para que el programa trabaje con ellas
-Si no son validos borro EEPROM y grabo valores por defecto

El programa NO TOCA PARA NADA los valores de EEPROM, tan solo se leen al inicio y se le asignan a variables.
Los valores solo se modifican por el usuario en caso de  entrar en la configuracion.
Solo hay 2 momentos en donde puede ocurrir un error (en un transcurso normal del programa):
-Cuando compruebo el boton al inicio. En caso de que la comprobacion no sea correcta entraria en modo configuracion, donde si se puede modificar los valores de EEPROM
-Cuando se lee la EEPROM, si el primer valor de la EEPROM no es uno determinado (como una llave) considera que la EEPROM esta vacia o mal configurada y reescribe los valores por defecto.

Mi principal sospecha es que son los picos de voltaje, por que tengo un circuito del que habre vendido 200uds quizas y nunca he tenido ningun problema. Este circuito utiliza el mismo PIC, e igualmente guarda los datos en EEPROM, pero su alimentacion proviene directamente de un iPod, bien regulada y sin servos o consumos elevados que vayan a generar ningun pico.
Donde si se me borra la EEPROM es en los circuitos que llevan servomotores.  :5]

Creo que lo que tengo que hacer es una "caja fuerte" para la EEPROM. Como un sistema de seguridad que si no se activan los (varios) sistemas de seguridad pertinentes entonces no se puede acceder a modificar la EEPROM...
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Se me borra la EEPROM interna!
« Respuesta #3 en: 07 de Mayo de 2016, 00:29:34 »
Si solo te pasa con los servomotores, entonces es ruido eléctrico.
¿Usan fuentes separadas? Si usan la misma fuente, lo que puedes hacer es separarla; y para activarla usar optoacopladores; de esta manera, se logra separar el ruido que puede venir por la fuente.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Se me borra la EEPROM interna!
« Respuesta #4 en: 07 de Mayo de 2016, 09:44:53 »
Si, algunos circuitos puedo separar la fuente, pero otros no.
Quizas sea mejor encontrar una proteccion por software, es mas barato y rapidamente adaptable.
Seguire pensando.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Se me borra la EEPROM interna!
« Respuesta #5 en: 07 de Mayo de 2016, 10:01:00 »
Quizas sea mejor encontrar una proteccion por software, es mas barato y rapidamente adaptable.

A mi no se me ocurre ninguna, por que el problema persiste, trata de ponerle mas capacitores entre Vcc y GND cerca del micro, tal ves uno de tantalio, y de distintos valores ceramicos. O la empeoras o la mejoras :P

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Se me borra la EEPROM interna!
« Respuesta #6 en: 12 de Mayo de 2016, 07:15:33 »
A mi no se me ocurre ninguna, por que el problema persiste, trata de ponerle mas capacitores entre Vcc y GND cerca del micro, tal ves uno de tantalio, y de distintos valores ceramicos. O la empeoras o la mejoras :P

Jeje, le metere algun condensador mas y seguire pensadon una proteccion por software. Me gusta el desafio de crear una proteccion para la eeprom :)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Se me borra la EEPROM interna!
« Respuesta #7 en: 12 de Mayo de 2016, 07:29:06 »
Es que la unica proteccion que se me ocurre es depender de algun bit (flag) de un registro en RAM. Para saber si poder grabar o no.
Me refiero al comienzo ponerlo en 1 luego de verificar la EEPROM y antes de grabar CADA BYTE ponerlo en 0. Al final de la rutina de EEPROM ponerlo en 1 de nuevo. ( Rutina que graba 1 solo numero) es decir terminas poniendo a 0 luego para cada numero.

Esto podria evitar el que se grabe por que "salto" el codigo. O en el peor caso, solo afectaria a 1 solo campo. Y no todos. Esto tambien implica que la rutina de ponerlos a default deberian de solo modificar el byte problematico y no los demas ( o un grupo y no todos )
Tambien es depender demasiado de la integridad de los datos de la RAM.

Ahora si la modificacion de la EEPROM ocurre por un ruido introducido por Vdd/Vss, hay otro problema. Y ya aca me cuestionaria realmente si la RAM es correcta tambien. Lo cual no podes tener una certeza al igual que la EEPROM. Por eso mismo una proteccion por Soft no veia posible.

Vi una placa que me trajeron que va en un auto, y solo posee una inductancia en la entrada ( 6 vueltas sobre un toroide pequeño ) en la alimentacion + capacitores de la fuente. Luego en el PIC 1 capacitor ceramico de .1uf y luego uno de tantalio ( este fue agregado, soldado por debajo ) de 6uF, toda la proteccion :P, y usa la EEPROM para su programacion.

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

Sigamos pensando nuevamente en el "salto" de programa.
La solucion que di antes queda inutilizada al saltar a la rutina que la graba, hagamos algo mas complejo, antes de la rutina de grabar Toda la EEPROM ademas corroboramos que existan 2 bytes en cierto orden en la RAM ( algo parecido al 0x55 y 0xAA ) Si no estan no graba. Pero aun asi el "salto" puede llevarlo a otra parte donde se ponen esos valores y se le da a grabar. Seguimos con las misma. Lo va a hacer mas dificil, pero no va a solucionar el tema.

Resumen comparacion con algo en la RAM no se puede, por que el salto puede coincidir con las instrucciones de seteo.

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

¿Es realmente un "salto" ?

Si tenes el WDT podes masomenos saberlo, De todas las direcciones de memoria viene a caer JUSTO en la EEPROM y encima varias veces seguidas?. Si ocurre muchas veces y suponemos que el salto es aleatorio, deberian haber saltos de software por muchos lados y no solo en la rutina de la EEPROM. Podrias poner el WDT, y leer los bits de reset para determinar si es que ocurre con el WDT, deberias tener reset por WDT como loco Si realmente fuera un salto de software. Ya que como decia si es aleatorio y suerte que caiga en la EEPROM entonces deberia haber muchos mas saltos que ocurran en partes sin ocupar de la flash.

Otra cosa, si el ruido afectara al PC, por que no afecta a todos los demas registros/RAM, etc. Y nuevamente estamos ante la posibilidad que se modifiquen miles de cosas pero solo se hace una siempre.. Que sumado a lo anterior parece poco probable lo del salto ( aun asi si fuera mas "vulnerable" el PC que lo demas )

Al menos es lo que pienso. Yo opino igual que Leon, para mi es un ruido externo por la alimentacion. Choque en la alimentacion general del micro + capacidad bien cerca de los pines
« Última modificación: 12 de Mayo de 2016, 08:06:37 por KILLERJC »

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Se me borra la EEPROM interna!
« Respuesta #8 en: 18 de Mayo de 2016, 08:09:41 »
Muchas gracias Killer por tu detallada respuesta!
Me ha hecho pensar cuando dices que el ruido deberia afectar tambien a los demas registros y a la RAM.
Al iniciar el micro, comprueba que en la EEPROM haya un valor concreto (similar a 0x55 0xAA), y si no lo hay asume que no hay valores o son erroneos, por lo que sobreescribe todo con valores por defecto. Quizas aqui este el problema. Quizas la alimentacion del micro aun no esta estable cuando se lee la eeprom, ya que al alimentar tambien el servo da un pequeño tiron de alimentacion. Si este valor no se lee correctamente es cuando se va todo a la mier**.
Probare poner algunos delays al inicio para que estabilice todo antes de leer.
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Se me borra la EEPROM interna!
« Respuesta #9 en: 20 de Mayo de 2016, 17:15:48 »
Yo venddo uno parecido y nunca se me borro la memoria

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re:Se me borra la EEPROM interna!
« Respuesta #10 en: 22 de Mayo de 2021, 01:58:01 »
Que tal Marttyn, aunque el tema es muy viejo, me esta sucediendo algo muy similar a lo tuyo y quisiera preguntarte si pudiste darle solucion.

Mi problema es muy concretamente la posición 0, de la memoria eeprom interna, cada determinado tiempo me cambia ese valor, siempre a cero (0).

No lo hacen todas las tarjetas de ese modelo, pero si que lo hace, a veces, solo regrabando el dato, ya no sucedía nuevamente, pero en otros casos eso no lo solucionaba.

Me gustaria saber como puedo evitar o disminuir la probabilidad de que suceda esto, o si les ha pasado como lo han solventado.

El PIC que uso es el PIC18F46K22

Saludos y muchisimas gracias
Nunca se deja de aprender

Desconectado gustavopic

  • PIC18
  • ****
  • Mensajes: 417
Re:Se me borra la EEPROM interna!
« Respuesta #11 en: 22 de Mayo de 2021, 21:24:47 »
estas SEGURO que no hay de vez en cunado un usuario, o un empleado o alguien que "toque "?¡?¡
pero SEGURO ???

dices que si al iniciar si esta manteido pulsado entra en modo programacion y ..... imagina que algun "niño" hace eso , y si tienes una pantalla o leds que titilan eso se pone lindo.....
estando en ese modo dime:
se puede provocar por hacer tonterias que pase lo que dices '? 

Desconectado gustavopic

  • PIC18
  • ****
  • Mensajes: 417
Re:Se me borra la EEPROM interna!
« Respuesta #12 en: 22 de Mayo de 2021, 21:32:56 »
Hola!
Tengo varios proyectos para diferentes aplicaciones que usan el PIC 12F1840 (incluso alguno mas antiguo que usaba el PIC 12F683) y este guarda unos valores de configuracion en la EEPROM interna del PIC.

En un inicio "normal" se leen los valores de la EEPROM, pero como el programa no puede funcionar sin esos valores, si los valores no entran dentro del rango de lo esperado, entonces se borran los anteriores y se almacenan los valores por defecto.

Estos valores tambien se pueden modificar manteniendo un pulsador antes de alimentar el circuito, y antes del loop principal, si se lee que el pulsador esta presionado, entonces entra en modo configuracion y se pueden almacenar nuevos valores en la EEPROM.

Cada tanto me encuentro que el programa tiene los valores por defecto y si bien todo funciona, hay que configurarlo nuevamente para adaptarlo a la aplicacion concreta, ya que los valores por defecto no son operativos.

Mis sospechas:
-Estos circuitos estan pensados para usar a pilas o baterias recargables, por lo que si estas estan muy descargadas podrian llevar al micro a una situacion de no tener alimentacion suficiente para funcionar correctamente, por lo que en algun funcionamiento erratico podria saltar el programa a la posicion de poner los valores por defecto de la EEPROM.
-Muchos circuitos usan servomotores, que pueden producir picos de voltaje y podria ocurrir lo mismo que en el caso anterior.

Soluciones:
-Hago una triple comprobacion antes de borrar la memoria, para estar seguro de que es algo que se esta haciendo deliberadamente.
-El primer valor de la EEPROM lo uso como "proteccion contra escrituras". Si el valor no es uno determinado, entonces la rutina que borra/escribe la eeprom no puede continuar. El valor este lo modifico desde otra posicion del programa ya que si lo hago en la misma rutina, y el programa salta entoces es como si no hubiera hecho nada
.

-Configurar el Brownout Reset para que el micro no funcione por debajo de cierto voltaje.

Ha funcionado?
Pues en parte... Ya no ocurre tan a menudo, pero sigue ocurriendo  :(
Si el problema es que el programa salta, da igual cuantas comprobaciones ponga... ya que si salta justo al pundo de borrar la EEPROM no se me ocurre que poder hacer.
Por otro lado, me parece raro, pero no se me ocurren ni mas motivos ni mas soluciones.

A algien le ha pasado algo asi? Alguna solucion?

Lamento no poder poner el codigo, ya que son diferentes proyectos, y ademas con codigos largos. Si hace falta puedo poner algun fragmento de codigo que pueda ser relevante.

Un saludo!

se me ocurre lo siguiente:
tu tienes los valores iniciales, que como dices se graban por defecto si ocurre un problema... y si en vez de eso haces asi:

1 -- valores iniciales, que solo se toman en cuenta la primera vez y tambien solo si activas un "reset oculto" ( que solo tu puedas activar.
2 --- valores ultimos de respaldo que seran estos a donde recurre el micro si hay un problema.
3 --- valores en uso , estos son lso valores que el usuario o tu programa .

funciona asi:

tu pulsas el boton y entras en modo programacion, como haces tu : al mantener pulsado  cuando arranca, todo bien, cambias valores, o el mismo micro se ocupa de leer y cambiar, como haces siempre, y esos  valores se graban en las direcciones (3) .
PERO A LA VEZ, AL SALIR TAMBIEN SE GRABAN EN OTRAS DIRECCIONES DE RESPALDO (  2) .

el programa trabaja siempre mirando y usando las direcciones ( y sus contenidos)  de (3 ) y si hay un problema, por defecto cargara todo lo de la direccion 2 , que basicamente es el respaldo o sea los valores ultimos...


la otra que puedes hacer es verificar si realmente se te esta borrando la EE, haciendo un programita, imagino que esta la placa ya hecha, y esa placa esta en la calle, donde usuarios, asi que es dificil modificar, seria un problema ese.......
si de verdad se te borra la EE ahi no sirve de nada lo que te dije, el tema es verificar si realmetne se te borra la EE  o si algun salame esta jugando con el boton....

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re:Se me borra la EEPROM interna!
« Respuesta #13 en: 24 de Mayo de 2021, 06:00:51 »
Gracias por tu respuesta! Ya hace tiempo de este post, y nunca consegui solucionarlo completamente. Cada tanto me llama un cliente diciendo que la placa se le ha desconfigurado sin el haber hecho nada.
No he podido averiguar cual es el problema, ya que a mi no me ha ocurrido nunca en todas las pruebas que he hecho, pero a lo largo de estos años he ido aplicando pequeñas correcciones al codigo que han disminuido los problemas.
Una de esas mejoras ha sido como has dicho, tener un respaldo de los ultimos valores guardados.
A estas alturas he asumido el fallo y me resulta mas rentable explicar a un cliente como reconfigurar el circuito que seguir investigando el tema. Sobre todo cuando el problema no se presenta muy a menudo...
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re:Se me borra la EEPROM interna!
« Respuesta #14 en: 25 de Mayo de 2021, 01:35:25 »
Que mal, pense que tal ves habias podido solucionarlo, no se que igual era un bug del compilador CCS, a mi me ocurre de ves en cuando, pero es algo molesto para el cliente tener que estar recargando el valor.

Intentare lo del valor de respaldo, tal ves con ello logre disminuir la incidencia.

Te agradezco mucho por tus sugerencias y experiencia

Saludos.
Nunca se deja de aprender