Bir mikrokontrolcüde bazen bazı verileri depolama ihtiyacı duyarız. Mesela bir sensör değeri, bir sayaç yada bir resim bilgisi gibi. Mikrokontrolcü tabanlı sistemlerde en çok kullanılan hafıza tipi EEPROM’dur.

EEPROM Nedir?

EEPROM, ROM’un bir türü olan Eletriksel olarak Silinebilen Programlanabilien ve Sadece Okunabilen Hafıza demektir. EEPROM ile sistem aktif olmasa bile kaydedilen veri uzun süre saklanabilmektedir. EEPROM hafızası bu şekilde veriyi kaydetme ve sistem aktif olduğundan o veriye tekrar ulaşılabilme özelliğinden dolayı mikrokotrolcü sistemlerinde çok yaygın kullanıma sahiptir.

Seri iletişim protokolleri yardımıyla mikrokontrolcü tabanlı sistemlerde kulanılan birçok EEPROM bellek çipi vardır. Zaten birçok mikrokontrolcü kendi bünyesinde küçük boyutlu dahili bir EEPROM barındırır. Böylece küçük çaplı projelerde hafıza olarak bu kullanılır ve harici bir hafıza çipine ihtiyaç duyulmamış olur. Seri iletişim protokolleri PC’nin seri portuyla iletişim veya diğer cihazlarla iletişim kurmak için tekrar kullanılabilir.

Normalde bir mikrokontrolcünün dahili EEPROM belleğine kaydedilebilecek verinin boyutu yalnızca birkaç kilobayt ile sınırlıdır. Bu yüzden bunlar bazı sensör değerlerini yada GPS gibi cihazlardan alınan yazılı metin verilerini saklamak için kullanılır. Bu projede PC’nin seri portu ile arduino kartının dahili EEPROM hafızasıyla nasıl bağlantı kurulacağını göreceğiz. Ve arduinoyu kapatıp tekrar açtığımızda ulaşıp okuyabileceğimiz bir metin yazacağız.

 

EEPROM hafızasının boyutu arduino kartlarının çeşidine göre de değişiklik göstermektedir.Bu projede arduino pro-mini kullanılmıştır. Arduino pro-mini kartında ATMEGA328 mikrokontrolcüsü bulunmakta ve dahili olarak 1Kb EEPROM hafızası barındırmaktadır. Pro-mini kartında ayrıca Tx ve Rx pinleride bulunmaktadır. Bu pinler ise serii iletişimde kullanılmaktadır. Aşağıda pro-mini ve Arduino IDE ‘nin birer fotoğrafı 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. Bu parça ayrıca USB portu üzerinden PC ile seri haberleşmeyi sağlayabilmektedir.

 

15_2

Arduino IDE kullanımı kolay, birçok kütüphaneye sahip ve karmaşıktan basite birçok fonksiyonu kendi içinde barındıran bir programdır. Arduino IDE ayrıca < EEPROM.h> olarak adlandırılan ve dahili EEPROM’a erişme imkanı sağlayıp EEPROM’a veri yazma yada veri okuma işlevini yapabileceğimiz kütüphaneye sahiptir. Bu proje için yazılan kodda EEPROM ‘dan veri okumak ve veri yazmak için 2 tane fonksiyon kullanılmıştır, bunlar sırasıyla EEPROM.write() ve EEPROM.read() ‘ dir.

 

Arduino IDE ayrıca serii iletişim işlemi için bazı yerleşik fonksiyonlara sahiptir. Belirli baud oranı ile seri iletişimi başlatan bir fonksiyon vardır ve seri porta veri gönderip veri alan bazı fonksiyonlarda bulunmaktadır. Bu projede kullanılan fonksiyonlar Serial.begin(), Serialprint(), SerialPrintln(), Serial.available(), Serial.read() and serial.write()’dır. Bu projeyi daha iyi anlamak için arduino serial iletişim ve arduino ile seri veri alıp gönderme konularını inceleyiniz.

Bu projede pin 6 ‘ya bir led bağlanmıştır. Ve bu led ile EEPROM hafızası meşgul olduğu sürece (her veri yazıldığında) yanıp sönme olacaktır buradan yazmanın gerçekleştiği görülebilecektir. Led’in bu şekilde çalışmasıda arduino IDE içindeki yerleşik bazı fonksiyonlarla sağlanmıştır. Bu fonksiyonlar pinMode(), digitalWrite() ve delay() komutur. Bu fonksiyonları ayrı ayrı inceleyerek projeyi daha iyi anlayabilirisiniz.

Devre Şeması:

CIRCUIT_20

 

Kod:

 

#include <EEPROM.h>
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);               // initialize the LCD library with the numbers of the interface pins
int address = 0;                                     // the variable which holds the address in the eeprom
int read_value = 0;                                  // the variable which holds the data which is read from the eeprom
char serial_in_data;                                 // the variable which holds serial input data
int led = 6;                                         // variable which holds the pin number at which the LED is connected
int i;
void setup()
{
  pinMode(led, OUTPUT);                               // initialize the led pin as an output.
  lcd.begin(16, 2);                                   // set up the LCD's number of columns and rows: 
  lcd.print("elektronikhobi.net");                      
  lcd.setCursor(0, 1);   
  lcd.print(" SERIAL  EEPROM ");
  Serial.begin(9600);                                 // initialize the serial port with baud rate 9600
  Serial.println();
  Serial.println("PREVIOUS TEXT IN EEPROM :-");
  for(address = 0; address < 1024; address ++)        // read the entire EEPROM memory
  {  
    read_value = EEPROM.read(address);
    Serial.write(read_value);
  }
  Serial.println();
  Serial.println("WRITE THE NEW TEXT : ");
  
  for(address = 0; address < 1024; address ++)        // fill the entire eeprom memory with white spaces
    EEPROM.write(address, ' ');                 
  
  for(address = 0; address < 1024; )                  // write the incoming serial data to the EEPROM
  {
    if(Serial.available())
    {
      serial_in_data = Serial.read();  
      Serial.write(serial_in_data); 
      EEPROM.write(address, serial_in_data); 
      address ++;
      digitalWrite(led, HIGH);       
      delay(100);
      digitalWrite(led, LOW);
    }
  }
}
 
void loop()
{
  //---- blink LED -----//
  digitalWrite(led, HIGH);       
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
  //---- blink LED -----//
}

 

 

Kod Açıklama:

Bu proje için yazılan kodda 6. pin çıkış pini LED’li gösterge olarak pinMode() fonksiyonu kullanarak düzenlenmiştir. 16*2 LCD ekranı başlatmak için lcd.begin() fonksiyonu kullanılmıştır. Serial.begin() fonksiyonu ise 9600 baud oranı ile seri haberleşmeyi başlatmak için kullanılmıştır.

Kod EEPROM hafızasına girerek EEPROM.read() komutuyla okuma yapar ve Serial.write() fonksiyonu kullanarak serii port ile bir önceki kaydedilen metin verisini gönderir. Sonra EEPROM hafızasının tümü EEPROM.write() fonksiyonu kullanılarak temizlenir. Böylece kod kullanıcı tarafından Serial.available() fonksiyonu kullanılarak bir metinin girilmesini bekler. Veri girildiğinde seri data EEPROM.write() komutu kullanılarak EEPROM’da belirli adrese yazılır. Eğer EEPROM’da yeterli bellek kalmaz ise bunu kullanıcıya göstermek için LED sürekli yanacaktır.

IMG_5504 copy

 

 

 

 

 

 

 

 

 

Video: