avr atmel logoC ile AVR programlama derslerimizin üçüncüsüne hoş geldiniz. Bu derste Atmega8535 entegresinin üzerinden AVR donanımına hızlı bir bakış atacağız. Bundan önceki iki dersimizde, programlama için gerekli araçları tanıtmıştık. AVR studio ve WinAVR programlarını indirip bilgisayarınıza kurmuş olmanız gerek.

AVRStudio ile proje oluşturma, program yazma, bunu kaydetme, derleme, debug yapma ve en sonunda da entegreye programı yükleme aşamalarını gösterdik. O dersi henüz okumadıysanız buradan okuyup bu derse öyle gelmenizi tavsiye ederim.

Daha önce Atmega16 entegresi üzerinden gideceğimizi duyurmuştuk fakat Atmega8535 ile devam etmeyi düşünüyoruz. Zaten aralarında bellek kapasiteleri dışında fazla farklılıklar yok.

Hadi, Atmega AVR mikro denetleyicilerin donanım yapısına Atmega8535 üzerinden bir bakalım:

atmel donanimi
Yukarıdaki şekil AVR Atmega8535 mikrodenetleyicisinin donanımına ait blok şemasıdır. Her mikrodenetleyicide olduğu gibi ALU, RAM, I/O ve Program Belleği gibi asıl birimlerin yanı sıra SPI (Seri haberleşme), Analog Comparator gibi ek birimler de var. Şimdi bazı birimlere kısaca göz atalım:

ALU, Aritmetik Lojik Birim:

Bütün aritmetik (toplama, çıkarma, çarpma ve bölme) ve mantıksal (AND, OR ve NOT) işlemlerin yapıldığını birimdir.

RAM, Random Access Memory:

Tanımladığımız değişkenlerin saklandığı registerlerdir. Örneğin,

char sayi;

Diye bir değişken tanımlarsak işlemci RAM’dan rastgele bir registere “sayi” değişkeninin atar. RAM’in adının nereden geldiğini anladınız mı? Rastgele bir yere yazıyor.

Mesela siz kardeşinize “al şu ilacı git, komidin çekmecesine koy” diyorsunuz. Kardeşiniz de gidiyor beş çekmecesi olan komidinde, ilacı ikinci çekmeceye koyuyor. Niye ikinci çekmeceye koydu? Rastgele koydu işte.

İşte işlemci de bizim tanımladığımız değişkenleri rastgele olacak şekilde registerlere yerleştiriyor. Ama yerleştirdiği bir registerin üstüne ikinci bir değişken yazmaz merak etmeyin. Gider boş olana yazar, boş register kalmadıysa derlenirken RAM doldu hatasını alırız.

Input Output Birim (I/O):

işlemcilerde olmazsa olmaz birimlerden biri de giriş çıkış birimleridir. Giriş çıkış birimleri olmazsa işlemciler ne işe yarar ki? Biz işlemcilerden, giriş yoluyla bilgileri alıp değerlendirmesini ve çıkış yoluyla da bize cevap vermesini isteriz.

Mikrodenetleyicilerde giriş - çıkış birimlerine PORT denir. Her PORT bir byte’dır ve bir portun her bitine de PIN denir. Atmega8535 entegresinde A,B,C ve D olmak üzere toplam 4 PORT ve 8’erden 32 PIN (giriş çıkış ucu) vardır. Biz bu pinleri ya çıkış olarak ya da giriş olarak kullanabiliriz.

Mesela bir buton bağlamak istiyorsak, PORT’lardan birinin herhangi bir pinini giriş olarak tanımlarız. Led bağlamak istiyorsak çıkış olarak tanımlarız.

atmel input output

Yukarıdaki resimde PORTB’nin 1.pinine (PORTB.1) bir buton, ikinci pinine ise bir Led bağlanmış. O halde, ben programımın başında PORTB.1 pinin giriş, PORTB.2 pinini ise çıkış olarak ayarlamalıyım. Girişe illa ki buton bağlayacağız diye bir kaide yok. Örneğin bir sensör de giriş elemanıdır. Ya da çıkışa sadece led bağlanmayabilir, örneğin bir motor da başka bir çıkış elemanıdır.

