atmel chipC dili ile Atmel AVR programlama derslerimizin dörüncüsüdür. Geçen derslerde, Atmega8 denetleyicisinin donanımına ihtiyacımız olduğu kadar değinmiştik. Bu dersimizdeyse artık ilk programımızı yazıp derleyeceğiz. Bu ilk ve en basit programımızda, PORTB’nin ikinci pinine bağlanmış bir Ledi yakalım.

Aşağıdaki program parçası bu işi yapar, bir göz atalım.

1. #include <avr/io.h>
2.
3. void main(){
4.
5. DDRB = 0xFF;
6. PORTB = 0x00;
7.
8. do{
9.
10. PORTB |= 0x04;
11.
12. }while(1);
13.
14. return 0;
15. }

Şimdi programı bir anlatalım.

Siz, bu programı yazarken satır numaraları yazmayacaksınız. Ben, programı satır satır anlatacağım için yazdım bu satır numaralarını. Yoksa programda yazarsanız derlemez, hata alırsınız. Zaten derleyiciyi,  satır numaralarını göstersin diye ayarlayabilirsiniz.

Birinci satırdaki include komutu, bir “header” dosyasını programımıza dâhil etmekte kullanılır. Header dosyası dediğimiz şey, derleyicileri tasarlayan adamlar tarafından oluşturulur. Bunların içinde donanıma ait bilgiler vardır. Geçen yazıda sizlere bir şey demiştim: C programı yazmak fazla donanım bilgisi gerektirmez. İşte nedeni bu header dosyalarıdır.  Avr dizinin altındaki  io.h dosyasını include ile programımıza dahil edersek, mesela, PORTB’nin bellekteki adresini bilmemize gerek kalmaz. İşte “io.h” dosyası, bütün donanıma bizim anlayacağımız cinsten değerler atandığı bir dosyadır. Aslında, bütün donanıma değil, sadece giriş çıkış birimlerine.

"io.h” dosyasını programa dahil etmeseydik PORTB kelimesini programda kullanamazdık, hata verirdi. İsterseniz deneyin, görün. PORTB yerine PORTB’nin RAM bellekteki adres numarısını bilmek zorunda kaldık. Aynı şekilde DDRB registerinin adresini de bilmek zorunda kalırdık. Kısaca bu header file olmasaydı hafıza haritasını ezbere bilmek zorunda kalacaktık.

İkinci satırı, program güzel gözüksün satırlar birbirine karışmasın, okunabilirlik artsın diye boş bıraktık. Kötü bir niyetimiz yoktu. Siz de her satırda olmasa bile arada sırada birer satır boşluk bırakırsanız iyi olur. Mesela ben size ders olarak yazdığım şu yazıyı satırlara bölüyorum. Hiç satıra bölmeseydim, hiç entere basmadan yazımı yazsaydım, muhtemel yazı çok karışık olmuş diyip okumayacaktınız, itiraf edin. Ama birkaç cümlede bir entere basıyorum ve yazımı satırlara bölüyorum aynı şey. Tabi zırt pırt entere basmak da iyi değil. Programımızı, anlamlı bütünler oluşturacak şekilde satırlara böleceğiz.

Üçüncü satır, main fonksiyonunun başladığını bildirir bize. Daha önce C diline aşina olanlar bilir, C dilinde program fonksiyonlara bölünmüştür. Ve her programda main() denilen bir ana fonksiyon bulunur. Bu fonksiyonun başındaki void ifadesi fonksiyonun bir değer döndürmediğini söylüyor ama bizim için o kadar önemli değil siz bir C programının mutlaka bir ana fonksiyon içermesi gerektiğini bilin yeter:

void main() { bu satır ana programın başıdır. Bu bir kalıptır.

Bu araya program yazılır.Burası kalıp değil, size bağlı, ne yazarsanız o çalışır.

return 0; bu son iki satır ana programın bitişidir. Bu bir kalıptır

}

Her fonksiyon aç süslü parantez “{“  ile başlar ve kapa süslü parantez ile “}” biter.
Beşinci satırda, DDRB kaydedicisine yani PORTB’nin giriş çıkış belirleme sekreterine hexadecimal olarak FF, yani binary olarak 11111111 yüklemişiz. Yani PORTB’nin bütün pinlerinin çıkış olmasını istemişiz. Hani led bağlayacağız ya. O yüzden çıkış olmasını istiyoruz. Kullanmadığım tüm pinleri de çıkış yapıyoruz. (Niye mi? Demek bir önceki dersi dinlememişsin!)

Altıncı satırda, çıkış olarak ayarladığımız PORTB’yi sıfırlıyoruz. Şu halde, bir ölçü aleti alsanız ve PORTB’nin pinlerindeki voltajı ölçeniz idealde 0 volt görürsünüz. Dolayısıyla ben Ledin anodunu PIN2 ye katodunu da bir dirençle toprağa bağlasam Led yanmayacaktır.

