Sì, è possibile scrivere manualmente i dati predefiniti nella EEPROM nel codice sorgente. Per prima cosa, dai un'occhiata a questa fantastica guida sull'EEPROM con AVR: Dean's AVR EEPROM Tutorial. Inoltre, dovrei aggiungere che è una buona idea creare un file .eep contenente i dati EEPROM usando il makefile che sarà programmato sul dispositivo insieme al codice sorgente. Tuttavia, se non si ha familiarità con varie operazioni di makefile e linker, può ancora essere fatto all'interno del file del codice sorgente - accadrà non appena il circuito viene alimentato, interrompendo l'operazione iniziale del programma.
All'inizio del programma (prima di qualsiasi tipo di ciclo principale) potresti fare qualcosa del genere:
#include <avr/eeprom.h>
#define ADDRESS_1 46 // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_2 52 // This could be anything from 0 to the highest EEPROM address
#define ADDRESS_3 68 // This could be anything from 0 to the highest EEPROM address
uint8_t dataByte1 = 0x7F; // Data for address 1
uint8_t dataByte2 = 0x33; // Data for address 2
uint8_t dataByte3 = 0xCE; // Data for address 3
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
La funzione "aggiorna" controlla innanzitutto se quel valore è già presente, per risparmiare su scritture non necessarie, preservando la durata della EEPROM. Tuttavia, farlo per moltissime località può richiedere parecchio tempo. Potrebbe essere meglio controllare una singola posizione. Se è il valore desiderato, è possibile saltare completamente il resto degli aggiornamenti. Per esempio:
if(eeprom_read_byte((uint8_t*)SOME_LOCATION) != DESIRED_VALUE){
eeprom_write_byte((uint8_t*)SOME_LOCATION, DESIRED_VALUE);
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
eeprom_update_byte((uint8_t*)ADDRESS_2, dataByte2);
eeprom_update_byte((uint8_t*)ADDRESS_3, dataByte3);
}
Se stai cercando di aggiornare grandi quantità di dati, prova ad usare altre funzioni come eeprom_update_block(...)
. E sicuramente leggi quel tutorial; è ben scritto.
È possibile inserire tutte le istruzioni di aggiornamento EEPROM in una singola istruzione condizionale del preprocessore. Questo è molto semplice da fare:
#if defined _UPDATE_EEPROM_
#define ADDRESS_1 46 // This could be anything from 0 to the highest EEPROM address
uint8_t dataByte = 0x7F; // Data for address 1
eeprom_update_byte((uint8_t*)ADDRESS_1, dataByte1);
#endif // _UPDATE_EEPROM_
Questo bit di codice non verrà nemmeno compilato a meno che non si esegua la seguente operazione:
#define _UPDATE_EEPROM_
È possibile lasciarlo lì come commento, quindi rimuovere il commento se è necessario modificare i valori EEPROM predefiniti. Per ulteriori informazioni sul preprocessore C, consultare questo manuale online . Penso che potresti essere più interessato alle sezioni sulle macro e alle dichiarazioni condizionali.