Tak, możesz ręcznie zapisać domyślne dane do EEPROM w kodzie źródłowym. Najpierw zapoznaj się z tym niesamowitym przewodnikiem po pamięci EEPROM z AVR: samouczek AVR EEPROM Deana. Powinienem również dodać, że lepszym pomysłem jest utworzenie pliku .eep zawierającego dane EEPROM przy użyciu makefile, który zostanie zaprogramowany na urządzeniu wraz z kodem źródłowym. Jeśli jednak nie znasz różnych operacji na plikach makefile i linkerach, nadal możesz to zrobić z poziomu pliku kodu źródłowego - stanie się to tak szybko, jak tylko obwód zostanie włączony, blokując początkowe działanie programu.
Na początku programu (przed jakąkolwiek pętlą główną) możesz zrobić coś takiego:
#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);
Funkcja „update” najpierw sprawdza, czy ta wartość już tam jest, aby zaoszczędzić na niepotrzebnych zapisach, zachowując żywotność pamięci EEPROM. Jednak zrobienie tego dla bardzo wielu lokalizacji może zająć sporo czasu. Lepiej sprawdzić jedną lokalizację. Jeśli jest to pożądana wartość, resztę aktualizacji można całkowicie pominąć. Na przykład:
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);
}
Jeśli chcesz zaktualizować duże ilości danych, spróbuj użyć innych funkcji, takich jak eeprom_update_block(...)
. I zdecydowanie przeczytaj ten samouczek; jest dobrze napisane.
Można umieścić wszystkie instrukcje aktualizacji pamięci EEPROM w pojedynczej instrukcji warunkowej preprocesora. Jest to bardzo proste do zrobienia:
#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_
Ten fragment kodu nie zostanie nawet skompilowany, chyba że wykonasz następujące czynności:
#define _UPDATE_EEPROM_
Możesz zostawić to jako komentarz, a następnie odkomentować, jeśli chcesz zmienić domyślne wartości EEPROM. Aby uzyskać więcej informacji na temat preprocesora C, zapoznaj się z tym podręcznikiem online . Myślę, że najbardziej interesują cię sekcje dotyczące makr i instrukcji warunkowych.