Todo lo que declare como variable en su código estará en la RAM del PIC y, por lo tanto, desaparecerá cuando lo apague. Sin embargo, el PIC18F2580 tiene 256 bytes de memoria EEPROM, que no es volátil. Puede almacenar sus números de teléfono allí cada vez que se modifiquen y cargarlos al inicio según sus variables.
Para leer y escribir un byte en una dirección dada de la EEPROM, debe usar los registros EECON1
, EECON2
, EEDATL
y EEADRL
(consulte el capítulo 8 de hoja de datos ), por ejemplo:
uint8_t read_eeprom(uint8_t addr)
{
EECON1 = 0;
EEADRL = addr;
EECON1bits.RD = 1;
return EEDATL;
}
void write_eeprom(uint8_t addr, uint8_t value)
{
EECON1 = 0;
EEADRL = addr; // address to write to
EEDATL = value; // value to write
EECON1bits.WREN = 1; // enable write
EECON2 = 0x55; // write unlock sequence
EECON2 = 0xAA;
EECON1bits.WR = 1; // do the actual write
EECON1bits.WREN = 0; // disable writing
while (EECON1bits.WR != 0); // wait for the writing to complete
EEIF = 0; // clear EEPROM interrupt flag
}
Y luego puedes cargar tus números con algo como esto:
void load_number(const uint8_t start_addr, char* n, const int len)
{
for (uint8_t i = 0; i < n; i++) {
n[i] = read_eeprom(start_addr + i);
}
}
load_number(0, callNumber1, 10);
load_number(10, callNumber2, 10);
// etc.
Y la misma idea para guardar. Tenga en cuenta que este código no utiliza la memoria EEPROM de manera muy eficiente, ya que almacenar los dígitos ASCII en ella desperdicia espacio. Si se ve restringido por los 256 bytes de EEPROM, puede, por ejemplo, almacenar los números en formato BCD, teniendo así dos dígitos por byte.
A diferencia de la RAM, las memorias no volátiles como EEPROM y Flash tienen un número limitado de ciclos de escritura. Aunque este número es generalmente muy alto (1 millón de ciclos para la EEPROM PIC18F2580), es una buena práctica no escribir en la memoria no volátil a menos que sea necesario , es decir, los datos realmente se han modificado y deben ser almacenado.
Si los datos deben escribirse periódicamente en una memoria EEPROM o Flash, un algoritmo de nivelación de desgaste podría ser útil para Distribuir uniformemente el desgaste en las celdas de memoria. Esto podría ser aún más importante con la memoria no volátil basada en Flash, que a menudo tiene menos ciclos de escritura que EEPROM (por ejemplo, la memoria Flash del PIC18F2580 tiene "solo" 100 000 ciclos de escritura de duración).