se resetea la eeprom del pic

Que tal gente del foro, tengo un problema con los datos de la eeprom interna del pic18f2550 y es que se me borran de un momento a otro cuando enciendo mi circuito.
Les cuento cuando programo mi pic inicio guardando un valor en eeprom
Código:
 #INT_EXT1
   void ext1_isr()
   {
   disable_interrupts(INT_EXT);
   distancia=conteo;
   write_int32_eeprom(0,distancia); 
   clear_interrupt(INT_EXT1);
   clear_interrupt(INT_EXT);   
   enable_interrupts(INT_EXT);
   }

   conteo=2500000;
Uso esa interrupción ya que mi PIC guarda en la eeprom solo cuando es apagado el sistema de lo contrario si guardara a cada rato, acabo con la cantidad de programacion bueno en fin... para eso utilizo un circuito básico que dure un tiempo para que guarde antes de apagar, y funciona ya que lo he probado, en en el otro gráfico esta el pic, el transistor básicamente es el que detecta el corte de energía, bueno ahora si les cuento mi circuito es un odometro y debe conservar los datos de kilometraje, es decir apago el auto después de un recorrido al encender los datos están, pero aveces no, aveces lo enciendo y el recorrido en pantalla aparece en ceros, como si se reseteara la eeprom, y no debería ser así por que debería volver al valor que contiene conteo si se reseteara, Disminuí de 10k a 2k la resistencia del MCLR ya por ahí leí que se hace para que no se reseteara el pic, pero no funciono.:confused:

El programa utiliza la int_ext, para contar los pulsos del sensor que trae el auto, int_ext_1, para guardar en eeprom cuando se apaga el sistema, un lcd para mostrar los datos. Voltaje de alimentacion 12VDC, coloque buenos filtros en mi fuente puesto que se trata de un auto que contiene una alternador y todo eso, tambien coloque en la fuente la fuente un diodo supresor de picos el p6kexx.
Gracias

la eeprom se lee cuando inicia el sistema:

Código:
if (read_int32_eeprom(0)<12345678900)
   {
   conteo=(read_int32_eeprom(0));
   metros=conteo*0.1; // formula nada mas
   lcd_gotoxy(1,2);   //segunda linea lcd 2 x 16 muestra el recorrido
   printf(lcd_putc,"Kms : %03.1f ",metros);
   Lcd_putc( "\b");
   }
 

Adjuntos

  • tao.jpg
    tao.jpg
    17.9 KB · Visitas: 16
  • general.jpg
    general.jpg
    48.9 KB · Visitas: 16
la resistencia al MCLR no es el problema.

yo creo que el problema esta en que para que se graben los la datos en la eeprom se requieren de 10mS creo o algo asi checalo, entonces pienso que se queda el pic sin alimentacion antes de que se grabe..


intenta poner un capacitor de unos 2200uF en la alimentacion.
 
coloque el condensador de 2200/50, después de hacer varias pruebas, continua igual " se resetea la eeprom interna del pic", pero lo que si note es que con valores grandes que seria lo ideal en tiempo, ocurre otro problema y es que los carros en las mañanas cuando estan frios, normalmente para un encendido ocurren de 2 a 3 start, y es en ese momento por ejemplo se le da start al carro pero no prende pero el condensador si alcanza a cargarse, y cuando ocurre el segundo start el circuito no ha terminado de descargarse y es ahí cuando noto que la eeprom también se resetea, actualmente tengo un c 470/50, con el ocurre menos el reset de la eeprom, pero es imprevisible.
 
Donde lo pusiste? podrias poner el esquema completo.

yo digo que lo pongas donde esta c9 de tu diagrama y quita r7 (de 10k) que no le veo mucho sentido.

como dato te puedo decir que la eeprom no se resetea simplemente se graba bien o no se graba.
 
Hola lo puse donde realizo el tao, diodo y condensador, el primer filtro lo tengo de 220/50, lle llame resetear por que el valor no deberia ir a cero, si hay una variable que guarda en la eeprom y que tiene un valor por defecto, entonces por lo que te entiendo, es q si no guarda bien lo que hay en la eeprom lo puede mandar a ceros..
papirrin adjunto el diagram completo de mi fuente.. gracias
 

Adjuntos

  • fuente.jpg
    fuente.jpg
    60.3 KB · Visitas: 33
no se si tenga algo que ver pero ese zener me parece sospechoso, segun yo deberia llevar una resistencia antes :unsure:


por otro lado si pones el capacitor de 2200uF donde esta el C9 y mides con tu multimetro cuanto tiempo tarda en caer el voltaje a 3V o menos al desconectarlo.



una pregunta ¿el LCD donde se alimenta? si es del mismo lado que el pic, alimentalo antes del D2
 
Última edición:
Ese diodo es un supresor de picos, el cual leí en un enlace que se utiliza para prevenir cosas indeseadas de los alternadores y demás cosas del automóvil en circuitos que contengan microcontroladores pic,:confused:,, voy a revisar el enlace si lleva una resistencia.

