Arduino Kaynak Kodu İncelemesi -4- Arduino Ayaklarını Tanımlayan Dosyalar

Arduino çekirdeğini incelediğimizde digitalWrite(), digitalRead(), analogRead() gibi fonksiyonlar için ayak tanımlaması yapan dosyaların kullanıldığını görürüz. Bu ayak tanımlamaları biraz karışık olmaktadır. Ayak adı belirtme adına bu kadar programlama zahmetine girilmektedir. AVR programlamada PORT adı ve PD1, PD2 şeklinde ayak adı belirtebiliyorduk. Fakat bunların aslında hafıza adresi ve bit değerinden ibaret olduğunu söyleyebiliriz. AVR-GCC derleyicisinde iom8.h dosyasında Atmega8’in tanımlamaları yer alıyordu. Bu dosyayı ilk yazıda biraz incelesek de ayak kısmına hiç değinmemiştik. Şimdi bu dosyadan örnek bir parça alalım ve inceleyelim.

Görüldüğü gibi burada PB7 ile adlandırılan ayak adı aslında 7 rakamından başka bir şey değil. Yani (1<<PB7) yerine (1<<7) demiş oluyoruz. C ile AVR programlama derslerinde bitwise operatörlerle giriş ve çıkışı anlattığımda nasıl giriş ve çıkış yapılabildiğinden bahsetmiştim fakat PORTB7 veya PB7 gibi adların aslında ne olduğunu sanırım anlatmamıştım. Bunu da burada anlatmış olalım. Aslında bu konuyu gömülü sistemler için C programlama derslerinde anlatmayı düşünsem de Arduino’nun kaynak kodunu incelemekte yardımcı olacağından şimdi anlatalım. Gömülü sistemler için C programlamayı anlattığımızda ise daha ayrıntılı olarak ele alırız.

Arduino’nun ayakları ve portları ile alakalı bit bazlı tanımlama ve fonksiyonların yer aldığı üç adet ayrı dosya görmekteyiz. Bunlardan birisi atmega8 klasöründe yer alan pins_atmega8.c dosyasıdır. Bu dosya Arduino kodlarını atmega8’in ayakları ile uyumlu hale getirir. Ne yazık ki Arduino kodlarını tek bir dosya ile her AVR mikrodenetleyiciye uyumlu hale getirmemiz mümkün değildir. O yüzden Arduino kaynak kodu içerisinde bol bol eklemelerin olduğunu görüyoruz. Eğer Arduino tam kapsamlı bir derleyici olabilseydi diğer derleyicilerde olduğu gibi tek bir kütüphane dosyasında ayakları ve yazmaçları tanımlar işin içinden çıkardı.

Bu dosyaların aşırı derecede uzun olduğunu gördüğüm için bu dosyaları indirip veya Github üzerinden açıp ayrı bir sekmede görüntülemeniz daha verimli olacaktır. Buraya kod bloklarını kopyalasam da orjinal dosyayı şu bağlantıdan açmanız gereklidir.

https://github.com/arduino/ArduinoCore-avr/blob/master-older/cores/atmega8/pins_atmega8.c

Bu dosyayı açıp ekranın bir köşesine alalım. Şimdi yukarıdan itibaren dosyadaki kodları inceleyelim ve neler yapıldığına bir bakalım.

Burada wiring.h dosyasının alındığını görmekteyiz. Wiring dosyalarını önceden incelemenin faydasını şimdi görüyoruz. Önceden incelediğimiz için bu dosyayı da anlamamız kolaylaşacak.

Burada NUM_PINS olarak belirtilen ayak numarası 28 olarak belirlenmiştir ve NUM_PORTS olarak belirlenen port sayısı dört olarak belirlenmiştir. Ayrıca PB, PC, PD olarak belirlenen ve portları temsil eden adlar 2, 3 ve 4 olarak belirlenmiştir. Burada ne maksatla kullanıldığını çözemeyiz o yüzden incelemeye devam edelim.

Burada port_to_mode adında bir dizi değişkeni tanımlanmıştır. Burada DDR yazmaçları kullanıldığı için bu değişkenin ayak modunu tanımlamada portları hazır hale getirdiğini gözlemleyebiliriz. Yani _SFR_IO_ADDR(DDRB) değeri ile içinde DDRB yazmacının adresini bulundurur veya diğer değerler ile DDRC veya DDRD yazmaçlarının adreslerini bulundurur. NOT_A_PORT ise 0 değerine eşittir ve pins_arduino.h dosyasında tanımlanmıştır. Bu dosyaları inceleyeceğiz.

Burada ise yine dizi değişkenine PORT yazmaçlarının adresleri atılmaktadır. Bu adresler ileride giriş ve çıkış işlemlerinde kullanılacaktır.

_SFR ile başlayan makroların tanımlarını ise AVR LibC referans sayfasında bulabilirsiniz. Biz sadece ne işe yaradığından bahsediyoruz.

https://www.nongnu.org/avr-libc/user-manual/sfr__defs_8h_source.html

Burada ise yine aynı değer tanım ve değer atama bu sefer dijital giriş için kullanılan PIN yazmacı için kullanılmıştır.

burada pin_t değişkenini görebiliriz. Muhtemelen typedef ile tanımlanmış bir uint16_t dizisi olsa gerektir. Çünkü değer atarken her ikişer adet tamsayı değeri atanmaktadır.  Burada bir dizi tanımlanmış ve ayaklara göre port adları ve bit adları belirtilmiştir. Bu belirtmelerin ATmega8’in ayaklarıyla uyuşması gerekir. pin_t değişkeninin nerede tanımlandığını ise tüm dosyaları ve derleyici dosyalarını aratsam da bulamadım. Belki ileride karşımıza çıkar diyoruz ve burayı geçiyoruz.

Bir sonraki yazıda Arduino ayakları ile ilgili dosyaları incelemeye devam edeceğim. Ardından daha fazla AVR kodlarını içeren dosyalara geçebileceğiz.

UYARI!!

Kapak Resmi, https://images5.alphacoders.com/695/695933.jpg

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...

Bir cevap yazın

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