Peki, bir Pinin giriş ya da çıkış olmasını denetleyiciye nasıl anlatacağız? Çok basit, Her portun giriş çıkış registeri vardır. Bu registerda, giriş olmasını istediğimiz pine 0, çıkış olmasını istediğimiz pine 1 vereceğiz. Örneğin, yukarıdaki gibi PORTB.1 giriş, PORTB.2 çıkış olsun istiyorsak PORTB’nin giriş çıkış registeri olan DDRB’ye şu değeri atayacağız:

DDRB = 0xFD;  (Yani binary olarak 1111 1101 yazmış oluyoruz)

(AVR’deki DDRB’nin PIC denetleyicilerdeki TRISB’ye karşılık geldiğini görüyorsunuz)

Yukarıdakini yazarak şöyle diyoruz. Ey PORTB; senin 1.pinin ÇIKIŞ, 2. pinin ise GİRİŞ olsun. (Pinler sıfırdan başlar yediye doğru gider unutmayın. Yani en sağdaki bit, birinci pin değil sıfırıncı pindir, aynı şekilde en sondaki pine de PIN8 değil, PIN7 denir.)

İyi güzel de, diğer kullanmadığımız pinlere niye “1” verip çıkış yaptık? “0” verip giriş yapamaz mıydık? Yapardık ama sakıncalı, kullanmayacağımız pinleri “0” yapıp giriş olarak ayarlarsanız sağdan soldan gelen parazitler denetleyicinin düzgün çalışmasına engel olabilir. Onun için siz siz olun, kullanmadığınız bitleri çıkış olarak ayarlayın yani bu bitlere “1” verin. (Belki derslerimiz ilerler de en sona ulaşırsak EMC/EMI uygunluğu hakkında da bir ders yapabiliriz.)

NOT: Daha önce PIC mikrodenetleyici kullanmış arkadaşlara bir uyarı, giriş çıkış işleminin AVR’de ters olduğunu fark ettiniz sanırım. PIC’de giriş olarak kullanmak istediğimize TRIS registerinin pinlerine 1, çıkış olarak kullanmak istediklerimize 0 veriyorduk. Burada tam tersi. (www.ruzname.net)

Atmel AVR donanımı kısaca böyle. Assembly ile programlama yapacak olsaydık donanımı biraz daha ayrıntılı işlememiz gerekirdi. Örneğin Status register, Program Counter, Stack Pointer, 32 adet Working register, adresleme modları vb… şeylerden bahsetmemiz gerekecekti. Ama biz C dili ile program yazacağımızdan illa ki bunları göreceğiz diye bir kaide yok.

İşte direk C ve benzeri dillerle (basic, pascal) mikrodenetleyici programlamaya başlamanın dezavantajlarından biri budur. Yani donanımı tam bilmenize gerek olmadığı için aslında denetleyiciye tam vakıf olamadan program yazmaya başlıyorsunuz. Yine de biz, yeri geldikçe bu donanımlardan da kısaca bahsetmeye çalışırız…

Bu ders uzadığı için burada bırakıyorum ve dersi ikiye bölüyorum. Bir diğer başlıkta ilk programımızı yazıp çalıştırabiliriz.

Bir Önceki Derse Dönmek için Tıklayınız

Anahtar Kelimeler: Mikrodenetleyici, ALU nedir, Atmega8 Donanım Yapısı, Atmega8 Hardware, ATMEL AVR C programlama, Atmel AVR ile PIC Arasındaki Farklar, ATMEL AVR öğren, Atmel vs PIC, AVR dersleri, AVR vs PIC, IO Nedir, RAM Nedir

peynir6 suyu tozu , 08/02/2010-17:27 Facebook'ta Paylas