Arduino Kaynak Kodu İncelemesi -7- AnalogRead() ve AnalogWrite() Fonksiyonları

Önceki yazımızda Arduino’nun digitalWrite(), digitalRead() gibi dijital giriş ve çıkış fonksiyonlarını incelemiştik. Şimdi ise sıra analog fonksiyonlara geldi. Analog fonksiyonlar mikrodenetleyicinin dijital bir sistem olmasından dolayı kısıtlıdır. AVR programlamada bile yapabileceğimiz analog işlem ADC ve PWM ile sınırlı kalmaktadır. Yani kare dalga üretebiliriz ya da gelen analog sinyali okuyabiliriz. Analog işlemler hakkında bilgi için lütfen Arduino Eğitim Kitabı’nın ve C ile AVR Programlama derslerinin ilgili yerlerine bakın. Burada sadece kodu incelemekle yetineceğiz.

Bizim analog işlemleri yaptırdığımız kodların yer aldığı dosyanın adı wiring_analog.c dosyasıdır. Bu dosyayı bu yazıyı okumadan önce açıp ekranın bir köşesine çekmenizi tavsiye ederiz. Dosyayı aşağıdan okuyabilirsiniz.

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

Bu dosya wiring_private.h ve pins_arduino.h adında iki kütüphane dosyasını çağırıyor. Bu iki dosyayı da daha önce inceledik.

analogReference fonksiyonu ile ADC referansının ne olacağını kararlaştırıyorduk. Burada ise bizim argüman olarak gönderdiğimiz değeri analog_reference değişkenine aktardığını görüyoruz. Burada analog referansına dair bir işlem yapılmamıştır.

Burada ise analogRead adında ADC okuma fonksiyonunu görmekteyiz. Aslında bu fonksiyona çok benzer bir fonksiyonu C ile AVR programlama derslerinin ADC konularında görmüştük. Klasik ADC okuma fonksiyonunu buraya taşıdıklarını görüyoruz. Tabi ki uyumluluk açısından #if defined gibi eklemelerin var olduğunu görmekteyiz. analogRead fonksiyonu aynı AVR kodunda olduğu gibi bir ayak numarası almak zorundadır. Bu ayak numarası ise ADMUX yazmacına yazılır. Böylelikle hangi ayaktan okuma yapılacağı kararlaştırılır.

Analog okuma değerinin 10-bit olup 8 bitlik bir değişkene veya yazmaca sığamayacağını biliyoruz. Bu yüzden düşük ve yüksek bayt olarak iki bayt verisini ortaklaşa kullanarak okumamız gerekli. Sonrasında ise bunu 16 bit olarak geri döndürebiliriz. Burada ise düşük ve yüzsek yazmaçlardan veri almak için iki adet 8 bitlik değişken tanımlandığını görmekteyiz.

Burada ADMUX yazmacı hem analog referans verisini hem de multiplexer verisini içeriyor. Burada iki değerin uygun bitlere yazıldığını görmekteyiz. Daha ayrıntılı bilgi için ADC yazmaçlarını konu aldığımız derslere bakabilirsiniz.

Eğer ATmega1280 kullanılıyorsa farklı kodlar çalıştırılır. Bizim hedefimiz Arduino’nun kullandığı ATmega8 ve aynı serinin 16 ve 32 kodlu entegreleri olduğu için bu kısımları atlayacağız.

Burada ADC çevirim başlatma biti bir (1) yapılır ve sonrasında ise çevirim bitene kadar program sonsuz döngüye sokulur.  Aslında başka bir şekilde de kodu yazmak pek mümkün değildir. Çünkü mikrodenetleyicinin kurallarına göre programı yazmadıkça doğru çalıştırmamız mümkün değildir.

Burada ADCL’yi önce okumak gereklidir aksi halde doğru sonuç alınmaz. Bunu derslerimizde de söylemiştik. ADCL yani ADC dönüşümünün verisini tutan alt yazmaç low değişkenine üst yazmaç ise high değişkenine aktarılır.

