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

Benzer belgeler