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:
- Iterar las ranuras. Use el primero válido que encuentre (donde
speed == ~speed_complement
).
- Si no se encuentran ranuras válidas, use el valor defualt.
Cuando almacenes un nuevo valor, harías lo siguiente:
- Recupere la ranura de consigna utilizada actualmente.
- Borre la siguiente ranura de punto de ajuste (a continuación, alternando páginas, alternando páginas).
- Escriba el nuevo punto de ajuste allí.
- 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.
- 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.