C ile AVR Programlama -44- EEPROM Kütüphanesi

EEPROM konusunu var olan bir kütüphaneyi açıklayarak bitireceğiz. Sadece kütüphane açıklayarak da konuyu bitirebilsek de bu insanı hazırcılığa itecektir. AVR programlarken çoğu kütüphaneyi kendimiz yazmamız, var olan kütüphaneleri de kendimiz düzenlememiz gereklidir. Böylelikle kütüphaneye göre program değil programa göre kütüphane ortaya çıkacaktır. Bu alanda profesyonel bir iş ortaya koymak için bu şarttır.

AVR GCC derleyicisinde hazır olarak eeprom.h başlık dosyası vardır. Dışarıdan bir kütüphane indirmemize gerek yoktur ve Atmel Studio’yu yüklediğimiz andan itibaren bu kullanılabilir. Yine include direktifi ile bu başlık dosyasını programa dahil etmemiz gereklidir. Aşağıdaki kodu programın başında kullanarak EEPROM kütüphanesini programımıza dahil ederiz.

Makro açıklaması ile devam ederken burada atladığımız makroların olduğunu söylememizde fayda var. Bu makrolar IAR AVR derleyicisine uyumluluk için tanımlanmış makrolar olup bizim işimize yaramamaktadır. Yazının sonunda kaynak olarak belirttiğimiz bağlantıdan kütüphanenin tamamını inceleyebilirsiniz.

eeprom_busy_wait() 

Bu makro EEPROMda okuma ve yazma işleri yürütülürken işlemciyi döngüye sokarak beklemeye alır. Örnek kodlarda belirttiğimiz beklemeyi bu fonksiyonla sağlarız.

eeprom_is_ready() 

EEPROM yeni bir okuma ve yazma işine hazır olduğunda bu fonksiyon bir (1) değerini geri döndürür. Bu fonksiyonun nasıl yazılacağını ise yazmaçları ve örnek kodları incelediğimiz için biliyoruz. Yani istesek kendi EEPROM kütüphanemizi de yazabiliriz.

Bu fonksiyon EEPROMdan bir veri bloğunu okuyup SRAM belleğine aktarır. Veri bloğunun boyutu __n ile belirlenir. __n verisine yazılan değer kadar bayt okuması yapılır. __src ise EEPROM adresi olup SRAM ise okunan değerin aktarılacağı adrestir. Veri blokları genellikle karakter dizileri olduğu için aktarım için dizi değişken tanımlanması gerekir. Örnek bir blok okuması aşağıdaki gibi olmalıdır.

Önce aktarılacak değerin adres değeri, sonra eeprom adresi (burada 20 olarak belirtilmiş 0-1023 arası olacak.) ve devamında uzunluk sabiti belirtilir. Bu fonksiyon 10 baytlık veriyi 20. adresten başlayarak StringVerisi dizisinin adresine sırayla kopyalar.

Bu fonksiyon EEPROMdan bir bayt okur ve bunu 8 bitlik değer olarak döndürür. __p değişkeni okunacak adres verisini bulundurur. Burada “*” işareti dikkatinizi çekmiştir. Bu işaretçi olarak alınan bir argüman değerini gösterir. Bunun için fonksiyon çağırılırken değerleri çevirmek gereklidir. Örnek kodda bu gösterilmiştir. Örneğin 50. adresteki bayt değerini okuyalım.

Bu fonksiyon 16 bitlik word tipinde değişken okumayı sağlar. Yukarıda olduğu gibi bu da işaretçi ile belirlendiği için argüman olarak göndereceğimiz sabitin işaretçiye dönüştürülmesi gereklidir. Aşağıdaki örnek kodda 50. adresteki word değişkeni okunmaktadır.

 

Yukarıdaki örneklerde olduğu gibi aşağıdaki fonksiyonların da bu şekilde kullanılması gereklidir.

Bu foksiyon 32-bit double word cinsinde değeri okur.

Bu fonksiyon float cinsi değer okur.

Bu fonksiyon byte cinsinde değer yazar.

Bu fonksiyon word cinsinde değer yazar.

Bu fonksiyon double word cinsinde değer yazar.

Bu fonksiyon float cinsinde değer yazar.

 

Bu fonksiyon blok değeri yazmak için kullanılır.

Okuma ve Yazma işleminden başka bir de Update (Güncelleme) özelliği vardır. Bu özelliğin tek getirisi mevcut değer aynı ise tekrar yazma işleminin yürütülmemesidir. Böylelikle EEPROMun ömrü uzatılmış olur.  Bu özelliğin kullanıldığı fonksiyonların prototipleri aşağıdaki gibidir.

Bayt için,

Word için,

Double word için,

Float için,

Blok için,

 

Bu fonksiyonların nasıl kullanılacağını örneklerle yukarıda açıkladığımız için tek tek açıklamaya gerek yoktur. Bu konuda anlatılacak pek bir şey kalmadığı için burada bitirelim ve yeni konuya geçelim.


Kaynaklar

Kapak Resmi : http://enacademic.com/pictures/enwiki/65/AVR_ATXMEGA_128A1.JPG

<avr/eeprom.h>: EEPROM handling, http://nongnu.org/avr-libc/user-manual/group__avr__eeprom.html, Erişim Tarihi : 27.09.2018

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

1 Response

  1. cemal dedi ki:

    Hocam kolay gelsin;

    **”eeprom_read_byte()” ve “eeprom_write_byte()” fonksiyonlarını kullanırken while(EECR & (1<<EEPE)); veya EECR |= (1<<EEMPE); işlemlerini yapmaya gerek yok değil mi? Bu işlemler fonksiyonda zaten yapılıyor diye anladım ?

    **Birde, şurayı anlamadım: "okunandeger = eeprom_read_byte((uint8_t*)50); " Burada niçin (uint8_t*) yazıyoruz anlayamadım. böyle birşey yazınca benim derleyicim hata veriyor.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.