Mikrodenetleyici Programlamaya Başlamak – 2

Mikrodenetleyicileri programlamaya ve kullanmaya başlamadan önce mikrodenetleyicilerin kabiliyetlerini, çevre birimlerini ve kullanacağımız araçları tanımamız gerekiyor. Bu nedenle öncelikle hangi birimlere sahipler ve programlarken neler kullanacağız gibi soruların cevaplarını arayacağız.

Not: Bu yazı dizisi boyunca vakit buldukça mikrodenetleyiciler ile ilgili her kaynakta bulabileceğiniz akademik-teorik bilgiler ya da kodlama bilgisinden çok mikrodenetleyicilerin çalışma yapısını mikrodenetleyici kavramlarını ve algoritma kurma mantığını daha anlaşılabilir kılacak bilgiler vermeye çalışacağım. Anlaşılmayan noktaları veya sorularınızı yorumlar üzerinden iletebilirseniz bazen zor anlaşılır olan bu alanda güzel bir kaynak ortaya çıkmasına katkıda bulunabilirsiniz.

Çevre Birimler (Peripherals)

Yazının ilk bölümünde bahsettiğim gibi mikrodenetleyiciler mikroişlemcilerden çevre birimlerine sahip olmaları ile ayrılırlar. Bir gömülü sistem tasarlanırken merkezi işlem biriminin yani bir işlemcinin yanında kalıcı ve geçici bellekler, analog dijital dönüştürücüler, genel amaçlı giriş çıkış birimi, zamanlayıcı gibi farklı birimlere de ihtiyaç duyulur. İşlemcilerin boyutlarının küçülmesi ile birlikte 1968 yılında Amerikan savaş uçaklarının uçuş bilgisayarında kullanılmak üzere bir mikroişlemci ile bazı çevre birimler tek bir tümdevre (ya da chip-yonga) içerisinde üretilerek ilk mikrodenetleyici ortaya çıktı. Günümüzde farklı mimariler farklı üreticiler mikrodenetleyicilerinde onlarca farklı çevre birimi sunuyor ve her geçen gün bu çevre birimlerin sayıları da, kabiliyetleri de artmaya devam ediyor.

Öncelikle bu çevre birimlerinden en önemli olanlarını tanıyalım, diğer çevre birimleri üzerinde daha sonraki yazılarda konuşacağız.

Osilatör: Osilatörler (clock) mikrodenetleyicilerde işlemcinin ve çevre birimlerinin senkronize çalışmasını sağlayan aynı zamanda mikrodenetleyicinin çalışma hızını belirleyen birimlerdir. Bu birimi daha iyi anlayabilmek için şöyle bir örnek verebiliriz; insanlar zamanı gösteren her hangi bir araç olmadan da zamanı algılayabilirlerken mikrodenetleyiciler için bir saatin tik-takları gibi zamanı belirten bir araca ihtiyaç vardır. Osilatörler mikrodenetleyicilerin bu amaçla ayrılmış özel pinlerine belirli hızlarda bir kare dalga işareti verirler. Böylelikle mikrodenetleyiciler için de artık zamandan dolayısıyla hızdan bahsedebiliriz. Her mikrodenetleyici birimi yaptığı işlemin her adımını saat darbesinin lojik 0 dan 1 e yükseldiği ya da 1 den 0 düştüğü sırada yapar. Bir 0 ve Bir 1 den oluşan süreye bir “cycle” yani bir çevrim denir. Osilatörün uyguladığı kare dalganın frekansı mikrodenetleyicinin çalışma hızını belirler. Örneğin 10 Mhz ‘lik bir osilatör bir saniyede 10 milyon kez kare dalga işareti uygulayacak (10 milyon cycle) ve çalışan işlemci saniyede 10 milyon işlem yapacaktır. 

RAM (Geçici Hafıza): Mikrodenetleyicilerde de tıpkı kişisel bilgisayarlarda olduğu gibi mikrodenetleyicinin çalışması esnasında geçici olarak hafızada tutulması gereken veriler oluşur. Bu veriler üzerinde daha  (kalıcı hafızaya göre) hızlı işlem yapmak, daha hızlı erişmek için RAM (Random Access Memory) bulunur. Mikrodenetleyiciler bilgisayarlara göre çok daha az işlemi gerçekleştirmek için tasarlandıklarından hafıza birimleri de kısıtlıdır. Maliyetleri düşürmek (daha düşük hafızalı bir mikrodenetleyici kullanarak) için bu kısıtlı hafıza birimlerini verimli kullanmak gerekir.

