Bölüm-1 Mikrodenetleyiciler

Giriş

Her dönem çeşitli alanlarda popüler kültürün etkisi göze çarpar. Mesleki eğitim de bu popüler kültürden nasibini almaktadır. Yakın zamanımız içinde geliştirme kiti adı verilen çeşitli tipte gömülü uygulama kartları ortaya çıkmış ve çok popüler olmuştur. Bu tip kartların yaygın örneklerinden biri olan Arduino geliştirme kitleri esasında bundan çok daha uzun bir zaman önce, elektronik tecrübesi zayıf öğrencilerin hızlı ve pratik şekilde mikrodenetleyici uygulamalarını gerçekleştirmelerini sağlamak üzere bir Üniversite projesi olarak hazırlanmıştır. Bu tür uygulama geliştirme kitleri, hızlı ve pratik bir eğitim imkânı sağlaması açısından oldukça elverişlidir. Ancak gerçek hayatta uygulaması olacak ve maliyet faktörünün göz önünde bulundurulduğu, yalnızca belli bir amaca yönelik olarak tasarlanması gereken endüstriyel uygulamalar için elverişli değildir.

Dolayısıyla yazarlığını yapmış olduğum mikrodenetleyiciler kitabında ve bu elektronik içerikte yaygın olarak amaca uygun devre tasarımı anlatılmaya çalışılmıştır. Öğrencilerimizin mikrodenetleyici temelli tasarımda genelde en çok zorlandıkları konuların başında kaydedici temelli çalışma ve datasheet olarak adlandırdığımız veri kılavuzlarını okuyarak çözümleme yapma gelmektedir. İyi bir veri kılavuzu incelemesi ve kaydedici temelli çalışmayla mikrodenetleyicinizin dahili donanımlarından maksimum düzeyde yararlanacak çalışmalar yapmanız mümkün olacaktır.

Bu içerik ağırlıklı olarak Microchip firmasının 8-bitlik PIC® (Programmable Interface Controller) mimarisi esas alınarak hazırlanmıştır. Mikrodenetleyici eğitimi verilirken elektronik eğitimi de dikkate alınmış ve işlevsel uygulamaların tasarım süreçleri uygulamalı olarak anlatılmıştır. Uygulamaların tamamı bilgisayar ortamında canlandırılmış (simüle edilmiş) olup, bu iş için Labcenter Electronics firmasının PROTEUS® programı kullanılmıştır. Kitap boyunca ağırlıklı olarak Mikroelektronika firmasının mikroC PRO for PIC uygulama geliştirme editörü ve mikroC derleyicisi tercih edilmiş ve ayrıca CCS C derleyicisine de yer verilmiştir. Bu uygulamalardan bir kısmının, gerçek uygulamalarda kullanılmak üzere hazırlanmış baskı devreleri de kitapta sunulmuştur. Devrelerin tamamının devre kartı, delikli plaket ya da baskı devre şeklinde gerçek uygulamaları ve testleri başarıyla yapılmıştır.

Kimi örneklerin kodlamasında Microchip firmasının MPLAB X editörü ve XC8 derleyicisi de kullanılmıştır. Aynı örnek uygulamanın Mikroelektronika ve Microchip firmalarının editörlerinde nasıl kodlandığı uygulamalı olarak anlatılmıştır.

Microchip firması endüstriyel uygulamalar için çeşitli çözümler ve donanımlar geliştiren bir firma olmakla birlikte, en yakından bilinen üretim faaliyeti mikrodenetleyicilerdir. 8 bit PIC® ve AVR® mimarisi, 16-bit dsPIC ve 16-bit genel amaçlı PIC24F mimarisi, 32-bit PIC ve ARM mimarisi mikrodenetleyiciler ile 32-bit mikroişlemciler firmanın ürettiği programlanabilir ünitelerdir. Amaca uygun mikrodenetleyiciyi tespit edip en ekonomik çözümü gerçekleştirmek tasarımcının sorumluluğundadır ve bu konuda Microchip firması oldukça geniş bir ürün yelpazesi sunar.

8-bit Mikrodenetleyici Mimarisi

Mikrodenetleyici sahip olduğu bir dizi donanım sayesinde içine yazılan program kodlarını çalıştıran ve bu kodlara göre kapasitesi ve yeterlikleri doğrultusunda çeşitli işlemleri yerine getiren bir çeşit bilgisayardır.

Şekil 1.1’de Microchip firmasınca üretilen 8 bitlik PIC® (Programmable Interface Controller) mikrodenetleyicilerine göre hazırlanmış genel bir mikrodenetleyici yapısı blok şema olarak gösterilmiştir.

Şekil-1.1

Mikroişlemcinin temel işlevi, işlenen ve kullanılan verileri birimler arasında iletmek, iletilen verileri işlemek, verileri bir durumdan diğerine çevirmek ve verileri saklamaktır. Mikrodenetleyicilerin içerisinde, mikroişlemci bulunmakla birlikte RAM, ROM, Program Belleği, Sayıcılar, İletişim Modülü (UART-USART / MSSP), PWM Sinyal Üretici, Programlanabilir I/O portları, Salınım Üretici 0-40 MHz, Analog Dijital Dönüştürücü gibi çeşitli donanımlar gömülü olarak bulunur.

Microchip® firmasının PIC® mikrodenetleyicilerinde genel olarak program belleği ve veri belleği olmak üzere iki bellek alanı vardır. Program belleği kullanıcı tarafından yazılan ve denetleyicinin yeterlikleri kapsamında yapmak istediği işleme uygun kod yazdığı ve bu kodun kalıcı olarak saklandığı yerdir. Denetleyici modeline bağlı olarak program belleği kapasitesi değişir. PIC16 ailesi mikrodenetleyicilerinde program belleği 14 bitlik komutlar içerir. Diğer bir ifadeyle her bir komutun uzunluğu 14 bittir ve her bir sözcük 'Word' olarak adlandırılır. Örnek olarak PIC12(L)F1571 1 KWord program belleği kapasitesine sahipken PIC12(L)F1572 ise 2 KWord program belleği kapasitesine sahiptir.