Apenas llegue a casa reviso con el multimetro y un cronometro cuanto tiempo se demora en descargase.

Si efectivamente el lcd esta alimentado antes de D2, de lo contrario se descargaría muy rápido C9.:cool:

Había pensado en utilizar una eeprom externa para guardar los datos, y alimentarla con una pila de 3v como por ejemplo esas cr2025, lo que si he visto por ahí es que toma mas tiempo guardar en eeprom por I2C, entonces no se si me pase lo mismo.
 
Ese diodo es un supresor de picos, el cual leí en un enlace que se utiliza para prevenir cosas indeseadas de los alternadores y demás cosas del automóvil en circuitos que contengan microcontroladores pic,,, voy a revisar el enlace si lleva una resistencia.

pues tiene toda la pinta de ser como un zener de varios amperios, y de no tener algo que limite la corriente pareceria que entra en corto, ¿no se calienta? o peor aun ¿todavia funciona?

mira lo que dice el datasheet:
Some input impedance represented by Zin is essential to
prevent overstress of the protection device. This impedance
should be as high as possible, without restricting the circuit
operation.

Alguna impedancia de entrada representado por Zin es esencial para
evitar la sobretensión del dispositivo de protección. Esta impedancia
debe ser tan alta como sea posible, sin restringir el circuito
operación.

Había pensado en utilizar una eeprom externa para guardar los datos, y alimentarla con una pila de 3v como por ejemplo esas cr2025, lo que si he visto por ahí es que toma mas tiempo guardar en eeprom por I2C, entonces no se si me pase lo mismo.

mejor ponle la pila al PIC, haciendo una especie de UPS. porque yo pienso que seria lo mismo o peor.


y en todo caso porque no dejas trabajando solo el PIC, el consumo es despreciable.
 
Última edición:
Haz esto, deja el PIC con alimentación y simula el corte de energía para generar la interrupción y grabar la EEPROM, una vez hecho esto observa con ayuda de tu programador si los datos de la EEPROM se han alterado.

Así podremos descartar una falla en el software. ¿Tienes alguna rutina que inicialice el espacio de memoria destinado para la EEPROM?, en caso de que si, revísala, puede ocurrir que cada que se encienda el circuito se ejecute la rutina y ponga a 0's los bytes reservados en la EEPROM.

Saludos
 
papirrin
pues tiene toda la pinta de ser como un zener de varios amperios, y de no tener algo que limite la corriente pareceria que entra en corto, ¿no se calienta? o peor aun ¿todavia funciona?

ya encontré el enlace, adjunto imagen el diodo se coloca en paralelo al circuito a proteger.

dejar trabajando el pic con la pila?, en eso pensé alguna sugerencia para que solo trabaje cuando el circuito se queda sin la alimentación de la batería del auto, había pensado en un minirele que realice el cambio de batería-auto a pila , claro esta con un capacitor para que el cambio no se note.

Daniel Meza,
Haz esto, deja el PIC con alimentación y simula el corte de energía para generar la interrupción y grabar la EEPROM, una vez hecho esto observa con ayuda de tu programador si los datos de la EEPROM se han alterado.

Daniel, lo realice y los datos no se alteran, varias pruebas y se graban bn.

Así podremos descartar una falla en el software. ¿Tienes alguna rutina que inicialice el espacio de memoria destinado para la EEPROM?, en caso de que si, revísala, puede ocurrir que cada que se encienda el circuito se ejecute la rutina y ponga a 0's los bytes reservados en la EEPROM

la rutina que tengo para inicializar la eeprom es esta;

Código:
if (read_int32_eeprom(0)<12345678900)
   {
   conteo=(read_int32_eeprom(0));
   metros=conteo*0.1; // formula nada mas
   lcd_gotoxy(1,2);   //segunda linea lcd 2 x 16 muestra el recorrido
   printf(lcd_putc,"Kms : %03.1f ",metros);
   Lcd_putc( "\b");
   }
y efectivamente cuando enciendo el circuito, lo primero que aparece en el lcd, es el kilometraje que se guardo, pero a veces no,, como les digo a veces lo enciendo y me aparecen el kilometraje en ceros. :confused: , adjunto imagen de lo que contiene mi lcd. en la primera fila el velocímetro el cual funciona sin problemas, segunda fila kilometraje, después del punto decimal incrementa cada 100 metros
 

Adjuntos

  • circuitotvs.jpg
    circuitotvs.jpg
    23.3 KB · Visitas: 14
  • prueba.jpg
    prueba.jpg
    35.4 KB · Visitas: 13
Creo ya saber donde radica el problema, según intuyo el nivel bajo necesario para disparar la interrupción no se genera al cortarse la energía, vamos, no es lo mismo 0 lógico que circuito abierto.
Ponte un resistor de unos 4K7 entre RB0 y GND y haz otra prueba pero esta vez si cortando el suministro completo del circuito
 
Atrás
Arriba