Memoria EEPROM de un PIC

Hola a todos.

Tengo una duda con respecto a la memoria EEPROM de los PIC. Hice un contador de objetos y guardo el ultimo valor que ha registrado el contador en la memoria EEPROM.

El problema es que por cada conteo hago una escritura en la memoria y en cada encendido una lectura de la misma. Según la Datasheet la memoria admite un millón de ciclos de lectura y escritura ... el contador cuenta hasta 9999. ¿Quiere decir que si llega a esa cifra ya habré gastado 9999 ciclos del millón disponible?.

Gracias.
 
Para guardar el 9999 se necesitan dos bytes, y si escribes y lees esos dos bytes en cada conteo, sí.
O sea que, puedes escribir y leer cada locación de la memoria 10,000,000 de veces, no 1,000,000
EEPROM.jpg
 
Suelen tener una interrupción cuando baja la tensión de alimentación, de forma que solo lo guardes cuando hace falta y el resto del tiempo no.

No sabia eso y es precisamente el mejor método ... guardar en la memoria solo cuando sea necesario. Investigare sobre el asunto. Muchas gracias.

Para guardar el 9999 se necesitan dos bytes, y si escribes y lees esos dos bytes en cada conteo, sí.
O sea que, puedes escribir y leer cada locación de la memoria 10,000,000 de veces, no 1,000,000
Ver el archivo adjunto 185562
Me refiero al PIC 16F628A.

P2.png
 
No sabia eso y es precisamente el mejor método ... guardar en la memoria solo cuando sea necesario. Investigare sobre el asunto. Muchas gracias.
... y si usas un DS1307, tienen 56bytes de una vram, sostenida con la pila del reloj, esa la podes escribir todas las veces sin pensar en el desgaste... imagino que existren otros chip de memoria con alimentación externa para recordar, despues de quitar la energia principal.
 
... y si usas un DS1307, tienen 56bytes de una vram, sostenida con la pila del reloj, esa la podes escribir todas las veces sin pensar en el desgaste... imagino que existren otros chip de memoria con alimentación externa para recordar, despues de quitar la energia principal.
Si, pero aumentaría el hardware y no quiero agregar mas circuitos.
 
Hola miembro,
Necesito un poco de ayuda de usted aquí.
Tuve un problema cuando escribí eeprom, el compilador me dio un error cuando compilé.
¿Podría usted y alguien aquí ayudarme, lo que está mal.

Código:
write eeprom @0, $232,$3,$0,$20,$20,$20,$54,$45,$53,$49,$53,$20,$46,$49,$4D,$45,$20,$20,$20

Gracias,
Lahmun
 
el compilador me dio un error cuando compilé.
¿Qué error muestra el compilador?
¿Qué compilador?

Eso parece Basic...
En MicroCode Studio: WRITE Address, Value/s

En Proton: Ewrite Address, [Variable {, Variable… etc. }]

write eeprom @0, $232,$3,$0,$20,$20,$20,$54,$45,$53,$49,$53,$20,$46,$49,$4D,$45,$20,$20,$20
Esos datos entre otras cosas, dice: TESIS FIME
 
hola D@rkbytes,
Muchas gracias por la respuesta. Consulte su referencia electrónica, que funciona bien, para que pueda compilar ese código. Pero todavía tengo otro problema, este problema parece solo un mensaje, pero podría ser usted o alguien aquí que pueda ayudar a resolverlo o decirme cuál es la solución.

Mi problema es el Mensaje (306), cruzando el límite de la página, recibí 3 líneas de mensaje sobre esto.
Capture.JPG
Busqué en otro foro, me sugirieron que agregue esta línea ( @ ERRORLEVEL -306 ), una vez que agregué esta línea adentro, solo tengo 2 líneas de mensajes, lo que significa que todavía tengo 2 líneas de mensajes restantes para borrar y estar bien compilados.

