6 Eylül 2026 Pazar

         EEPROM(Electrically Erasable Programmable Read-Only Memory), ihtiyacımız olan küçük boyuttaki verileri kalıcı olarak saklayabilen, elektriksel olarak bu verileri yazıp silebilen küçük bir depolama birimidir. Arduino'da dâhili olarak bulunan EEPROM'a verilerimizi kaydedebilir, istediğimiz zaman bu verileri tekrar kullanabiliriz. Enerjisi kesilse dahi EEPROM'daki veriler silinmez.

Bir EEPROM, bit başına iki transistör içeren bir dizi kayan kapı transistörü kullanılarak oluşturulur. EEPROM’lar Flash Belleğe benzer. Aralarındaki fark Flash Belleğin daha büyük olması ve daha büyük veri blokları kullanmasıdır. Flash Bellek yaklaşık 10.000 kez yeniden yazılabilir. Arduino mikrodenetleyicileri, kendisine yüklenen programları depolamak için Flash Belleği kullanır. 

SD Kartlar, USB bellekler, sabit diskler vb. nazaran EEPROM’un çok az miktarda depolama alanı vardır. Aslında EEPROM kapasiteleri bayt yerine genellikle Bit cinsinden ölçülür. Az miktarda veri depoladıkları için çok fazla akım tüketmezler. 

Flash Bellekte olduğu gibi, EEPROM’ların da sınırlı sayıda yazma döngüsü vardır. EEPROM’u istediğiniz kadar okuyabilir, ancak verileri yalnızca belirli sayıda yazabilirsiniz. Yaygın EEPROM’lar için yazma döngüleri sınırı yaklaşık 100.000 ila 2 milyon arasındadır. Bu sayı fazla gibi gelebilir. Ancak, mikroişlemcinin ne kadar hızlı veri yazabileceğini düşündüğünüzde bu sayı yeterli olmayabilir. Diğer bir EEPROM sınırlaması ise veri saklama süresidir. EEPROM teknolojisi günümüzde sürekli olarak gelişirken, EEPROM’lar bozulmadan önce verileri oda sıcaklığında yaklaşık 10 yıl saklayabilir. Bu verilerin yeniden yazılması, sayacı yeniden başlatacak ve EEPROM’un ömrünü uzatacaktır.


EEPROM’un Ömrünü Uzatmak

Sürekli aynı adrese veri yazmak, o konumdaki bellek hücresinin yıpranmasına ve ömrünün azalmasına neden olabilir. Döngü ömrünü tamamlamamış bir EEPROM çalışmıyorsa en büyük sebebi bu olabilir. Veri girişi olduktan sonra, sonraki veri grubunu, adresi kaydırarak girmelisiniz.

Ayrıca EEPROM’a gereksiz ve sürekli veri girilip girilmediğinden emin olmalısınız. “update” fonksiyonunu bu yüzden kullanmalısınız. Ayrıca program kodunu hazırlarken, EEPROM’a for döngüsü içerisinden veri yazmamaya çalışın. Herhangi bir yanlışlık, hata, bug, EEPROM’un tamamen bozulmasına neden olabilir. EEPROM’lara veri yazmak yaklaşık 3ms sürmekte bu yüzden siz kod bloğunu durdurana kadar, çoktan bir EEPROM’u kaybetmiş olabilirsiniz.



Arduino Uno’da Flash ve EEPROM Karşılaştırması

Cihaz

Hafıza Tipi

Boyut

Tekrar Yazma

AtMega328P (Arduino Uno)

Flash

32 KB

>10.000

EEPROM

1 KB

>100.000

Arduino UNO kartınıza günde 10 kere program yazarsanız, yaklaşık 2.7 sene içinde flash bellek ömrünü doldurmuş olursunuz. Eğer günde 10 kere EEPROM’a veri yazarsanız, yaklaşık 27 sene içinde EEPROM yazdırma döngüsünü tamamlamış olursunuz. 


Bazı Popüler Arduino Modellerinde Dahili EEPROM Hafızası

Board Name

Microcontroller

EEPROM size in bytes

Arduino UNO

ATmega328P

1024 bytes

Arduino Nano

ATmega328P

1024 bytes

Arduino Mega2560

ATmega2560

4096 bytes

Arduino Micro

ATmega32U4

1024 bytes

Arduino Leonardo

ATmega32u4

1024 bytes

 

Bu EEPROM’lar projelerimiz için yeterli olacaktır. Yeterli olmadığı durumlarda ise hafıza alanının artırılması için harici EEPROM'lar da kullanabiliriz. EEPROM'lar bit seviyesinde, yani bir seferde bir bit veri iletimi olacak şekilde tasarlanırlar. Bu da, birçok I2C tabanlı EEPROM cihazının geliştirilmesini sağlamıştır. 

Arduino ile bir I2C EEPROM cihazı kullanmak çok basittir. Çünkü, Arduino'nun zaten I2C bağlantıları ve bunları kullanmak için kütüphaneleri vardır. I2C EEPROM'un bir diğer avantajı da Arduino'nun dahili EEPROM'unda bulunan 100.000 yazma sınırından daha büyük bir yazma döngüsü toleransına sahip olmalarıdır.



EEPROM’un Mantıksal Yapısı


Adres

Veri

Address 0

1111 0101

Address 1

1011 1100

