EEPROM – ing. Electrically Erasable Programmable Read-Only Memory (i`prom desəniz şad olaram) yəni Elektriklə silinə və proqramlana bilən daimi yaddaş qurğusu. Çox pratik olduğundan bir çox mikrokontrollerdə daxili yerləşir, amma istəsəniz aşağı şəkildəki kimi xarici olaraq da belə qurğuları öz proyektinizdə istifadə edə bilərsiniz (amma biz bu yazıda ancaq daxili olanından istifadə edəcəyik).
Nümunə olaraq ev telefonlarında adları və nömləri də yaddaşa yazmaq üçün də bu qurğudan istifadə olunur. Bu yaddaşdan istifadə prinsipi çox asandır:
Yaddaşda hər baytın öz adresi var. Bu adresdən istifadə edərək oradakı məlumatı oxuya və ya başqa veriləni yaza bilərik. Deyək ki, 1 Kb (1024 bayt) EEPROM yaddaş var, deməli, 1024 adresimiz var, hər adres isə 1bayt həcmində yaddaşa malikdir
EEPROM-dan əlavə şəkildə gördüyünüz EPROM-qurğusu da var. Bunun EEPROM dan tək fərqi bir dənə E hərfinin olmamasından başqa proqram ilə verilənlər yazılsa da onların sonradan elektrik ilə yox, ultrabənövşəyi şüa ilə silinəbilməsidir.
Daha çox məlumat vermək olar amma keçək əsas mətləbə – yəni Arduiondakı daxili EEPROM-dan istifadəyə.
Buna da aydınlıq gətirmək lazımdır ki, bu yaddaş qurğusunun arduinoda yazdığımız skeçlərin yükləndiyi flaş (flash) və ya SRAM-la (bildiyimiz RAM-ın işini görən) bir əlaqəsi yoxdur və ayrıca bir periferik qurğudur.
Arduino modelindən asılı olaraq EEPROM-u tutumu dəyişir:
Mikrokontroller | EEPROM |
ATmega328 (Arduino Uno, Nano, Mini) | 1024 bayt |
ATmega168 (Arduino Nano) | 512 bayt |
ATmega2560 (Arduino Mega) | 4096 bayt |
Bu yaddaşdan istifadə etmək üçün #include <EEPROM.h> başlığından (kitabxanasından) istifadə olunmalıdır. Kitabxana əlavə etməyə ehtiyac yoxdur, çünki bu kitabxana hazır yüklənib. İndi isə bu kitabxananın daxili funksiyalarına baxaq:
write(adres,qiymət) – byte tipindəki hər hansı bir dəyişəni yazmaq üçündür qiymət-yaddaşa yazacağımız dəyişən,əgər ədəd yazacaqsınızsa bu 0-255 arası olmalıdır. Çünki 255dən yuxarı ədədlər 1 baytdan (8bit) çox yer tutur. Char tipində yalnız bir istənilən hərf yazıla bilər. Adres-yaddaşdan asılı olaraq (misal üçün ATmega328 Arduino Uno, Nano, Mini-də 0-1024 arası ) bir dəyişəndir.
put(adres,qiymət)– write ilə oxşasa da ondan tək fərqi byte-dan başqa da tipdə qiymət yazmaq mümkündür. Qiymət-yaddaşa yazacağımız dəyişən, əgər ədəd yazacaqsınızsa və bu ədəd 255dən böyükdürsə 2bayt, yəni 2 adres tutacağını unutmayın. Məsələn:
EEPROM.get(0,3622); dedikdə 3622 ədədi 2 bayt tutduğundan 0 və 1 adresləri tutulmuş olacaq və növbəti dəyişən belə yazıla bilər:
EEPROM.get(2,2545); – təbii ki,bu adres 2 və ya başqa ola bilər.
32-bitlik bir dəyişən yazsanız sizcə neçə adres tutar? – Bəli 4.
update(adres,qiymət) – put ilə demək olar eyni işi görür əmma çox maraqlı bir fərqi var. Beləki əgər 0 adresində olan qiymət misal üçün 258dirsə və biz ona yenidən 258 qiymətini vermək istəyiriksə buna izin vermir. Bunun əsas səbəbi EEPROM yaddaşda 100.000 oxuma yazma ömrü olmasıdır. Yəni 100.000 dəfə qiymət yazsaq və ya oxusaq EEPROM istifadəsi mümkün olmayacaq. Bunu araşdırdım və tapdım ki sadəcə 100.000 oxuma/yazmadan sonra istehsalçı (Atmel) “qarantiya vermir”. Yəni,işləyə də bilər, işləməyə də.
read(adres) –eynən write kimi olan bu funksiya da byte tipindəki dəyişəni oxumağa xidmət edir.
get(adres,qiymət) – bu funksiya isə put ilə oxşardır yəni ki, byte tipindən də başqa qiymətləri oxumaq mümkündür.Burada qiymət nəyə lazımdır deyə soruşa bilərsiniz. Həmin adresdəki məlumat buradakı qiymətə yüklənəcək.
EEPROM[adres] – birbaşa hansısa adresə müraciət üçündür.
qiymət = EEPROM[0]; // və ya
qiymət = EEPROM.read(0); // məlumatı oxumaq üçün istifadə edə bilərsiz
EEPROM[0] = qiymət; və ya EEPROM.write(0,qiymət); də məlumatı yeniləyə bilərsiniz.
length() – yuxarıdakı cədvələ əsasən işlətdiyiniz mikrokontrollerə uyğun EEPROM yaddaşın uzunluğunu deyir. Məsələn:
#include <EEPROM.h>. //EEPROM yaddaşdan istifadə üçün bu başlıq əlavə olunmalıdır
void setup() {
Serial.begin(9600); //USB-serial interfeys aktiv olundu
}
void loop() {
Serial.println(EEPROM.length()); //ekrana yazılması üçün
delay(500); //serial monitordakı məlumatlar beynimizi xarab etməsin deyə fasilə}
İndi isə keçək nümunə kodlara:
1. Bu kodu Arduinoya yükləyək:
#include <EEPROM.h> //EEPROM yaddaşdan istifadə üçün bu başlıq əlavə olunmalıdır int adres = 0; //məlumatın yazılacağı adres təyin olundu int qiymet = 123; //kefimizə uyğun bir qiymət təyin olundu void setup() { Serial.begin(9600); //USB-serial interfeys aktiv olundu } void loop() { Serial.print(" adres:"); Serial.print(adres); Serial.print(" qiymet:"); Serial.print(EEPROM.read(adres)); //0 adresindəki məlumatın oxunması Serial.println(); //məlumatların yeni sətirdə ekranda yazılması delay(500); //serial monitordakı məlumatlar beynimizi xarab etməsin deyə fasilə }
sonra isə yaddaşın qalıcı olduğunu görmək üçün karta reset verək və USB-dən ayırıb yenidən qoşaq sonra isə, bu kodu yükləyək:
2. Bütov EEPROM-un oxunması
Bayaqkı nümunədə ancaq 0 adresindəki məlumatı oxuduq indi isə
Bütov EEPROMu oxuyaq:
#include <EEPROM.h> //EEPROM yaddaşdan istifadə üçün bu başlıq əlavə olunmalıdır int adres = 0; //məlumatın yazılacağı adres təyin olundu (şərti olaraq 0) int uzunluq = EEPROM.length(); //EEPROM-un uzunluğu bir dəyişənə təyin olundu void setup() { Serial.begin(9600); //USB-serial interfeys aktiv olundu for(adres;adres<uzunluq;adres++) { int qiymet =EEPROM.read(adres);//qiymet dəyişəninə hazırki adresdəki məlumatın yüklənməsi Serial.print(" adres:"); //ekranda göstərilmə Serial.print(adres); Serial.print(" qiymet:"); Serial.print(qiymet,BIN); //hazırki adresdəki qiymətlərin göstərilməsi Serial.println(); //məlumatların yeni sətirdə ekranda yazılması delay(150); //serial monitordakı məlumatlar beynimizi xarab etməsin deyə gecikmə } Serial.print("Oxuma prosesi tamamlandi!Proqrami yeniden basladin!"); //Son } void loop() { //loop-luq bir şey yoxdur }
Burada Serial.print(qiymet,BIN) sətirində BIN ikilik say sistemində ifadə olunması üçündür
Serial.print(qiymet,OCT); //8lik
Serial.print(qiymet,HEX); //16-lıq
Serial.print(qiymet,DEC); //10luq
Say sitemlərində göstərilə bilər.
3. Bu nümunədə Bütöv EEPROM-u siləcəyik:
#include <EEPROM.h>//EEPROM yaddaşdan istifadə üçün bu başlıq əlavə olunmalıdır int adres = 0;//məlumatın yazılacağı adres təyin olundu (şərti olaraq 0) int uzunluq = EEPROM.length();//EEPROM-un uzunluğu bir dəyişənə təyin olundu void setup() { Serial.begin(9600); //USB-serial interfeys aktiv olundu for(adres;adres<uzunluq;adres++) { byte qiymet =EEPROM.read(adres);//qiymet dəyişəninə hazırki adresdəki məlumatın yüklənməsi Serial.print("\tadres:");//ekranda göstərilmə Serial.print(adres); Serial.print("\tqiymet:"); Serial.print(qiymet);//hazırki adresdəki qiymətlərin göstərilməsi EEPROM.write(adres,0); if(qiymet == 0x00)//Əgər qiymət 00000000-dırsa deməli həmin adres təmizlənib { Serial.print("\tSilindi!");//Həmin məlumatı ekranda göstər } Serial.println();//məlumatların yeni sətirdə ekranda yazılması } Serial.print("Silme prosesi tamamlandi!Proqrami yeniden basladin!");//Son delay(150);//Prosesi rahat görək deyə azacıq gecikmə } void loop() { //loop-luq bir şey yoxdur }
if(qiymet == 0x00); // burada 0x00 -00000000 deməkdir.
Bunu etməkdə əsas məntiq adresdəki qiymətlər 2lik say sistemində yazıldığından,əgər adres boşdursa deməli,həmin adres 00000000dır və if şərt bloku da bunu bizə göstərəcək.
0x-16lıq
0b – 2-lik say sistemini göstərir.
Serial.print(“\t adres:”); // burada \t – tab boşluq deməkdir.
Serial.print(” adres:”); // bunun ilə eyni işi görür.
Hər iki nümunədə olan for(adres;adres<uzunluq;adres++) EEPROM-un uzunluğuna əsasən əmrləri yerinə yetir deməkdir. Adres 0-dan başlayıb artdıqca for şərti-dövr operatorunun içindəki əmrləri yerinə yetirir. Nə vaxt ki,uzunluq dəyişəninin təyin olunduğu qiymətə çatır,onda dayanır.
Növbəti məqalədə görüşənədək.