Usé un procesador es (PIC16F876A)

Gracias,
Lahmun
 
Eso no es un error, es solo un mensaje de advertencia ya controlado por el IDE y la compilación no se verá afectada.
Los elimines o no con "errorlevel X" el hex generado será el mismo.
Lo único que pasará es que no se mostrarán en el log de compilación.
Preocúpate cuando sean errores, ahí ya no se podrá compilar.
 
Eso no es un error, es solo un mensaje de advertencia ya controlado por el IDE y la compilación no se verá afectada.
Los elimines o no con "errorlevel X" el hex generado será el mismo.
Lo único que pasará es que no se mostrarán en el log de compilación.
Preocúpate cuando sean errores, ahí ya no se podrá compilar.
Hola D@rkbytes,
Muchas gracias y dame confianza con mi compilado y mi compilador que usé.

Gracias,
Lahmun
 
Hay que revisar las hojas de datos del PIC a utilizar para saber si habrá o no problemas muy comunes si se usan tablas gigantes.

En el caso de usar C++ el compilador se encarga de todo el "trabajo sucio". Cuando de usa ASM hay que prestar atencion a los saltos de pagina porque ahí empiezan los errores. Errores que vienen al usar llamadas (CALL) porque no cabe toda la dirección mas la codificación de la instrucción en el ancho que usa el PIC para codificarlos (para la linea PIC12 y PIC16 es de 14bits).

Cuando se usa esas instrucciones (CALL por ejemplo, creo que GOTO no tiene problemas pero hay que revisar porque puedo estar errandole) no carga toda la dirección sino una parte por lo que no pueden acceder directamente a toda la memoria sino que queda reducido a una pagina (porcion de memoria de programa). Si los saltos son en la pagina 0 no habrá problemas, pero si los saltos son a otra pagina y no se ajusta el registro para que marque la pagina correspondiente el programa saltara a un lugar no deseado generando problemas ("cuelgues" de programa por ejemplo).

De ahí que el compilador te diga que, si bien no es un error, chequees todo porque puedes haber un problema si no lo has tenido en cuenta.

De echo acabo de buscar y en el foro hay un hilo sobre tu problema con ejemplos. Te aconsejo que lo leas.
 
Un pequeño aporte. Como mencione al comienzo de este tema, necesitaba guardar en memoria eeprom el conteo de un contador de objetos de 4 dígitos, pero solo al apagarse para no gastar la memoria guardando en cada conteo. Probé varias posibles soluciones pero ninguna funciono, hasta que se me ocurrió leer el cambio de estado de un puerto que inicialmente esta en alto y al apagarse este debería cambiar a estado bajo mientras se desenergiza la fuente.

Lo hice y no funciono. Pensé que el cambio era demasiado rápido y que debía ralentizar esa acción para que el micro en su ultimo suspiro lograse leer ese cambio y así guardar en memoria el ultimo conteo. Así que utilice un capacitor de 470uf y ¡aleluya ahora si funciono!.

Como ya tenia las tarjetas hechas no podía hacer un cambio significativo y entonces se me ocurrió eliminar el reset que no es tan necesario y solo tenia que quitar un pulsador, y en su lugar poner el capacitor.

Así es el circuito original del reset:
Memoria.png










Y al modificarlo quedo así:

Memoria modificado.png

Ya en el programa elimine el MCLR y deje ese puerto libre para ser usado
como entrada, luego leo el cambio de estado y guardo en la eeprom.

Seguro hay mejores métodos y mas elegantes que este, pero a mi si me sirvió y espero que a alguien mas le
pueda servir también.

Gracias.
 