Address 2

0011 0111

.

.

.

.


.

.

.

.


Address 1023

1010 1010



1024 adet bellek hücresi vardır ve her biri 8 bitlik ikili veriyi depolayabilir. 0'dan 1023'e kadar numaralandırılmış adresleri kullanarak belirli bellek konumuna erişebiliriz. Her bellek konumu 0 - 255 arasındaki bir ondalık sayıyı veya 'A' gibi 8 bitlik bir ASCII karakterini depolayabilir. Değiştirilmemiş bir EEPROM bellek konumunun varsayılan değeri 255'tir.


Arduino EEPROM Komutları

Yapacağımız uygulamalarda Arduino Uno’nun dâhili EEPROM'u kullanılacaktır. Bunun için öncelikle #include <EEPROM.h> komutu EEPROM kütüphanesini projemize dâhil etmeliyiz.

  1. EEPROM.length();

Arduino kartındaki EEPROM boyutunu verir. Boyutu unsigned int biçiminde döndürür.

eeprom_boyut = EEPROM.length();


  1. EEPROM.write();

Belirtilen bir bellek adresine 1 bayt veri yazmak için kullanılır. Veri tipleri char ve byte türünde1 bayt olmalıdır. Yani 0 - 255 arası sayılar veya 8 bitlik ASCII karakterler. Bu fonksiyonunun tamamlanması yaklaşık 3.3ms sürer. Bir yazma işlemi gerçekleştirilirken işlemciye gelen voltajın önemli ölçüde dalgalanmaması gerektiğini lütfen unutmayın.

EEPROM.write(adres , veri);


Bu fonksiyonu herhangi bir adresteki veriyi silmek için de kullanabiliriz:

EEPROM.write(adres, NULL); 

NULL yerine yine boş anlamına gelen “\0” veya “FF” değerleri de kullanılabilir.  


  1. EEPROM.read();

Belirtilen bir bellek konumundaki veriyi okumak için kullanılır. Daha önce hiç yazılmamış konumlara okuma çağrısı yaptığınızda fonksiyon 255 değerini döndürecektir. Veri tipleri char ve byte türünde1 bayt olmalıdır.

oku = EEPROM.read(adres);


  1. EEPROM.update();

Bu fonksiyon hem okuma hem de yazma yönteminin bir kombinasyonudur. Önce belirtilen adresteki veriyi okur. Eğer yazacağı veri, adresteki veri ile aynıysa yazma işlemi yapmaz, farklıysa yazma işlemi yapar. Bu nedenle fonksiyon, EEPROM bellek hücresine gereksiz yazmaları önleyerek hücrenin ömrünü uzatır. Veri tipleri char ve byte türünde1 bayt olmalıdır.


EEPROM.update(adres , veri);


  1. EEPROM[adres];

Bu komut kullanılarak EEPROM adreslerindeki veri doğrudan okunabilir ve adreslere doğrudan veri yazılabilir.

EEPROM[15] = 120 //15 adresine 120 değerini yaz.

data = EEPROM[10] //10 adresindeki değeri “data” değişkenine ata.


1 Bayttan Daha Uzun Verilerin Yazılıp Okunması

Arduino kartının dahili EEPROM'una 1 byte'tan daha büyük olan float(4 byte) veya double(4 byte) veya dizi gibi değerleri yazmak veya okumak için EEPROM.get() ve EEPROM.put() komutları kullanılır. Fakat bunları kullanmak şart değildir. get() veya put() kullanacağımıza bir döngü ile dizi harflerini teker teker read() veya write() kullanarak da yazıp okuyabiliriz.

Dizi uygulamalarında char[ ] tipi ARRAY veriler bilgisayar belleğinde genelde otomatikman bir NULL karakter ile sonlandığından, get() ve put() işlevleri, yazma ve okuma işlemlerini bu noktaya kadar yaparlar. Yani bir NULL bulunca okuma ve yazma durur. Eğer bu sizin işinize göre değilse, o zaman write() veya read() kullanmanız daha uygun olabilir.

  1. EEPROM.put(adres , data);

EEPROM'a 1 bayttan daha uzun veri yazmak için kullanılır. “adres” değişkeni verilerin yazılacağı başlangıç adresidir. “data” değişkeni ise yazılacak olan veridir. Float, double yada char türünde 1 bayttan büyük veri türüdür. Örneğin “data” değişkenini char türünde bir dizi olarak tanımlayıp içine bazı karakterleri yerleştirerek bu fonksiyon ile karakterleri belli bir adresten itibaren EEPROM’a yazabiliriz.

Not: Bu fonksiyon yazma işlemini gerçekleştirmek için EEPROM.update()'i kullanır.


  1. EEPROM.get(adres , data);

EEPROM'dan 1 bayttan daha uzun veri okumak için kullanılır. “adres” değişkeni verilerin okunmaya başlanacağı başlangıç adresidir. “data” değişkeni ise EEPROM’dan okunan verilerin kaydedileceği float, double yada char türündeki 1 bayttan büyük değişkendir. Örneğin; belli bir adres itibaren verileri okuyarak char türünde tanımlanmış “data” değişkenine atayabiliriz.









0 comments:

Yorum Gönder

Arduino Eğitimi Konu - 7

Toplam Sayfa Görüntüleme Sayısı

Sensörler ve Aygıtların Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com