PIC Mimarisi – Hafıza Birimleri ve Özel Fonksiyon Yazmaçları

16F84A’nın datasheeti üzerinden PIC mimarisini anlatmaya devam ediyoruz. Datasheetin nasıl okunması gerektiğini ve ne anlama geldiğini yazıda yer yer bahsedeceğim. Bu yazı dizisinden öğreneceğimiz üç konu olacaktır. Birincisi genel mikrodenetleyici mimarisi, ikincisi PIC mimarisi ve son olarak datasheet okuyabilmek. O yüzden PIC programlamak isteyenlere yönelik değil gömülü sistemlere giriş yapmış ve bu alanda ilerlemek isteyenlere yönelik bir seri olacaktır. Dördüncü başlıkta ise datasheet üzerinden hafıza birimlerini ve temel yazmaçları anlatacağız.

Harvard mimarisini esas alan diğer aygıtlar gibi PIC denetleyicilerin de program hafızası ve veri hafızası olmak üzere iki ayrı hafıza biriminden oluştuğunu görmekteyiz. Teknik veri kitapçığında “Memory Organization” başlığında hem şema olarak hem de açıklama olarak gayet güzel anlatıldığını görüyoruz. Her hafıza biriminin kendine ait yolu bulunup aynı saat çeviriminde program hafızasına ve veri hafızasına erişim sağlanabilir. Bu özellik Harvard mimarisine özgü bir özellik olup bu mimarideki aygıtlar bu sayede daha performanslı çalışmaktadır. Bu mimarileri öğrenmeniz mikrodenetleyici ve mikroişlemci mimarilerini öğrenmenizi kolaylaştıracaktır. Bunun için Harvard ve von Neumann mimarileri arasındaki farkları yazdığım makaleme bakınız.

Veri hafızası (RAM) genel kullanımlı RAM ve özel fonksiyon yazmaçları (SFR) olarak iki bölüme ayrılmaktadır. Örneğin PORT, Zamanlayıcı birimlerine ait ayar ve verilerin tutulduğu yazmaçlara özel fonksiyon yazmaçları denir ve bunlar RAM bellekte tutulur. EEPROM hafızasının da dolaylı olarak veri hafızasında haritalandırıldığını öğrenmekteyiz.

Program hafızası ise 13-bit program sayacı tarafından adreslenir ve 8K x 14 bellek alanına kadar veriyi adresleyebilir. 16F84A denetleyicisi için 1K x 14 yani 0x000 ve 0x03FF arası adresleme yapabilmektedir. Bu hafızada reset konumu 0x0000 ve kesme konumu ise 0x0004 olmaktadır. Aşağıda program hafızasının haritasını görebiliriz.

Burada Program sayacının toplamda 13 bit olduğunu ve CALL, RETURN, RETFIE ve RETLW komutlarıyla alakadar olduğunu görebiliriz. Burada yığın (stack) da program akışında önemli bir rol oynamaktadır. Program RESET Vector adı verilen Reset konumundan itibaren işlemeye başlar. Reset konumu mikrodenetleyicinin yeniden başlatılması anlamına geldiğinden 0x0000 adresidir. Interrupt Vector adı verilen kesme konumu ise kesme yürütülürken atlanacak adrestir. Geriye kalan nokta ise bizim yazacağımız program verisini satır satır içermektedir. Program hafızası az ve basit yapıda olduğu için bu kadar bilgi bizim için yeterlidir. Bu şemalar her denetleyicinin datasheetinde benzer yapıda olduğu için kolayca öğrenmemize yardımcı olmaktadır.

Veri hafızası (RAM) bellek ise yazmaçları içerdiğinden biraz daha karışık bir yapıdadır. Öncelikle özel fonksiyon yazmaçları bellekte belli bir adresi tutmaktadır. Şemadan inceleyip anlatmaya devam edelim.

Burada belleğin iki ana bölüme ayrıldığını görebiliriz. Bu bölümlerden biri özel fonksiyon yazmaçlarının yer aldığı baştaki kısımdır. Öteki ise 68 genel maksatlı yazmaç olan SRAM kısmıdır. Burası programcının uygulamadaki verilerini kaydedeceği kısım olmaktadır. Özel fonksiyon yazmaçları ise sabit bir adreste olup o yazmaçlardan yazılıp okunan veri ile bazı özel işler yapılmaktadır.

Burada Bank 0 ve Bank 1 olmak üzere hafızanın iki ayrı bölüme ayrıldığını görebiliriz. Bu bankaları seçmek için STATUS yani durum yazmacının özel bir biti vardır. MOVWF ve MOVF komutları W yazmacındaki değeri istenilen yere kaydedebilir ve buradan değeri W yazmacına döndürebilir. Dosya seçme yazmacı (FSR) ile doğrudan veya dolaylı olarak herhangi bir hücre erişilebilir. Bank 0 ve Bank 1 bölmelerini ise STATUS yazmacındaki RP0 bitini 0 veya 1 yapmakla seçeriz.

Bunları bilmek Assembly dilinde program yazmak için zorunlu olsa da C dilinde sadece özel fonksiyon yazmaçlarını öğrenmek yeterli olacaktır. Mikrodenetleyicinin hafıza birimleri biraz kafa karıştırıcı olabilir. İşin içine değerin yanında adres girmektedir ve bellek erişiminde bazı kurallar vardır. Burada 68 adet genel maksatlı yazmaca erişimde Bank 0 veya Bank 1 diye bir ayrımı göremiyoruz. Bunlar doğrudan Bank 0 bölümüne haritalandırılmıştır. Kısacası burada dikkat etmemiz gereken nokta sadece SFR adı verilen özel fonksiyon yazmaçlarındadır.

Özel fonksiyon yazmaçları programlamada en sık kullanacağımız yazmaçlar olup mikrodenetleyici donanımına erişimi buradan sağlarız. 16F84A denetleyicisinde özel fonksiyon yazmaçları oldukça az olduğu için kısaca anlatma fırsatımız vardır. Şimdi tek bir sayfada tablo halinde verilen bu yazmaçlara bir bakalım.

Burada yazmaçlar iki ayrı bölüme Bank 0 ve Bank 1 olarak ayrılmıştır. Yukarıda belleği anlatırken bu bölümlerden bahsetmiştik. Burada en önemli yazmaç olarak STATUS yazmacını görmekteyiz. TMR0, PORTA, PORTB, EEDATA, EEADR gibi yazmaçlar mikroişlemciyle doğrudan alakalı yazmaçlar değildir. Yani bu yazmaçları bilmeden ve kullanmadan da bir program yazmamız mümkündür fakat örneğin EECON, EEDATA, EEADR yazmaçlarını bilmezsek EEPROM kullanma imkanımız olmaz.

Mikrodenetleyicinin datasheetini okurken çokça bakacağımız başka bir kısım da ayak açıklamalarıdır. Mikrodenetleyicinin her ayağının özelliğini “Pinout Description” başlığında bulabilirsiniz. Bunu gözden kaçırdığımız için burada kısaca bahsedelim. Bir sonraki başlıkta özel fonksiyon yazmaçlarını inceleyerek konumuza devam edeceğiz.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

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.