MİKROİŞLEMCİLERİN YAPISI VE ÇALIŞMASI
Günümüzde teknolojinin ilerlemesini inceleyecek olursak; bu ilerlemede hem araç hem de amaç olan özel bir elemanı keşfetmemiz uzun sürmez. “Nedir bu eleman?” denildiğinde; cevap tabi ki bilgisayarlardır.Öyle ki; yaptığımız her işte adeta elimiz ayağımız haline gelmiş olan bilgisayarlar, günlük hayatımızın ayrılmaz bir parçası haline gelmiştir. Burada bilgisayarlar denildiğinde, hepimizin aklına klavyesi ve ekranıyla PC dediğimiz bilgisayarlar gelmektedir. Halbuki çevremizde o kadar farklı “bilgisayarlar!” vardır ki, bunları dikkatli bakmadığımızda göremeyebiliriz.
Örnek vermek gerekirse kolumuzdaki saatten, televizyonumuzun uzaktan kumandasına, aracımızın frenlerinden fırınımızın pişirme sistemine kadar her yerde bilgisayarlar karşımıza çıkar. Burada bilgisayar denildiğinde gerçek anlamda “istenilen işlemler dizisini, istenilen zamanda ya da istenilen süreçte yapabilen sistemler” içerisinde mikroişlemci bulunduran (ve hatta bazen bulunmayan) elemanlardan söz etmekteyiz.İşte bu şekilde hayatımızın içine girerek araç haline gelen bilgisayar sistemleri, aynı zamanda teknolojinin geliştirilmesi durumunda bir amaçtır.
Bu şartlarda, bu sistemleri, üretim aşamasında ya da tüketim aşamasında bilmek veya kullanabilmek günümüzde büyük önem kazanmıştır. Tüketici olarak basit mikroişlemcili aletleri hemen hemen herkes, hatta okuma yazması olmayanlar bile (tv uzaktan kumandaları) kullanır hale gelmiştir. Günümüzde PC bilgisayarlar da işletim sistemlerinin geliştirilmesiyle herkes tarafından kullanılır hale getirilmeye çalışılmaktadır.
Üretim aşamasında ise, kullanılacak malzemenin cinsine göre ince bir ayrıntı işin içine girmektedir, ki bu ayrıntı işlemin cinsine göre mikroişlemci ya da mikrokontrollör olarak kendini göstermektedir. Bu iki terim aslında temelde aynı olmakla birlikte, aralarındaki farkı şöyle çarpıcı bir örnekle görmek mümkündür.
Bir televizyon uzaktan kumandası için bir mikroişlemci kullanmak demek, adeta bir cep
bilgisayarı şeklinde kumanda demektir ki buda maliyet açısından büyük külfet demektir. Halbuki bu işi bir mikrokontrollör ile yaptığımız zaman maliyet, imalat ve boyut açısından büyük avantajlar elde ederiz. Öyleyse bu iki elemanın farkı nedir?
Mikroişlemci dediğimiz eleman temelde bir programı icra etme yeteneğin sahip bir elemandır; ancak bu icra işlemi için çok fazla sayıda yan aparata ihtiyaç duyar. Bu aparatları kısaca hafızalar, osilatör elemanları, besleme elemanları, girişçıkış elemanları şeklinde sıralamak mümkündür.
Bu listedeki besleme elemanları, zaten her türlü elektrikli devrede kullanılması gereken elemanlardır. Osilatör devresi ise yerine göre tek bir elemanla bile yapılabilen bir devre parçasıdır. Bunları bir tarafa bıraktığımızda, bir mikroişlemci ile iş gören bir devre yapmak istediğimizde, en çok uğraşılacak bölüm hafıza (RAM, ROM, Adres Decoder) ve Giriş-Çıkış (PIA ve Buffers) elemanlarıdır ki plaket üzerinde mikroişlemcinizin kaplayacağı alandan kat
kat fazlasını işgal ederler.
Mikrokontrollör elemanında ise, hafıza ve giriş-çıkış bölümleri ve hatta bazı modellerde A/D ve D/A dönüştürücü elemanları da tek chip üzerine yerleştirilmiştir. Böylece mikrokontrollör ile işlem yapabilmek için, devreye ilave olarak sadece besleme devresi ve osilatör devresi elemanlarını eklemek yeterli olacaktır. Böylece gerekli durumda pil ile besleme yapılırsa, kibrit kutusunun yarısı büyüklüğünde devreler üretmek ve bir çok işi yaptırmak mümkün olacaktır.
Yukarıda anlattığımız özelliklerinden dolayı günümüzde, özellikle sanayi tipi uygulamalarda mikrokontrollörler PC ve PLC türü devrelerin yerini almaya başlamıştır.
MİKROİŞLEMCİLİ SİSTEMLERE GENEL BAKIŞ
Mikroişlemcili sistemler denildiğinde genel olarak bilgisayarları anlamak mümkündür. Bu tip elemanlara kullanıcı tarafından bakıldığında aşağıdaki gibi bir yapıya rastlamak mümkündür.
Bu sistemde kullanıcı olayın sadece giriş-çıkış ünitesi ile ilgilidir ve sadece burada olan olaylarla ilgilidir. Bu üniteler; kullanıcının sisteme ulaşmasını ya da sistemin kullanıcıya ulaşmasını sağlayan ünitelerdeir. Bir diğer deyişle kullanıcının sistemi kullanmasını sağlayan, sisteminde kullanıcıya işlem sonuçlarını iletmesini sağlayan ünitelerdir.
Günümüzdeki sistemlerde sıkça kullanılan giriş ve çıkış ünitelerini aşağıdaki gibi
sıralamak mümkündür.
Giriş Üniteleri: Klavye,Mouse,joystic,Disk sürücüler,CD-ROM, DVD-ROM,Fax-modem,Light Pen,Ekran,Kart-Şerit,Sensörler (Algılayıcılar)
Çıkış Üniteleri: Ekran,Printer, Plotter,Disk sürücüler,CD-Writer, DVD-ROM,Fax-modem,Kart-Şerit,Kontrol Devreleri
Bu cihazların tamamı, kullanıcı açısından bakıldığında, yapısı ve fonksiyonları yönünden çok farklı cihazlardır. Ancak işlemci açısından bakıldığında, sistem içerisindeki bir hafıza ünitesi ile bu cihazların çalışma şekli açısından hiçbir fark yoktur. Olaya işlemci açısından baktığımızda, işlemcili sistemin genel yapısı aşağıdaki gibidir:
Şekil.1.1’i inceleyecek olursak mikroişlemcili bir sistemin fonksiyonel olarak nasıl çalıştığını anlayabiliriz. Sistemin çalışması şöyledir:
Giriş ünitesinden gelen bilgiler hafızaya aktarılır. Hafızaya kaydedilen bilgiler, içerisinde işlem içeriyorsa, işleme girecek bilgiler öncelikle ALU’ya (Aritmetik ve Lojik İşlem Ünitesi) aktarılır. Burada gerekli işlemler yapıldıktan sonra sonuçlar tekrar hafızaya aktarılır. İşlem sonuçları hafızadan alınarak çıkış ünitesine aktarılır.
Tabii ki bu işlemlerin belirli sırayla olmasını sağlamak gereklidir. Ayrıca giriş ünitesinden
gelecek bilgilerin işlem mi, yoksa bilgi mi olduğunu ayırt edecek bir sisteme gerek olduğu açıktır. İşte bu sisteme kontrol ünitesi diyoruz. Kontrol ünitesi bu sisteme enerji verildiğinde devreye girer ve giriş ünitesine gerekli emirleri verir. (Kontrol ünitesi, giriş ünitesine der ki: Bazı bilgiler sana verilecek.
Bilgiler gelmeye başladığında bana bildir.) Giriş ünitesine veriler gelmeye başladığında öncelikle kontrol ünitesine haber gider ve kontrol ünitesi hafıza ünitesinde gerekli ayarlamaları yapar. (Kontrol ünitesi, hafıza ünitesine der ki: Girişten bazı bilgiler sana gönderilecek. Bu bilgileri xxxx adresinden itibaren kaydet.) Böylece giriş ünitesinden gelen bilgiler hafızaya kaydedilir. Bu arada girilen bilgilerin hangisinin komut, hangisinin veri olduğunu kontrol ünitesi ayırt eder.
Eğer bilgiler içerisinde işlem varsa, ALU üzerinde ve hafızada gerekli ayarlamaları yaparak işlemlerin yapılmasını sağlar. (Kontrol ünitesi, hafıza ünitesine ve ALU’ya der ki: Hafıza ünitesi; xxxx adresinden itibaren olan bilgileri ALU ya gönder, ALU’ya da derki hafızadan gelen bilgileri al ve xx işlemini yap ve yine hafızaya der ki ALU’dan gelecek işlem sonuçlarını xxxx adresinden itibaren kaydet.) Son olarak hafıza ünitesindeki sonuçların çıkışa aktarılmasını, yine kontrol ünitesi sağlar.
Bu işlem içinde hafıza ünitesi ve çıkış ünitesi arasındaki işbirliğini ve bağlantıları yine kontrol ünitesi ayarlar. Eğer bu şekilde bir işlem grubu tamamlanmış olduğunu düşünürsek, bu işlem grubu tamamlanınca kontrol ünitesi, yine giriş ünitesine gerekli uyarıyı vererek sisteme yeni girişleri beklemeye başlar.
İşte burada “ALU ve Kontrol Ünitesinin” ikisi birden tek chip üzerindedir ve bu elemana mikroişlemci denir. Bu blokların dördünü birden üzerinde bulunduran tek bir chip’e ise mikrokontrollör denir.
MİKROİŞLEMCİLİ SİSTEMLERİN YAPISI
Önceki bölümde bahsettiğimiz gibi mikroişlemcili sistemde mikroişlemci; belirli bölümlere belirli komutları vererek, işlemleri kendi kontrolünde işleten bir yapıya sahiptir. Bu yapı içerisinde tüm sistem mikroişlemcinin kontrolündedir. “Öyleyse mikroişlemci bu kontrolü nasıl sağlar?” sorusunun cevabına bir bakalım. Mikroişlemci yan sistemlerle tüm bağlantısını üç hat üzerinden yapar. Bu hatlar:
a) Data bus
b) Address bus
c) Kontrol bus
Öncelikle bus kelimesinin anlamına bakalım.Bus kelimesi bir grup hattı simgelemektedir. Yani tek bir iletim hattı değil de genellikle birbirine paralel olan 4, 8, 12, 16… gibi gruplardan oluşan ve birçok ayrı sistemi birbirine bağlayan iletim hatlarına bus diyoruz. Buna göre:
Data Bus: Sistemdeki dataları taşıyan hat gruplarına denir. Genellikle sekiz hattan oluşurlar ve paralel bilgi taşıma tekniğine uygun olarak işlemcinin içinde ve dışındaki bilgi taşıma işlevini yaparlar. Çift yönlü işletim hatlarıdır, yani bu hatlar üzerinden bilgi her iki istikamette de gider.
Address Bus: İşlemci yan cihazlara ulaşmak için her seferinde ulaşmak istediği cihazı seçmek zorundadır. Bu seçme işlemi address bus üzerinden gönderilecek bilgi ile yapılır. Burada seçilecek yan cihaz, diyelim ki tek bir chip ise bu chip’in Chip Select Ucu’na gerekli bilgiyi ulaştırmak bu elemanın seçilmesi demektir. Bu işlem için address bus üzerinden gönderilen bilgi, address decoder üzerinden kod çözme işleminden geçerek gerekli bilgiyi (1 ya da 0) seçilecek elemanın chip select ucuna ulaştırır. Ancak seçilecek eleman bir hafıza ise, bu elemanın chip select ucuna gerekli sinyalin ulaştırılması yetmez. Bu durumda, hafıza elemanının çeşitli kontrol uçlarından da ayrıca gerekli bilgilerin gönderilmesi gerekir. Bununla ilgili detayları ileride göreceğiz.
Kontrol Bus: İşlemciniz adres seçme ve bilgi hatlarını kullanırken bunların tek başına kullanılması yeterli olmaz. Örnek vermek gerekirse, en basit olarak üstte belirttiğimiz örnekte bir hafıza elemanı seçildiğinde (RAM) “Bu elemana bilgi mi yazılacak, yoksa bu elemandan bilgi mi okunacak?” sorusunun açıklığa kavuşması gerekir. Bu durumda da kontrol hatlarının bir tanesi olan R/W (Okuma/Yazma) hattından gerekli bilgilerin ilgili hafıza elemanına ulaşması gerekir. İşte işlemcinin kontrol etmesi gereken yan elemanlara, gerekli komut, senkronizasyon ve kontrol sinyallerini gönderdiği hatlara, kontrol bus diyoruz. Kontrol bus’un diğer bus’lardan farkının, “her bir hattın kendi başına bağımsız gibi çalışıyor olması” olduğu buradan anlaşılmaktadır.
REGİSTER’LER
Bir mikroişlemcinin işlemleri yaparken bazı geçici hafızalara ihtiyaç duyacağı kesindir. Çünkü aritmetik ya da lojik işlem yapan üniteler içlerinde bir hafıza ünitesi içermezler. Durum böyle olunca diyelim ki bir toplama işlemi yapacağınız zaman elinizde tam toplayıcılardan oluşan bir paralel toplama ünitesi varsa, bu ünite toplama işlemini gerçekleştirmek için giriş kısmında toplanacak iki sayının hazır olmasını isteyecektir.
Bunun için de paralel toplayıcınızın girişinde iki adet (8 bitlik) registere ihtiyaç duyulacağı kesindir. Ayrıca işlem yapıldığında sonucun kaybolmaması için bir yere kaydedilmesi gerekecektir ki, buda bir (8 bitlik) registerdir. Ayrıca elde, ya da işaret biti taşması durumunda, sonucun taşma ya da işaretleriyle ilgili bilgilerini tutmak için tek bitlik hafıza elemanlarına ihtiyaç vardır. İşte bu sebeplerle her işlemci, bazıları özel ve bazıları genel amaçlı olmak üzere içerisinde register bulundurmak zorundadır.
a. Akümülatör (Working register) : Genel amaçlı bir registerdir. Tüm işlemcilerde bulunan bu register Acc ya da A ismiyle anılır. Pic serisi işlemcilerde ise W adıyla anılmaktadır. Bu register işlemlerin çoğunda kullanılan bir registerdir. İki operandla yapılan işlemlerde, operandlar işleme girerken, operandlardan bir tanesi burada tutulur; aritmetik ya da lojik işlemlerde işlem sonuçlarını tutar, ayrıca çok özellikli bir register olduğu için bit işlemleri, kaydırma, döndürme, eksiltme, artırma, tersini alma gibi işlemler de burada yapılabilir.
b. Program Sayacı (PC:Program Counter): Bu register ise program akışını kontrol eden bir registerdir. Çalışmakta olan programların adresleri burada tutulur ve sayılır. Program icra edilirken halen işletilecek olan komutun adresi PC’de bulunur ve bu komut okunduğunda adres otomatik olarak 1 artar. Eğer komutun bir operandı varsa komut algılandıktan sonra bu operand okunur ve bu okunma tamamlanınca PC yine 1 artar. Bu şekilde PC sistemin işleyişini kontrol etmiş olur. Ayrıca program içerisindeki atlama komutlarında atlanacak adres, PC’ye yüklenerek programın bir yerden bir başka yere atlaması sağlanır.
Ayrıca alt program çağırma işlemlerinde, programın bir noktadan diğer bir noktaya atlarken geri dönüş adresinin belirlenmesi açısından, programın o anda çalıştırdığı adresin de bir yerlerde tutulması gerekir. Bu bölüme ise STACK adı verilir. Stacklar FILO (First In Last Out) mantığına göre çalışırlar. Bir işlemcinin stack kapasitesi, o işlemcinin çalıştırabileceği alt program adedini belirler. Intel firmasının sanayi tipi işlemcilerinde stack için bir segment (Ör:8085) ayrılırken, daha basit tipteki işlemcilerde (Ör: 6502) 1 K’lık alan ayrılmaktadır. Pic serisinde bu alan daha azdır. Mesela PIC16C8X ailesinde 8 byte’dır. Pic serisinde direkt kullanımı olmamasına rağmen, diğer işlemcilerde stacka direk müdahale için stack adresini tutan Stack Pointer registeri ile ilgili komutlar vardır.
c- İşlemci Hal Kaydedici(Processor Status Register): PS ya da Status adıyla anılan bu register bayrak işaretlerini tutan registerdir. Diğer registerlerden farklı olarak bu register, blok olarak değil tek tek bit olarak ele alınır. Bu registerin bitlerine bakılarak işlemin ve işlemcinin durumu hakkında bilgi elde etmek mümkündür.
ARİTMETİK LOJİK ÜNİTE (ALU):
İşlemcinin diğer bir önemli parçası ise aritmetiksel ve mantıksal işlemlerin yapıldığı kısım olan ALU birimidir. Bu birim tüm işlemcilerde bulunur ve işlemcinin yapabildiği işlemlerin kapasitesini belirler. Genellikle toplama, çıkarma, komplement alma, lojik and, or, exor işlemleriyle bit kaydırma, döndürme işlemlerini yapabilme yeteneklerine sahiptir.
HAFIZA BİRİMLERİ:
Mikroişlemcilerde dış ünite olarak kullandığımız hafıza elemanları mikrokontrollörlerde iç ünite durumundadır. Bunları yapısına göre iki ayrı grupta toplamak mümkündür:
a) RAM (Random Access Memory)
b) ROM (Read Only Memory)
Ram hafıza yazma ve okuma amaçlı bir bölümdür. Bu özellikleri sebebiyle program içerisindeki geçici bilgileri (ki biz onlara değişken diyeceğiz)tutmak için kullanılacaktır. Bazı işlemcilerde ramın program hafızası olarak kullanıldığını görmek mümkündür, ancak bu işlemciler ya bir dış kalıcı hafıza tarafından desteklenmekte ya da içerisinde şarj olabilen bir pil içermektedirler.
Rom hafıza ise program hafızası olarak kullanılan bir hafıza çeşididir. Sadece okunabilme özelliğine sahip olduğu için, bir kez programlandığında programın silinmesi diye bir şey söz konusu olmamaktadır. Ancak, bu durum bazen sorunlara yol açmaktadır. Bir iş yapılırken program yazılır yazılmaz, tam şekliyle çalışması hemen hemen imkansız gibidir. Bunun için yazılan programın çeşitli denemelerden geçirilerek geliştirilmesi gerekmektedir. Bu işlem için ise, eğer mikrodenetleyiciniz bir kez programlanabilen ROM hafıza içeriyor ise, program geliştirilmesi esnasında her bir yeni program yazımında kaldır at şeklinde çalışılacaktır.
Bu sistem pek ekonomik değildir. Bu sebeple Pic serisi işlemcilerde Rom kullanılan işlemcilerin yanında EPROM ve EEROM kullanan modeller mevcuttur. Program geliştirirken eerom’lu (pic16f84) işlemciler kullanılıp, tasarım tamamlandıktan sonra piyasaya sürülürken
rom’lu işlemciye (pic16c84) yazılmaktadır, böylece daha ekonomik tasarım yapmak mümkün olmaktadır.
ZAMANLAMA, DENETİM VE İLETİŞİM BİRİMLERİ:
Mikroişlemciler içerisindeki programı icra edebilmek için beslemenin yanında bir clock sinyaline ihtiyaç duyarlar. Bu ünitenin bir kısmı işlemcinin içerisinde iken bir parçası dışarıdadır. Osilatör olarak isimlendirilen bu kısmın tamamı chip üzerine konulmaz; çünkü sistemin hızını bu bölüm belirler. Kullanıcıya esneklik sağlaması açısından, osilatörün frekans belirleyen parçaları dışarıdan eklenecek şekilde tasarım yapılır. Ayrıca standart zamanlama problemlerinin çözümü için, programlanabilen standart zamanlama register ya da sayıcıları da bu bölümde bulunur.
PROGRAMLAMA MANTIĞI
Programlama bir düşünce sanatıdır ve aslında, kullanılacak programlama dilinden bağımsız bir düşünme tekniğidir. Kullanılan programlama dilinin bu işleme katkısı ise makine dilinde çok komutla yapılabilecek işlemleri, tek komutta yapma imkanını vermesidir. Ancak, yapılacak işe göre, kullanacağınız programlama dilinde hangi komutları, hangi sıra ve hangi formatta yazacağınızı bilmek, daha doğrusu düşünebilmek programlama sanatıdır.
Direk mikroişlemci mantığıyla ya da istenirse de bir programlama dili kullanarak bir işlem yaptırılmak istendiğinde işin temeli her zaman iyi bir programlama mantığına sahip olmaktır. Aksi durumda sadece yapılmış örnekleri tekrarlamaktan ileri gidilemez. Bu sebeple bu konunun çok iyi anlaşılması gerekmektedir.
Bu işlemi de öğrenmek için çok kullanılan iki teknik algoritma ve akış diyagramlarıdır. Algoritma; bir programın yapacağı işlemlerin adım adım yazılmasından ibarettir. Akış diyagramı ise yine bir programın yapması gereken işlemlerin çizgisel diyagramla gösterilmesidir. Bu iki tekniği kullanarak birkaç örnekle basit tip düşünmeyi öğrenmeye çalışacağız. Ama önce akış diyagramlarında rastlayacağımız birkaç sembolün anlamını inceleyelim. (Bakınız:şekil 2.1)
Örnek 2.1. Bir pic 16f84 kullanarak bir butonla lambayı yakıp söndürme işlemi yapalım. Buton basılı olduğu sürece lamba yanık olsun. Buton basılı değil iken ise lamba sönük
olsun.
Çözüm:
Algoritma:
1) Başlangıç ayarlamalarını yap.
2) Ledi söndür.
3) Butonun basılı olup olmadığını kontrol et.
4) Buton basılı değilse 3. adıma dön.
5) Buton basılı ise ledi yak.
6) Butonun basılı olup olmadığını kontrol et.
7) Buton basılı ise 6. adıma dön.
8 Buton basılı değilse 2. adıma dön.
Burada 1. adımda belirtilen başlangıç ayarı, mikroişlemcilerin tamamında olan bir olaydır ki, sistem tasarlanırken yapılması gereken donanım eklemeleri ve program yazılırken başlangıçta yapılacak işlemleri içerir. Bu işlemler ise bazen sistemin tüm çalışmasını etkileyebilecek kadar önemlidir. Örneğin, sisteme ilk enerji geldiğinde programın başlangıçtan başlamasını sağlayacak POR (Power On Reset) sistemi tasarlanmamışsa, sistem ilk enerjilendiğinde bazen başlangıçtan bazen de rastgele bir yerden başlar. Böylece sistem bazen doğru çalışırmış bazen de çalışmamış olur. Programla yapılacak işlemlere örnek ise açılışta yapılması gereken port ayarları olarak verilebilir.
Şimdi de bu algoritmaya göre akış diyagramını çizelim:
Örnek 2.2. Şimdi birinci örneği bir adım daha ileri götürelim. Örneğimiz şöyle olsun: Tuşa ilk
basıldığında led yansın; İkinci basıldığında ise led sönsün. (Not:Burada tuşa basılması kelimesi, basılıp bırakmak anlamındadır.)
Çözüm 2:
Algoritma:
1) Başlangıç ayarlamalarını yap.
2) Ledi söndür.
3) Butonun basılı olup olmadığını kontrol et.
4) Buton basılı değilse 3. adıma dön.
5) Buton basılı ise ledi yak.
6) Butonun basılı olup olmadığını kontrol et.
7) Buton basılı ise 6. adıma dön.
8 Butonun basılı olup olmadığını kontrol et.
9) Buton basılı değilse 8. adıma dön.
10) Buton basılı ise ledi söndür.
11) Butonun basılı olup olmadığını kontrol et.
12) Buton basılı ise 11. adıma dön.
13) Buton basılı değilse 3. adıma dön.
Örnek 2.3. Şimdi ikinci örneği biraz değiştirelim Örneğimiz şöyle olsun. Tuşa ilk basılıp bırakıldığında led yansın, ikinci basıldığında ise bırakılmayı beklemeksizin led sönsün.
Çözüm 3:
Algoritma:
1) Başlangıç ayarlamalarını yap.
2) Ledi söndür.
3) Butonun basılı olup olmadığını kontrol et.
4) Buton basılı değilse 3. adıma dön.
5) Butonun basılı olup olmadığını kontrol et.
6) Buton basılı ise 5. adıma dön.
7) Ledi yak. (Buton bırakılmıştır.)
8 Butonun basılı olup olmadığını kontrol et.
9) Buton basılı değilse 8. adıma dön.
10) Buton basılı ise ledi söndür.
11) Butonun basılı olup olmadığını kontrol et.
12) Buton basılı ise 11. adıma dön.
13) Buton basılı değilse 3. adıma dön.
PIC 16F8X KOMUTLARI
ADDLW : Bir sayı ile W’nin içeriğini topla
İngilizce Yazılımı:Add Literal with W
Kullanım Şekli: ADDLW k
İşlevi: W←W+k
Etkilenen Bayraklar: C,DC,Z
Periyot:1
Örnek:
ADDLW 05h
Komuttan önce W=60h ise
Komuttan sonra W=65h olur.
ADDWF : Bir register ile W’nin içeriğini topla
İngilizce Yazılımı:Add W with File register
Kullanım Şekli:ADDWF f,d
İşlevi: W←W+f veya f←W+f
Etkilenen Bayraklar:C, DC, Z
Periyot:1
Örnek:
ADDWF SAYI,1
Komuttan önce W=60h ve SAYI=05h ise
Komuttan sonra W=60h , SAYI=65 h olur.
Örnek 2:
ADDWF SAYI,0
Komuttan önce W=60h ve SAYI=05h ise
Komuttan sonra W=65h , SAYI=05 h olur.
ANDLW : Bir sayı ile W’Yi AND işlemi yapar
İngilizce Yazılımı:And Literal with W
Kullanım Şekli: ANDLW k
İşlevi: W←W AND k
Etkilenen Bayraklar: Z
Periyot:1
Örnek:
ADDLW 05h
Komuttan önce W=67h ise
Komuttan sonra W=05h olur.
ANDWF : Bir register ile W’yi AND yapar.
İngilizce Yazılımı:And W with File register
Kullanım Şekli:ANDWF f,d
İşlevi: W←W AND f veya f←W AND f
Etkilenen Bayraklar:Z
Periyot:1
Örnek:
ADDWF SAYI,1
Komuttan önce W=6Fh ve SAYI=15h ise
Komuttan sonra W=6Fh , SAYI=05 h olur.
Örnek 2:
ADDWF SAYI,0
Komuttan önce W=65h ve SAYI=0Fh ise
Komuttan sonra W=65h , SAYI=05 h olur.
BCF : Registerin istenilen bitini 0 yap
İngilizce Yazılımı:Bit Clear f
Kullanım Şekli:BCF f,b
İşlevi: f(b) ← 0
Etkilenen Bayraklar:Yok
Periyot:1
Örnek:
BCF SAYI,3
Komuttan önce SAYI=FFh ise
Komuttan sonra SAYI=F7h olur.
BSF : Registerin istenilen bitini 1 yap
İngilizce Yazılımı:Bit Set f
Kullanım Şekli:BSF f,b
İşlevi: f(b) ← 1
Etkilenen Bayraklar:Yok
Periyot:1
Örnek:
BCF SAYI,5
Komuttan önce SAYI=00h ise
Komuttan sonra SAYI=20h olur.
BTFSC : Registerin istenilen bitini test et ve bu bit 0 ise 1 konut atla
İngilizce Yazılımı:Bit Test f, Skip if Clear
Kullanım Şekli:BTFSC f,b
İşlevi: f(b) = 0 ⇒ bir komut atla
Etkilenen Bayraklar:Yok
Periyot:f(b)=1 ise 1 periyot
f(b)=0 ise 2 periyot
Örnek 1:
BTFSC SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=00h ise
Komuttan sonra işlem işlem 2 ye gider.
Örnek 2:
BTFSC SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=FFh ise
Komuttan sonra işlem işlem 1 e gider.
BTFSS : Registerin istenilen bitini test et ve bu bit 1 ise 1 konut atla
İngilizce Yazılımı:Bit Test f, Skip if Set
Kullanım Şekli:BTFSS f,b
İşlevi: f(b) = 1 ⇒ bir komut atla
Etkilenen Bayraklar:Yok
Periyot : f(b)=0 ise 1 periyot
f(b)=1 ise 2 periyot
Örnek 1:
BTFSS SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=00h ise
Komuttan sonra işlem işlem 1 e gider.
Örnek 2:
BTFSS SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=FFh ise
Komuttan sonra işlem işlem 2 ye gider.
CALL Alt program çağırma komutudur.
İngilizce Yazılımı:Call Subrutine
Kullanım Şekli:CALL Altprogram
İşlevi: TOS (Top Of Stack)← PC+1
PC← Alt Program Başlangıç Adresi
Etkilenen Bayraklar:Yok
Periyot:2
Örnek:
İŞLEM CALL TOPLAMA
DEVAM …
…
TOPLAMA …
Komuttan sonra İşlem TOPLAMA adresinden devam eder. Bu arada DEVAM etiketinin adresi stact’ta tutulur.
CLRF : Registerin içeriğini 00h yap
İngilizce Yazılımı:Clear f
Kullanım Şekli:CLRF f
İşlevi: f ← 00h
Etkilenen Bayraklar:Z
Periyot:1
PIC PROGRAMLAMA
Herhangi bir dilde program yazarken, öncelikle kullanılacak dil ve bu dilin editörünü kullanabilmek önemlidir. Biz bu işlem için Mplab programını kullanacağız. Bu sebeple aslında öncelikle bu editörün kullanımını bilmemiz gerekir. Ancak, şu ana kadar mikroişlemcilerle ilgili olarak öncelikle temel yapıyı öğrendik. Bu bilgilerimizin kalıcı olabilmesi için, daha önce akış diyagramını verdiğimiz örneklerin programını yazarak önceki bilgilerin daha iyi anlaşılmasını sağlamaya çalışalım. Dersleriniz esnasında bu aşamadan itibaren, program editörünü kullanmayı yavaş yavaş öğreneceğiz.
Problem 4.1: Bir gökdelenin 4 katlık bir bölümündeki yangın kontrol ve söndürme sisteminin şu şekilde çalışması isteniyor. Herhangi bir kattan yangın algılandığında o kata ait yangın söndürme fıskiyeleri devreye giriyor ve yangın devam ettiği sürece çalışıyorlar. Yangın bittiğinde ise kapanıyorlar. Ayrıca sistemin ortak su tankını kontrol eden bir bölümü ise depodaki su deponun yarısına düştüğünde 1 motor ile depoya su pompalıyor. Yangın algılayan sensörler kendi içinde duman ve ısı algılayarak çalışıyor ve sisteme yangın varken 1, yangın yokken 0, bilgisi veriyorlar. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını yazınız.
Çözüm: Bu sistemde öğrenci mantığı ile düşünüldüğünde, her bir kattaki sensör bir buton olarak düşünülüp tek tek buton kontrollu çıkış gibi algılanabilir. Ancak daha basit mantıkla, sensörden gelecek bilginin aynısının kendisi ile ilgili çıkışa gönderilebileceğini görürüz. Bu mantıkla düşünülünce yangın söndürme kısmı sadece bir oku-yaz programı olur. Depo için ise 2 sensör gerekir ki; birisi deponun yarı seviyesini gösterecek, diğeri ise dolu olduğunu gösterir. Buna göre depo kısmı için seviye yarının altında ise doldurma motorunu çalıştır, depo doldu ise motoru durdur mantığı şeklinde düşünülür.
DÖNGÜLER
Programlama işlemlerinde en çok kullanılan ya da kullanılması gereken programlardan bir tanesi de döngü programlarıdır. Yani bir program içerisinde bazı işlemleri tekrar tekrar yapmak (tekrarlamak) gerekir. Bu tekrarlama işleminin kaç kez yapılacağı baştan belli olabileceği gibi, tekrarlamanın bitişi işlemlerle üretilen bir değerin belli şartı sağlaması şeklinde de olabilir. Örnek vermek gerekirse 1’den 10’a kadar sayıları toplayan bir program yazdığınızda 9 kez tekrarlama yaptırıyorsanız bu tekrarlama sayısının başlangıçta belli olduğu anlamına gelir. Ancak kökleri sayma sayısı olan bir denklemin kökünü, yerine koyma metodu ile buluyorsanız; işlemin kaç kez tekrarlanacağını baştan bilemezsiniz. Bunun yerine, tahmini kök değerini işlemde yerine koyup, sonucun 0 çıkması durumunda işleme son verilecek, değilse bir sonraki tahmini kök değeri yerine konularak işleme devam edilecektir.
Çok kullanılan bir diğer döngü tipi ise, zaman geçirme döngüleridir. Bunlar da bir işlemin, belli bir süre devam etmesi gerektiği durumlarda kullanılır. Bu tip döngülerde süreyi program yazarken hesaplayıp; program yazarken, döngü sayısı başlangıçtan belli döngüler gibi programını yazmak gerekir.
Problem 5.3: Bir temizlik robotunun kendi kendine çalışarak ortamı temizlemesi isteniyor. (Robot, düz zeminde rastgele yönlere hareket ederek, üzerinde taşıdığı elektrik süpürgesinin çalışması ile zeminin süpürülmesi işleminin kendiliğinden yapılmasını sağlayacaktır.)
Bunun için robot üzerindeki 2 adet motordan bir tanesi robotun o andaki istikametinde düz ilerlemesini sağlıyor. Diğeri ise robotun belli açılarla dönmesini sağlıyor. Düz ilerlemeyi sağlayan robot kendisine 1 verilince çalışıyor, 0 verilince duruyor. Dönmeyi sağlayan robot ise yine 0 verilince duruyor ve her 1 saniye süresince verilen 1 değeri için 10 derece dönmeyi sağlıyor. Robotun etrafına yerleştirilmiş 6 adet optik algılayıcı ise kendi istikametinde engel görünce 1 veriyor.
Robutun düz istikametinde bir engel görüldüğünde 30 derece döndükten sonra engelleri kontrol ettikten sonra yeni istikametinde ilerlemesi, eğer 30 derece dönüşten sonra hala engel varsa 30 derece daha dönerek işleme devam etmesi isteniyor. Devrenin prensip şemasını çiziniz ve programını yazınız.
Çözüm : Burada 6 sensör bağlanmış olmasına rağmen robot sadece düz istikamette ilerleyeceğinden, robotun düz istikametindeki engelleri gösteren sensör haricindeki sensörleri kullanmadan çözüm üretmek mümkündür. Tabii ki profesyonel devre yapılıyor ise diğer sensörlerde kullanılarak robotun dar aralara girme durumu engellenmiş olur. Ayrıca dar aralığa girip geri çıkamadığı durumlar için 360 derece döndüğü halde düz ilerleyemeyecek, olursa bir sesli ikaz vermesi de düşünülebilir. Ancak öğrenme amaçlı bu problemde sadece düz istikametteki sensörü dikkate alarak çözüm yapacağız.
UYGULAMALAR
Pic mikrodenetleyiciler için uygulama denildiğinde, programın tasarlanmasından başlayıp, devre şekline dönüştürülüp çalıştırılmasına kadar geçen evreler akla gelir. Ancak kitabın bu bölümüne kadar olan kısım için gerekli olan uygulama olayı, programın bilgisayara yazılıp simulasyon şeklinde çalıştırılması şeklinde olmalıdır. Bu işlem de pic serisi denetleyiciler için, microchip firmasının ürettiği MPLAB programı ile yapılabilmektedir. Bunun için, öncelikle MPLAB programının kullanımını öğrenmemiz gerekecektir.
UYGULAMA 1: 8 ışıklı yürüyen ışık programı
UYGULAMA 2: Trafik ışığı programı
UYGULAMA 3 : 8 ledli flip-flop devresi
UYGULAMA 4 : İki butonla bir ledi yak-söndür programı
UYGULAMA 5 : 7-segment göstergede basçek buton kullanılarak 0-9 arası sayıcı.
ALT PROGRAMLAR ALTPROGRAM NEDİR?
Programlamada döngü kadar etkili bir diğer kullanım şekli de alt programlardır. Bu sistemde işlemin birkaç yerinde lazım olan bir program parçasını tekrar tekrar yazmak yerine, bu bölümü bir kez ayrı bir program gibi yazıp, bu parçanın gerekli olduğu yerde programın bu kısmını çağırmak (ya da o kısma atlamak) metodu kullanılır. Bu sadece bir program yazımından kısaltma ile kurtulmak değildir. Bir tablodan istenilen verinin seçilmesi veya programın çok fazla hafıza isteyip işlemcinizin bunu karşılayamadığı durumlarda, alt programlar adeta bir can yeleğidir.
Alt program yazımının bir programı ne kadar kısaltacağını görebilmek için, döngüler kısmında çözülen trafik ışığı öneğini birde alt program kullanarak çözelim.
ÇEVRİM TABLOLARI
Bazı programlarda, bir tablodan belirli değerlerin seçtirilmesi, sıkça lazım olan bir durumdur. Bunun için CALL komutu RETLW komutu ile birlikte kullanılır. Sistemde CALL komutu ile bir alt program çağırılırken eğer W registerinde bir değer varsa ve bu değer PCL ile toplanırsa bu sistem bir index gibi kullanılır. Bu index ile atlanan adımda RETLW değer şeklinde bulunan komut satırındaki değer W registerine aktarılarak alt programdan çıkılır ve böylece ilgili indexteki değer tespit edilmiş olur. Bu işlemi bir örnekle görelim:
INTERRUPT-INTERRUPT NEDİR:
Kelime anlamı olarak kesilim isteği anlamına gelen interrupt kelimesi, işlemcinin herhangi bir programı icra ederken, bu programa dışarıdan gelen bir sinyal sebebiyle ara verip, başka bir programa (interrupt alt programı) atlayıp, atladığı programı tamamladıktan sonra tekrar geri dönüp ilk kaldığı programdan devam etmesi işlemidir. Bu anlatımdan anlaşılacağı gibi interrupt bir alt program çalıştırma işleminin aynısı gibidir. Ancak, alt programın çağrılma şekli farklıdır. Bu fark ise normal alt programı çağırma işlemi CALL komutu ile yapılırken, interrupt alt programının ise, normal programın herhangi bir anında dışarıdan gelecek bir sinyal ile çağırılması olayıdır.
INTERRUPT ÇEŞİTLERİ:
Interruptları genel olarak ikiye ayırmak mümkündür:
1. Mask Edilemeyen Interruptlar: Bu tür interrupt’ta interuptun işlemci tarafından algılanması herhangi bir program mantığıyla engellenemez. Bu tür kesilime örnek olarak işlemcilerin reset butonlarını göstermek mümkündür ki; tam olarak yukarıda verdiğimiz tarife uymamakla birlikte reset tuşu programa ara verilip sistemin açılışa dönmesini sağlayan bir interrupt şeklidir ve programla reset tuşu devre dışı bırakılamaz.
2. Mask Edilebilen Interruptlar: Bu tür interruptlar yukarıda verilen interrupt tarifine tam uyan interruptlardır. Bunlar istenirse öncelik sırasına dizilebileceği gibi, istenmezse hiç interrupt gelmemiş gibi programlanarak, yok farz edilebilirler. Bu işlemin nasıl olduğunu konunun ilerleyen detaylarında inceleyelim.
Pic16f84 için Interrupt çeşitleri: Pic 16f84 işlemcisi için (MCLR=RESET hesaba katılmazsa) 3 tür interrupttan söz etmek mümkündür.
1) RB0 Interrupt: Bu tür interruptta interrupt alt programı, işlemcinin B portunun 0 numaralı (RB0) ucundan gelecek bir sinyale göre işleme girer. Bu sinyal alçalan kenar veya yükselen kenar şeklinde sürekli sinyal olabileceği gibi, bir puls sinyali de olabilir. Tek sinyalde interrupt kontrol edilmesi istenilen yerlerde kullanışlı olur.
2) TMR0 (timer) Interrupt: Bu tür interrupt, işlemcinin içerisinde programdan bağımsız çalışan bir sayıcının çalıştırılarak, sayıcının her 0’dan geçişte sisteme interrupt vermesi esasına göre çalışan çeşididir ki, burada sayıcı option registerdeki ayarlamalar sayesinde kendi içerisindeki osilatör sinyaline göre veya dışarıdan gelecek olan (RA4/T0CKI ucundan) sinyalleri sayma esasına göre programlanabilir. Zamana bağlı problemleri çözmede çok kullanışlı olur. Mesela saat, kronometre, vb…
3) RB4..RB7 uçlarındaki bilginin değişmesi esasına göre tasarlanmış bir interrupt çeşididir ki, iletişim ve güvenlik işlemlerinde kullanılması uygun olur.
ADC KULLANIMI
Mikrodenetleyici kullanırken en çok rastlanan husus, bir fiziksel büyüklüğün ölçülmesi ya da ayarlanması şeklindedir. Mesela ortam sıcaklığının ölçülmesi ya da ayarlanması, ortam ışıklandırılması vb… Bu gibi durumlarda ADC kullanılması gerekmektedir. Bazı PIC serisi işlemcilerde kendi içerisinde ADC mevcuttur, ancak biz burada 16f84 ile ADC kullanarak yapılabilecek işlemlere bakacağız. İşlemlerimizde ADC olarak ADC804 elemanını kullanacağız.
8 bit ADC uygulamaları için, B portunun ADC çıkışlarına birebir olacak şekilde bağlandığını kabul edeceğiz. Böylece diğer işlemler için sadece A portunu kullanacağız. Tabii ki burada dışarıdan çoğullama kullanılarak çok farklı çözümler üretmenin mümkün olduğu unutulmamalıdır
örnek 3.2: Bir süpermarkette iç ortam sıcaklığının 22oC ile 25oC arasında ayarlanması isteniyor. Bu iş için sıcaklığı ölçmek amacıyla aşağıda değerleri verilen PTC kullanılmıştır. Gerekli devreyi çiziniz ve programını yazınız.
22 oC de PTC Direnci :22 K
25 oC de PTC Direnci :25 K
Çözüm : Burada, devrede bir harici ADC kullanılır ve PTC ile sabit bir direncin, gerilim bölücü olarak kullanılmasından faydalanılır. PTC direncinin değişimine göre de ADC’nin giriş voltajı (gerilim bölme kuralı ile) ile bu voltaja karşılık ADC’nin üreteceği sayı hesaplanır. Sonrasında problem, girişteki sayı X’den küçükse A işlemini yap, girişteki sayı Y’den büyükse B işlemini yap durumuna gelir.
ÖRNEK PROBLEM 1: Bir süpermarkette kapıların otomatik çalışması istenmektedir. Bu iş için kullanılacak optik sensörler görüş açısındaki cismi algılayınca 1,boşta iken 0 vermektedirler. Bir kapının giriş-çıkış şeklinde çalışması için gerekli devreyi tasarlayınız. Kapı ortasında kimsenin sıkışmaması için gerekli tedbiri alınız.
Çözüm: Burada en az 3 sensöre ihtiyaç olacaktır. Bunlar kapıda biri olduğunu algılayan sensör ile kapı tam açık ya da kapı tam kapalı şeklindeki değerleri veren limit switch şeklindeki kapı açık-kapalı sensörleridir. Bunlar olduğunda problem kapıda biri varsa ve kapı tam açık değilse kapı açma motorunu çalıştır. Kapıda kimse yoksa ve kapı kapalı değilse kapı kapatma motorunu çalıştır şeklinde düşünülür.
ÖRNEK PROBLEM 2: Bir süpermarkette iç ortam aydınlığının 100 Lüx’ün üzerinde ayarlanması isteniyor. Bu iş için aydınlık derecesini ölçmek amacıyla aşağıda değerleri verilen LDR kullanılmıştır. Ayrıca aydınlatma lambaları iki ayrı grup altında birleştirilmiştir. Buna göre, ışık miktarı 80 Lüx’den az iken her 2 grup lambanı yanması, 80-100 Lüx arasında ise 1 grup lambanın yanması isteniyor. Eğer, ışık miktarı 100 Lüxün üzerinde ise lambaların sönük olması isteniyor. Gerekli devreyi çiziniz ve programını yazınız.
80 Lüx’de LDR Direnci :100 K
90 Lüx’de LDR Direnci :90 K
100 Lüx’de LDR Direnci :80 K
Çözüm : Yine ADC gerektiren bir örnek. Burada aydınlığı ölçecek LDR ile bir gerilim bölücü direnç kullanarak ve kritik aydınlık değerlerinde ADC’nin üreteceği sayı hesaplanarak, büyük-küçük kıyaslamaları ile problem çözülür.
DENEY 1: Yürüyen ışık
DENEY 2: 2 butonla 1 ledi yak-söndür deneyi
DENEY 3 : 1 butonla tek bit sayıcı
DENEY 4: Tek bit yukarı aşağı sayıcı
DENEY 5: 2 bit ileri-geri sayıcı
DENEY 6 : Tek display ile decoder kullanmadan yapılan sayıcı
DENEY 7: 6 display ile sabit yazı yazma
DENEY 8: 6 display ile kayan yazı deneyi
Hazırlayan : ÖĞR. GÖR. A. Osman YAĞLIOĞLU – Mikrodenetliyiciler ve mikrokontrolörler hakkında tüm bilgiler bulunuyor kolay anlaşılır dilde bolca örnek ile mükemmel bir yazı dizisi devre problemleri şema ve kaynak assembly asm kodları ile çözümler ve fazlası. Hazırlayan emeği geçen kişilere teşekkürler.
Kodlarınızı yazmak ve derlemek için kullanacağınız ücretsiz MPLAB programı MPLAB_IDE_8_36.zip ve türkçe kullanım kılavuzu ise Burada Microchip Mplab Kullanım Kılavuzu
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/06/12 Etiketler: assembly kodlar, mikrodenetliyiciler, Mikrokontrolörler, örnek asm kodları, PIC komutları, PIC programlama, pic programlama dersleri, pic16f84 devreleri
Yazılarınızı takip etmekteyim.Gerçekten pic programlarama gibi bir konudada gereken özen ve alakayı göstermişsiniz.Ellerinize sağlık.
teşekkürler güzel bilgiler