ROM (Program Hafızası- Kalıcı Hafıza): Bir mikrodenetleyicinin yapacağı işlemler çeşitli programlama dillerinde kodlanırlar, ardından bu kodlar derleyiciler ile 1 ve 0 ‘lardan oluşan makina koduna çevrilirler. Bu makina kodu program hafızasına yazılarak mikrodenetleyici programlanır. Program hafızasına sadece programlama esnasında yazılabilir ve mikrodenetleyicinin çalışması sırasında değiştirilemez , bu nedenle (Read Only Memory- ROM) olarak da adlandırılırlar.

Giriş Çıkış Birimi (GPIO): GPIO birimi mikrodenetleyicinin dış dünyaya açılan kapısıdır. Bu birim üzerinden giriş çıkış pinleri ile harici birimlere veri ya da güç aktarımı yapılır. Örneğin bir pine bağlı led yakılırken güç aktarımı yapılır, bir haberleşme pini üzerinden farklı birimlere veya başka bir mikrodenetleyiciye veri gönderilebilir.

Saklayıcılar: Saklayıcılar mikrodenetleyicilerin en önemli birimidir diyebiliriz. İçeride yapılan tüm işlemler saklayıcılar arasında yapılan veri transferleri ile yapılır. Çevre birimleri saklayıcılar tarafından kontrol edilirler, değişkenler, sayılar saklayıcılarda tutulurlar. Saklayıcı temel olarak mikrodenetleyicideki en küçük hafıza birimidir. 8 bit mikrodenetleyiciler için 8 bitlik yapıya sahiptir. Mikrodenetleyicileri programlarken bu terimi sıklıkla çevre birimlerin kontrolü sırasında duyacağız ve kullanacağız. Çevre birimlerin konfigurasyonlarını o birime ait saklayıcılar içine yazdığımız veriler ile sağlayacağız.

Mikrodenetleyicileri Programlamak

Bir üreticisi mikrodenetleyicisi ile birlikte bu mikrodenetleyiciyi programlamak için oluşturduğu komut seti ile birlikte duyurur. Çok temel seviyedeki işlemleri yapmak için oluşturulan bu komut setine daha uygun bir tabirle bu komut setinin kullanıldığı programlama diline assemlbly denir. Fakat bu komut setini kullanarak mikrodenetleyicileri programlamak oldukça karmaşıktır. Çok basit işlemleri yapmak için bile satırlarca komut yazmanız gerekebilir. Bu nedenle mikrodenetleyicileri daha kolay programlamak ve daha üst seviyeli programlama dillerinin nimetlerinden yararlanmak için derleyiciler geliştirilmeye başlandı. Günümüzde bir çok üretici komut seti ile birlikte C dilinde yazılan mikrodenetleyici programının assembly komutlarına çevrilmesini sağlayan derleyiciler ile birlikte geliştiricilere sunuyor. Bu mikrodenetleyici derleyicilerine örnek olarak PIC C, Atmel Studio, Keil, IAR ve MPLAB ‘ı verebiliriz. 

Bir önceki yazıda C dilinin gömülü sistemlerde en çok kullanılan programlama dili olduğu bilgisini vermiştim. Aradan geçen uzun zamanda Python özellikle gömülü linux işletim sistemi  (daha sonra bahsedeceğiz) kullanılan projelerin artması ile birlikte gömülü sistemlerde en çok kullanılan programlama dili listesinde 1. sıraya yükseldi. Listeyi görüntülemek için linke tıklayabilirsiniz. En çok kullanılan programlama dilleri | IEEE Spectrum

Üst seviyeli bir dilde yazdığımız kodlar derleyiciler ile önce assembly komutlarına, ardından derleyici içerisinde assembler denilen programlarla makina kodlarına çevrilirler. Bu kodlar yine birmikrodenetleyici tarafından yönetilen programlayıcı devreleri ile program hafızasına yazılır. Programlayıcılar bu kodları üreticilerin mikronetleyici tasarımı sırasında belirlediği formatta, mikrodenetleyicilerin programları pinleri üzerinden gönderirler.

Bir sonraki yazıda ilk mikrodenetleyici programımızı yazacağız ve bu programı mikrodenetleyicilerin çalışma mantığı açısından inceleyeceğiz…