Evet, kaynak verileri EEPROM'a varsayılan verileri elle yazabilirsiniz. İlk olarak, AVR ile Dean'in AVR EEPROM Öğreticisi ile bu harika rehbere göz atın. Ayrıca, kaynak kodu ile birlikte cihaza programlanacak makefile kullanarak EEPROM verilerini içeren bir .eep dosyası oluşturmak için daha iyi bir fikir olduğunu eklemeliyim. Bununla birlikte, çeşitli makefile ve linker işlemlerine aşina değilseniz, yine de kaynak kodu dosyanızdan yapılabilir - sadece devreye güç verilir verilmez, ilk program işlemini durdurur.
Programın başında (herhangi bir ana döngüden önce) böyle bir şey yapabilirsiniz:
#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);
"Güncelle" fonksiyonu önce bu değerin zaten mevcut olup olmadığını kontrol eder, gereksiz yazmalardan tasarruf etmek için EEPROM ömrünü korur. Ancak, bunu çok fazla yer için yapmak biraz zaman alabilir. Tek bir konumu kontrol etmek daha iyi olabilir. İstenen değer ise, güncellemelerin geri kalanı tamamen atlanabilir. Örneğin:
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);
}
Büyük miktarda veriyi güncellemek istiyorsanız, gibi diğer işlevleri kullanmayı deneyin eeprom_update_block(...)
. Ve kesinlikle bu eğitimi okuyun; iyi yazılmış.
Tüm EEPROM güncelleme ifadelerini tek bir önişlemci koşullu ifadesine koyabilirsiniz. Bunu yapmak çok basit:
#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_
Aşağıdakileri yapmadığınız sürece bu kod biti derlenmeyecektir:
#define _UPDATE_EEPROM_
Bunu orada bir yorum olarak bırakabilir, ardından varsayılan EEPROM değerlerini değiştirmeniz gerekirse bu seçeneği kaldırabilirsiniz. C önişlemcisi hakkında daha fazla bilgi için bu çevrimiçi kılavuza bakın . Bence en çok makrolar ve koşullu ifadeler ile ilgilenebilirsiniz.