C ile AVR Programlama -43- EEPROM Örnek Kod İncelemesi

AVR Programlarken çoğu zaman dahili bir kütüphane olmasa da EEPROM kütüphanesi derleyicinin içinde gelmektedir. Aslında bu kütüphaneyi kullanıp bütün bu yazmaçlardan ve bitlerden kurtulmamız mümkün olsa da biz bu alanda literatür oluşturacak seviyede bir ders dizisi yazma gayretinde olduğumuz için işi mümkün olduğunca alt seviyede tutmaya çalışacağız. Böylelikle anlaşılmadık bir nokta kalmayacak. Şimdi teknik veri kitapçığında verilen örnek EEPROM okuma ve yazma kodlarını satır satır inceleyelim.

Okuma işlemini anlatmakla işe başlayalım. Okuma işlemi oldukça basit olup adresteki değeri döndürmekten ibarettir. Bu adres verisi unsigned int uiAddress olarak programcı tarafından fonksiyon çağrılırken yazılır.

while(EECR & (1<<EEPE))   EECR Yazmacındaki EEPE biti bir olduğu sürece program sonsuz döngüye sokulur. EEPE biti eğer bir okuma veya yazma işlemi yürütülüyorsa bir (1) konumunda olup işlem bitmesinin ardından donanım tarafından sıfır (0) konumuna çekilir. Yeni bir işlemin yürütülmesi için öncelikle önceki işlemin bitmesi gereklidir. Bu yüzden bu kontrol döngüsünü en başa alıyoruz.

EEAR = uiAddress;  Aynı kodun Assembly dilindeki halini incelediğimde EEARH ve EEARL yazmaçlarına ayrı ayrı değer atandığını gördüm. Fakat C dilinde programlama yaparken sadece EEAR yazmacında değer atamak yeterli oluyor. Normalde üst ve alt yazmaçlara ayrı ayrı değer atanması gerekse de burada böyle bir kolaylık getirilmiştir.

EECR |= (1<<EERE);  EERE biti bir (1) yapılarak okuma işlemi yürütülür. Yazmaçları açıkladığımız önceki derste bu bitin okuma işlemini başlatmakla görevli olduğunu açıklamıştık.

return EEDR;  EEPROM Veri Yazmacı değer olarak döndürülür. Bu yazmaçta okuma işlemi bittikten sonra belirtilen adresteki okunan veri yer alır.

Sırada ise yazma işleminin yürütüldüğü bir fonksiyon var. Bunu da yukarıda olduğu gibi satır satır inceleyelim.

Görüldüğü gibi bu fonksiyon void ile başlıyor. Çünkü yazma işleminde herhangi bir değer okumayacağız. Öncelikle 10 bitlik adres verisini unsigned int uiAddress olarak, yazılacak veriyi ise unsigned char ucData diye argüman olarak alıyoruz.

while(EECR & (1<<EEPE)) ;  EECR Yazmacındaki EEPE biti bir olduğu sürece program sonsuz döngüye sokulur. EEPE biti eğer bir okuma veya yazma işlemi yürütülüyorsa bir (1) konumunda olup işlem bitmesinin ardından donanım tarafından sıfır (0) konumuna çekilir. Yeni bir işlemin yürütülmesi için öncelikle önceki işlemin bitmesi gereklidir. Bu yüzden bu kontrol döngüsünü en başa alıyoruz.

EEAR = uiAddress;    Programcı tarafından belirlenen 10 bitlik adres verisi EEAR yani EEPROM Adres Yazmacına yazılır. Yazma işleminden önce muhakkak doğru adresin yazılması gereklidir. Bu adresi ise programcı çakışmadan belirlemek zorundadır. Hangi verinin hangi adreste bulunacağı keyfimize bağlıdır. Önemli olan bu değerlerin üst üste gelip birbiri üzerine yazılmamasıdır.

EEDR = ucData;  char olarak bu veri yazılsa da bizim bir baytlık veri olarak anlamamız gereklidir. Bu değerlerin muhakkak işaretsiz (unsigned) olması gerektiğini söylememize gerek yoktur.

EECR |= (1<<EEMPE); EEPROMa yazma işlemini yapmadan önce bu güvenlik bitini bir yapmamız gereklidir. Kontağı açıp marşa basmak gibi bir işlem olduğu için önce kontağı açmamız gereklidir. Bu görevi bu bit yerine getirmektedir.

EECR |= (1<<EEPE); Bu bit ile yazma işlemini yürütmeye başlarız. Bütün bu hazırlıktan sonra son noktayı bu bite bir (1) yazarak koyarız ve işlem yürütülür.

 

Bir sonraki dersimizde EEPROM kütüphane fonksiyonlarını açıklayacağız ve konuyu bitireceğiz.

 

Kaynaklar

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

ATmega328P – Microchip Technology , http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf, Erişim Tarihi: 25.08.2018

UYARI!!

Gökhan Dökmetaş

Bilgi Teknolojileri Uzmanı

You may also like...

Bir cevap yazın

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