Çevresel Aygıtlar ve Donanımlar

Tüm Mikrodenetleyici için ortak olan bazı çevresel aygıtlar (peripherals) ve dahili donanımlar vardır. Bunlar:
CPU: Her mikrodenetleyici bir Merkezi İşlem Birimine (Central Processor Unit) sahiptir. Merkezi işlem birimi mikroişlemcinin bir diğer adıdır. CPU mikrodenetleyici içindeki tüm birimlerin ve entegre devrelerin veri ve adres yolları üzerinden haberleşmesini sağlayan, RAM-ROM belleklerdeki veri ve program kodlarını okuyup çalıştıran, kısaca sistemin çalışmasını sağlayan en önemli birimdir.

ROM Bellek: Salt Okunur Bellek (Read Only Memory) anlamına gelen bir hafıza elemanıdır. Çeşitli türleri olmakla birlikte günümüz mikrodenetleyicilerinin büyük çoğunluğunda elektrikle silinebilir ve yazılabilir türü olan EEPROM modeli kullanılmaktadır. Mikrodenetleyicinin çalışması sırasında değiştirilen verilerin saklanması için kullanılır. Elektrik kesilse bile içindeki bilgi silinmez. Örnek olarak uygulamalarımızda yaygın olarak kullanılacak PIC16F628A mikrodenetleyicisinde 128 Byte’lık kalıcı (nonvolatile – elektrikle silinmeyen) bir EEPROM veri belleği bulunur. Bu belleğe programcı tarafından ilgili kaydediciler ve komutlar kullanılarak kalıcı bilgiler yazılabilir.

RAM Bellek: Rastgele Erişimli Bellek (Random Access Memory) anlamına gelen hafıza elemanıdır. Geçici olarak saklanan bilgilerin tutulduğu ve ROM belleğe göre daha hızlı çalışan bir bellek türüdür. Elektrik kesildiğinde içindeki bilgiler kaybolur. Aslında tüm ROM bellek türleri de rastgele erişimlidir. Rastgele erişim, Harddisk, CD/DVD ROM gibi manyetik ve optik disk kaydedicilerden farklı olarak, bilginin aynı hızda yazılıp silinebildiği bellek teknolojisidir. Bu teknolojide bilginin belleğin hangi adres bölgesinde olduğunun önemi yoktur. PIC16F628A mikrodenetleyicisinde 224 byte’lık uçucu (volatile – elektrik kesildiğinde silinen) SRAM (Static RAM) alanı bulunur. Mikrodenetleyici için yazılan programlar içinde birtakım değişkenler kullanılır. Programı yazdığınız platform tarafından kullanılan derleyici, program içinde üretilen kalıcı olmayan değerleri işte bu geçici bellek alanlarına yazar. Mikrodenetleyiciler için makine kodunu üretmekten sorumlu derleyicinin gerçekleştirmek zorunda olduğu en önemli görevlerden biri de bellek yönetimidir.

Flash ROM: Günümüz mikrodenetleyicilerinin büyük çoğunluğu USB belleklerin yapısına benzer şekilde bünyesinde Flash ROM bulundurur. Flash ROM da elektrikle silinebilir ve kaydedilebilir kalıcı tip bellek türüdür. EEPROM ile arasında tasarım yönünden farklılık bulunmaktadır. Flash ROM bellekler NAND Gate mimarisiyle, EEPROM bellekler ise NOR Gate mimarisiyle tasarlanmıştır. Bu durum kullanım ömürleri açısından da farklılık ortaya çıkartır. NOR Gate mimarisi biraz daha hızlı olmakla birlikte tasarım açısından daha maliyetlidir.

Bu tasarım farklılığı kullanım ömürleri açısından da farklılık ortaya çıkartır. EEPROM 1.000.000 (bir milyon) yazma ömrüne sahipken, Flash ROM 100.000 (yüz bin) yazma ömrüne sahiptir. Ayrıca Flash ROM’larda veriler bayt grupları halinde okunur. EEPROM’da ise tek seferde bir bayt okunabilir. Bu nedenle kullanıcı programı Flash ROM için ayrılmış olan bölgeye yazılırken, EEPROM daha çok program sırasında kullanılan sabitler, değişkenler ve program işleyişi sırasında değişen diğer veriler için kullanılır.