Bunu AVR derslerinde de anlatmıştım. Üst bitler sekiz adım sola kaydırılır ve alt baytın önüne yazılır. Böyellikle 16-bit bir veri için doğru dizilim elde edilmiş olur.

Bu analogWrite fonksiyonunu atmega8’e göre tekrar düzenleyip buraya koydum. Yoksa kolay kolay anlatmam mümkün değildi. Çünkü kodun ortasında atmega1280 komutu yer alıyor sonra yine atmega8 komutu yer alıyor ardından ise tekrar atmega1280 komutlarına geçiliyordu. Kafanızın karışmaması için atmega8 için işletilen komutları yukarıda sırasıyla görmeniz mümkündür. analogWrite fonksiyonu Arduino’da PWM üretmek için kullanılıyordu.

Bu fonksiyon pin ve value adında iki argüman alıyor. Bunlardan biri çıkış alınacak ayak numarası öteki ise çıkış değeridir. Bu çıkış değeri 0-255 arasında olup 8 bitlik bir değerdir. Aslında ATmega’dan 16 bitlik PWM sinyali almak mümkündür. Fakat yazılımda böyle bir kısıtlama vardır.

Bu kontrol yapısında digitalPinToTimer makrosu çalıştırılır ve her ayak için tanımlanmış zamanlayıcılar bulunur ve ortaya çıkarılır. Bu makroyu ve sabit diziyi önceki yazıda incelediğimiz için bir önceki yazıya bakabilirsiniz. Burada bunu tekrar incelemeyeceğiz.

OCR1A yazmacı karşılaştırma değerini içeren yazmaçtı. Karşılaştırmaya kadar yazmaç saymaya devam eder ve karşılaştırma değerine gelinde taşma gerçekleşir ve sıfırlanırdı. Burada da val değerinin karşılaştırma değerini ve pek tabii görev döngüsünü (duty cycle) belirlediğini görmemiz mümkün.

En sonunda ise başka bir kontrol yapısını görmekteyiz. Ayaklar zamanlayıcılara isabet etmeyince bunlar değere göre sabit sinyal  veriyor. Bu programlayıcı hatasından kaynaklanan bir durumu kararlı hale getirmek için yapılmış olsa gerektir.

wiring_analog.c dosyasında bizi heyecanlandıran pek bir şey göremedik. Oldukça basit ADC okuma ve PWM üretme fonksiyonlarına rastladık. digitalWrite() gibi fonksiyonları AVR’ye uyarlamak biraz uğraştırıcı olsa da bu fonksiyonları  neredeyse olduğu gibi AVR’de kullanmamız mümkün. Kaynak kodları incelerken diğer dosyaları incelediğimde ise bazılarının yazılımsal yönünün ağır bastığını ve C++ ile yazılmış olduğunu görüyorum. Diğer dosyalar ise AVR donanımına yönelik ve bizim derslerde anlattığımız işlemlerden çok da farklı değil. O yüzden Arduino kaynak kodunu incelemeyi burada bitirelim.

Bu yazı dizisinden anlamamız gereken en önemli şey birkaç Arduino fonksiyonu ile ne mühendislik ne de geliştiricilik yapılabildiğidir. İki arduino fonksiyonu kullanmakla, hazır kodları kopyalamakla kendine maker diyen insanların olduğu bir sektörde yabancı makaleleri çat pat İngilizce ile yarım yamalak tercüme edebilen “İçerik yazarı” oluyor. Bu böyle devam ettikçe bizim bu alanda ses getirecek bir iş ortaya koymamız mümkün değildir.  O yüzden ne kadar zahmetli olsa da en ileri seviye bilgiyi sizlere açıklamaya çalıştım. Her ne kadar okuyucusu az olsa da bir gün birilerinin işine muhakkak yarayacaktır.

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

Bir cevap yazın

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