Register nedir ? Bu sorunun cevabını AVR mikro denetleyici üzerinden, dilim
döndüğünce ve kendi anladığım kadarıyla cevaplamaya çalışacağım.
Register, küçük hafıza birimleridir. bir işlemcinin, mikro
denetleyicinin veya bir entegrenin işlemleri nasıl yapacağı hakkında bilgilerin
yazıldığı alanlardır. Bir işlem öncesi bakılması gereken hafıza bölümünü,
hesaplamalar sonucu bulunan değerleri ve giriş-çıkış işlemlerinde yönlendirme
bilgisi gibi kayıtlar tutulur. Aşağıdaki şemayı incelerseniz 8 adet led
diyot ve bu ledlere gerilimin gelişini kontrol eden anahtarlar (dip switch)
göreceksiniz. bu anahtarlardan hangisini "on" "kapalı"
konumuna getirirsek o pine bağlı led yanacaktır. Örneğin 2,4 ve 6 numarayı
"on" konumuna getirirsem led2, led4 ve led6 yanacaktır.
Alttaki şemada kırmızı kutunun içini
Atmega328p de bulunan PORT adı verilen bölüm olduğunu hayal edin (PORTD).
Başka bir tabirle Arduino'da gerilim verip harici devre elemanlarını
yönettiğimiz dijital çıkışlar D0-D7 arası pinler olduğunu hayal edin.
Bu pinlerin çıkış ya da giriş olması durumunu Arduino idesinde
pinMode() fonksiyonu ile yapıyoruz. Çıkış olarak ayarladığımız porta-pinlere
bağlı olan ledleri yakmak için digitalWrite() fonksiyonunu kullanıyoruz.
C ile nasıl yapıldığına bu konu sonunda değineceğim. Bu ledlerin hangisinin
yanmasını istiyorsak ona göre fonksiyonda pin numarasını belirtmemiz
gerekecektir. Yukarıdaki örnek üzerinde gidersek. digitalWrite(2, HIGH); digitalWrite(4,
HIGH); digitalWrite(6, HIGH); komutlarını Arduinoya vermemiz
gerekir. İki örnekte de aslında yapılan aynı şeydir. Çıkış
olarak tanımlanan pinlerin anahtarlarını açıp kapatarak ledleri yaktık.
Burada anahtarlar bizim çıkış olarak tanımlı
pinlerimizin gerilimi geçirip geçirmeyeceği bilgisini tutan
"Register" dir. Bizim yazdığımız digitalWrite(2,
HIGH); fonksiyonunda bulunan parametrelerden "2" hangi anahtarın
seçili olduğunu "HIGH" ya da "1" seçilen anahtarın
"on" "kapalı" konumda olması gerektiğini söyler. Bu bilgiyi
alan mikro denetleyici bizim elle yaptığımız işi yapar ve ledler yanar. Bu
örneklerde anlatmaya çalıştığım saklayıcı "register" bizim
örneğimizde PORTD registeridir. PORTx registeri 328P de bulunan b,c ve d
portlarının çıkış durumunu kontrol eder. PORTB, PORTC ve PORTD şeklinde kontrol
edilir. DDRx giriş-çıkış durumunu, PINx giriş durumunda pinlerdeki gerilimi
kontrol eder.
Aşağıdaki şema kabaca atmega328p de port
registerlerini gösteriyor. DDRx giri-çıkış durumunu kontrol eder. DDRx
registerinin hepsi kapalı "0" olduğunda ledlerin yanma şansı yoktur.
Pinler giriş modundadır PINx registerine bağlıdır ve pinlerin gerilim
durumu kontrol edilebilir. PORTx registeri çıkış durumunu yönetir dedik. DDRx
registerinin hepsi "1" olduğunda PORTx registerinin "1"
veya "0" olmasına göre ledler yanabilir.
Atmega328p datasheetten alıntı port registerleri.
Şu ana kadar registerin ne olduğu konusunda
faydalı bilgi aktarmış olduğumu umut ediyorum. Biraz daha farklı bir konu olsa
da burada değinmem gereken "bit"ler var. Anahtarın register olduğunu
söyledik, registerin açık-kapalı, on-off, high-low ve
"1"-"0" olması durumuna göre ledleri yaktık. Şematik
registerde 8 adet anahtar var, 2,4 ve 6 numaralı anahtarların "on"
yani "1" olması diğer anahtarların "0" olması durumunu şu
şekilde yazsam soldan sağa doğru 7. anahtardan 0 numaralı anahtara doğru
anahtar konumları "01010100" şeklinde olacaktır.
"1" olan anahtarlar "on" konumunda. Bu 8 haneli bir ve
sıfırlardan her biri bir "bit" 8 tanesinin toplamı bir
"byte" tır. İkilik sayı sisteminde karşılığı 0b01010100 şeklinde
yazılır. Onluk "Decimal" sistemde "84" 16lık
"Hexadecimal" sistemde ise "54" sayısına karşılık gelir ve
"0x54" şeklinde yazılır. Soldan sağa doğru bitlerin isimleri anahtar
numaralarıyla aynıdır. Sol taraf yüksek bit sağ taraf düşük bit olarak isimlendirilir.
Anahtarları "registerleri" elle
kontrol etmek yerine küçü robotların bu işi yaptığını düşünelim. Bu robotlara öyle bir bilgi vermeliyiz ki hem anahtar numarasını hem de anahtarın açık mı
kapalı mı olduğunu anlayabilsin. (Bu robotlara 3 sayı sisteminden hangisini
verirsek verelim hepsini ikilik sayı sistemine çevirecekler.)
0xF3=243=0b11110011 üç sayı sisteminden birbirine
dönüşmüş hali yeni bir örnek olsun. Bu robotlara 0xF3 dediğimizde bize bir
cevap veremeyeceklerdir. Bizim onlar için bu sayıların anlamlı hale gelmesini
sağlamamız gerekir. Bunun için bu sayıları nereye yazacaklarını, nerede
kullanacaklarını bilmeleri gerekir. İşte register isimleri burada devreye
giriyor. PORTD 0xF3 olacak ya da PORTD 0b11110011
olacak dersek onlarda gidip üst şemadaki 7,6,5,4,1 ve 0 numaralı anahtarları
"1" "on" konumuna getirirler. Bu arada herşey 1ve 0 dan
oluşuyor PORTD dediğimizde aslında 0x2B = 0b00101011 bellek adresini söylemiş
oluyoruz.
Bunun C dilinde yazılışı digitalWrite() yerine
PORTD=0xF3; veya PORTD=0b11110011; şeklinde olur. Doğru ve uygun olan
yazım şekli yalnızca "1" yapmak istenen bitleri "1"
yapmaktır. PORT|=0xF3;
Hiç yorum yok:
Yorum Gönder