This is an old revision of the document!
AVR mikrokontrollerisse on sisse ehitatud teadud osa EEPROM mälu. Kodulabori III põlvkonna kontrolleris ATXMega128A1U on EEPROM mälumaht 2KB. EEPROM-iga suhtlemiseks on soovitatav kasutada teeki, mis on AVR GCCsse juba sisse ehitatud. Teegis on ära defineeritud põhilised funktsioonid EEPROM mälupesaga suhtlemiseks:
Lihtne näitekood EEPROM-i andmete salvestamiseks. Loetakse bait aadressilt 46 ning sõna aadressilt 50:
// AVR-i EEPROM mällu baidi ja sõna salvestamise ja sealt lugemise näidisprogramm. Kirjutamiseks kasutatakse //update// funktsiooni, mis enne kirjutamist loeb EEPROM mälupesa sisu ja korrektse väärtuse olemasolul seda üle ei kirjuta. Sellega säästetakse mäluelemente hävimise eest, kuid kirjutamine võtab natuke rohkem aega. #include <avr/eeprom.h> void main(void) { uint8_t andmeBait; uint8_t andmeSona; // EEPROM-i aadressile 46 numbri 86 kirjutamine eeprom_update_byte((uint8_t*)46, 86); // EEPROM-i aadressile 50 numbri 860 kirjutamine eeprom_update_word((uint16_t*)50, 860); // EEPROM-i aadressilt 46 baidi lugemine (peaks olema 86) andmeBait= eeprom_read_byte((uint8_t*)46); // EEPROM-i aadressilt 50 sõna lugemine (peaks olema 860) andmeSona= eeprom_read_word((uint16_t*)50); }
Selleks, et liigutada korraga rohkem andmeid tuleks kasutada bloki lugemist/kirjutamist. Selleks tuleb eelnevalt defineerida andmeblokk muutujamälus:
// AVR-i EEPROM mällu andmebloki salvestamise ja sealt lugemise näidisprogramm #include <avr/eeprom.h> void main(void) { uint8_t andmeJada1[10] = "TestLause."; uint8_t andmeJada2[10]; // Esimene parameeter on pointer EEPROM mälu andmeblokile, // teine parameeter on pointer muutujamälu andmeblokile // kolmas parameeter on andmeJada pikkus eeprom_update_block((const void*)&andmeJada1, (void*)12, 10); // Esimene parameeter on pointer muutujamälu andmeblokile, // teine parameeter on pointer EEPROM-i mälu andmeblokile // kolmas parameeter on andmeJada pikkus eeprom_read_block((void*)&andmeJada2, (const void*)12, 10); }
Alati ei ole aga otstarbekas pidada meeles täpseid EEPROM-i mäluaadresse. Selleks on defineeritud selline muutuja atribuut nagu EEMEM. Selle kasutamine vabastab kasutajat aadresside haldamisest ning laseb seda teha kompilaatoril. Meeles tuleb aga pidada, et andmeid tuleb EEPROM-is liigutada siiski teegikäskudega.
// AVR-i EEPROM EEMEM kasutamise näidisprogramm #include <avr/eeprom.h> uint8_t EEMEM NonVolatileChar; uint16_t EEMEM NonVolatileInt; uint8_t EEMEM NonVolatileString[10]; int main(void) { uint8_t SRAMchar; uint16_t SRAMint; uint8_t SRAMstring[10]; SRAMchar = eeprom_read_byte(&NonVolatileChar); SRAMint = eeprom_read_word(&NonVolatileInt); eeprom_read_block((void*)&SRAMstring, (const void*)&NonVolatileString, 10); }