I Yağlıoğlu
Transkript
I Yağlıoğlu
MİKRODENETLEYİCİLER - I Yağlıoğlu 1 BÖLÜM 1 MİKRODENETLEYİCİLER - I Yağlıoğlu MİKROİŞLEMCİLERİN YAPISI VE ÇALIŞMASI 1.GİRİŞ 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 çalışılmaktadır. 2 kullanılır hale getirilmeye MİKRODENETLEYİCİLER - I Yağlıoğlu Ü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ğine 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. 3 MİKRODENETLEYİCİLER - I Yağlıoğlu 1.1. 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. GİRİŞ ÜNİTESİ İŞLEM ÜNİTESİ ÇIKIŞ ÜNİTESİ 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 Çıkış Üniteleri Klavye Ekran Mouse,joystic Printer, Plotter Disk sürücüler Disk sürücüler CD-ROM, DVD-ROM CD-Writer, DVD-ROM Fax-modem Fax-modem Light Pen Kart-Şerit Ekran Kontrol Devreleri Kart-Şerit Sensörler (Algılayıcılar) 4 MİKRODENETLEYİCİLER - I Yağlıoğlu 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: HAFIZA GİRİŞ ÇIKIŞ ALU KONTROL ÜNİTESİ µP Şekil-1.1. Mikroişlemcili sistem blok diyagramı. 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 5 MİKRODENETLEYİCİLER - I Yağlıoğlu ü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. 1.2. 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: 6 MİKRODENETLEYİCİLER - I Yağlıoğlu 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: 1.2.1. 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. 1.2.2. 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. 1.2.3. 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 7 MİKRODENETLEYİCİLER - I Yağlıoğlu 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. 1.3. SİSTEMİN ÇALIŞMASI: Sistemde yer alan elemanların fonksiyonel olarak aralarındaki bağlantı aşağıdaki şekil.1.2’deki gibidir. Şekil.1.2. üzerindeki BUS kelimesi paralel bilgi taşıyan hatlar anlamına gelmektedir. Bunun anlamı address bus, adres taşıyan hatlar; data bus, bilgi taşıyan hatlar; kontrol bus ise kontrol sinyallerini taşıyan hatlar demektir. Address Bus Mikroişlemci RAM ROM I/O Data Bus Kontroll Bus Şekil.1.2. Mikroişlemcili sistemde bus bağlantısı blok diyagramı Herhangi bir komut icra edileceği zaman, işlemci içerisindeki komut tutma ve algılama işlevlerini yapan register komutu algıladıktan sonra (diyelim ki hafızadaki xxxx adresine yy bilgisini yazma komutu olsun.) komutla ilgili parametrelerin algıanması sağlanır. (örneğimizde xxxx adresi ve yy bilgisi.) Sonra ilgili adres bilgisi, address bus üzerine verilir ve aynı anda ilgili yy datası data bus üzerine verilir. Son 8 MİKRODENETLEYİCİLER - I Yağlıoğlu olarak kontrol bus üzerinden kontrol sinyalleri (örneğimizde bilgi hafızaya yazılacağı için yazma sinyali) gönderilerek komutun icrası tamamlanmış olur. Bu aşamada komut algılayan register tekrar devreye girerek sonraki yapılacak işlemin komutunu algılar. Böylece işlemler belli bir düzen üzerinde yürür. Aynı mantıkla hafızaya değil de giriş çıkış ünitesi üzerinden çıkışa bir bilgi gönderilecek ise önce giriş çıkış ünitesinin çıkış olarak ayarlanması yapılır. Bu işlemden sonra işlemci açısından hafızaya bir bilgi yazmak ile çıkış ünitesine bir bilgi yazmak arasında hiçbir fark yoktur. Bu sebeple kullanıcı açısından sisteme baktığımızda, birçok birbirinden farklı giriş-çıkış ünitesi olmasına rağmen; işlemci açısından olaya bakıldığında sadece birçok hafıza ünitesi vardır demek çok doğru bir görüştür. “Bu sistemde rom hafızaya neden ihtiyaç vardır?” sorusunun cevabını ise sistemin ilk açılışta neler yaptığı ve işlemlerini nasıl yaptığı konusunu inceleyerek vermek gerekir. Üstteki örnek dikkatle incelenecek olursa, işlemlerin belirli bir düzen içerisinde yürüdüğü belirtilmekte idi, işte bu düzenin sağlanmasının temel koşulu: SİSTEMİN ALDIĞI İLK BİLGİ (RAKAM) KOMUT OLMAK ZORUNDADIR. İşte açılışta bu koşulun sağlanması için ve ayrıca sistemin ilk enerji geldiğinde yapılması gereken bazı işlemleri yapması için, bu işlemlerin silinmez bir hafıza üzerinde bulunması ve sistemin de ilk açıldığında bu hafızaya yönlendirilmesi gerekir. Tıpkı bilgisayarlarımızda bios entegresi olması ve açılışta bu bios programının çalıştırılması gibi... Yönlendirme işlemi için basit bir reset düzeneği yeterlidir. Sistemin ilk yapacağı işlemler ise, sisteme göre değişmekle birlikte genelde hafızanın temizlenmesi, yan cihazların tanınması ve setup’larının yapılması gibi şeylerden oluşur. Bu işlemler bittikten sonra sıra kullanıcının yapacağı veya yaptıracağı işlemlere gelmiştir. Bazı sistemlerde, özellikle makine kontrol işlemlerinde işlenecek programın kendisi de bu rom içerisinde bulunur ve açılış işlemleri bittikten sonra kullanıcının daha önceden yazdığı hazır program devreye girerek sistemin çalışması devam eder. 9 MİKRODENETLEYİCİLER - I Yağlıoğlu 1.4. Pic16f84’ün YAPISI ve ÇALIŞMASI Pic 16f84’ün yapısı ve çalışmasına girmeden önce genel olarak içerisinde olması gereken parçaların isimleri ve görevlerini inceleyelim. Bunun için iç yapısının en temel öğelerini içeren bir şekil üzerinde neler olduğunu kısaca görelim: Şekil 1.3 de görüleceği gibi mikrokontrollör üzerinde temel olarak bir program hafızası alanı ve bir de program esnasında oluşacak ya da kullanılacak değişken değerlerinin tutulacağı file register alanlarından oluşan bir hafıza alanı vardır. Aritmetik ve lojik işlemlerin yapılacağı ALU ünitesi, işlem ve sonuç bilgilerini değişkenler şeklinde kullanacağından direk file registere bağlanmıştır. Ayrıca program akışını kontrol edecek olan program counter registeri ise program hafızası alanı ile direk irtibatlandırılmıştır. Instruction register ve ona bağlı olan instruction decoder ve kontrol alanı ise sistemin esas iş gören kısmıdır ki yukarıda bu kısmı kontrol birimi olarak isimlendirmiştik. Şekil 1.3. Pic16f84 temel yapısı 10 MİKRODENETLEYİCİLER - I Yağlıoğlu 1.4.1. SİSTEMİN ÇALIŞMASI: Temel olarak programcının ürettiği program, program hafızasındadır. Program counter başlangıçta bu programın başlangıç adresini tutar. Böylece ilk komut, instruction registere, dolayısıyla instruction decoder and kontrol kısmına gelir. Burada ne olduğu algılanan komutun icrası için gerekli sinyalleri bu bölüm üreterek, komutun işlenmesini bu bölüm yaptırmış ve denetlemiş olur. Burada işleme girecek veriler (değişkenler) mevcut ise bu bilgiler file register içerisinde tutulur ve bunlarla ilgili işlemler de ALU’da yapılır. Tabii ki bu temel işlemlerin detaylarını anlamak için, öncelikle yapılması gereken iş verilen şekildeki parçaların tek tek ne iş yaptığını ve neden orada bulunduğunu öğrenmektir. Burada her bir birim için “Nedir? Neden oradadır? Ne iş yapar? Olmasa ne olur?” sorularının cevaplarını verebildikten sonra sistemin çalışmasını daha rahat anlayabiliriz. Sistemi ana parçalarına ayıracak olursak: - Registerler - ALU - Hafıza birimleri - Zamanlama Denetim ve İletişim bölümleri, şeklinde bölümlendirmek mümkündür. 1.4.2. 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 11 MİKRODENETLEYİCİLER - I Yağlıoğlu 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 12 MİKRODENETLEYİCİLER - I Yağlıoğlu 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. Status Registerin Bitleri: Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IRP RP1 RP0 TO PD Z DC C Bit 7: IRP : Bank seçme biti (16f84’te kullanılmaz) 0=Bank 0,1 1=Bank 2,3 Bit 6,5: RP1,RP0: Bank seçme biti. 00: Bank 0 (h’00’-h’FF’) 01: Bank 1 (h’80’-h’FF’) 10: Bank 2 (h’100’-h’17F’) 11: Bank 3 (h’180’-h’1FF’) Bit 4: TO: Time Out biti. 0= WDT zamanlayıcısında zaman dolduğunda 1=Pic’e enerji verildiğinde,CLRWDT ve SLEEP komutları çalıştırıldığında Bit 3: PD: Power down biti. 0= SLEEP komutu çalışınca 1=Pic’e enerji verildiğinde ve CLRWDT komutu çalıştırıldığında Bit 2: Z: Zero bayrağı. 1= Bir önceki işlem sonucu 0 olduğunda 0= Bir önceki işlem sonucu 0’dan farklı olduğunda 13 MİKRODENETLEYİCİLER - I Yağlıoğlu Bit 1: DC: Digit Carry (Taşma) biti. ADDLW ve ADDWF komutları kullanıldığında alt nibble’dan üst nibbl’a taşma olursa kullanılır. 1= alt nibble’dan üst nibbl’a taşma olursa 0= alt nibble’dan üst nibbl’a taşma olmazsa Bit 0: C: Carry (elde/borç)biti. ADDLW ve ADDWF komutları kullanıldığında 7. bitten taşma veya ödünç alma olursa kullanılır. Ayrıca RLF ve RRF komutlarında en sağ ya da en soldaki bit bu bayrağa yüklenir. 1= 7.bitten taşma olursa 0= 7. bitten taşma olmazsa 1.4.3. 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. Buraya kadar incelediğimiz parçaların sistemdeki yerlerini şekil.1.4. de görmekteyiz. Bu sistemde programcının ürettiği program program hafızasındadır. Program counter başlangıçta bu programın başlangıç adresini tutar. Böylece ilk komut instruction registere, dolayısıyla instruction decoder and kontrol kısmına gelir. Burada ne olduğu algılanan komutun icrası için gerekli sinyalleri, bu bölüm üreterek komutun işlenmesini de bu bölüm yaptırmış ve denetlemiş olur. Burada işleme girecek veriler (değişkenler) mevcut ise bu bilgiler file register içerisinde tutulur ve bunlarla ilgili işlemler de ALU’da yapılır. Burada dikkat edilecek olursa başlangıçtan bir adım daha ileri giderek işlem yapılan kısmın detayı verilmiştir. Buna göre bir aritmetik ya da lojik işlem yapılacak ise, işleme girecek verilerden bir tanesi başlangıçta W registerinde tutulur. Diğeri ise data bus üzerinden (file registerden ya da program memory’den alınarak) ALU’ya ulaşır. Böylece iki data ALU’ya ulaşarak işlem ALU’da yapılır. İşlemin sonucu ise W registerine aktarılır. Böylece işlem sonunda sonuç W registerindedir ve işlem başlangıcındaki W registerindeki data, 14 MİKRODENETLEYİCİLER - I Yağlıoğlu artık oradan silinmiştir. Ayrıca işlem sonuçları ile ilgili bayrak işaretleri ise status registere aktarılır. Şekil.1.4. Pic16f84 ün temel fonksiyonel blok diyagramı 1.4.4. HAFIZA BİRİMLERİ: Mikroişlemcilerde dış ünite olarak mikrokontrollörlerde iç ünite durumundadır. kullandığımız hafıza elemanları 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. 15 MİKRODENETLEYİCİLER - I Yağlıoğlu 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. 1.4.5. 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. Denetleme birimi tüm işlemcilerde bulunur ve işlem doğruluğu, işlem akışı ve öncelikli işlemler konusunda karar verip sistemde program ve iş akışını kontrol eder. İletişim birimi ise, mikroişlemcilerde bir dış ünite olmasına rağmen mikrokontrollörlerde yine bir iç ünitedir.Bu birim ise portlar ve portları kontrol eden yönlendirme registerlerinden oluşur. Bu bölüm sayesinde mikrokontrollörler dış dünya ile iletişim yapma hakkına sahip olurlar. Bu birimin detayı ileride tekrar anlatılacaktır. 16 MİKRODENETLEYİCİLER - I Yağlıoğlu 1.5. PİC16F84 MİKROKONTROLLÖR SİSTEMİNİN TAM YAPISI VE ÇALIŞMASI: Bu sistemin tam olarak blok diyagramını aşağıda görmekteyiz. Birçok ana parçasını yukarıda anlattığımız bu düzenin çalışmasına genel olarak bakalım. Bu arada yukarıda bahsedilmemiş olan parçaları da kısaca tanımış olalım. Şekil-1.5. Pic mikrokontrollörün yapısı A ve B portları mikrokontrollörümüzün dış dünya ile olan bağını kuran uçlardır. Burada A portu A0-A4 adıyla 5 uç ve B portu B0-B7 adıyla 8 uçtan oluşan toplam 13 uç vardır ve bunlar hem giriş hem de çıkış olarak kullanılabilirler ki; bu uçlardan bazılarına ayrıca özel görev verilebilir. (Bu görevleri ilerleyen konularda göreceğiz.) 17 MİKRODENETLEYİCİLER - I Yağlıoğlu Bu kullanımda TrisA ve TrisB registerlerinin ayarlanması gerekmektedir. Bu konuyu ileride port yapıları bahsinde tekrar inceleyeceğiz. Sistemin çalışmaya başlaması için altta görülen besleme ve MCLR uçlarına uygun sinyallerin gelmesi gerekmektedir. Burada uygun değerler varken bunların bağlı olduğu timer, osilatör ve reset sistemi gerekli hizmeti vermeye başlar ve program counter program hafızasının başlangıç adresini gösterir. Böylece ilk adresteki komut (Burası mutlaka “KOMUT” içermek zorundadır) intruction registere (Komut registeri : Bir komut işlemci tarafından işlenirken komut bilgisini üzerinde tutan registerdir.) aktarılır. Instruction decoder ve kontrol sistemi, instruction registerdeki komutu çözümler ve bu komutun icra edilmesi için gerekli kontrol sinyallerini sırasıyla üretmeye başlar. Bu arada program counter, bu kontrol sinyallerinden bir tanesiyle bir sayı artar. Eğer komut alt program içeriyorsa 8 seviyeli stack, o andaki program counterdeki adresi tutma görevini yapar böylece pc artık yeni bir adrese atlayabilir. Eğer bir aritmetik ya da lojik işlem yapılacaksa, işleme girecek datalardan birisi dahili data bus üzerinden ve mux üzerinden ALU’ya ulaşır. Diğer data ise, W üzerinde tutulur ve gerekli işlem yapıldıktan sonra sonuç yine W registerine aktarılır. İşlem sonucu ile ilgili bayrak işaretleri ise status registere alınır. Eğer, yapılan işlem file registere yazma ya da okuma komutları içeriyorsa fsr (File status register: Dolaylı ya da direkt adresleme işlemlerini ayarlayan registerdir.) registerininde katkısıyla uygun adrese ulaşma işlemi sağlanır ve kontrol kısmından gelen sinyalle register yazma ya da okunma konumuna alınır. Bu arada eğer yazma işlemi yapılacaksa, data bus üzerinde olan bilgi bu register tarafından algılanarak bilgi registere yazılmış olur. Eğer, ilgili registerin okunması söz konusu ise adres ve kontrol bilgileri registere ulaştıktan sonra registerin içeriği data busa aktarılır. Burada son bir detay olarak sistemim hafıza haritasını (memory map) inceleyelim. Pic16f84’ün 0x00-0x4f adresleri aralığında ayrılmış ram hafızası vardır. Burası 8 bitlik registerlerden oluşan bir hafıza alanı şeklindedir. (PCLATCH registeri diğerlerinden farklı olup 8 bittir.) Bu alanın bir kısmı özel amaçlı registerler içerir. Diğer kısım ise genel amaçlı olarak kullanılır; yani özel amaçlı registerlerin dışında 18 MİKRODENETLEYİCİLER - I Yağlıoğlu kalan alan program içerisinde üretilecek ya da girilecek değişkenler için gerekli alan olarak kullanılacaktır. Bu alan iki bank (sayfa) şeklinde bölümlendirilmiştir. Şekil 1.6 da görüleceği gibi iki banktan oluşan bu alan üzerinde bazı özel registerler her iki bankta da mevcuttur. Ayrıca 0x0C-0x4F arası ile 0x8C-0xCF arası gölge hafıza olarak kullanıldığı için tek bir alan olarak çalışır. İleride program yazmaya başladığımızda bu adres sistemi daha iyi anlaşılacağından burada detayına girilmeyecektir. BANK 0 BANK 1 0x00 INDF 0x80 INDF 0x01 TMR0 0x81 OPTION 0x02 PCL 0x82 PCL 0x03 STATUS 0x83 STATUS 0x04 FSR 0x84 FSR 0x05 PORTA 0x85 TRİSA 0x06 PORTB 0x86 TRİSB 0x07 0x87 EEPROM Hafıza Alanı 0x08 0x88 Program yazma anında kullanılan 0x09 0x89 Registerlerin bulunduğu alan 0x0A PCLATCH 0x8A PCLATCH 0x0B INTCON 0x8B INTCON 0x0C 0x8C Program veri alanı olarak 0x4F 0xCF kullanılan alan Şekil 1.6. Pic16f84 memory map İç yapısını ve çalışmasını bu şekilde gördüğümüz mikrokontrollörün ayak bağlantılarını şekil 1.7’de görmekteyiz: 19 MİKRODENETLEYİCİLER - I 1 2 3 4 5 6 7 8 9 Yağlıoğlu RA2 RA1 RA3 RA0 RA4/TOCKI OSC2/CLKOUT MCLR OSC1/CLKIN Vss VDD RB0/INT RB7 RB1 RB6 PIC16F84 RB2 RB5 RB3 RB4 18 17 16 15 14 13 12 11 10 Şekil 1.7. Pic16f84’ün pin görünüşü Pin yapısını üstte gördüğümüz işlemcinin detay olarak görmediğimiz pinlerinin yapısını da tanıyalım: 1.6. PORTLARIN YAPISI: Şekil 1.8. Pic16f84 giriş-çıkış portlarının iç yapısı Şekil.1.8’den anlaşılacağı gibi portun ilgili pininin çıkış olması için, çıkıştaki tristate bufferin aktif edilmesi, yani tris latch üzerine önceden 0 bilgisinin verilmiş olması gerekir. Eğer tris latch üzerine önceden 1 yüklenmiş ise, çıkıştaki buffer açık devre 20 MİKRODENETLEYİCİLER - I Yağlıoğlu olacağı için bilgi çıkışı mümkün değildir. Bu durumda ancak oku komutu verilerek (Read Port) pin üzerindeki bilginin data busa aktarılması, yani okunması (giriş yapılması) sağlanmış olacaktır. Write port ya da write tris ise adres hattına bağlı olan seçme hatları gibi çalışırlar. Tris ve Port registerinin adreslerinden biri bank0 diğeri bank 1’dedir. Bu sebeple port ayarı programı yazmak için öncelikle bank1’e geçip (bu işlem için fsr registeri kullanılacaktır.) tris üzerine istenilen bilgi yazılır. Burada portun pinleri birbirinden bağımsız olduğu için istenilen port ucu giriş, istenilen port ucu çıkış olarak ayarlanabilir. Bunun için tris registerinin ilgili ucuna 1 ya da 0 verilmesi (giriş için 1, çıkış için 0) yeterli olacaktır. Böylece sistemin tamamını tanımış olduk. Şimdi de dışarıdan yapılacak bağlantıları inceleyelim: 1.7. MİKROKONTROLLÖR OSİLATÖR BAĞLANTILARI Pic mikrokontrollörlerde osilatör elemanı olarak üç tip eleman kullanmak mümkündür. Bunlar: a) RC b) Rezonatör c) Kristal Buradaki her üçtip eleman için, işlemcinin aynı ayaklarına bağlanarak osilasyon oluşturacak bir yapı pic içerisinde hazırdır. Buraya yapılabilecek bağlantılar ve ayrıntıları aşağıda verilmiştir. a- RC OSİLATÖR: Frekansın çok hassas olması gerekmeyen yerlerde kullanılan maliyeti çok ucuz olan bir osilatördür. Frekans değeri, bağlanan rc elemanın toleransına, beslemedeki sapmalara ve çevre şartlarına bağlı olarak +%5-20 arasında değişim gösterebilir. 21 MİKRODENETLEYİCİLER - I Yağlıoğlu Vdd 1 2 3 4 5 6 7 8 9 RA2 RA1 RA3 RA0 RA4/TOCKI OSC2/CLKOUT MCLR OSC1/CLKIN Vss VDD RB0/INT RB7 RB1 RB6 PIC16F84 RB2 RB5 RB3 RB4 18 17 16 RC Clk/4 R 15 14 13 C 12 11 10 Şekil 1.9. Pic-RC osilatör bağlantısı RC osilatör bağlantısı şekil 1.9’da görüldüğü gibi yapılır. Kullanılmak istenen frekansa göre piko ya da nano serisi kondansatör, değerleri uygun direnç bağlanarak kullanılabilir. Örnek tabloda bağlanan eleman değerlerini ve elde edilen frekansları görmekteyiz. b- R C Fosc (yaklaşık) 10 K 20 pf 625 KHz 10 K 220 pf 80 KHz 10 K 100 nf 85 Hz KRİSTAL OSİLATÖRLER: Frekansın çok hassas olması istenen yerlerde kullanılır. Bu osilatör tipi, pic ile yapılan devre eğer zamanla alakalı bir yerde kullanılacaksa mutlaka tercih edilmelidir. Mesela, pic kullanarak bir saat yapılması düşünülüyor ise mutlaka tercih edilmelidir. Devre yapısı şekil 1.10’daki gibidir. 22 MİKRODENETLEYİCİLER - I Yağlıoğlu MCLR C1 16 OSC2/CLKOUT XTAL PIC16F84 C2 15 OSC1/CLKIN Rs RA0 RA1 RA2 RA3 RA4/TOCKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 4 17 18 1 2 3 6 7 8 9 10 11 12 13 Şekil 1.10. Pic-XTAL osilatör bağlantısı Bu sisteme, aslında sadece hazır tipteki bir kristal osilatör devresini bağlamak da mümkündür; ancak burada kristalin entegresi ve benzeri elemanlarla uğraşmaktansa işlemcinin sunduğu avantajları kullanmak daha faydalı olacaktır. Devredeki Rs direnci kullanılmayabilir ancak; osilatörün ilk çalışma durumunu garantiye almak için devreye 100-200 ohm arası direnç bağlamak faydalı olacaktır. Burada istenilen frekansa göre kristal seçimi yapıldıktan sonra tabloda verilen değerlere uygun olarak kondansatör seçimi yapılmalıdır. Osilatör tipi Frekans Kondansatör LP 32 KHz 33-68 pf 100 KHz 47-100 pf 200 KHz 15-47 pf 500 KHz 20-68 pf 1 MHz 15-68 pf 2 MHz 15-47 pf 4 MHz 15-33 pf 8 MHz 15-47 pf 20 MHz 15-47 pf XT HS Kristal osilatör kullanılırken seçilen kondansatör değerleri birbirine eşit olur. Ayrıca seçilen kondansatör değerinin düşük ya da yüksek olması osilasyonun başlamasını 23 MİKRODENETLEYİCİLER - I Yağlıoğlu sağlamayabilir veya osc2 ucundaki dalga şeklinin bozuk olmasını sağlayarak osilasyon olmasına rağmen pic bu osilasyonu algılayamayabilir. c- REZONATÖR İLE YAPILAN OSİLATÖR: Ucuz ve hassas bir eleman olan seramik rezonatör üç uclu bir eleman olup içerisinde kristal ve kondansatörü hazır durumdadır. Rezonatörün üç ayağından kenarda olanlar osc1 ve osc2 uclarına bağlanır. Hangi ayağın osc1’e, hangi ayağının osc2’ye bağlandığı önemli değildir. Devre bağlantısı şekil 1.11’deki gibidir. MCLR 16 OSC2/CLKOUT PIC16F84 15 SERAMiC RESONATOR OSC1/CLKIN RA0 RA1 RA2 RA3 RA4/TOCKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 4 17 18 1 2 3 6 7 8 9 10 11 12 13 Şekil 1.11. Pic-Rezonatör osilatör bağlantısı 1.8. RESET İŞLEMLERİ Pic ile yapılsın yapılmasın tüm mikroişlemcili uygulamalarda esas olan şey, işlemciye ilk ulaşan bilginin bir komut olması gerektiğidir. Bu sebeple bu sistemlerde, besleme geldiğinde işlem nereden olursa olsun çalışmaya başlasın gibi bir mantık olamaz. Bu sebeple bu sistemlerde besleme geldiği anda sistem ne olursa olsun çalıştırması gereken programın başlangıç adresine yönlendirilmesi gerekir. Bunun için de bu sistemler için bir reset devresi uygulaması kullanılır. Pic serisi mikrokontrollörlerde MCLR ucu reset işleminin ayarlanmasında kullanılır. Bu uca 0 (sıfır) bilgisi verildiğinde sistem program başlangıç adresine döner. Bu uca 1 (bir) verildiğinde ise 24 MİKRODENETLEYİCİLER - I Yağlıoğlu program başlangıç adresinden itibaren çalışmaya başlar. Bu uca bağlanan bir butonla istenildiği zaman kullanıcıların programı tekrar başlangıçtan başlatması sağlanabilir. U1 16 +5V 15 OSC2/CLKOUT OSC1/CLKIN 10K 4 RA0 RA1 RA2 RA3 RA4/TOCKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 MCLR RESET 17 18 1 2 3 6 7 8 9 10 11 12 13 PIC16F84 Şekil 1.12. Pic16f84 reset devresi bağlantısı 1.9. GÜÇ BAĞLANTILARI Pic16x84 işlemcileri çalışma esnasında 5 Volt besleme isterler. Mikroişlemcilerin genel karakteristiği olarak besleme ne kadar stabl olursa o kadar iyi sonuç alınır. Vdd ve Vss ayaklarına sistem beslemesi bağlanır. Bu iki uc arasına da her ihtimale karşı 100 nanofaradlık bir kondansatör parazit süzücü olarak bağlanmıştır. MCLR RA0 RA1 RA2 RA3 RA4/TOCKI +5Volt 14 VDD PIC16F84 100nF 5 Vss RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 OSC1/CLKIN OSC2/CLKOUT 4 17 18 1 2 3 6 7 8 9 10 11 12 13 15 16 Şekil 1.13. Pic-besleme bağlantısı 25 MİKRODENETLEYİCİLER - I Yağlıoğlu Tün verilen bilgilerin ardından bir pic16f84 mikrodenetleyicisinin çalışması için osilatör, reset ve besleme bağlantılarının yapılı olması gerektiğini görmekteyiz. Aşağıda RC osilatör için bu şartları sağlayan devre şekli verilmiştir. +5Volt 14 VDD 100nF 5 RA0 RA1 RA2 RA3 RA4/TOCKI Vss RESET 10K 4 MCLR 10K PIC16F84 15 OSC1/CLKIN RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 17 18 1 2 3 6 7 8 9 10 11 12 13 33pF 16 OSC2/CLKOUT Şekil 1.14. Pic16f84’ün çalışabilmesi için gerekli bağlantı 1.10. GİRİŞ-ÇIKIŞ İŞLEMLERİ Bir mikroişlemcili sistemin kendi içinde, tek başına bir şey yapıyor olması asla düşünülemez. Bunun nedeni, böyle bir sistemin tasarlanması için gerekli sebepler incelenirse anlaşılabilecektir. Böyle bir sistem, ya girilecek bilgileri analiz etmek, çeşitli sonuçlar üretmek ve bu sonuçlara bağlı olarak çeşitli cihazlara kumanda etmek, veya sadece bilgileri displayda göstermek, veya sadece kendi içinde bazı işlemler yapıp, buradan elde ettiği sonuçlara göre başka cihazlara kumanda etmek, veya bir display sistemine gerekli bilgileri üretmek amacıyla tasarlanır. Hangi sebeple tasarlanırsa tasarlansın, en azından bir display sistemi yardımıyla veya tek bir uc aracılığıyla bilgi çıkışı yapmak, bu sistemin en temel fonksiyonu olacaktır. İşte böyle bir durumda uygun bir display sisteminin tasarlanması gerekir. Tasarlanabilecek en basit display sistemi, bir port çıkış ucundan bir lambayı (5 volt, 12 volt veya 220 volt) yakma-söndürme işlemi yapacak sistemdir ki, bu tip tasarımda en önemli nokta port çıkışının korunmasıdır. Bu koruma işleminde ilk akla 26 MİKRODENETLEYİCİLER - I Yağlıoğlu gelen koruma porttan fazla akım çekilmemesi olayıdır ki, bunu ohm kanunu ile hesaplamak mümkündür. Diyelim ki, mikroişlemcili sisteminiz 5 volt ile çalışıyor ve maksimum 20 mili amper çıkış verebiliyor ise, buna bağlanacak sistemin hesabını aşağıdaki gibi yapmak mümkündür. Ancak, bu hesaba geçmeden önce portun korunmasındaki ikinci olaya bakalım: Sistemden, port aracılığı ile kendi beslemesinden daha yüksek voltajlarda çalışan bir devreye kumanda ediliyor ise, kumanda edilen devreden sisteme gelecek voltaj sızıntısının önlenmesi gerekir. Aksi taktirde sisteminizde kullanılan dijital yapıya uygun elemanlar (ki beslemeye karşı aşırı hassastırlar) dışardan gelecek birkaç voltluk yüksek voltaj ile tahrip olabilirler. Bunu engellemek için sistemden sadece çıkış yapılan uçların tıkama diyodu mantığıyla korunması gerekir. Eğer porttan sadece bir led sürülüyor ise böyle bir korumaya gerek olmaz. Şekil 1.14’teki ledin ışık verirken üzerinde 2 volt tuttuğu ve 10-20 mili amper akım çektiği biliniyor ise bağlanacak direncin hesabı: R min=V/I=(5-2)/(20 mili amper)= 150 ohm R max=V/I=(5-2)/(10 mili amper)= 300 ohm Bu hesaba göre 180,220, 270 ohmluk standart dirençlerden herhangi birisi kullanılabilir. Burada tavsiye edilen değer, eğer ledin fazla parlak yanması gerekmiyor ise, az akım çekilerek sistemin az ısınması bakımından 270 ohm kullanılmasıdır. Şekil 1.15. Port ucuna bir led bağlanması Şekil 1.16 ve 1.17’da kumanda mekanizmasının normal çalışması için gerekli olan şey, transistor üzerinden yeterli akımı akıtabilecek beyz akımının akıtılabilmesidir. Bu şekilde akım akıtmanın gerekli olduğu yerlerde transistörün 27 MİKRODENETLEYİCİLER - I Yağlıoğlu hatalı bağlanması ile ilgili devre şekil 1.16’de verilmiştir. Öncelikle şekil 1.16’deki hatanın sebebini açıklayalım: Burada verilenler: a) Emiterden akıtılacak akım (yük akımı) = 1 amper b) Transistörün betası= 100 c) Transistor beslemesi= 12 volt d) Port çıkışı = 5 volt e) Yük direnci = 10 ohm f) Vbe=0.6 volt g) Vd=0.6 volt Çözüm: Ib=Ie/(Beta+1) =1/101=0,0099=9.9 mili amper Ib=(Vport-Vbe-Vd)/(Rb+(Ie*Ryük) denkleminden Rb=(Vport-Vbe-Vd-Ie*Ryük)/Ib=(-626 ohm) Buradan görüldüğü gibi normal şartlarda 10 volt 1 amperlik (10Watt) bir yükü bu sistemle sürmek (aktif eleman olmadığı sürece direnç hesabı negatif olmayacağından) mümkün olmamaktadır. Şekil 1.16. Pic ile 12 voltluk bir DC lambanın uygun olmayan metotla sürülmesi 28 MİKRODENETLEYİCİLER - I Yağlıoğlu Bunun esas nedeni emiterdeki yükün beyz tarafından bakıldığında (Beta+1) katı kadar bir direnç göstermesidir ki, bu direnç beyzden geçecek akımı ve dolayısıyla emiterden geçecek akımı sınırlamaktadır. Şekil 1.17. Pic ile 12 voltluk bir DC lambanın sürülmesi Şimdi Şekil 1.17 ’teki devre için beyz direncini hesaplayalım: Ib=Ie/(Beta+1) =1/101=0,0099=9.9 mili amper Rb=(Vport-Vd-Vbe)/Ib=383 ohm Yükün hassasiyetine göre tam değer ya da standart dirençlerden 390 ohm kullanılabilir. Şekilde 470 ohm olarak kullanılmıştır. Şekil 1.18’de transistör ile role sürme devresi verilmiştir. Rolenin sürülmesi demek, porttan yüksek akım ya da gerilimlere kumanda edilmesi demektir. Burada şekil 1.18 üzerindeki röleye paralel direnç neden konulmuştur sorusunun cevabı, role çekili iken bırakması istendiğinde (yani röleden akımı kestiğimizde) oluşacak olan ters elektromotor kuvvetinin oluşturacağı akımdan, sistemin korunması ve rölenin zamanında bırakmasının sağlanmasıdır. 29 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil 1.18. Port çıkışından 12 voltluk bir DC rolenin sürülmesi Burada role kullanılarak yüksek voltaj ve güçlerdeki DC ve AC yüklere kumanda etmek mümkündür. Ancak hepimiz bilmekteyiz ki sürekli açma-kapama işlemleri ve yüksek akımlar role kontaklarını kısa sürede tahrip etmektedir. Yük omik olduğu zaman tristör ya da triyak ile yapılacak kumandalarda faz farkı ve iletimden düşme problemleri olmayacağından tek problem sistem yalıtımı olmaktadır ki, bu problemi de tıkama diyotu ile aşmak mümkündür. Bu şekilde bir bağlantı şekil 1.18’de verilmiştir. Burada çift tıkama diyotu kullanılarak bir nevi çifte güvenlik sağlanmış olur. Şekil 1.19. Port çıkışından triyak kullanarak bir AC lambaya kumanda edilmesi 30 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil 1.19’deki ac lambanın sürülmesi olayına gelince, burada önemli olan triyakın bir kez iletime geçmesini sağlayacak akımı sistemden geçirmektir. Burada triyakı iletime küçük bir darbe de geçirebileceğine göre, ortalama olarak porttan çekilecek akımı yaklaşık 10 miliamperle sınırlamak yeterli olacaktır. 1.11. DİSPLAY TASARIMI Eğer, port üzerinden tek bir lamba değil de bir display sistemi sürülecek ise sabit yakma veya taramalı yakma mantığına göre birkaç ayrı tasarım yapmak mümkündür. Eğer, display sayısı uygun ise, taramalı yakma mantığıyla tasarlamak çok daha uygundur. Bu uygunluğun nedeni ısı problemlerinin ve güç kaybının azaltılmasından ileri gelmektedir. Burada örnek olarak aşağıdaki display sistemi ele alınacaktır: Burada display bağlantısı Şekil 1.19’daki gibidir. Displayların ortak ayakları ise ortak katot şeklindedir ve A portuna çıkışı değillenmiş bir 3 to 8 mux üzerinden bağlanmıştır. Böylece mux üzerinden sadece bir uçtan 0 geleceği için aynı anda sadece 1 adet display seçilmiş olmaktadır. Diyelim ki, en düşük değerlikli displayda C harfini göstermek istiyorsak A portundan onaltılık sistemde 01 sayısını göndermemiz gerekir. Böylece en düşük değerlikli olan display seçilmiş olmaktadır. Şimdi de B portundan gönderilecek datanın hesabına bakalım: C harfinin ekranda görülmesi için seven segment sistemde a,d,e,f segmentlerinin ışık vermesi yani bu uçlara 1 gönderilmesi lazımdır. Sönük kalacak uçlara da 0 göndermek gerekmektedir. Seven segment displayın uçlarının B portuna bağlanış sırasına göre sıralayalım ve gerekli yerlere 1 ve 0 sayılarını yazalım. Buna göre datamız: Bağlantı sırası : dp g f e 0 0 1 1 d c b a 1 0 0 1 İkili sistemde= 0011 1001, Onaltılık sistemde =39 31 MİKRODENETLEYİCİLER - I Yağlıoğlu Tabii ki bu sayıları göndermek için portların önceden çıkış olarak tasarlanmış olması gerekir. Bu işlem nasıl yapılacaktır denildiğinde öncelikle portların yapısını ve giriş ya da çıkış olarak nasıl ayarlanabileceğini incelemek gerekmektedir. U3 16 +5V 6 4 5 A B C G1 G2A G2B Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 I I I 15 14 13 12 11 10 9 7 74LS138 Şekil 1.20. Örnek dislay B portu bağlantısı 32 GND a b c d e f g I I I U4 1 2 3 GND a b c d e f g I I I GND a b c d e f g I I I GND GND C1 33pF a b c d e f g I II II II II II I I II II II II II I PIC16F84 I I I OSC2/CLKOUT 3 2 1 18 17 GND R2 10K RA4/TOCKI RA3 RA2 RA1 RA0 a b c d e f g RESET OSC1/CLKIN MCLR 15 4 SW1 I I I R1 10K 13 12 11 10 9 8 7 6 a b c d e f g RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0/INT +5V BÖLÜM 2 MİKRODENETLEYİCİLER - I Yağlıoğlu 2. 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) Sembol Anlamı Genel işlemler, işlemin ne olduğu kutu içerisine yazılır. Karşılaştırma işlemleri; karar verme durumlarını simgeler ve doğru-yanlış seçenek içerir 33 gibi iki MİKRODENETLEYİCİLER - I Yağlıoğlu Başlangıç ve bitiş belirtmede kullanılır. Çıkış; genellikle yazı şeklindeki çıktılarda kulanılır. Sembol Anlamı Bağlantı bölümleri El ile bilgi girişi Şekil 2.1. Akış diyagramlarında rastlanılan bazı sembollerin anlamları. Şimdi bu sembollerle işlemlerin nasıl belirtilebileceğini çok bilinen bir örnekle vermeye çalışalım: Ö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. 34 MİKRODENETLEYİCİLER - I Yağlıoğlu Çözüm: Önce problemin algoritmasını yazalı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. 35 MİKRODENETLEYİCİLER - I Yağlıoğlu Şimdi de bu algoritmaya göre akış diyagramını çizelim: Şekil 2.2. Örnek 2.1. için akış diyagramı 36 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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. 37 MİKRODENETLEYİCİLER - I Yağlıoğlu Şimdide bu işlem için, akış diyagramını tasarlayalım. Şekil2.3 Örnek 2.2. akış diyagramı. 38 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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. Bu örnekle ikinci örnek birbirine benzemekle birlikte, aslında işlem önceliğini burada görmekteyiz. Program yazımında bu önemli bir ayrıntıdır. Şimdi de bu işlem için akış diyagramını tasarlayalım. 39 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil2.4. Örnek 2.3 için akış diyagramı. 40 MİKRODENETLEYİCİLER - I Yağlıoğlu Bu şekildeki basit akış diyagramları örnekleri ile bir sistemdeki çalışma mantığına temel olarak bakmış olduk. Artık bazı komutları da bu işe ekleyerek ilk pic programı yazma denemelerimizi yapma zamanımız gelmiş oldu. Akış diyagramlarını bu şekilde verdiğimiz bu örneklerin programını yazarken, buradakinden daha değişik (ve kısa) metotlarla farklı çözümlerini göreceğiz. Program yazımına geçmeden önce pic 16f84 mikrokontrollörün komutlarını ve ne iş yaptıklarını öğrenerek temel bilgilerimizi tamamlamış olmakta fayda var. 41 BÖLÜM 3 MİKRODENETLEYİCİLER - I 3. PIC 16F8X Yağlıoğlu KOMUTLARI 3.1.KULLANILAN SEMBOLLER: f : File register, Herhangi bir değişkenle tarif edilen bir saklayıcı adresi (0h-7Fh) k : Sabit değer (genellikle (0-FF arasında) d : Destination (hedef) göstergesi (Genellikle 0 ya da 1) b : Bit belirten sayı (0-7 arası) veya Binary sayı (b’00101111’) h : Hexadecimal sayı (h’FF’ veya FFh) x : Değeri önemli olmayan bit (1 ya da 0 olabilir) [] : Duruma göre kullanılıp kullanılmaması serbest olan seçenek ⇒ : İse veya ... işleminin sonunda ← : Değer atama etiket : Değişken adı veya adres bildirmek için kullanılan isim 3.2.KOMUTLAR VE KULLANIM ÖRNEKLERİ 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 42 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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 43 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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 44 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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 45 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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. 46 MİKRODENETLEYİCİLER - I Yağlıoğlu Ö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 DEVAM CALL TOPLAMA ... ... 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 47 MİKRODENETLEYİCİLER - I Yağlıoğlu Örnek: CLRF SAYI Komuttan önce SAYI=xxh ise Komuttan sonra SAYI=00h olur. CLRW : Akümülatörün içeriğini 00h yap İngilizce Yazılımı:Clear W Kullanım Şekli:CLRW İşlevi: W ← 00h Etkilenen Bayraklar:Z Periyot:1 Örnek: CLRW Komuttan önce W=xxh ise Komuttan sonra W=00h olur. CLRWDT : Watchdog timer içeriğini 00h yap İngilizce Yazılımı:Clear Watch Dog Timer Kullanım Şekli:CLRWDT f İşlevi: WDT ← 00h WDT Önbölücüsü ← 0 TO ← 1 , PD ← 1 Etkilenen Bayraklar: TO, PD Periyot:1 48 MİKRODENETLEYİCİLER - I Yağlıoğlu Örnek: CLRWDT Komuttan önce WDT=xxh ise Komuttan sonra WDT=00h olur. İşlevde belirtilen diğer değerler atanır. COMF : Bir registerin komplementini alır İngilizce Yazılımı:Complement f Kullanım Şekli:COMF f,d İşlevi: W ← (Complement) f veya f ← (complement) f Etkilenen Bayraklar:Z Periyot:1 Örnek 1: COMF SAYI,0 Komuttan önce W=07h ve SAYI= 30h ise Komuttan sonra W=CFh ve SAYI= 30h olur. Örnek 2: COMF SAYI,1 Komuttan önce W=07h ve SAYI= 30h ise Komuttan sonra W=07h ve SAYI= CFh olur. DECF : Register içeriğini 1 azalt. İngilizce Yazılımı:Decrement file register. Kullanım Şekli:DECF f,d İşlevi: W←f-1 veya f←f-1 Etkilenen Bayraklar:Z Periyot:1 49 MİKRODENETLEYİCİLER - I Yağlıoğlu Örnek 1: DECF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=6Fh , SAYI=14h olur. Örnek 2: DECF SAYI,0 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=14h , SAYI=15h olur. DECFSZ : Register içeriğini 1 azalt, sonuç 0 ise bir komut atla. İngilizce Yazılımı:Decrement f, Skip if Zero Kullanım Şekli:DECFSZ f,d İşlevi: f←f-1 ve eğer f=0 ise 1 komut atla. Etkilenen Bayraklar:Yok Periyot: f≠0 ise 1 periyot f=0 ise 2 periyot Örnek : MOVLW 0Fh MOVWF SAYAC TEKRAR DECFSZ SAYAC,1 GOTO DEVAM TEKRAR .... Açıklama: Sayac 0 olana dek işlem tekrar ve goto tekrar satırları arasında 15 kez tekrarlar. Sonra sayac 0 olunca işlem devam satırından devam eder. 50 MİKRODENETLEYİCİLER - I Yağlıoğlu GOTO : Verilen adrese git. İngilizce Yazılımı:Go to adress Kullanım Şekli:GOTO k İşlevi: PC←Adres(k) Etkilenen Bayraklar : Yok Periyot:2 Örnek : İŞLEM1 GOTO İŞLEM2 Komuttan sonra işlem sırası, işlem2 ye gider. INCF : Register içeriğini 1 artır. İngilizce Yazılımı:Increment file register. Kullanım Şekli:INCF f,d İşlevi: W←f+1 veya f←f+1 Etkilenen Bayraklar:Z Periyot:1 Örnek 1: INCF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=6Fh , SAYI=16h olur. Örnek 2: DECF SAYI,0 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=16h , SAYI=15h olur. 51 MİKRODENETLEYİCİLER - I Yağlıoğlu INCFSZ : Register içeriğini 1 artır, sonuç 0 isebir komut atla. İngilizce Yazılımı:Increment f, Skip if Zero Kullanım Şekli:INCFSZ f,d İşlevi: f←f+1 ve eğer f=0 ise 1 komut atla. Etkilenen Bayraklar:Yok Periyot:f≠0 ise 1 periyot f=0 ise 2 periyot Örnek : MOVLW 00h MOVWF SAYAC TEKRAR INCFSZ SAYAC,1 GOTO DEVAM TEKRAR .... Açıklama: Sayac 0 olana dek işlem tekrar ve goto tekrar satırları arasında 256 kez tekrarlar. Sonra sayac 0 olunca işlem devam satırından devam eder. IORLW : Bir sayı ile W’yi OR işlemi yapar İngilizce Yazılımı:Inclusive Or Literal with W Kullanım Şekli: IORLW k İşlevi: W←W OR k Etkilenen Bayraklar: Z Periyot:1 Örnek: ADDLW 05h Komuttan önce W=62h ise Komuttan sonra W=67h olur. 52 MİKRODENETLEYİCİLER - I Yağlıoğlu IORWF : Bir register ile W’yi OR yapar. İngilizce Yazılımı:Inclusive Or W with File register Kullanım Şekli:IORWF f,d İşlevi: W←W OR f veya f←W OR f Etkilenen Bayraklar:Z Periyot:1 Örnek 1: IORWF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=6Fh , SAYI=7F h olur. Örnek 2: ADDWF SAYI,0 Komuttan önce W=65h ve SAYI=0Fh ise Komuttan sonra W=7Fh , SAYI=0F h olur. MOVLW : Accumulatora bir sayı yükle. İngilizce Yazılımı:Move Literal to W Kullanım Şekli: MOVLW k İşlevi: W←k Etkilenen Bayraklar:Yok Periyot:1 Örnek: MOVLW 05h Komuttan önce W=xxh ise Komuttan sonra W=05h olur. 53 MİKRODENETLEYİCİLER - I Yağlıoğlu MOVF : Bir register içeriğini hedefe taşı. İngilizce Yazılımı:Move f Kullanım Şekli:MOVF f,d İşlevi: W←f veya f←f Etkilenen Bayraklar:Z Periyot:1 Örnek: MOVF SAYI,0 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=15h , SAYI=15h olur. MOVWF : W’nin içeriğini bir registere taşı. İngilizce Yazılımı:Move w to f Kullanım Şekli:MOVWF f İşlevi: f←W Etkilenen Bayraklar:Yok Periyot:1 Örnek: MOVWF SAYI Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=6Fh , SAYI=6Fh olur. 54 MİKRODENETLEYİCİLER - I Yağlıoğlu NOP : İşlem yapma İngilizce Yazılımı:No Operation Kullanım Şekli:NOP İşlevi: 1 periyot pekle Etkilenen Bayraklar:Yok Periyot:1 Örnek: NOP Açıklama : 1 periyot süresince bekletir. RETFIE : Interupt altprogramından geri dön. İngilizce Yazılımı:Return From Interrupt. Kullanım Şekli:RETFIE İşlevi: PC←TOS GIE ←1 (INTCON(7)←1) Etkilenen Bayraklar:Yok Periyot:2 Örnek: RETFIE: Açıklama : İşlevde belirtilenleri yaparak interrupt alt programının çağırıldığı yerden işlemin devam etmesini sağlar. Yani interrupt altprogramını sonlandırma komutudur. 55 MİKRODENETLEYİCİLER - I Yağlıoğlu RETLW : Altprogramdan accumulatora bir sayı yükleyerek geri dön. İngilizce Yazılımı:Return with Literal in W. Kullanım Şekli:RETLW k İşlevi: W←k ve PC←TOS Etkilenen Bayraklar:Yok Periyot:2 Örnek: CALL LİSTE komutu işletilecekse ve LİSTE isimli altprogramda aşağıdaki gibi ise W=01h ise işlem bitişinde W=11h olur ve geri döner. W=02h ise işlem bitişinde W=12h olur ve geri döner. Bu şekilde listeden değer seçme işlemlerinde kullanılır. LİSTE ADDWF PC RETLW 11h RETLW 12h RETLW 13h RETLW 14h RETURN : Altprogramdan geri dön. İngilizce Yazılımı:Return From Subrutine. Kullanım Şekli:RETURN İşlevi: PC←TOS Etkilenen Bayraklar:Yok Periyot:2 Örnek: RETURN Açıklama : İşlevde belirtilenleri yaparak altprogramın çağırıldığı yerden işlemin devam etmesini sağlar. Yani alt programı sonlandırma komutudur. 56 MİKRODENETLEYİCİLER - I Yağlıoğlu RLF : Registerin bitlerini 1 bit sola döndür. İngilizce Yazılımı:Rotate Left f Kullanım Şekli:RLF f,d İşlevi: C Register (f) Etkilenen Bayraklar:C Periyot:1 Örnek 1: RLF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h C=0 ise Komuttan sonra W=6Fh , SAYI=2Ah , C=0 olur. İşlem 4 kez tekrarlarsa W=6Fh, SAYI=05h ve C=1 olur. Örnek 2: RLF SAYI,0 Komuttan önce W=6Fh ve SAYI=15h C=0 ise Komuttan sonra W=2Ah , SAYI=15h , C=0 olur. RRF : Registerin bitlerini 1 bit sağa döndür. İngilizce Yazılımı:Rotate Right f Kullanım Şekli:RRF f,d 57 MİKRODENETLEYİCİLER - I Yağlıoğlu İşlevi: C Register (f) Etkilenen Bayraklar:C Periyot:1 Örnek 1: RRF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h , C=0 ise Komuttan sonra W=6Fh , SAYI=0Ah , C=1 olur. İşlem 2 kez tekrarlarsa W=6Fh, SAYI=85h ve C=0 olur. Örnek 2: RRF SAYI,0 Komuttan önce W=6Fh ve SAYI=15h C=0 ise Komuttan sonra W=0Ah , SAYI=15h , C=1 olur. SUBLW : Bir sayıdan W’nin içeriğini çıkarır. İngilizce Yazılımı:Subtract W from Literal Kullanım Şekli: SUBLW k İşlevi: W←k-W Etkilenen Bayraklar: C,DC,Z Periyot:1 Örnek: SUBLW 65h Komuttan önce W=60h ise Komuttan sonra W=05h olur. 58 MİKRODENETLEYİCİLER - I Yağlıoğlu SUBWF : Bir registerin içeriğinde W’nin içeriğini çıkarır. İngilizce Yazılımı:Subtract W from File register Kullanım Şekli:SUBWF f,d İşlevi: W←f-W veya f←f-W Etkilenen Bayraklar:C, DC, Z Periyot:1 Örnek: SUBWF SAYI,1 Komuttan önce W=60h ve SAYI=65h ise Komuttan sonra W=60h , SAYI=05 h olur. Örnek 2: SUBWF SAYI,0 Komuttan önce W=60h ve SAYI=65h ise Komuttan sonra W=05h , SAYI=65 h olur. SWAPF : Bir registerin nibble’larını yer değiştir. İngilizce Yazılımı:Swap nibbles in f Kullanım Şekli:SWAPF f,d İşlevi: W(LSN)←f(MSN) ve W(MSN)←f(LSN) veya f(LSN)←f(MSN) ve f(MSN)←f(LSN) Etkilenen Bayraklar:Yok Periyot:1 59 MİKRODENETLEYİCİLER - I Yağlıoğlu Örnek: SWAPF SAYI,1 Komuttan önce W=60h ve SAYI=65h ise Komuttan sonra W=60h , SAYI=56 h olur. Örnek 2: ADDWF SAYI,0 Komuttan önce W=60h ve SAYI=65h ise Komuttan sonra W=56h , SAYI=65 h olur. XORLW : Bir sayı ile W’Yi EXOR işlemi yapar İngilizce Yazılımı:EX-OR Literal with W Kullanım Şekli: XORLW k İşlevi: W←W EXOR k Etkilenen Bayraklar: Z Periyot:1 Örnek: XORLW 05h Komuttan önce W=67h ise Komuttan sonra W=62h olur. XORWF : Bir register ile W’yi EXOR yapar. İngilizce Yazılımı:EX-OR W with File register Kullanım Şekli:XORWF f,d İşlevi: W←W EXOR f veya f←W EXOR f Etkilenen Bayraklar:Z Periyot:1 60 MİKRODENETLEYİCİLER - I Yağlıoğlu Örnek 1: XORWF SAYI,1 Komuttan önce W=6Fh ve SAYI=15h ise Komuttan sonra W=6Fh , SAYI=7Ah olur. Örnek 2: XORWF SAYI,0 Komuttan önce W=65h ve SAYI=15h ise Komuttan sonra W=70h , SAYI=15 h olur. Not: Komutlarda hedef olarak 0 şeklinde belirtildiğinde bilgi W adresine gider, 1 ile belirtildiğinde ise ilgili registere gider. Burada 0 yerine w, 1 yerine ilgili registerin adı yazılırsa da program aynı olur. Bu yazılımda program daha anlaşılır olur. 61 BÖLÜM 4 MİKRODENETLEYİCİLER - I Yağlıoğlu 4. 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. Bu sebeple önce “Kalem kağıtla bu iş nasıl yapılır?” sorusunun cevabını görelim: Assembler program yazımı: Assembler program yazımında direkt olarak çizgi ile gösterilmemesine rağmen ekranınız ya da kağıdınız 4 ayrı sütunmuş gibi düşünülür. Etiket Komut Parametre Açıklama Alanı Alanı Alanı Alanı Üstte görüldüğü gibi program yazma alanı 4 ayrı alandan oluşur. Bu alanların ne olduğuna bir bakalım: 1) Etiket Alanı: Program içerisinde bölüm ya da satırlara isim vermek için kullanılır. Bu isimler, ya program esnasında adı geçen bölümü çağırmak, ya o bölüme atlama yapmak, ya da değişken adı ve benzeri şekilde kullanılır. Harf adeti ya da kullanım sınırlaması pek fazla olmamasına rağmen yine de komut kelimelerini ya da standart register isimlerini etiket adı olarak kullanmamak gerekir. Ayrıca programın windows altında çalışıp çalışmayacağını düşünerek 62 MİKRODENETLEYİCİLER - I Yağlıoğlu İngiliz alfabesindeki harfleri kullanmak, sekiz harfi geçmeyecek isimler kullanmak uygun olur. 2) Komut Alanı: Bu alanda bir pic assembler komutu bulunur. Özel bir durumu olmamasına rağmen komutların ya tamamını büyük harfle veya tamamını küçük harfle yazmakta fayda vardır. 3) Parametre Alanı: Bazı komutlar parametre içerir, bazıları ise içermez. Parametre içeren komutların parametreleri bu alana yazılır. Parametre kelimesi, burada komutun önüne gelecek eklemeler anlamına gelmektedir. Bunların neler olabileceğini komutlar bölümünde görebiliriz. 4) Açıklama Alanı: Bu alan istenirse kullanılır, istenmezse kullanılmaz. Komutun bitiminden sonra, araya bir noktalı virgül (;) atıldıktan sonra, istenilen açıklama yazılır. Açıklama kısmı program derlenirken işleme girmez; sadece programı yazan veya yazılmış bir programı inceleyen kişiye o satırın ya da o bölümün ne iş yaptığını gösterir. Program yazan kişinin ileride aynı programı tekrar incelemesi, değişiklik ya da ekleme yapması gerektiğinde hatırlatıcı not görevi gördüğü için, özellikle büyük programlarda açıklama yazmak önemlidir. Uzun açıklamalarda ya da bölüm isimlendirmelerinde satırın en başından itibaren noktalı virgül atılarak başlanırsa, o satır olduğu gibi açıklama satırı şeklinde kullanılmış anlamına gelir. Şimdi ilk programımızı yazarak bu alanların ne olduğunu ve programımızın çalışmasını inceleyelim. Örnek 4-1: Programlama mantığı bölümünde akış diyagramı verilen birinci led yakma örneğinin programını yazalım: 63 MİKRODENETLEYİCİLER - I Yağlıoğlu Programı yazmadan önce port uçlarının kullanımı konusunda karar verelim. Diyelim ki; PortA’nın PA0 ucuna tuş, PA1 ucuna da led bağlanacak olsun. Buna göre devrenin bağlantısı aşağıdaki gibi olacaktır: +5Volt 10K 4 MCLR RA0 VDD 10K tus 14 100nF OSC2/CLKOUT RESET 15 33pF R3 LED 18 OSC1/CLKIN RA1 330Ohm 5 Vss RA2 RA3 RA4/TOCKI RB0/INT RB1 PIC16F84 RB2 RB3 RB4 RB5 RB6 RB7 17 16 1 2 3 10K 6 7 8 9 10 11 12 13 Şekil 4.1. Pic16f84 kullanarak buton ile led kontrol devresi. Şimdi programımızı yazalım: list p=16f84 ;Bank 0 register tanımlamaları INDF EQU 00h ;Dolaylı adreslemede FSR ile birlikte kullanılır. TMR0 EQU 01h ;Timer sayıcı register 64 MİKRODENETLEYİCİLER - I PCL EQU 02h Yağlıoğlu ;Program Sayacı STATUS EQU 03h ;Durum registeri FSR EQU 04h ;Dolaylı adreslemede kullanılır. PORTA EQU 05h ;A Portu PORTB EQU 06h ;B portu EEDATA EQU 08h ;EEPROM verisini tutan reg. EEADR ;EEPROM verisinin adresini tutan register. EQU 09h PCLATH EQU 0Ah ;Program sayacının üst bitlerini tutan register. INTCON EQU 0Bh ;İnterrupt kontrol denetleme registeri. ;0Ch adresi ve sonrası kullanıcı programları için ;ayrılmıştır. ;Bank 1 registerleri tanımlamaları OPTION EQU 81h ;Bazı ayarlamaları tutan reg. TRISA EQU 85h ;PortA yönlendirme reg. TRISB EQU 86h ;PortB yönlendirme reg. EECON1 EQU 88h ;EEPROM işlemleri 1. reg. EECON2 EQU 89h ;EEPROM işlemleri 2. reg. ;Ana ayarlamaları yapalım org 0h ;Reset vektörü adresi goto basla ;Reset işl. Prg. ; Şimdi ana programa başlayalım: başla clrf PORTA ;PORTA reg. sil bsf STATUS,5 ;Bank1’e geçmek için Status registerin 5. bitini 1 yap. movlw 3Dh ;PA1’i çıkış yapmak için movwf TRISA ;trisA’da ayarlandı. 65 MİKRODENETLEYİCİLER - I Yağlıoğlu bcf STATUS,5 ;Bank 0’a geç. tekrar bcf PORTA,1 ;Ledi söndür tus1 btfss PORTA,0 ;tuşu kontrol et goto tus1 ;tuş basılmamışsa geri git bsf PORTA,1 ;Tuş basılıdır, ledi yak btfsc PORTA,0 ;Tuşu kontrol et goto tus2 ;tuş basılı ise geri git goto tekrar ;tuş bırakılmış ise başa git tus2 end ;program sonu Örnek 4-1-b) Önceki örneğimizde tanımlamaların çok fazla yer tuttuğunu görmüştük. Bunu kısaltarak programı tekrar yazalım: Çözüm: Bu işlemde iki çözümden birini kullanmak mümkündür. Bu çözümlerden ilki kullanmadığımız registerleri tanımlama alanına yazmamaktır. Bu durumda yine de bir tanımlama alanını yazmak gerekir. İkinci metod ise microchip firmasının yazdığı “pic16f84.inc” dosyasını, programa eklemek yeterli olacaktır. (Bu dosyanın içeriği EkB’de verilmiştir.) Bu işlem include komutu ile yapılır. Bu durumda program aşağıdaki gibi olur. ;Tanımlama ve ana ayarları yapalım: list p=16f84 include “pic16f84.inc” org 0h ;Reset vektörü adresi goto basla ;Reset işl. Prg. 66 MİKRODENETLEYİCİLER - I Yağlıoğlu ; Şimdi ana programa başlayalım: başla clrf PORTA ;PORTA reg. sil bsf STATUS,5 ;Bank1’e geçmek için Status registerin 5. bitini 1 yap. movlw 3Dh ;PA1’i çıkış yapmak için movwf TRISA ;trisA’da ayarlandı. bcf STATUS,5 ;Bank 0’a geç. tekrar bcf PORTA,1 ;Ledi söndür tus1 btfss PORTA,0 ;tuşu kontrol et goto tus1 ;tuş basılmamışsa geri git bsf PORTA,1 ;Tuş basılıdır, ledi yak tus2 btfsc PORTA,0 ;Tuşu kontrol et goto tus2 ;tuş basılı ise geri git goto tekrar ;tuş bırakılmış ise başa git end ;program sonu Örnek 4-2: Akış diyagramlarında verilen ikinci örneğin programını yazalım. Çözüm : Hatırlama açısından algoritmasını tekrar yazalı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. 67 MİKRODENETLEYİCİLER - I Yağlıoğlu 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. Şimdi de programımızı yazalım: ;Tanımlama ve ana ayarları yapalım: list p=16f84 include “pic16f84.inc” org 0h ;Reset vektörü adresi goto basla ;Reset işl. Prg. ; Şimdi ana programa başlayalım: başla clrf PORTA ;PORTA reg. sil bsf STATUS,5 ;Bank1’e geçmek için Status’ün 5. bitini 1 yap. movlw 3Dh ;PA1’i çıkış yapmak için movwf TRISA ;trisA’da ayarlandı. bcf STATUS,5 ;Bank 0’a geç. tekrar bcf PORTA,1 ;Ledi söndür tus1 btfss PORTA,0 ;tuşu kontrol et goto tus1 ;tuş basılmamışsa geri git bsf PORTA,1 ;Tuş basılıdır, ledi yak 68 MİKRODENETLEYİCİLER - I tus2 Yağlıoğlu btfsc PORTA,0 ;Tuşu kontrol et goto tus2 ;tuş basılı ise geri git ;tus bırakılana kadar bekle tus3 tus2 btfss PORTA,0 ;tuşu kontrol et goto tus3 ;tuş basılmamışsa geri git bcf PORTA,1 ;Tuş basılıdır, ledi söndür btfsc PORTA,0 ;Tuşu kontrol et goto tus2 ;tuş basılı ise geri git goto tekrar ;tuş bırakılmış ise başa git end ;program sonu Örnek 4-3 : Akış diyagramlarında verilen üçüncü örneğin programını yazalım. Çözüm : Hatırlama açısından algoritmasını tekrar yazalı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) 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. 69 MİKRODENETLEYİCİLER - I Yağlıoğlu 12) Buton basılı ise 11. adıma dön. 13) Buton basılı değilse 3. adıma dön. Şimdi de programımızı yazalım: ;Tanımlama ve ana ayarları yapalım: list p=16f84 include “pic16f84.inc” org 0h ;Reset vektörü adresi goto basla ;Reset işl. Prg. ; Şimdi ana programa başlayalım: başla clrf PORTA ;PORTA reg. sil bsf STATUS,5 ;Bank1’e geçmek için Status reg.’in 5. bitini 1 yap. movlw 3Dh ;PA1’i çıkış yapmak için movwf TRISA ;trisA’da ayarlandı. bcf STATUS,5 ;Bank 0’a geç. tekrar bcf PORTA,1 ;Ledi söndür tus1 btfss PORTA,0 ;tuşu kontrol et goto tus1 ;tuş basılmamışsa geri git btfsc PORTA,0 ;Tuşu kontrol et goto tus2 ;tuş basılı ise geri git tus bırakılana kadar bekle bsf PORTA,1 ;Ledi yak btfss PORTA,0 ;tuşu kontrol et goto tus3 ;tuş basılmamışsa geri git tus2 tus3 70 MİKRODENETLEYİCİLER - I bcf tus4 PORTA,1 Yağlıoğlu ;ledi söndür. btfsc PORTA,0 ;Tuşu kontrol et goto ;tuş basılı ise geri git tus4 ;tus bırakılana kadar bekle goto tekrar ;tuş bırakılmış ise başa git end ;program sonu Buraya kadar verdiğimiz örneklerle hem assembler program yazmayı hem de komutların bir kısmının kullanım tekniğini öğrendik. Ayrıca en önemlisi program yaparken nasıl düşünmemiz gerektiğini öğrendik. Şimdi çeşitli örneklerle programlama tekniğini öğrenmeye devam edelim. 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 gönderilebileceğini görürüz. Bu mantıkla düşünülünce yangın söndürme kısmı 71 çıkışa MİKRODENETLEYİCİLER - I Yağlıoğlu 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. ;RA0 ,RA1,RA2,RA3 ucları her kattaki yangın algılayıcılar ;RB0, RB1,RB2, RB3 ucları katlardaki yangın fıskiyeleri ;RB4 Su seviyesi yarım sensörü ;RB5 Su dolu sensörü ;RB6 motor çıkışı ;RB7 boş çıkış LIST P=16F84 STATUS EQU 3h PORTB EQU 6h TRISB EQU 6h PORTA EQU 5h TRISA EQU 5h yedek equ 11h X1 org 0h ; Power on goto START ; 0000 bsf STATUS,5 movlw b'00110000' movwf TRISB movlw 0Fh movwf TRISA bcf STATUS,5 clrf PORTB clrf yedek START deger ;RB7,RB6,RB3,RB2,RB1,RB0 çıkış ;A portu giriş 72 MİKRODENETLEYİCİLER - I devam bos dolu movf PORTA,w andlw 0Fh iorwf yedek,w movwf PORTB btfsc PORTB,4 goto dolu bsf PORTB,6 bsf yedek,6 btfss PORTB,5 goto devam bcf PORTB,6 bcf yedek,6 goto devam Yağlıoğlu END 73 BÖLÜM 5 MİKRODENETLEYİCİLER - I Yağlıoğlu 5. DÖNGÜLER 5.1. 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. Öncelikle basit bir döngü programı yazarak işlemin nasıl yapılabileceğine bir bakalım: DÖNGÜ ÖRNEĞİ 1: TEKRAR CLRF SAYAC INCF SAYAC,F MOVLW h’07’ 74 MİKRODENETLEYİCİLER - I DÖNGÜ SUBWF SAYAC,W BTFSS STATUS,2 GOTO TEKRAR GOTO DÖNGÜ Yağlıoğlu END Yukarıdaki örnekte sayac isimli değişken önce 0 yapılıyor ve sonra içerisi birer birer artırılarak sayması sağlanıyor. Bu sayılan değer her turda 7 sayısı ile kıyaslanıyor ve bu kıyaslama sonucunda sonuç 0 değilse (yani sayac=7 değilse) işlem tekrar adımına geri dönüyor. Böylece tekrar satırı ile goto tekrar satırları arası 7 kez tekrar ediliyor. Yukarıdaki bu örnekte diğer bir döngü şekli daha görülmektedir ki; bu tip döngüye sonsuz döngü diyoruz. Bu da döngü etiketli satırda yapılmış döngü metodudur. Dikkat edilirse; program döngü isimli satıra gelince tekrar aynı satıra geri geliyor yani işlem herhangi bir şarta bağlı olmaksızın aynı satıra geri dönüyor. Böylece bir nevi işlem orada bekleme pozisyonuna geçmiş oluyor. Bu tip döngüler, genelde resetlemenin beklenildiği yerlerde kullanılır. Bir diğer kullanım yeri ise programları sürekli yapmaktır. döngü Sayac ←0A Sayac=sayac-1 Hayır Sayac=0 mı? Evet Şekil 5.1. Döngü akış diyagramı 75 MİKRODENETLEYİCİLER - I Yağlıoğlu DÖNGÜ ÖRNEĞİ 2: MOVLW h’0A’ MOVWF SAYAC DÖNGÜ DECFSZ SAYAC,F GOTO DÖNGÜ DEVAM XXXX Yukarıdaki örnekte ise sayac değişkenine decimal 10 sayısı yüklenmekte ve döngü satırında sayacın içeriği her seferinde 1 azaltılarak, sonucun 0 olup olmadığı kontrol ediliyor. Sonuç 0 değilse; işlem döngü satırına atlatılarak işleme devam ediliyor. Bu tip döngülere, zaman geçirme döngüleri diyoruz. Bu döngünün kaç cycle (saykıl) tuttuğunu hesaplayarak işlem süresini de hesaplamak mümkündür. Bu hesaplamaya geçmeden önce, işlemcinin 1 komut saykılı dendiğinde, osilatör frekansının dörde bölünmesinden elde edilen değer olduğunu bilmemiz gerekir. Örneğin 4 MHz’de çalışan bir devre için 1 komut saykılı 4/4=1 MHz olacaktır. Bu sistem için bir komut periyodu 1 Mikrosaniye olacaktır. Aşağıda her komutun ne kadar cycle süreceğini görüyoruz. ETİKET DÖNGÜ KOMUT PARAMETRE CYCLE MOVLW h’0A’ 1 MOVWF SAYAC 1 DECFSZ SAYAC,F D=1, Y=2 GOTO DÖNGÜ 2 Şimdi de programın tamamının kadar cycle tutacağını hesaplayalım: 76 MİKRODENETLEYİCİLER - I ETİKET DÖNGÜ Yağlıoğlu KOMUT PARAMETRE CYCLE TOPLAM CYCLE MOVLW h’0A’ 1 1*1 MOVWF SAYAC 1 1*1 DECFSZ SAYAC,F D=1, Y=2 1*254+2 GOTO DÖNGÜ 2 2*254 TOPLAM 766 CYCLE Tek bir döngü bazı durumlarda istediğimiz tekrar adedini vermeye bilir ya da istediğimiz süreyi üretemeyebilir. Bu gibi durumlarda içiçe döngü metodu kullanılır. Bu tip döngünün yazılımına bir bakalım: Sayac1 ←FF Sayac2←FF Sayac2=sayac2-1 H Sayac2=0 mı? E Sayac1=sayac1-1 H Sayac1=0 mı? E Şekil 5.2. İç içe döngü akış diyagramı 77 MİKRODENETLEYİCİLER - I Yağlıoğlu ETİKET KOMUT PARAMETRE CYCLE TOPLAM CYCLE SÜRE MOVLW h’FF’ 1 1*1 MOVWF SAYAC1 1 1*1 MOVLW h’FF’ 1 1*255 MOVWF SAYAC2 1 1*255 DECFSZ SAYAC2,F D=1, Y=2 1*254*254 DÖNGÜ1 DÖNGÜ2 2*255 GOTO DÖNGÜ2 2 2*255*255 DECFSZ SAYAC2,F D=1, Y=2 1*254 2*1 GOTO DÖNGÜ1 2 2*254 TOPLAM 196862 CYCLE Bu şekilde iç içe döngüler yazılarak sistemde istenilen tekrarlama adedi sağlanır. Döngü programı yazılırken dikkat edilecek en önemli husus; içiçe döngü yazımında döngülerden içtekinin içte, dıştakinin dışta kalmasını sağlamaktır. Yani kelimenin tam anlamıyla döngüler iç içe olmalı, birbirini kesmemelidir. Döngüler zaman geçirmek için kullanılabileceği gibi, bir registere sığmayan bilgileri saydırmak gerektiğinde de kullanılır. Şimdi bu tip konulara örnekler verelim. Problem 5.1: Bir kavşaktaki trafik ışıklarının aşağıda verilen zaman ve sıra içerisinde çalışması isteniyor. Trafik ışığı olarak led kullanarak gerekli devreyi tasarlayınız ve programını yazınız. Süre Araç Yaya 15 Yeşil Kırmızı 5 Sarı Kırmızı 25 Kırmızı Yeşil 5 Sarı ve Kırmızı Kırmızı (Saniye) 78 MİKRODENETLEYİCİLER - I Yağlıoğlu MCLR RA4/TOCKI RA3 RA2 RA1 RA0 10K 4 VDD 10K 14 100nF 3 2 1 18 17 +5Volt RB0/INT RESET RB1 15 RB2 OSC1/CLKIN 33pF RB3 PIC16F84 16 5 RB4 OSC2/CLKOUT RB5 RB6 RB7 Vss 6 5xLED 5x330 Ohm YAYA KIRMIZI 7 YAYA YESIL 8 ARAC SARI 9 ARAC YESIL 10 ARAC KIRMIZI 11 12 13 Şekil 5.3.: Trafik ışığı sorusu devre şekli Çözüm: Bu normal bir zamanlama problemidir. Burada 200*200=40000 turluk bekleme döngüsünü 1 saniye olarak kabul ediyoruz. ;Trafik ışığı problemi, LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h ZD1 EQU 0Fh ZD2 EQU 0Eh zaman EQU 0Dh X1 org 0h ; Power on goto START ; 0000 ; Registerler ; Değişkenler 79 MİKRODENETLEYİCİLER - I START TOP BEKLE1 D1 D2 BEKLE2 D11 D21 Yağlıoğlu bsf STATUS,5 ; Page 1 movlw 0h ; 0000-0000 sayısını W registerine al movwf TRISB ; PortB yi çıkış olarak ayarla TRISB=00h bcf STATUS,5 ; Page 0 movlw 09h ;0 0 0 0 1 0 0 1 movwf PORTB ; Araç Yeşil, Yaya Kırmızı movlw 0Fh ;15 sn bekleme süresi movwf zaman movlw .200 movwf ZD1 movlw .200 movwf ZD2 decfsz ZD2,F goto D2 decfsz ZD1,F goto D1 decfsz zaman,F goto BEKLE1 movlw 05h ;0 0 0 0 0 1 0 1 movwf PORTB ; Araç Sarı, Yaya Kırmızı movlw 05h ;5 sn bekleme süresi movwf zaman movlw .200 movwf ZD1 movlw .200 movwf ZD2 decfsz ZD2,F goto D21 decfsz ZD1,F goto D11 80 MİKRODENETLEYİCİLER - I BEKLE3 D12 D22 BEKLE4 D14 D24 Yağlıoğlu decfsz zaman,F goto BEKLE2 movlw 12h ;0 0 0 1 0 0 1 0 movwf PORTB ; Araç Kırmızı, Yaya Yeşil movlw 19h ;25 sn bekleme süresi movwf zaman movlw .200 movwf ZD1 movlw .200 movwf ZD2 decfsz ZD2,F goto D22 decfsz ZD1,F goto D12 decfsz zaman,F goto BEKLE3 movlw 15h ;0 0 0 1 0 1 0 1 movwf PORTB ; Araç Sarı-Kırmızı, Yaya Kırmızı movlw 05h ;5 sn bekleme süresi movwf zaman movlw .200 movwf ZD1 movlw .200 movwf ZD2 decfsz ZD2,F goto D24 decfsz ZD1,F goto D14 decfsz zaman,F 81 MİKRODENETLEYİCİLER - I goto BEKLE4 goto TOP Yağlıoğlu ; Tekrarla END Problem 5.2: Port B’deki bağlı olan 8 adet ledi kayan ışık şeklinde çalıştıran programı yazınız. Program ledleri bir kez sırayla yaktıktan sonra tüm ledlerin sönük kalması şeklinde sona erecektir. 4 VDD 10K MCLR RA4/TOCKI RA3 RA2 RA1 RA0 14 100nF 3 2 1 18 17 +5Volt RB0/INT RESET RB1 10K 15 RB2 OSC1/CLKIN 33pF PIC16F84 16 5 OSC2/CLKOUT RB3 RB4 RB5 RB6 Vss RB7 8xLED 8x330 Ohm 6 7 8 9 10 11 12 13 Şekil 5.4: 8 adet led devresi (Yürüyen ışık devresi) LIST P=16F84 INCLUDE “P16F84.INC” SAYAC1 EQU h’0C’ SAYAC2 EQU h’0D’ CLRF PORTB BCF STATUS,0 ; Carry=0 BSF STATUS,5 ; Bportu çıkış CLRF TRISB BCF STATUS,5 ;PORTB=0 82 MİKRODENETLEYİCİLER - I Yağlıoğlu MOVLW h’01’ MOVWF PORTB TEKRAR MOVLW h’FF’ MOVWF SAYAC1 DÖNGÜ1 MOVLW h’FF’ MOVWF SAYAC2 DÖNGÜ2 DECFSZ SAYAC2,F GOTO DÖNGÜ2 DECFSZ SAYAC1,F DUR GOTO DÖNGÜ1 RLF PORTB,F BTFSS STATUS,0 GOTO TEKRAR GOTO DUR END 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. 83 MİKRODENETLEYİCİLER - I Yağlıoğlu Çö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. ;Temizlik robotu sorusu çözümü ;B potunda 6 sensör bağlı, düz istikametteki sensör RB0 ucunda bağlı ;RA0 ucunda düz ilerleten motor bağlı ;RA1 ucunda dönmeyi sağlayan motor bağlı ;Robot sadece düz ilerlediğinden öndeki sensör haricinde diğer ;sensörlerin çözümde bir etkisi yoktur. LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h D0 EQU 0Dh ; bekle sayacı 0 D1 EQU 0Eh ; bekle sayacı 1 D2 EQU 0Fh ; bekle sayacı 2 X1 org 0h ; Power on goto START bsf STATUS,5 movlw h'FF' START ; 0000 ;B portu giriş 84 MİKRODENETLEYİCİLER - I movwf TRISB movlw 00h movwf TRISA bcf STATUS,5 TOP clrf PORTA kontrol btfsc PORTB,0 goto dondur bsf PORTA,0 goto kontrol bcf PORTA,0 bsf PORTA,1 movlw .3 movwf D0 movlw .200 movwf D1 movlw .200 movwf D2 decfsz D2,1 goto ZD3 decfsz D1,1 goto ZD2 decfsz D0,1 goto ZD1 goto TOP dondur BEKLE ZD1 ZD2 ZD3 Yağlıoğlu ;A portu çıkış ;3 saniyelik bekleme END 85 BÖLÜM 6 MİKRODENETLEYİCİLER - I Yağlıoğlu 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. MPLAB KULLANIMI Bu bölümde MPLAB Ver 3.31.00 versiyonunun çalıştırılması ve kullanımı ana hatlarıyla anlatılacaktır. MPLAB programının diğer versiyonları da bu versiyon ile menü açısından benzerlik göstermektedir. Bu sebeple bu bölüm iyi anlaşıldığında, programın diğer versiyonları da kullanılabilir. MPLAB programı disketle veya CD ile alındığında kendi kurulum programını çalıştırdığınızda (Bu versiyon için MPL33100.exe) tüm sorulara olumlu yanıt verdiğinizde kendisini: C:\PROGRAM FILES\MPLAB adında bir klasör içerisine kurar ve başlat içerisinde de kendisine Microchip MPLAB adında yer açar. Programı çalıştırmak için: Başlat/Programlar/Microchip Mplab/MPLAB 86 seçilir. MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.1:MPLAB çalıştırılması Bu seçim yapıldığında aşağıdaki ekran karşımıza gelir. Şekil.2:MPLAB açılış sayfası 87 MİKRODENETLEYİCİLER - I Yağlıoğlu Programı ilk kurduğunuzda yapılması gereken 2 adet ayar vardır. Bu ayarlar kullanacağınız işlemciyi tanıtmak ki; biz pic16f84 tanıtacağız. Bunun için; Options/Development Mode seçilir. Şekil.3:MPLAB’ın ilk çalıştırılması Gelen ekrandan kullanacağınız işlemciyi belirleyiniz (Bizim örneğimizde Pic16f84) Şekil.4:MPLAB’ın ilk çalıştırılması 88 MİKRODENETLEYİCİLER - I Yağlıoğlu Yapılması gereken diğer ayar ise Tools/Verify Emulator işlemidir ki; burada bu seçildikten sonra gelen mesajlara olumlu (YES/OK) cevaplar vererek arada gelecek olan üçlü menüden SIMULATOR seçeneği seçildikten sonra, yine gelen mesajlara olumlu cevaplar verilerek işlem tamamlanır. Bu işlemi yapmak bize yazacağımız programı simulasyon modunda çalıştırma imkanı verir. Şekil.5:MPLAB’ın ilk çalıştırılması Yeni programınızı yazabilmek için boş bir sayfa açmalısınız. Bunun için; File/New Source seçiniz. 89 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.6:MPLAB’da yeni sayfa açılması Bu işlemden sonra aşağıdaki boş sayfa karşınıza gelir ve programınızı buraya yazabilirsiniz. Şekil.7:MPLAB’da yeni sayfa açılması 90 MİKRODENETLEYİCİLER - I Yağlıoğlu Eğer daha önceden yazıp kaydettiğiniz bir dosyayı açacaksanız; File/Open Source seçiniz ve gelen ekrandan klasör ve dosya isimlerini seçerek dosyanızı ekrana getirebilirsiniz. Şekil.8:MPLAB’da önceden yazılmış programın açılması Eski dosyanızı çağırdığınızda veya yeni yazdığınız tamamladığınızda aşağıdaki şekilde bir görüntü oluşacaktır. 91 programın yazımını MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.9:MPLAB’da program yazımı Ancak programı yeni yazdıysanız başlık satırında isim yerine UNTITLED yazısı görünecektir. Programınızı yeni yazdıysanız isim vererek kaydetmelisiniz. Kayıt işlemi için File/Save seçeneğini seçiniz. Şekil.10:MPLAB’da yazılan programın kaydedilmesi 92 MİKRODENETLEYİCİLER - I Yağlıoğlu Gelen ekranda seçili klasör, sizin istediğiniz klasör değilse, Windows işletim sisteminin kullanım metoduyla, seçili klasörü istediğiniz şekilde değiştirebilirsiniz. Ancak daha sonra seçtiğiniz klasörün isminin lazım olacağını unutmayınız. File Name kısmına ise istediğiniz ismi veriniz; ancak uzantı ismi olarak asm vermeyi unutmayınız. Örnek SAAT.ASM gibi… Şekil.11:MPLAB’da yazılan programın kaydedilmesi Dosya oluşturduktan sonra sıra proje oluşturma aşamasına gelecektir. Proje oluşturma aşamasında ise ilk iş; Project/New Project seçeneğini seçmektir. 93 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.12:MPLAB’da proje oluşturulması Bu seçim yapılınca proje ismi vermek için aşağıdaki ekran gelir. Burada NEWPROJ.PJT ismi kendiliğinden verilir. İstenilirse proje ismi değiştirilir. Bu değiştirme yapılırken ileride sorun yaşamamak için, proje adına PJT uzantısının yazılması ve klasör adının değiştirilmemesine özen gösterilmelidir. 94 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.13:MPLAB’da proje oluşturulması Bu aşamadan sonra Edit Project ekranı gelir. Burada iki ayrı bölüm vardır. Project Files ve Non Project Files alanları. Burada Project Files alanına projede olmasını istediğimiz dosyanın adını diğer taraftan çift tıklayarak veya seçip add seçeneğini tıklayarak aktarırız. Bu işlemden sonra tamam (Ok) diyerek işlemi tamamlamış oluruz. Proje içerisindeki dosya adı ile ilgili bir sorun olursa Project/Edit Project seçeneği ile bu bölüme tekrar gelebiliriz. 95 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.14:MPLAB’da proje oluşturulması Şimdi sıra yazdığımız programın derlenmesine gelmiştir. Derleme esnasında hatalar belirlenip bize mesaj olarak verilir. Ayrıca uzantısı “hex” olan bir dosya ile de yazılı programın çalışır kodları üretilir. Bu işlem için; Project/Build All seçilir. 96 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.15:MPLAB’da oluşturulan projenin derlenmesi Bu seçimden sonra ekranda hareketli band olan bir pencere gelir ve derlemenin yapıldığını gösterir. İşlem bittiğinde aşağıdakine benzer bir pencere gelir. Eğer şekildeki gibi Success No Error mesajı varsa programda yazım hatası yok demektir ve program denemeye hazır demektir. Eğer There are Errors şeklinde bir mesaj gelirse hatalar uzantısı “err” olan bir dosya da kayıtlıdır. Bu dosyayı açarak hataların nerelerden kaynaklandığına bakar ve düzeltiriz. Bu hatalar dosya adı, satır numarası ve hata cinsi şeklinde satır satır belirtilir. Burada satır numarasının kaç olduğunu ekranın altındaki durum satırından takip ederek hataları düzeltme yoluna gidilir. 97 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.16:MPLAB’da oluşturulan projenin derlenmesi Programda hata yoksa artık sıra deneme işlemine gelmiştir. Deneme işlemi için; programda buton işlemi yoksa iki adım yeterlidir. Bunlardan birincisi; Windows/File Registers seçeneğini seçmektir. 98 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.17:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Ekrana yeni gelen pencerede RAM adresleri ve içerikleri verilmiştir. Burada örnek olarak 0000 numaralı satırdaki 05 adresi A portu, 06 adresi B portu dur. Programı çalıştırdığımızda buradaki değişimlere bakarak A ve B portundaki bilgi değişimlerine bakarak programın çalışma şekli hakkında fikir yürütebiliriz. Şekil.18:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması 99 MİKRODENETLEYİCİLER - I Yağlıoğlu Programı çalıştırmak için; Debug/Run/Animate seçeneği seçilir ve ekrandaki değişimler izlenerek programın doğruluğu hakkında fikir yürütülür. Burada animate modu programın yavaş bir hızda çalıştırılması işlemidir. Yani bilgisayarınız programı rahat inceleyebilmeniz için normalin 5000-10000 katı bir yavaşlıkta programı sürekli moda çalıştırır. Şekil.19:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Eğer program adım adım çalıştırılmak isteniyorsa, Debug/Run/Step seçilir veya F7 tuşuna her basışta 1 komut çalışması sağlanır. 100 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.20:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Eğer programın çalışması esnasında sadece bir iki yerdeki değişim izlenmek isteniyorsa Windows/New Watch Window seçilir. 101 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.21:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Çıkan ekranda istenilen register seçilir. Örnekte PortA seçilmektedir. Şekil.22:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması 102 MİKRODENETLEYİCİLER - I Yağlıoğlu Seçim tamamlandığında Watch_1 şeklinde gelen ekranda A portundaki sayı ikilik, onluk ve onaltılık sistemde gösterilir. Şekil.23:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Eğer sistemde dışarıdan buton veya anahtar bağlantısı ile bilgi girişi varsa ve bu bilgi girişi için programın vereceği tepki izlenmek isteniyorsa buton tarifi yapılması gerekir. Bunun için; Debug/Smilator Stimulus/Asynchronous Stimulus seçeneği seçilir. 103 MİKRODENETLEYİCİLER - I Yağlıoğlu Şekil.24:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Yeni gelen pencerede 12 adet buton mevcuttur ve bu butonların her birini işlemcinizin bir ucuna bağlı olarak gösterebilirsiniz. Şekil.25:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması 104 MİKRODENETLEYİCİLER - I Yağlıoğlu Biz örnek olarak RA2 ucuna Toggle moda bir buton tarifi yapalım. Burada interrupt algılamalı denemeler har,cinde genel olarak toggle mod kullanılır. Bu işlem için Stim1 butonuna sağ tuş ile tıklayalım: Şekil.26:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Gelen pencereden Assign Pin seçelim ve yine gelen pencerede RA2’yi çift tıklayalım. Şekil.27:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması 105 MİKRODENETLEYİCİLER - I Yağlıoğlu Bu işlem tamamlanınca tekrar geri dönmüş olacağız. Yine aynı tuşa (Şimdi üzerinde RA2 yazmaktadır) sağ tuş ile tıklayalım ve çıkan ekrandan Toogle seçeneğini seçelim. Şekil.28:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması Artık işlem tamamlanmıştır. Başlangıçta üzerinde Stim1(P) yazan tuşta artık RA2(T) yazmaktadır. Bunun anlamı program animate edilirken bu tuşa her tıkladığımızda RA2 ucundaki bilgi durum değiştirecektir, yani bir 1 olacak bir 0 olacaktır. Şekil.29:MPLAB’da oluşturulan projenin simulasyon modunda çalıştırılması 106 MİKRODENETLEYİCİLER - I Yağlıoğlu UYGULAMA 1: ;8 ışıklı yürüyen ışık programı ;8 ışıklı yürüyen ışık programı ;ledler 330 ohmluk dirençlerle port b'ye bağlanacak ;10K,33pf osilatör bağlantısı ile her bir ışık yaklaşık 1 sn süreyle yanar. list p=16f84 status equ 03 portb equ 06 trisb equ 86h s1 equ 0Ch s2 equ 0Dh giden equ 0Eh org 0 goto init clrf portb bsf status,5 clrf trisb bcf status,5 init main ; port adresi ; reset vektörü movlw 01h movwf giden tekrar bcf status,0 ;carry bayrağı 0 movf giden,w movwf portb 107 MİKRODENETLEYİCİLER - I bekle Yağlıoğlu movlw .2 movwf s1 d1 movlw .2 movwf s2 d2 decfsz s2,1 goto d2 decfsz s1,1 goto d1 rlf giden,1 goto tekrar end UYGULAMA 2: Trafik ışığı programı Bir kavşaktaki trafik ışıklarının aşağıda verilen zaman ve sıra içerisinde çalışması isteniyor. Gerekli programı yazınız ve MPLAB programı ile test ediniz. Süre Araç Yaya 15 Yeşil Kırmızı 5 Sarı Kırmızı 25 Kırmızı Yeşil 5 Sarı ve Kırmızı Kırmızı (Saniye) 108 MİKRODENETLEYİCİLER - I Yağlıoğlu Not: MPLAB programı simulasyon modunda iken normal programı çok yavaşlatarak çalıştırdığı için programda zamanlama işlemi için 200*200=40000 tur yerine 2*2=4 turluk bekleme döngüsünü 1 saniye olarak kabul ediyoruz. ;Trafik ışığı problemi, LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h ZD1 EQU 0Fh ZD2 EQU 0Eh zaman EQU 0Dh X1 org 0h ; Power on goto START ; 0000 bsf STATUS,5 ; Page 1 movlw 0h ; 0000-0000 sayısını W registerine al movwf TRISB ; PortB yi çıkış olarak ayarla TRISB=00h bcf STATUS,5 ; Page 0 movlw 09h ;0 0 0 0 1 0 0 1 movwf PORTB ; Araç Yeşil, Yaya Kırmızı movlw 0Fh ;15 sn bekleme süresi movwf zaman movlw .2 movwf ZD1 movlw .2 ; Registerler ; Değişkenler START TOP BEKLE1 D1 109 MİKRODENETLEYİCİLER - I D2 BEKLE2 D11 D21 BEKLE3 D12 Yağlıoğlu movwf ZD2 decfsz ZD2,F goto D2 decfsz ZD1,F goto D1 decfsz zaman,F goto BEKLE1 movlw 05h ;0 0 0 0 0 1 0 1 movwf PORTB ; Araç Sarı, Yaya Kırmızı movlw 05h ;5 sn bekleme süresi movwf zaman movlw .2 movwf ZD1 movlw .2 movwf ZD2 decfsz ZD2,F goto D21 decfsz ZD1,F goto D11 decfsz zaman,F goto BEKLE2 movlw 12h ;0 0 0 1 0 0 1 0 movwf PORTB ; Araç Kırmızı, Yaya Yeşil movlw 19h ;25 sn bekleme süresi movwf zaman movlw .2 movwf ZD1 movlw .2 movwf ZD2 110 MİKRODENETLEYİCİLER - I D22 BEKLE4 D14 D24 Yağlıoğlu decfsz ZD2,F goto D22 decfsz ZD1,F goto D12 decfsz zaman,F goto BEKLE3 movlw 15h ;0 0 0 1 0 1 0 1 movwf PORTB ; Araç Sarı-Kırmızı, Yaya Kırmızı movlw 05h ;5 sn bekleme süresi movwf zaman movlw .2 movwf ZD1 movlw .2 movwf ZD2 decfsz ZD2,F goto D24 decfsz ZD1,F goto D14 decfsz zaman,F goto BEKLE4 goto TOP ; Tekrarla END 111 MİKRODENETLEYİCİLER - I Yağlıoğlu UYGULAMA 3 : ;8 ledli flip-flop devresi LIST P=16F84 INCLUDE “P16F84.INC” S1 EQU h’00’ S2 EQU h’0D’ CLRF PORTB BSF STATUS,5 CLRF TRISB BCF STATUS,5 MOVLW h’00’ MOVWF PORTB MOVLW h’FF’ MOVWF S1 MOVLW h’FF’ MOVWF S2 DECFSZ S2,F GOTO DÖN2 DECFSZ S1,F GOTO DÖN1 MOVLW h’FF’ MOVWF PORTB MOVLW h’FF’ MOVWF S1 MOVLW h’FF’ MOVWF S2 TEK GECİKME DÖN1 DÖN2 BEKLE DÖN1 ;Bekletme kısmı ;Bekletme kısmı 112 MİKRODENETLEYİCİLER - I DÖN2 DECFSZ S2,F GOTO DÖN2 DECFSZ S1,F GOTO DÖN1 GOTO TEK Yağlıoğlu END UYGULAMA 4 : ;İki butonla bir ledi yak-söndür programı ;PROGRAM AC_KAPA.ASM ;PIC 16F84 ;WATCHDOG DEVRE DIŞI ;FONKSİYON AC butonuna basıldığında LED yanar, ;KAPA butonuna basıldığında LED söner. ;PORTA’nın 1 nolu ucu AÇ butonuna bağlıdir. ;PORTA’nın 2 nolu ucu KAPA butonuna bağlıdir. ;PORTB’nin 1 nolu ucu LED’e bağlıdir. list p=16f84 status equ 03 porta equ 05 ; port adresi portb equ 06 ; port adresi trisa equ 85h ; trisb equ 86h ; #define ac porta,1 ; A portunun 1.bitine bağlı buton #define kapa porta,2 ; A portunun 2.bitine bağlı buton 113 MİKRODENETLEYİCİLER - I #define led Yağlıoğlu portb,0 ; B portunun 0.bitine bağlı LED org 0 ; reset vektörü goto init ;**************** ana program burada başlıyor **************** init clrf portb ; Port B'yi sıfırlayarak başla. bsf status,5 ; 1. sayfaya geç movlw 0fh main movwf trisa ; A portunu giriş yap. clrf trisb ; B portunu çıkış yap. bcf status,5 ; 0. sayfaya dön. btfsc ac ; AC butonuna basılıp basılmadığını kontrol et, ; basılmışsa sonraki adımı atla. test goto main ; Basılana kadar döngüye gir. bsf led ; LED'i yak. btfss kapa ; KAPA butonuna basılıp basılmadığını kontrol et, ; basılmışsa sonraki adımı atla. goto test ; Basılana kadar döngüye gir. bcf led ; LED'i söndür. goto main ; Başa dön. end ; Programın sonu. 114 MİKRODENETLEYİCİLER - I Yağlıoğlu UYGULAMA 5 : ; 7-segment göstergede basçek buton kullanılarak ; gerçekleştirilen 0-9 arası sayıcı. ;B portuna bağlı seven segmen decoder ile display sürülmektedir. ;;Program RA0 butonuna her basışta 0-9 arası yukarı sayar LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h say EQU 0Ch ; counter to turn on the pins on PortB D0 EQU 0Dh ; delay counter 0 D1 EQU 0Eh ; delay counter 1 D2 EQU 0Fh ; delay counter 2 X1 org 0h goto START bsf STATUS,5 movlw 0h movwf TRISB movlw 0fh movwf TRISA START bcf TOP1 ; Power on ; 0000 STATUS,5 movlw 00H movwf say 115 MİKRODENETLEYİCİLER - I TOP2 TUS movf say,W movwf PORTB btfss PORTA,0 goto TUS nop Yağlıoğlu ;Tuş basılı mı? ;kısa bekleme nop BIRAK btfsc PORTA,0 goto BIRAK incf say,1 movf say,w sublw 0Ah btfss STATUS,2 goto TOP2 goto TOP1 ;tuş bırakıldı mı? return end 116