Un pequeño aporte. Como mencioné al comienzo de este tema, necesitaba guardar en memoria EEPROM el conteo de un contador de objetos de 4 dígitos, pero solo al apagarse para no gastar la memoria guardando en cada conteo.
Probé varias posibles soluciones pero ninguna funcionó, hasta que se me ocurrió leer el cambio de estado de un puerto que inicialmente está en alto y al apagarse este debería cambiar a estado bajo mientras se desenergiza la fuente.
Eso de guardar datos en la EEPROM cuando se detecte un corte o al apagar el circuito, no lo comentaste cuando iniciaste la consulta, si lo hubieras hecho, se te habría colaborado mejor y en base a eso.
Me refiero al PIC16F628A.
El PIC16F628A cuenta con comparadores análogos que puedes usar para detectar una caída de tensión antes de que el sistema Brown-out Detection actúe y se produzca un reset.
El BOR (Brown-out Reset) se puede configurar a varios voltajes.
Si lees la hoja de datos te podrás enterar de varias cosas.
 
Para detectar la caída de tensión se puede realizar a través de una toma de la salida del secundario del trasformador de alimentación (rectificada y filtrada minimamente ó si se toma de la alimentación general la deberás tomar de la tensión de alimentación antes del regulador de tensión, este sistema ofrece mas tiempo de proceso antes que se agote la Vcc ya que se detecta mas rápidamente, (estarás sensado sobre por ejemplo una Vcc de 12V a una bajada de por ejemplo a 8VCC, como punto de detección). Una vez detectado el corte de tensión se ejecuta una interrupción de salvaguarda de datos en la cual lo primero que hay que hacer es desconectar todos los consumos por displays, motores, leds, etc, esto nos permitirá mantener la VCC durante más tiempo, dándonos ese tiempo precioso para ahora si, guardar en E2PROM tus valores. Una vez acabado el proceso de salvaguarda de datos, lo conveniente es activar de nuevo displays, leds, etc para agotar la VCC rápidamente y entre el Brown-out Reset lo antes posible.
 
Eso de guardar datos en la EEPROM cuando se detecte un corte o al apagar el circuito, no lo comentaste cuando iniciaste la consulta, si lo hubieras hecho, se te habría colaborado mejor y en base a eso.
No, lo que buscaba era una solución para no gastar la memoria EEPROM prematuramente. Lo de guardar en memoria al detectar un corte fue algo incidental.
El PIC16F628A cuenta con comparadores análogos que puedes usar para detectar una caída de tensión antes de que el sistema Brown-out Detection actúe y se produzca un reset.
No se usar los comparadores aun. No soy ingeniero; aprendo por mi cuenta.
El BOR (Brown-out Reset) se puede configurar a varios voltajes.
Trate de usarlo pero no me funciono, debido a mi inexperiencia.
Si lees la hoja de datos te podrás enterar de varias cosas.
Siempre lo hago, pero leer no implica entender (no me refiero al inglés).
Para detectar la caída de tensión se puede realizar a través de una toma de la salida del secundario del trasformador de alimentación (rectificada y filtrada minimamente ó si se toma de la alimentación general la deberás tomar de la tensión de alimentación antes del regulador de tensión, este sistema ofrece mas tiempo de proceso antes que se agote la Vcc ya que se detecta mas rápidamente, (estarás sensado sobre por ejemplo una Vcc de 12V a una bajada de por ejemplo a 8VCC, como punto de detección). Una vez detectado el corte de tensión se ejecuta una interrupción de salvaguarda de datos en la cual lo primero que hay que hacer es desconectar todos los consumos por displays, motores, leds, etc, esto nos permitirá mantener la VCC durante más tiempo, dándonos ese tiempo precioso para ahora si, guardar en E2PROM tus valores. Una vez acabado el proceso de salvaguarda de datos, lo conveniente es activar de nuevo displays, leds, etc para agotar la VCC rápidamente y entre el Brown-out Reset lo antes posible.
Seguro que funciona, pero es algo mucho mas complicado. En mi caso lo resolví cambiando un pulsador por un capacitor y modificando una línea de código. Dadas las circunstancias, fue una buena solución para mi.
 
Atrás
Arriba