EEPROM nedir?

Elektriksel olarak Silinebilen Programlanabilen ve Sadece Okunabilen Hafıza demektir. Bir EEPROM’a veri elektriksel programlama yardımı ile yazılabilir. EEPROM hafızası yaygın olarak mikrokontrolcü sistemlerinde kullanılır. Sistem açıldığında bazı belirli verilerin sistemde sürekli tutulması ve sistem kapatıldığında da aynı şekilde kaydedilmesi gerekir.
Bu hafıza alanına programımız işlerken müdahale edebiliyor, okuyabiliyor veya üzerine yazabiliyoruz. Küçük çaplı sistemlerde yani yalnızca birkaç byte depolama ihtiyacının olduğu durumlarda extra EEPROM çipleri tercih edilmez. Sebebi ise donanıma eklenecek extra karışıklık, kodlama ve sistem maliyetini arttırma gibi durumlardan kaçınmaktır. Bu yüzden depolama ihtiyacının az olduğu küçük çaplı bir çok mikrokontrolcüde küçük boyutlu bir EEPROM çip kullanılır.
Arduino kartında AVR mikrokontrolcüsü kullanılır ve kendinde kurulu dahili bir EEPROM hafızası bulunmaktadır. Hafıza boyutu Arduino kartının çeşidine ve bunlarda kullanılan mikrokontrolcüye göre değişiklik göstermektedir.

Bazı mikrokontrolcülerde belirli data değerlerini uzun süreli saklama ihtiyacı duyulabilir. Örnek vermek gerekirse bir sensör değeri, belirli bir süreç sayma yada bir görüntü bilgisi işte böyle verileri uzun periyotlarda depolamak için EEPROM hafızası kullanılır. EEPROM hafızası ayrıca sistemin kendisini kapatmadan önceki verileri kaydetmesi için de kullanılır böylece sistem yeniden açıldığında kapanmadan önceki verilere rahatlıkla ulaşılabilme imkanı sağlanır. Mesela ARDUİNO kapanmadan önce okunan bir sensör değerinin nasıl kaydedileceğini ve bu aynı değere arduino açıldığında tekrar nasıl ulaşılacağını bu projeyle göstermiş olacağız.

 

 

IMG_5499 copy

 

Bu mikrokontroller analog giriş voltaj değerini okuyabilir ve onu analog dijital çevirici (ADC) ile dijital değere çevirebilir. Ayrıca bununla PWM metodunu kullanarak harici bir cihaza analog voltaj uygulanabilir. Zaten mikrokontrolcülerin bir çoğu kendi içinde PWM modülü ve ADC ( analog digital converter) modulü barındırır. Böylece analog giriş voltaj değeri okuma ve harici bir cihaza analog sinyal üretme özelliğini üstünde barındırırlar.

Bir arduino kartındaki bazı dijital pinler analog çıkış olarakta yapılandırılabilirler. Ayrıca kartın üzerinde birde analog sinyal değerlerinin okunabileceği analog giriş pinleride mevcuttur. Bu projede analog giriş olarak kullanılabilecek pin sayısı maximum 8 olan pro-mini kullanılmıştır. Bu pinler kartta A0, A1, A2, A3, A4, A5, A6, A7 olarak temsil edilirler. Bu pinler aslında analog dijital çevriminin yapılacağı yani analog değerin dijital değere çevrileceği giriş kanallarıdır. Arduino pro-mini kartında ATMEGA328 mikrokontrolcüsü bulunmakta ve dahili olarak 1Kb EEPROM hafızası baulunmaktadır.

Bu projede Arduino pro-mini kartı Windows üstünde Arduino IDE 1.0.3 kullanılarak programlanmıştır. Arduino pro-minin bir fotoğrafı ve arduino IDE ‘nin bir ekran görüntüsü aşağıda gösterilmiştir.

 

10_6

2_0_3

 

Arduino pro-mini kartları özel olarak hantal, ağırlık yapan, boyutu büyüten parçalarından kurtularak yalnızca temel parçalarını üzerinde barındırırlar. Bu yüzden yardımcı bir donanım olarak  programı USB ‘den TTL çevirimini yaparak arduino kartına yükleyen harici çeviricisi vardır.

 

15_2

 

Özel olarak önce bu projede analog değişken gerilim yani analog bir değer sağlayabilmek için potansiyometre kullanılır . İleriki projelerde potansiyometrenin yeri gerçek analog değerlerin okunabileceği bir sensörler değiştirilecektir. Potansiyometrenin değişken ucu analog input pinine bağlanır. Bu projede A0 ‘a bağlanmıştır. Potansiyometrenin diğer iki bacağı VCC ve GND dir. Böylece VCC’den gerilim uygulandığında potansiyometreyi sağa sola çevirerek arduinonun analog input pininden analog değerler okunabilecektir.

İlk olarak bir değer okunduğu takdirde analog çıkış pinine bağlı olan led ışık vermeye başlar. Potansiyometreyi sağa sola çevirerek okunacak olan analog değerlerle ledin parlaklığı değişecektir. Okunan değer ayrıca voltaj eşdeğerine çevrilecek ve LCD ekranda gösterilecektir aynı zamanda EEPROM hafızasına kaydedilecektir. Sırasıyla okuma, yazma ve adresleme olarak kullanılan AnalogRead(), analogWrite() ve map() komutlarını biraz incelemenizi tavsiye ediyoruz.