Sekizinci satır ve on ikinci satırlardaki do while ifadelerinin her programımızda kullanacağız. Yani, biz asıl işi yapacak program parçasını ana fonksiyondaki;

do{
...

}while(1);

Kodları arasına yazmalıyız. Bu yöntem, yazdığımız program parçasına, sonsuz döngü sağlıyor (gâvurcası endless loop ya da super loop). Bunu yazmazsak programımız bir kere çalışır ve en son satırda kalır, başa dönmez.

Onuncu satırda, PORTB’ye hexadecimal olarak 04, yani binary olarak 00000100 verdik. Şu halde elinize bir voltmetre alıp PORTB’nin pinlerini ölçseniz, yalnızca PIN2 de +5V olduğunu, diğer pinlerde 0V olduğunu görürsünüz. Yani biz Led’in anodunu PIN2’ye katodunu da bir dirençle gnd’ye bağlarsak led yanmış olacak. Program amacına ulaştı.

Şimdi PORTB |= 0x04 ifadesine daha yakından bakalım. Aslında bu ifadenin daha açık şekilde yazılış şekli şudur:

PORTB = PORTB | 0x04;

Yukarıdaki ifadeyle bizim en başta yazdığımız PORTB |= 0x04; arasında milim fark yok, aynı manada. Tek fark birinin kısa, biri uzun yazılış şekli. Yani “Doktor Ahmet” yazmıyoruz da “Dr. Ahmet” yazıyoruz.

Pekâlâ, şimdi o satırda bir “|” işareti görüyoruz. Bu Mantıksal OR’dur. Mantıksal OR kapısı görmüşsünüzdür, ne yapardı? Girişine gelen iki ifadeyi OR işleminden geçirip çıkışa aktarıyordu. Örneğin girimini bir tanesi lojik “1”, diğeri “0” ise çıkışım 1 olurdu. Bunun doğruluk tablosunu biliyorsunuzdur.

PORTB = PORTB | 0x04; satırıyla POTRB ile 0x04 sayısını OR işlemine sokup, sonucunu yine PORTB’ye yazıyoruz. Buna ne gerek var PORTB’ye direk 0x04 versek, yani:

PORTB = 0x04 yazsaydık olmaz mıydı?

Tamam, itiraf ediyorum, bu örnek için olurdu. Çünkü PORTB’yi biz en başta sıfırlamıştık, yani kendisinde hiç bilgi (lojik 1) yok.

Ama eğer PORTB’de bir ya da bir kaç bilgi olsaydı, örneğin sıfırıncı biti “1” olsaydı yani PORTB = 0x01 olsaydı. Biz ikinci biti bir yapmak yani PIN2’ye bağlı ledi yakmak amacıyla;

PORTB = 0x04 yazsaydık,

PIN2’yi lojik 1 yapma (ledi yakma) amacına ulaşmış olurduk ama PORTB’nin üzerine yazmış olacağımızdan, sıfırıncı bitteki bilgi (lojik 1) kaybolacaktı (lojik 0 olacaktı).

İşte, bu tür bilgi kayıplarını önlemek maksadıyla bilgiyi register’a direk yazmıyoruz da yazmak istediğimiz değer ile (bu örnekte 0x04) Registerı (burada PORTB) ile OR işlemine sokup aynı registere (PORTB) bu şekilde kaydediyoruz. Böylece herkes mutlu oluyor.

On dört ve on beşinci satır, bize programın bittiğini bildirdi.

Proje oluşturmayı, Programı derlemeyi ve debug yapmasını geçen derslerde göstermiştik, bilmeyen o dersi takip ederek programın hex kodunu üretebilirler...

Bir yazının daha sonunda geldik. Maalesef çok yavaş gidiyoruz. Biraz fazla ayrıntıya girdiğimi hissediyorum. Çünkü hiç bilmeyen ama meraklı olanların da faydalanmasını istiyorum. Bu ayrıntılar bu işi biraz bilenlerin canını sıkabilir ama yapacak bir şey yok. Kısaca yazıp geçmek benim de işime gelir doğrusu. Fakat herkes faydalansın.

Bir dahaki dersimizde, programımıza bir buton ekleyelim ve buton ile ledi yakalım. Veri türlerini ve aritmetik - mantıksal operatörleri görelim. Daha ileride de IF, SWITCH; WHILE yapılarını görelim. Ardından bir kara şimşek örneği yapalım. (mı?)

Allah’a emanet olun.

Anahtar Kelimeler: Mikrodenetleyici, Atmel ATmega Programlama, Atmel AVR C e-book, Atmel AVR C kitap, Atmel AVR C Programming, Atmel AVR kullanımı, Atmel Türkiye, C ile Atmel AVR dersleri

peynir6 suyu tozu , 09/02/2010-05:31 Facebook'ta Paylas