eeprom corrupción de datos durante un corte de energía

3

Recientemente encontré un problema con el eeprom de un PIC16F877A que se usa para controlar la velocidad de un motor de CC. Se supone que la unidad funciona en la última velocidad establecida, incluso si falla la alimentación. Pero el problema a veces (no siempre) después de la falla de alimentación, la velocidad establecida (que se lee de eeprom) no es la misma que la última velocidad establecida. Por lo general, cada vez que ocurre este problema, el valor se cambia al valor predeterminado de eeprom 255, (pero no siempre, también algunos valores aleatorios). ¿Cuáles podrían ser las posibles causas ?.

    
pregunta raforanz

1 respuesta

2

Supongamos que tiene algún tipo de regulador lineal que alimenta su PIC. Ese regulador probablemente tiene mucho espacio para la cabeza (digamos que tiene una entrada de 12V y una salida de 3.3V). El regulador funcionará bien a pesar de que la entrada sea de solo 8 V, por ejemplo.

Debe elegir este punto de corte y enviarlo a un comparador que produzca una señal lógica llamada Power Good (PG). Esta señal se apagará por mucho tiempo antes , el regulador no puede regularse y el BOD se activa.

Siempre que esté ausente el PG, no debería estar haciendo ninguna escritura EEPROM.

También debe almacenar el punto de ajuste con algún valor de verificación. Un esquema simple es usar el 1s complemento de la velocidad. Por ejemplo, para la velocidad 0x88, el complemento 1s es 0x77. En C:

typedef struct {
  uint8_t speed;
  uint8_t speed_complement;
} SetpointSlot;

Si una ranura de punto de ajuste tiene un valor de verificación no válido, simplemente lo ignora.

Debería estar almacenando incluso varios SetpointSlots, al menos dos. Si su EEPROM está paginada, las ranuras no deben cruzar páginas, y deben estar distribuidas en dos páginas (o más páginas si no caben en dos páginas). Con 2 puntos de ajuste, tendrá cada uno en su propia página, por ejemplo.

Al iniciar:

  1. Iterar las ranuras. Use el primero válido que encuentre (donde speed == ~speed_complement ).
  2. Si no se encuentran ranuras válidas, use el valor defualt.

Cuando almacenes un nuevo valor, harías lo siguiente:

  1. Recupere la ranura de consigna utilizada actualmente.
  2. Borre la siguiente ranura de punto de ajuste (a continuación, alternando páginas, alternando páginas).
  3. Escriba el nuevo punto de ajuste allí.
  4. Verificar los valores escritos. Si están equivocados, elimínelos para asegurarse de que se mantendrán equivocados, seleccione la siguiente ranura de punto de ajuste y vaya a 1.
  5. Ponga a cero (no borre) la ranura del punto de ajuste actual, pero solo si no es la misma ranura donde se almacenó el nuevo valor. Ese podría ser el caso si tuviera dos ranuras y una de ellas estuviera en un área "mala" de eeprom.
respondido por el Kuba Ober

Lea otras preguntas en las etiquetas