Son değer, o anki değer gibi okunan tüm analog değerler 16*2 LCD ekran da gösterilecektir. LCD ekranı kullanabilmek için gerekli olan kütüphane <LiquidCrystal.h>. Bu projeyi daha rahat yapabilmek için öncelikle LCD ekranın nasıl kullanıldığı ve bir sensör değerinin LCD ekrana nasıl yazdırılacağı konularına bakmanızda fayda var.

Arduino pro-mini ATMEGA328 mikrokontrolcü ve 1Kb EEPROM hafızasına sahipti. Bu EEPROM hafızasına erişim koddada görülebilen <EEPROM.h> kütüphanesiyle mümkündür. Yine aynı şekilde buradada öncelikle EEPROM hafızasına nasıl girileceği ve EEPROM kontol testinin nasıl yapılacağı gibi temel konulara bakmanızda fayda var.

EEPROM hafızasına data yazmak yada EEPROM hafızasından data okumak için sahip olduğumuz temel 2 fonksiyon vardır. Bunlar sırasıyla EEPROM.write() ve EEPROM.read(). Bu fonksiyonlar aşağıda daha detaylı anlatılacaktır.

 

 

 EEPROM.write()

EEPROM.write() fonksiyonu fonksiyonda geçen parametreler dahilinde EEPROM hafızasının belirli adresine kapladığı byte değerinde veriyi yazmak için kullanılır. Fonksiyonun 2 parametresi vardır; birinci parametre yazılmak istenen verinin tutulması istenen bir adresidir. İkinci parametre ise gerçek veri değeridir. Örnek olarak veri ‘A’ olsun ve yazılmasını istediğimiz adres ise ‘addr’ olsun bunu kodda nasıl gösterebiliriz bakalım.

EEPROM.write(addr, 'A');

 

EEPROM.read()

EEPROM.read() fonksiyonu ise arduino’nun mikrokontrolcüsündeki dahili EEPROM hafızasından okunmak istenen belirli veri değeri için kullanılır. Bu fonksiyonun tek bir parametresi vardır. Oda verinin nereden okunacağının adresidir. Örnek olarak veri değeri değişken ‘addr’ tarafından belirtilen yerden okunacak ise aşağıdaki ifade kullanılabilir.

EEPROM.read(addr);

 

AÇIKLAMALAR:

 

Arduino kartı analogRead() fonksiyonunu kullanarak analog input kanalından analog değerleri okur. Daha sonra değerler 0-255 arasında adreslenir böylece PWM olarak yazılabilecek aralığa geçirilir. Map() fonksiyonu 0-1023 değer aralığını 0-255 aralığına çekmek için kulanılır. Eşlenen değer direk analog çıkış olarak ayarlanan pinden analogWrite() fonksiyonu kullanılarak yazılır. Bundan dolayı bu pine bağlanan LED ‘in parlaklığı değişir.

Eşlenen değer daha sonra gerçek voltaj değerine çevrilir ve dahili EEPROM hafızasında <EEPROM.h> kütüphanesi fonksiyonu yardımıyla saklanır. EEPROM.write() fonksiyonu belirli bir hafıza adresine değeri yazmak için kullanılır. Değer ayrıca 16*2 LCD ‘de gösterilir.

Arduinoya güç verildiği anda ilk olarak kod okunduğunda aynı adreste depolanan bir önceki değer 16*2 LCD ekranda gösterilir. <EEPROM.h> kütüphanesinin fonksiyonu olan EEPROM.read() ile hafıza adresindeki değer okunur.

Adresleyerek sakladığımız bir önceki değer ve şu anki analog pinden okuduğumuz değer ikiside 16*2 LCD ekranında <LiquidCrystal.h> kütüphanesinin fonksiyonu yardımıyla gösterilir.

 

Arduino ilk açıldığı anda ekranda sıfır değeri belirecektir bu normaldir. Çok kısa bir süre sonra EEPROM’daki arduino açıkken kaydedilen son değer ekranda gösterilecektir.

 

 

 

Arduino Devre Şeması:

CIRCUIT_18

 

Arduino Kodu:

 

#include <EEPROM.h>
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);               
 
const int analogInPin = A0;                          // potansiyometrenin baglandıgı analog input pin
const int analogOutPin = 6;                          // ledin baglandığı analog output pin
int potvalue = 0;
int outputvalue = 0;
 
int address = 50;                                    // eepromdaki değişken adres
int read_value = 0;                                  // eepromdan okunarak tutulan data
 
int led = 6;                                         
 
void setup()
{
  pinMode(led, OUTPUT);                            
 
  lcd.begin(16, 2);                                    
  lcd.print("elektronikhobi.net");
  delay(2000);
  lcd.clear();
  
  lcd.print("SON DEGER : ");
  read_value = EEPROM.read(address);                  // adresten degeri oku
  lcd.print(read_value);  
  lcd.print('v');  
  delay(2000);
  lcd.clear();    
}
 
void loop()
{
  potvalue = analogRead(analogInPin);        
  outputvalue = map(potvalue, 0, 1023, 0, 255); 
  analogWrite(analogOutPin, outputvalue);    
  
  lcd.setCursor(0, 0);
  lcd.print("  SENSOR DEGERI");
  lcd.setCursor(7, 2);
  lcd.print((outputvalue * 5)/255);
  lcd.print("V");
  
  EEPROM.write(address, ((outputvalue * 5)/255));                 // eeprom adrese değeri yaz
  
}

Uygulama Videosu:

01

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz