Cómo guardar variables dentro de la memoria de los microcontroladores

5

Estoy diseñando una aplicación que incluye GSM SIM900 con PIC18F2520 . La aplicación incluye servicios básicos de llamadas y sms. Un usuario presionará un botón y se realizará una llamada a un número definido. Este número se puede cambiar a través de sms. Por lo tanto, cada vez que se presione nuevamente el botón, se realizará la llamada al número recién definido. Actualmente estoy usando estas variables para el número:

char callNumber1[10];
char callNumber2[10];
*
*
char callNumber5[10];

El problema que estoy enfrentando es que estas variables funcionan como se esperaba. Pero cuando apago el MCU, los datos almacenados en ellos se pierden. Quiero que los datos permanezcan como están después del apagado y se puedan usar nuevamente después del encendido. Cómo guardarlos en la memoria de MCU. Por favor, proporcione cualquier enlace donde pueda leer sobre la memoria en MCU. Por favor ayuda.

    
pregunta S Andrew

2 respuestas

20

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).

    
respondido por el Ale
14

El SIM900 en realidad tiene su propia 'agenda', que puede usar para guardar los números. Ver AT+CPBW y los comandos relacionados.

Ejemplos de la documentación. Escribir en la agenda:

  

AT + CPBW =, "13918   18xxxx ", 129," Daniel "

Leer de la agenda:

  

AT + CPBF="Daniel"

devuelve

  

+ CPBF: 5, "13918186089", 129, "Daniel"

Lista de agenda:

  

AT + CPBR = 1,10

    
respondido por el pjc50

Lea otras preguntas en las etiquetas