Register (Saklayıcı) Nedir ?



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