Elektronikanın əsaslarıEmbeded sistemlər

EEPROM Yaddaş Nədir?

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:

MikrokontrollerEEPROM
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.

Əlaqəli Məqalələr

0 0 səslər
Article Rating
Abunə ol
Xəbər ver
guest

0 Comments
Ən köhnə
Ən yeni Ən çox səs alanlar
Sətir içi geri bildirimlər
Bütün şərhlərə baxın
Back to top button
0
Fikirlərinizi bilmək istərdik,lütfən şərh yazın.x