Mikrodenetleyici programlama kartları yardımıyla, mikrodenetleyicinin içine yüklenen program, bu Flash ROM mimarisinden oluşan program belleği alanına yazılır. Mikrodenetleyicilerin Flash ROM belleklerinin programlanması, genellikle yüksek voltaj programlaması (HVP) seviyesinde mikrodenetleyicinin VPP (ya da (MCLR) girişine 13 V seviyesinde voltaj uygulanmasıyla gerçekleştirilir. Düşük voltaj programlaması (LVP) seviyesinde ise 3.3 V-5 V arası bir voltaj verilmesiyle gerçekleştirilir. PIC mikrodenetleyicileri için genel olarak bellek tahsisini, PIC16F628A üzerinden Şekil 1.2’de gösterildiği gibi özetleyebiliriz. Tablo 1.1’de ise bu mikrodenetleyicinin türevleri için bellek değerleri gösterilmiştir.

Şekil-1.2

Tablo-1.1 Bazı PIC ailesi mikrodenetleyiciler için bellek kapasiteleri
MikrodenetleyiciProgram BelleğiVeri Belleği
Flash ROM (Word)SRAM (Byte)EEPROM (Byte)
PIC16F627A1024224128
PIC16F628A2048224128
PIC16F648A4096256256

Osilatör (OSC): İstenilen frekansta kare dalga sinyal üretilmesini sağlayan donanım osilatör olarak adlandırılır ve farklı türleri mevcuttur. Her mikrodenetleyici ve mikroişlemci belli bir hızda çalışır. Bu hız saat darbesi (Clock Pulse) olarak adlandırılır. Her bir saat darbesi için geçen süreye bir çevrim (periyot) denir. RISC (Reduced Instruction Set Computer) mimarisiyle tasarlanmış Mikrodenetleyici ve Mikroişlemcilerde her bir komut aynı çevrim süresinde işlem görür. Bu süre denetleyici veya işlemcinin çalıştığı frekansla ilişkilidir. Örnek olarak PIC18F4550 en yüksek 48 MHz hızında ve PIC16F628A ise en yüksek 20 MHz hızında çalışabilir.

Genel olarak MCU’larda OSC1 ve OSC2 bacakları bulunur. OSC1 isimli bacak CLKIN olarak geçer ve MCU’nun çalışması için gerekli kare dalga sinyal buradan verilir. OSC2 isimli CLKOUT bacağından ise bu frekansın dörde bölünmüş hali alınır. PIC® mikrodenetleyicilerinde çalışma frekansının 1/4 hızında program sayacı işler. 4’e bölünmüş saat frekansının karşılığı olan periyota "instruction cycle" yani komut süresi denir. Bu bir komutun işlenmesi için gereken zamandır.

Eğer bir mikrodenetleyici 4 MHz hızında çalışıyor ve bir komut çevrimi bir periyot sürüyorsa, öncelikle çevrim hızı 4 MHz/4 = 1 MHz olarak bulunur. Periyot T = 1/F’den 1 usn (mikro saniye) olarak elde edilir. Bu mikrodenetleyicide her bir komutun 1 mikrosaniye sürdüğü anlaşılır. Şekil 1.3’te düşen ve yükselen kenar zamanları kayıpsız olarak kabul edilmiş farklı iki frekanstaki bir saat darbe sinyalinin Lojik-1, Lojik 0 süreleri ve periyot ilişkisi gösterilmiştir.

Şekil-1.3

Dâhili ve harici osilatör türleri vardır. Quartz Kristal ile yapılan osilatörler direnç ve kondansatör kullanılarak yapılanlara göre daha kararlı çalışır. Mikrodenetleyicilerin bazı modellerinde harici ve dâhili osilatör seçenekleri mevcutken, bazı modellerde yalnızca harici osilatör desteği vardır. Tablo 1.2'de iki farklı PIC modeline göre osilatör seçenekleri sunulmuştur:

Tablo-1.2 Örnek iki farklı mikrodenetleyici için osilatör seçenekleri
MİKRODENETLEYİCİ12LF157216F628A
Maksimum frekans32 MHz20 Mhz
Osilatör Seçeneği
Sayısı
48
Osilatör ModlarıECL (External Clock Low-Power): Düşük güç tüketimi modunda harici saat darbesi kaynağı (0 - 0,5 MHz)

ECM (External Clock Medium-Power): Orta güç tüketimi modunda harici saat darbesi kaynağı (0,5 MHz - 4 MHz)

ECH (External Clock High-Power): Yüksek güç tüketimi modunda harici saat darbesi kaynağı (4 MHz - 32 MHz)

INTOSC: 31 kHz ile 32 MHz aralığında çok seçenekli dâhili osilatör modudur.
  • 32 MHz (4xPLL devresi gerektirir)
  • 16 MHz
  • 8 MHz
  • 4 MHz
RC: Tek pinli ucuz direnç/kondansatör seçeneği

LP: Düşük güçlü kristal osilatör seçeneği

XT: Standart kristal/rezonatör seçeneği

INTOSC: İki hızlı kararlı dâhili osilatör seçeneği. Bu modda mikrodenetleyici iki farklı frekansta çalıştırılabilir:
  1. 37 kHz
  2. 4 MHz

HS: Yüksek hızlı kristal/rezonatör modu

EC: Harici osilatör frekansı girişi

Sleep (uyku) modu: Güç tasarrufu sunan bir moddur. Kullanıcı mikrodenetleyiciyi harici kesme, reset grişi ya da dâhili kesmelerle uyandırabilir.

Kütükler-Kaydediciler (Registers): Mikrodenetleyicileri standart giriş/çıkış özellikli diğer sayısal entegre devre sistemlerinden ayıran en önemli özelliklerden biri kütüklerdir. Kütükler mikrodenetleyicinin içinde gerçekleşen pek çok işleme ait sonradan kullanılmak üzere tutulan bilgileri saklar. Ayrıca mikrodenetleyicinin sahip olduğu çevre birimlerinin (peripheral) nasıl çalışacağı ya da nasıl davranacağı da kütüklerde yapılan değişiklikler ile gerçekleştirilir. 8-bitlik MCU’larda kütükler de 8-bitliktir. Kütüklerin her bir bitinin lojik-0 ya da lojik-1 olma durumuna göre farklı işlemler gerçekleştirilir.

PIC mikrodenetleyicilerinde genel olarak iki adet kaydedici vardır. Bunlardan biri Özel İşlev Kaydedicileri (Special Function Registers - SFR), diğeri ise Genel Amaçlı Kaydediciler (General Purpose Registers - GPR) olarak adlandırılır. Her iki kaydedici de mikrodenetleyicinin SRAM belleğinde yer alır ve bu kaydedicilere yazılan değerler elektrik kesildiğinde sıfırlanır. SFR için ayrılmış bellek alanı mikrodenetleyicilerin veri kılavuzlarında belirtilen bellek boyutlarına dâhil edilmez. Veri belleği içinde SRAM olarak GPR alanı bulunur.

Port: Mikrodenetleyicinin fiziki dünya ile iletişim kurmasını sağlayan bağlantı noktalarıdır. Çıkış (Out-put-O) ya da giriş (Input – I) olarak kullanılabilir. PIC mikrodenetleyicilerinin çoğunda portlar alfabetik isimlerle anılırlar. Örnek olarak PIC16F628A mikrodenetleyicisinin A ve B olmak üzere iki adet 8 bitlik portu vardır. Bu portlar PORTA ve PORTB kaydedici isimleriyle anılır. Ancak PIC12F675 mikrodenetleyicisi tek bir porta sahiptir ve değer okuma/yazma işlemlerinde GPIO kaydedicisi kullanılır.

PIC mikrodenetleyicilerinde portun giriş mi yoksa çıkış mı olacağını belirleyen TRIS kaydedicisi bulunur. Hangi port kullanılacaksa o portun ismi ilave edilir. Örnek olarak A portu tüm pinleriyle çıkış yapılacaksa TRISA = 0X00, B portu tüm pinleriyle giriş yapılacaksa TRISB = 0xFF komutu kullanılır (PIC12F675 için TRISIO). Çıkış yapılan A portunun ilk dört bitine değer gönderilmek isteniyorsa, PORTA = 0x0F (ya da PORTA = 15, PORTA = 0b00001111) şeklinde bir yazım kullanılabilir. Diğer bir ifadeyle TRIS kaydedicisinin ilgili portunun pini giriş yapılacaksa lojik-1, çıkış yapılacaksa lojik-0 uygulanır.

Bu kaydedicilerden farklı olarak, kitapta kullanılan mikrodenetleyicilerden PIC12F1840 ve PIC18F2550/4550 modellerinde LATA (LATB, LATC, vb.) kaydedicisi bulunur. Bu kaydedici tutma belleği (latch) özelliklidir. Verinin ilgili porta gönderilmesinde PORTA ve LATA komutlarının ikisi de aynı davranır. Ancak veri okunurken PORTA doğrudan pinlerde gözüken veriyi okurken, LATA ise tutma belleğinde yer alan ve ilgili porta gönderilmesi düşünülen veriyi okur. Bu özelliği sayesinde, gönderilen ve okunan veri arasında hat kayıpları ve kapasitif etkilerden dolayı bir farklılık olup olmadığını anlayabilirsiniz. Kısacası LAT kaydedicisi “read-modify-write” (oku-düzelt ve yaz) işlemleri için kullanım avantajı sağlar.

Bank: Tüm PIC mikrodenetleyicileri, modeline bağlı olarak değişen sayılarda kaydedici rezerv alanlarına sahiptir. Bu rezerv alanları Bank olarak adlandırılır. Banklar, mikrodenetleyicinin veri belleği (data memory) alanında kaydediciler için tahsis edilmiş hücrelerden oluşur. 8-bitlik bir mikrodenetleyici için her bir hücrenin uzunluğu 8-bit kadardır. Örnek olarak PIC16F628A ve PIC16F887 için 4 adet bank varken PIC18F2550/4550’de 16 adet bank vardır. Özel ve genel amaçlı tüm kaydediciler bu banklarda yer alır.

Örnek olarak; PIC16F628A için Bank0, 00h – 7Fh; Bank1, 80h – FFh; Bank2, 100h – 17Fh ve Bank3, 180h – 1FFh SRAM belleği alanı içindedir.

Veri ve Adres Yolları: Her bilginin saklandığı bellek bölgesinde belli bir yeri vardır. Buraya erişebil-mek için adresin bilinmesi gerekir. Bilgisayar sistemlerinde adresleme olarak onaltılı (hexadecimal) sayı sistemi kullanılır. İlgili bellek bölgesine erişebilmek için kullanılan yola adres yolu denir. Adres yolu üzerinden ulaşılan bilginin ilgili yere taşınması için kullanılan yola da veri yolu denir. Adres yolları ve veri yolları 8 bit, 16 bit, 32 bit, 64 bit gibi uzunluk bilgisiyle anılır.

Zamanlayıcılar (Timers): Mikrodenetleyicinin ya da dış ortamdan başka bir donanımın çalışma hızına bağlı olarak yürütülecek zamana bağlı işlemler için kullanılan birimlerdir. Mikrodenetleyicinin özelli-ğine bağlı olarak en az 1 ya da daha fazla sayıda Timer bulunur.

ADC – Analog Dijital Çevirici (Analog Digital Converter): Zamana göre sürekli olarak değişen analog sinyalleri 1 ve 0 dizilerinden oluşan sayısal bilgiye çevirir. Böylece işlemesi zor analog sinyaller bilgisa-yarlar tarafından daha rahat işlenebilir.

DAC – Dijital Analog Çevirici (Digital Analog Converter): Bazı durumlarda dijital sinyallerin analog sinyallere çevrilmesi gerekir. Örneğin elektrik motoru gibi cihazların kumandasında bu çeviriciler kullanılabilir.

MCU Programlama ve Assembly

Programlama: Mikrodenetleyicilerin en önemli özelliği, makine dili dediğimiz 1 ve 0 sembolleriyle gösterilen kodların program belleği alanına uygun donanımlar yoluyla yazılması sonucu istenilen iş ve işlemleri gerçekleştirmelerinin sağlanmasıdır.

Tüm mikrodenetleyiciler belli voltajla çalışırlar. Genellikle Lojik-1 = 5V ve Lojik-0=0V’a karşılık gelir. Makine dili biz insanların anlamakta güçlük çekeceği bir dil olduğundan, konuşma dilimize yakın seviyede programlama dilleri geliştirilmiştir. Bu diller içinde en alt seviye programlama dili Assembly Dili olarak geçer. Assembly dili o mikrodenetleyiciyi üreten firmanın geliştirdiği program kodlarıdır. INTEL, Microchip, Motorola, Atmel, STM, Texas Instrument, vb. firmaların kullandıkları assembly dilleri farklılıklar gösterir.

Üretici firmaların aralarındaki bu farklılıkları ortadan kaldırmak ve kullanıcıların farklı mikrodenetleyi-ciler için ortak projeler ve programlar yazabilmeleri adına daha üst seviye programlama dilleri gelişti-rilmiştir. Python, PIC-Basic, PIC-C, mikroC, JAL, CCS C, vb. mikrodenetleyiciler için üst seviye prog-ramlama dillerine örnektir.

Örnek: (PIC Mikrodenetleyicisi için)

AssemblyMakine DiliAçıklama
MOVWF00 0000 1fff ffffW kütüğündeki (akümülatör) bilgiyi, 7 bitlik F dosya adres kütüğü ile gösterilen dosya adresine taşı.

Byte-Bit: Dijital donanım olan mikrodenetleyicilerde komutlar ve adresler ikilik sayı kodlarıyla temsil edilir. Lojik-1 ve Lojik-0 durumunun her birine bit denir. 8 bit bir Byte eder ve bilgisayar dünyasındaki anlamlı en küçük bilgi parçasıdır.

Kelime Uzunluğu: Mikroişlemcinin her saat darbesinde işlem yapabileceği bit sayısına kelime (Word) uzunluğu denir. İşlenen veriler işlemcinin özelliğine göre 4-bit, 8-bit, 12-bit, 14-bit, 16-bit, 24-bit, 32 bit ve 64-bit uzunluğunda olabilir. Aynı mikroişlemci ya da mikrodenetleyicinin kelime uzun-luğu, veri yolu uzunluğu, adres yolu uzunluğu farklılık gösterebilmektedir. Şekil 1.4’te farklı kelime uzunlukları gösterilmiştir.

Şekil-1.4

Akümülatör: Aritmetik ve mantık işlemlerinde bilginin geçici olarak saklandığı kaydedicidir. ACC, W ya da A harfleriyle gösterilir.

Program Sayıcı (Program Counter-PC): Mikroişlemcinin yürütmekte olduğu program komutlarının adres bilgisini tuttuğu özel amaçlı bir kaydedicidir. PC kısaltmasıyla gösterilir. Bir komutun çevrim sayısı kadar değişir. Tek çevrimde işleyen ADDWF, MOVWF gibi assembly komutları 1 çevrim sürer ve PC adres değeri ekstra değişmez; CALL, GOTO, RETURN gibi iki çevrimde işleyen komutlarda adres içeriği ekstra 1 artar. Koşullu olarak çalışan INCFSZ, BTFSC, BTFSS gibi komutlarda koşulun sağlanması durumunda 2 çevrimlik iş yapıldığından adres değeri ekstra 1 artar.

Bu ikinci çevrim assembly komutu olan NOP komutunun işletilmesiyle gerçekleştirilir. 18F serisi mik-rodenetleyicilerde belli şartların sağlanması durumunda 3 çevrim süren komutlar da vardır.

Yığın İşaretçisi (Stack Pointer): Program içinde CALL gibi dallanma komutlarıyla başka bir noktaya dallanma gerçekleştiğinde ya da bir kesme meydana geldiğinde programın kalınan noktasına tekrar geri dönmek için kullanılan adres bölgesidir. Yığın işaretçisi yazılabilir ya da okunabilir değildir. Program içinde kullanımını gerektiren bir durum oluştuğunda mikrodenetleyici tarafından veri yazılır ya da okunur.

Bir dallanma ya da kesme oluştuğunda PC değerinin tuttuğu program adresi 1 yükseltilir ve yığın işaretçisine yazılır. Bu işlem adres değerinin yığın işaretçisine İngilizce PUSH edilmesi olarak adlandırılır. Dallanma komutundan geri dönüş gerçekleştiğinde ya da kesme prosedürü sonlandığında program adres değeri yığın işaretçisinden alınır. Bu işlem verinin İngilizce POP edilmesidir. Böylece program dallanmanın gerçekleştiği adres değerinin bir sonrasından çalışmaya devam eder.

Yığın işaretçisinin boyutu ve derinliği mikrodenetleyici türüne göre değişiklik göstermektedir. Örneğin PIC16F887’de 13-bit uzunluğunda 8 yığın işaretçisi alanı vardır. XLP teknolojili ve yeni nesil PIC16(L)F18424-44’te ise 15-bit uzunluğunda 16 adet yığın işaretçisi alanı vardır. Yığın işaretçisi dairesel sıralı şekilde adres değerlerini alır. LIFO (Last In First Out) dediğimiz bir çalışma ilkesine göre yığın işaretçisine son giren adres bilgisi ilk çekilir. Dairesel sıralı şekilde adres bilgileri bir önceki değerin önüne yazılır ve son yığın işaretçisine de adres değeri yazıldığında, yeni gelen adres değeri tekrar yığının başından olacak şekilde yazılmaya devam eder. Böylece eski değerler sırayla silinmiş olur.

Şekil 1.5’te PIC16F887 ve PIC16(L)F18424-44 mikrodenetleyicileri için program belleği haritaları gösterilmiştir. PIC16F887 gibi daha eski nesil mikrodenetleyicilerde adres uzunluğu 13-bit olduğundan PC ve yığın işaretçilerinin veri alanları da 13-bit uzunluğundadır. Ancak PIC16(L)F18424-44 gibi yeni nesil 16F serisi mikrodenetleyicilerde adres uzunluğu ve dolayısıyla yığın işaretçisi veri alanı da 15-bit uzunluğundadır.

Görüldüğü üzere, CALL, CALLW gibi assembly komutlarıyla program içinde başka bir noktaya dallanma gerçekleştiğinde ya da kesme (interrupt) oluştuğunda kalınan adres değeri yığın işaretçisine alınır. RETURN, RETLW, RETFIE gibi assembly komutlarıyla program içinde kalınan yerden programa devam edlir.

Şekil-1.5

Kesme Vektörü (Interrupt Vector): Program içinde kesme oluştuğunda mikrodenetleyicinin kesme hizmeti yordamına (Interrupt Service Routine - ISR) gitmesini sağlayan kesme adresidir. 8-bit 16F serisi çoğu PIC mikrodenetleyicisinde 0004h değeri IV (Interrupt Vector) adresidir. 18F serisi yüksek segment mikrodenetleyicilerinde, yüksek öncelikli (high priority) olmak üzere 000008h ve düşük öncelikli (low priority) olmak üzere 000018h değerinde 21-bitlik iki adet adres vektörü bulunur.

Kesme oluştuğunda, mikrodenetleyici belleğin belli bir alanında yer alan ISR’ye gideceğini bilir. ISR’nin bellekte ki yeri, yazılan programı mikrodenetleyici için makine koduna çeviren derleyici tara-fından belirlenir. RETFIE komutuyla ISR’den çıkıldığında, PC’ye daha önceden yüklenmiş olan adres değerinden itibaren program çalışmaya devam eder.

Dolaylı Adresleme (Indirect Addressing): Mikrodenetleyicilerde bir bellek ya da kaydedici adresine başka bir işaretçi yardımıyla erişmek istediğimizde dolaylı adresleme dediğimiz bir yöntemi uygularız. Bu işlem ilgili adrese hızlı erişmemizi ve daha esnek işlem yapmamızı sağlar. Bilgisayar programcılı-ğında da sıklıkla yazılımcıların karşısına çıkan “pointer - işaretçi” kavramı mikrodenetleyicilerde dolaylı bellek erişimi için kullanılan bir kavramdır. Bu durumu PIC16F628A için assembly komutlarını kullana-rak aşağıdaki gibi açıklayabiliriz:

PIC16F628A’da bir kaydediciye dolaylı olarak gitmek için Dosya Seçme Kaydedicisi (File Select Regis-ter - FSR) kullanılır. FSR ile gerçekleştirilen dolaylı adreslemeyi okumak için de INDF (Indirect File Register) kaydedicisi kullanılır. Örneğin;

PORTA SFR kaydedicisinin PIC16F628A’da adresi 05h’dır. PORTB SFR kaydedicisinin adresi ise 06h’dır.

  • 05h adresinde 10h değeri olsun,
  • 06h adresinde ise 0Ah değeri olsun,
  • 05h değerini FSR kaydedicisine yükleyelim
  • INDF kaydedicisini okursak 10h değeri dönecektir
  • FSR kaydedicisinin değeri 1 artırılır
  • NDF kaydedicisi tekrar okunursa bu sefer yeni değer 0Ah olacaktır
  • Bu işlemlerin assembly kodu ve açıklamaları Tablo 3’te gösterilmiştir.

Tablo-1.3 Dolaylı adresleme ile PORTA ve PORTB içeriklerinin okunması
Assembly koduVeri ya da kaydedici adresiAçıklama
MOVLW0x10W akümülatörüne 10 hekzadesimal değeri aktarılıyor.
MOVWFPORTAW akümülatöründeki 10 hekzadesimal değeri PORTA'ya gönderiliyor.
MOVLW0x0AW akümülatörüne 0A hekzadesimal değeri gönderiliyor.
MOVWFPORTBW akümülatöründeki 0Ah değeri PORTB'ye gönderiliyor.
MOVLW0x05W akümülatörüne 5 hekzadesimal değeri aktarılıyor.
MOVWFFSRFSR kaydedicisine 05h değeri gönderiliyor.
MOVLWINDFINDF içeriği dolayısıyla 10h değeri W akümülatörüne yazılır.
INCFFSRFSR kaydedicisinin değeri 1 artırılıyor. Böylece dolaylı olarak 06h adresinin içeriğine ulaşılır.
MOVLWINDFW akümülatörünün yeni içeriği 0Ah değeri olur.

Kısacası INDF kaydedicisi gerçekte fiziksel bir kaydedici değildir. INDF kaydedicisi ile dolaylı olarak adres değeri FSR’de tutulan dosya kaydedicisine göndermede bulunulur. Yukarıda yapılan örneğin tersine eğer INDF kaydedicisine değer gönderilecek olursa FSR’nin gösterdiği adresin değeri değiştirilmiş olur. Bu örneği istenilen bir RAM aralığının temizlenmesiyle gösterelim. Mikrodenetleyiciler eğer herhangi bir işlem görmemişse bellek alanları FFh değeriyle kurulu olarak satılır. Örneğimizde RAM belleğinin 20h – 2Fh aralığı dolaylı adresleme ile temizlenecektir.

Tablo-1.4 Dolaylı adresleme ile bellek alanının bir kısmının temizlenmesi
EtiketAssembly kodlamaAçıklama
movlw 0x20W akümülatörüne 20h değeri yüklenir.
movwf FSRdolaylı olarak 20h adresli bellek alanı işaret ediliyor.
SONRAKIclrf INDFINDF kaydedicisi, dolayısıyla 20h adresi temizleniyor.
incf FSRFSR kaydedicisi, dolayısıyla 20h adres değeri 1 arttırılıyor.
btfss FSR, 4FSR'nin 4.bitinin değeri 1'mi?
goto SONRAKIHAYIR, o zaman SONRAKI satırına git.
DEVAMEVET, PC değeri 1 artırılır ve DEVAM satırından devam edilir.

Tablo 1.4’teki örnekte koşul sağlanana kadar bir sonraki adrese gidilmekte ve INDF kaydedicisi te-mizlenmek suretiyle ilgili adres değeri de temizlenmektedir.

Durum Kaydedicisi: Durum kaydedicisi 8-bitlik bir kaydedicidir. Bu kaydedicinin her bir biti ayrı ayrı anlam ifade eder. Mikroişlemci içinde veya dışardan yapılan herhangi aritmetiksel, mantıksal veya kesmelerle ilgili işlemlerin sonucuna göre bu bitler değer değiştirir.

Komut Seti: Mikroişlemciler ve Mikrodenetleyiciler genel olarak iki farklı komut mimarisi ile üretilir-ler. Bunlar:

  • CISC – Complex Instruction Set Computer: Karmaşık komut setini kullanan mimarilerde çok sayıda ve kelime uzunlukları değişen, dolayısıyla da çevrim hızları değişiklik gösteren bir komut dizisi kullanılır. Birkaç komutun yapacağı bir işlemi tek bir komutla yapmak mümkündür. Ancak komutların farklı hızlarda çalışması nedeniyle program işleme hızları değişiklik gösterir.
  • RISC – Reduced Instruction Set Computer: Azaltılmış komut setini kullanan mimarilerde daha az sayıda komut vardır ve komutların çevrim hızları daha düşüktür. Ayrıca her ko-mutun hızı genellikle aynı olduğu için bu mimaride yazılan program hızlarını kestirmek de daha kolaydır.

Hafıza Mimarisi: Genel olarak tercih edilen iki tür hafıza mimarisi vardır.

  • Harvard Memory Architecture Microcontroller: Bu mimaride veri ve program bellekleri ayrılmış olup her ikisi için de ayrı iletişim yolları kullanılmaktadır. Günümüz sistemlerinde kullanılan mimaridir.
  • Princeton (Von Neumann) Memory Architecture Microcontroller: Eski bir mimaridir. Günümüzde kullanılmamaktadır. Program ve veri belleği ortaktır. Veri işlemleri ve ko-mut işlemleri aynı ortak iletişim yolunu kullandığı için sistem performansı düşüktür.

ALU (Arithmetic Logic Unit): Aritmetik ve Mantık birimi tüm mantıksal ve aritmetiksel işlemlerin yürütüldüğü işlemci birimidir. Şekil 1.6’da ALU’nun çalışma ilkesi gösterilmiştir. Veri yolu yardımıyla bellekten akümülatör ve geçici kaydedicilere alınan bilgi, ALU’da işleme sokulur ve sonuç veri yolu üzerinden ilgili birimlere ya da yeniden kaydedicilere yazılır. İşlem sonucunda meydana gelen durum değişiklikleri (status) bayrak kaydedicisinde ya da durum kaydedicisinde tutulur.

Şekil-1.6

Silicon Errata: Mikrodenetleyicinin mühendislik tasarımı sırasında karşılaşılmayan, ancak sonrasında saha sonuçlarından gelen geri dönüşler neticesinde tespit edilen birtakım yarıiletken temelli malze-me sorunlarının yazılımsal olarak düzeltilmeye çalışıldığı yöntemlerin sunulduğu dokümanlardır. Do-ğal olarak bu tür dokümanlar mikrodenetleyici üretildikten sonra yayınlanır. Ayrıca veri kılavuzu gün-cellenmişse güncel veri kılavuzunda da bu düzeltmeler yer alır. Microchip firmasının resmi internet sayfasında ilgili mikrodenetleyici için tespit edilmiş bir sorun ve düzeltmesi varsa ayrı bir kılavuz şek-linde yayınlanır. Örnek olarak bu kitap içinde anlatılan mikrodenetleyiciler için, Timer1 modülü ile ilgili yayınlanmış “errata” kılavuzuna göre gerçekleştirilmiş bir düzeltme örneğinden bahsedilmiştir.

Mikroişlemci ve Mikrodenetleyici Arasındaki Farklar

Mikroişlemcili (MPU) bir sistemde program belleği, çevre cihazlarla iletişim için gerekli donanımlar, veriyolu ve adresyolu denetleyicileri gibi pek çok donanım harici olarak bulunur. Bu durum mikroişlemcili sistemlerin pahalı olmasına yol açar. Bellek, giriş/çıkış birimleri ve işlemciden meydana gelen basit bir mikroişlemcili sistem, daha sonrasında adı geçen elemanların tek bir entegre hâline getirilmesiyle mikrodenetleyici (MCU) adını almıştır. Bu durumun kısa bir özeti Şekil 1.7'de gösterildiği gibidir. Mikroişlemcili sistemi meydana getiren birimlerin kırpılmış özellikleri mikrodenetleyici sistemde kullanıldığından, maliyet düşmüş, programlanması kolay olmuş ve dolayısıyla boyutları da küçülmüştür. Mikrodenetleyiciler sürekli geliştirilmekte, özellikleri ve performansları arttırılmaktadır. Mikrodenetleyiciler bilindik kullanım yerlerinin dışında endüstride ve günlük yaşantımızda kendisine sürekli yeni kullanım alanları açmaktadır.

Şekil-1.7 (Kaynak: https://learn.microsoft.com/de-de/azure/iot-develop/concepts-iot-device-types)

Mikroişlemcinin temel işlevi, işlenen ve kullanılan verileri birimler arasında iletmek, iletilen verileri işlemek, verileri bir durumdan diğerine çevirmek ve verileri saklamaktır. Mikrodenetleyicilerin içerisinde, mikroişlemci bulunmakla birlikte RAM, ROM, Program Belleği, Sayıcılar, İletişim Modülü (UART-USART / Ethernet), PWM Sinyal Üretici, Programlanabilir I/O portları, 0-40 MHz Salınım Üretici, Analog Dijital Dönüştürücü gibi çeşitli donanımlar gömülü olarak bulunur.

Mikroişlemciler hafıza veya giriş çıkış entegresi gibi çevre elemanlar ile birlikte aritmetik işlemler yapabilen, karar verebilen entegrelerdir. Mikrodenetleyici ise mikroişlemcinin yanı sıra kendi program hafızası ve giriş çıkış özelliklerini içinde barındıran entegrelerdir. Bu özellikleri sayesinde yüklü bir programı uygulamaya dönüştürerek bir kontrol sistemi olarak kullanılabilir.

Mikrodenetleyiciler, mikroişlemcilere kıyasla daha özelleştirilmiş uygulamalar için hazırlanmıştır diyebiliriz. Çünkü gerekli elemanları kendi üzerinde barındırarak neredeyse yalnız başına çalışabilmektedir. Oysa mikroişlemciler bilindiği üzere BUS (veri yolu), IO (giriş/çıkış), RAM (bellek) vb. yapılara ihtiyaç duyarlar.

Orta Ölçekli PIC Mikrodenetleyicilerinin Mimarisi

PIC16Fxxx ve yüksek performans PIC18Fxxxx orta ölçekli 8-bit PIC® MCU ailesi geniş bir hafıza boyu-tu ve I/O pini seçeneği sunar. Serinin numara kodlarına göre pin sayısı ve hafıza boyutunun değişimi grafiksel olarak Şekil 1.8’de gösterilmiştir.

Şekil-1.8

Harward Mimarisi

Anlatılan uygulamalarda ağırlıklı olarak 2 adet PIC12F serisi, 2 adet PIC16F serisi ve 1 adet 18F serisi 5 farklı 8-bit MCU kullanılmıştır. Bu mikrodenetleyiciler piyasa fiyatı, donanım zenginliği, yaygınlık ve kullanım genişliği konusunda sundukları performans sonucu seçilmiştir.

Orta ölçekli PIC® MCU’lar çift yollu Harvard Mimarisini kullanırlar (Bkz. Şekil 1.9). Veri ve program yolları ayrıdır ve genişlikleri farklıdır. 16F serisi mikrodenetleyicilerde her bir program kodu uzunluğu 14-bit olduğundan program hafızası ile ALU arasındaki yol 14-bit genişliğindedir. RAM veri hafızası ile ALU arasındaki genişlik ise 8-bittir. Mikrodenetleyicinin 8-bit olarak anılmasında, veri adres yolu genişliği önemli bir etkendir. Her bir komut çevriminde program belleğinden okunan ilgili komut, 14-bitlik program yolundan ALU’ya getirilir.

Şekil-1.9

Komut Örneği ve Bilgi İletişim Kanalı (Pipeline)

Orta ölçekli PIC’lerin çift yollu mimarisi iki evreli bir bilgi işlem kanalı sunar. Her bir saat çevriminde iki komut fazı işletilir (Bkz. Şekil 1.10):
1.Faz: Sonraki komut “Program Belleğinden” getirilir (Fetch).
2.Faz: O anki komut işlenir (Execute) ve gerekiyorsa veri belleğine yazma, bellekten okuma ya da bellekteki veriyi değiştirme işlemi gerçekleştirilir.

Şekil-1.10

PIC mikrodenetleyicilerinin 1 numaralı osilatör girişindeki frekans dörde bölünerek birbiriyle örtüş-meyecek şekilde dört farklı sinyal elde edilir. Bu sinyaller Q1, Q2, Q3 ve Q4 olarak adlandırılır. Genel olarak PIC mikrodenetleyicilerinde bu işlemin nasıl yürütüldüğü Şekil 1.10’da gösterilmiştir.

Şekil-1.11

Orta ölçekli PIC® MCU’ların veri belleği kısmına daha yakın bir bakış yapacak olursak, çevre birimleri ve I/O portlarını kontrol eden kütüklere, belirli veri belleği adreslerinden okuma ya da adreslere yazma yoluyla ulaşıldığını görürüz. Çevre birimlerinin bellek adresleriyle haritalandırılması MCU’ların nasıl programlandığı mantığını daha iyi kavramanızı sağlar. Şekil 1.12’de çevre birimlerinin ve giriş/çıkış portlarının her biri için veri belleğinde adres alanı tahsis edildiği gösterilmiştir.

Şekil-1.12

Orta ölçekli her bir PIC® MCU’nun 16F serisinde 35, yeni nesil 16F serilerinde 50, 18F serisinde yaklaşık 75 assembly komutu vardır. Doğrudan veri belleği adresine erişen komutlar bir çevrim süresinde işler. Program sayacında değişime neden olan BRA, GOTO, RETURN, CALL, vb. komutlar iki çevrim süresinde işler.

I/O ve çevre birim kütüklerini veri belleğinde adreslemek suretiyle, PIC MCU’lar I/O işlemleri için ya da çevre birimlerinin kütüklerini ayarlamak için özel komutlara ihtiyaç duymaz. Bir I/O portuna bilgi göndermek istediğinizde ya da bir çevre birimini ayarlamak istediğinizde, basitçe ilgili adres bölgesine yazmanız yeterlidir. Benzer şekilde girişten değer okumak istediğinizde, analog/dijital dönüştürücünün değerini görmek istediğinizde ya da bir zamanlayıcının o anki değerine erişmek istediğinizde tek yapmanız gereken ilgili adres alanındaki bilgiyi okumaktır. Bu esneklik PIC mikrodenetleyicilerinin programlanmasını kolaylaştırır.

Mikrodenetleyicide bir programın çalışma mantığının anlaşılması açısından, Tablo 1.5’te hem yüksek seviyeli C diliyle, hem de assembly diliyle aynı işi yapan bir kod örneği gösterilmiştir.

Tablo-1.5 PIC MCU'larda örnek C ve Assembly kodlama
GörevC DiliAssembly Dili
Bir değeri değişkene YAZMAKint sayac=7;movlw
movwf
7
sayac, 0
Bir değeri kütüğe YAZMAKTMR0=0x10;movlw
movwf
0x10
TMR0, 0
Çıkış portuna YAZMAKPORTB=0xFF;movlw
movwf
0xFF
PORTB, 0
Giriş portunu OKUMAKsayac=PORTA;movf
movwf
PORTA, W
sayac, 0
Bir değişkenin değerini OKUMAKsayac=zamanmovf
movwf
zaman, W
sayac
Özel bir kütükten (SFR),
başka bir SFR'ye OKUMAK
CMCON=OPTION_REGmovf
movwf
OPTION_REG, W
CMCON