Cualquier cosa 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. Puedes almacenar allí tus números de teléfono cada vez que se modifiquen, y cargarlos al arrancar en tus variables.
Para leer y escribir un byte en una dirección determinada de la EEPROM, hay que utilizar la función EECON1
, EECON2
, EEDATL
y EEADRL
registros (véase el capítulo 8 de la 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 el ahorro. Para tener en cuenta que este código no está utilizando la memoria EEPROM muy eficientemente, porque el almacenamiento de los dígitos ASCII en ella desperdicia espacio. Si te ves limitado por los 256 bytes de EEPROM, podrías 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 del PIC18F2580), es una buena práctica no escribir en la memoria no volátil a menos que sea necesario es decir, los datos han sido realmente modificados y tienen que ser almacenados.
Si los datos deben escribirse periódicamente en una EEPROM o una memoria Flash, un algoritmo de nivelación del desgaste podría ser útil para distribuir uniformemente el desgaste de las células 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 la EEPROM (por ejemplo, la memoria Flash del PIC18F2580 tiene "sólo" 100k ciclos de escritura de resistencia).
9 votos
The problem I am facing is these variables works as expected.
Ese no es tu problema.0 votos
Steve, ¿cuál es el objetivo de tu comentario?