You are on page 1of 157

BÖLÜM 1.

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 kullanılır hale getirilmeye çalışılmaktadır.
Üretim aşamasında ise, kullanılacak malzemenin cinsine göre ince bir ayrıntı işin
içine girmektedir, ki bu ayrıntı işlemin cinsine göre mikroişlemci ya da mikrokontrollör
olarak kendini göstermektedir. Bu iki terim aslında temelde aynı olmakla birlikte,
aralarındaki farkı şöyle çarpıcı bir örnekle görmek mümkündür. Bir televizyon uzaktan
kumandası için bir mikroişlemci kullanmak demek, adeta bir cep bilgisayarı şeklinde
kumanda demektir ki buda maliyet açısından büyük külfet demektir. Halbuki bu işi bir
mikrokontrollör ile yaptığımız zaman maliyet, imalat ve boyut açısından büyük avantajlar
elde ederiz. Öyleyse bu iki elemanın farkı nedir?
Mikroişlemci dediğimiz eleman temelde bir programı icra etme yeteneğ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

1
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.

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İŞ İŞLEM ÇIKIŞ


ÜNİTESİ ÜNİTESİ Ü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.

2
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)

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İŞ ALU ÇIKIŞ

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

3
işlemlerin belirli sırayla olmasını sağlamak gereklidir. Ayrıca giriş ünitesinden gelecek
bilgilerin işlem mi, yoksa bilgi mi olduğunu ayırt edecek bir sisteme gerek olduğu
açıktır. İşte bu sisteme kontrol ünitesi diyoruz. Kontrol ünitesi bu sisteme enerji
verildiğinde devreye girer ve giriş ünitesine gerekli emirleri verir. (Kontrol ünitesi, giriş
ünitesine der ki: Bazı bilgiler sana verilecek. Bilgiler gelmeye başladığında bana bildir.)
Giriş ünitesine veriler gelmeye başladığında öncelikle kontrol ünitesine haber gider ve
kontrol ünitesi hafıza ünitesinde gerekli ayarlamaları yapar. (Kontrol ünitesi, hafıza
ünitesine der ki: Girişten bazı bilgiler sana gönderilecek. Bu bilgileri xxxx adresinden
itibaren kaydet.) Böylece giriş ünitesinden gelen bilgiler hafızaya kaydedilir. Bu arada
girilen bilgilerin hangisinin komut, hangisinin veri olduğunu kontrol ünitesi ayırt eder.
Eğer bilgiler içerisinde işlem varsa, ALU üzerinde ve hafızada gerekli ayarlamaları
yaparak işlemlerin yapılmasını sağlar. (Kontrol ünitesi, hafıza ünitesine ve ALU’ya der
ki: Hafıza ünitesi; xxxx adresinden itibaren olan bilgileri ALU ya gönder, ALU’ya da
derki hafızadan gelen bilgileri al ve xx işlemini yap ve yine hafızaya der ki ALU’dan
gelecek işlem sonuçlarını xxxx adresinden itibaren kaydet.) Son olarak hafıza
ünitesindeki sonuçların çıkışa aktarılmasını, yine kontrol ünitesi sağlar. Bu işlem içinde
hafıza ünitesi ve çıkış ünitesi arasındaki işbirliğini ve bağlantıları yine kontrol ünitesi
ayarlar.
Eğer bu şekilde bir işlem grubu tamamlanmış olduğunu düşünürsek, bu işlem
grubu tamamlanınca kontrol ünitesi, yine giriş ünitesine gerekli uyarıyı vererek sisteme
yeni girişleri beklemeye başlar.

İşte burada “ALU ve Kontrol Ünitesinin” ikisi birden tek chip üzerindedir ve bu
elemana mikroişlemci denir. Bu blokların dördünü birden üzerinde bulunduran tek bir
chip’e ise mikrokontrollör denir.

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:
a. Data bus
b. Address bus

4
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 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. Sistemin Çalışması:

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

5
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

RAM ROM I/O


Mikroişlemci

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 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

6
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.

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.

7
Şekil 1.3. Pic16f84 temel yapısı

1.4.1. Sistemin Çalışması:


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. Register’ler

8
Bir mikroişlemcinin işlemleri yaparken bazı geçici hafızalara ihtiyaç duyacağı
kesindir. Çünkü aritmetik ya da lojik işlem yapan üniteler içlerinde bir hafıza ünitesi
içermezler. Durum böyle olunca diyelim ki bir toplama işlemi yapacağınız zaman
elinizde tam toplayıcılardan oluşan bir paralel toplama ünitesi varsa, bu ünite toplama
işlemini gerçekleştirmek için giriş kısmında toplanacak iki sayının hazır olmasını
isteyecektir. Bunun için de paralel toplayıcınızın girişinde iki adet (8 bitlik) registere
ihtiyaç duyulacağı kesindir. Ayrıca işlem yapıldığında sonucun kaybolmaması için bir
yere kaydedilmesi gerekecektir ki, buda bir (8 bitlik) registerdir. Ayrıca elde, ya da işaret
biti taşması durumunda, sonucun taşma ya da işaretleriyle ilgili bilgilerini tutmak için tek
bitlik hafıza elemanlarına ihtiyaç vardır. İşte bu sebeplerle her işlemci, bazıları özel ve
bazıları genel amaçlı olmak üzere içerisinde register bulundurmak zorundadır.

a. Akümülatör (Working register) : Genel amaçlı bir registerdir. Tüm işlemcilerde


bulunan bu register Acc ya da A ismiyle anılır. Pic serisi işlemcilerde ise W adıyla
anılmaktadır. Bu register işlemlerin çoğunda kullanılan bir registerdir. İki operandla
yapılan işlemlerde, operandlar işleme girerken, operandlardan bir tanesi burada tutulur;
aritmetik ya da lojik işlemlerde işlem sonuçlarını tutar, ayrıca çok özellikli bir register
olduğu için bit işlemleri, kaydırma, döndürme, eksiltme, artırma, tersini alma gibi işlemler
de burada yapılabilir.

b. Program Sayacı (PC:Program Counter): Bu register ise program akışını kontrol


eden bir registerdir. Çalışmakta olan programların adresleri burada tutulur ve sayılır.
Program icra edilirken halen işletilecek olan komutun adresi PC’de bulunur ve bu komut
okunduğunda adres otomatik olarak 1 artar. Eğer komutun bir operandı varsa komut
algılandıktan sonra bu operand okunur ve bu okunma tamamlanınca PC yine 1 artar.
Bu şekilde PC sistemin işleyişini kontrol etmiş olur.
Ayrıca program içerisindeki atlama komutlarında atlanacak adres, PC’ye
yüklenerek programın bir yerden bir başka yere atlaması sağlanır.
Ayrıca alt program çağırma işlemlerinde, programın bir noktadan diğer bir
noktaya atlarken geri dönüş adresinin belirlenmesi açısından, programın o anda
çalıştırdığı adresin de bir yerlerde tutulması gerekir. Bu bölüme ise STACK adı verilir.
Stacklar FILO (First In Last Out) mantığına göre çalışırlar. Bir işlemcinin stack
kapasitesi, o işlemcinin çalıştırabileceği alt program adedini belirler. Intel firmasının
sanayi tipi işlemcilerinde stack için bir segment (Ör:8085) ayrılırken, daha basit tipteki
işlemcilerde (Ör: 6502) 1 K’lık alan ayrılmaktadır. Pic serisinde bu alan daha azdır.

9
Mesela PIC16C8X ailesinde 8 byte’dır. Pic serisinde direkt kullanımı olmamasına
rağmen, diğer işlemcilerde stacka direk müdahele 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
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
10
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. Aritmetik Lojik Ünite (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 memoru’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, artık oradan silinmiştir. Ayrıca işlem sonuçları ile
ilgili bayrak işaretleri ise status registere aktarılır.

11
Şekil.1.4. Pic16f84 ün temel fonksiyonel blok diyagramı

1.4.4. Hafıza Birimleri:

Mikroişlemcilerde dış ünite olarak kullandığımız hafıza elemanları


mikrokontrollörlerde iç ünite durumundadır. Bunları yapısına göre iki ayrı grupta
toplamak mümkündür:

a- RAM (Random Access Memory)


b- ROM (Read Only Memory)

Ram hafıza yazma ve okuma amaçlı bir bölümdür. Bu özellikleri sebebiyle program
içerisindeki geçici bilgileri (ki biz onlara değişken diyeceğiz)tutmak için kullanılacaktır.
Bazı işlemcilerde ramın program hafızası olarak kullanıldığını görmek mümkündür,
ancak bu işlemciler ya bir dış kalıcı hafıza tarafından desteklenmekte ya da içerisinde
şarj olabilen bir pil içermektedirler.

Rom hafıza ise program hafızası olarak kullanılan bir hafıza çeşididir. Sadece
okunabilme özelliğine sahip olduğu için, bir kez programlandığında programın silinmesi
diye bir şey söz konusu olmamaktadır. Ancak, bu durum bazen sorunlara yol
açmaktadır. Bir iş yapılırken program yazılır yazılmaz, tam şekliyle çalışması hemen
hemen imkansız gibidir. Bunun için yazılan programın çeşitli denemelerden geçirilerek
geliştirilmesi gerekmektedir. Bu işlem için ise, eğer mikrokontrolörünüz 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
12
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, Denetim ve İletişim Birimleri:

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.

1.5. Pic16f84 Mikrokontrollör Sisteminin Tam Yapısı ve Çalışması:

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.

13
Ş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.) 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

14
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 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.

15
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:

1 1 8
R A 2 R A 1
2 1 7
R A 3 R A 0
3 1 6
R A 4 / T OO SC C K 2 I / C L K O U T
4 1 5
M C L R O S C 1 / C L K I N
5 1 4
V s s V D D
6 1 3
R B 0 / I N T R B 7
7 1 2
R B 1P I C 1 6 F R8 B4 6
8 1 1
R B 2 R B 5
9 1 0
R B 3 R B 4

Şekil 1.7. Pic16f84 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:

16
1.7. Portların Yapısı:

Ş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
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.8. Mikrokontrollör Osilatör Bağlantıları


Pic mikrokontrollörlerde osilatör elemanı olarak üç tip eleman kullanmak
mümkündür. Bunlar:
a- RC
b- Rezonatör

17
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.
V d d

1 1 8
R A 2 R A 1
2 1 7
R A 3 R A 0
3
R A 4 / T OO SC C K 2 I / C
1 6
L K O R UC T C l k / 4R
4 1 5
M C L R O S C 1 / C L K I N
5 1 4
V s s V D D
6 1 3
R B 0 / I N T R B 7 C
7 1 2
R B 1P I C 1 6 F R 8 B4 6
8 1 1
R B 2 R B 5
9 1 0
R B 3 R B 4

Ş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.

R C Fosc (yaklaşık)
10 K 20 pf 625 KHz
10 K 220 pf 80 KHz
10 K 100 nf 85 Hz

b- 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.

18
4
C 1 M C L R
1 6 1 7
O S C 2 / C L K RO AU 01 T 8
R A 11
R A 22
R A 33
X T A L R A 4 / T O C K I
P I C 1 6 F 8 4 6
C 2 R B 0 / I7 N T
1 5 R B 18
O S C 1 / C L K RI N B 29
R s R B 31 0
R B 41 1
R B 51 2
R B 61 3
R B 7

Ş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
XT 500 KHz 20-68 pf
1 MHz 15-68 pf
2 MHz 15-47 pf
4 MHz 15-33 pf
HS 8 MHz 15-47 pf
20 MHz 15-47 pf

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ı 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

19
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.

4
M C L R
1 6 1 7
O S C 2 / C L K RO AU 01 T 8
R A 11
R A 22
R A 33
R A 4 / T O C K I
P I C 1 6 F 8 4 6
R B 0 / I7 N T
1 5 R B 18
O S C 1 / C L K RI N B 29
R B 31 0
R B 41 1
R B 51 2
S E R A M i C R B 61 3
R E S O N A T O R R B 7

Şekil 1.11. Pic-Rezonatör osilatör bağlantısı

1.9. Reset İşlemleri


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 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.

20
U 1

1 6
+ 5 V O S C 2 / C L K
O U 1T 7
1 5 R A 01 8
O S C 1 / C L K RI N A 11
R A 22
R A 33
R A 4 / T O C K I
1 0 K 6
R B 0 / I7 N T
4 R B 18
M C L R R B 29
R B 31 0
R B 41 1
R E S E T R B 51 2
R B 61 3
R B 7

P I C 1 6 F 8 4

Şekil 1.12. Pic16f84 reset devresi bağlantısı

1.10. Güç Bağlantıları

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.

4
M C L R
1 7
R A 01 8
R A 11
+ 5 V o l t R A 22
R A 33
1 4 R A 4 / T O C K I
V D D 6
R B 0 / I7 N T
P I C 1 6 F 8 4 R B 18
1 0 0 n F R B 29
R B 31 0
R B 41 1
5 R B 51 2
V s s R B 61 3
R B 7
1 5
O S C 1 / C 1 L6 K I N
O S C 2 / C L K O U T

Şekil 1.13. Pic-besleme bağlantısı

21
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.

+ 5 V o l t

1 4
V D D
1 0 0 n F 1 7
R A 01 8
5 R A 11
V s s R A 22
R A 33
R E S E T R A 4 / T O C K I
1 0 K 6
4 R B 0 / I7 N T
M C L R R B 18
R B 29
1 0 K P I C 1 6 F 8 R 4 B 31 0
R B 41 1
1 5 R B 51 2
O S C 1 / C L K RI N B 61 3
R B 7
3 3 p F
1 6
O S C 2 / C L K O U T

Şekil 1.14. Pic16f84’ün çalışabilmesi için gerekli bağlantı

1.11. Giriş-Çıkış İşlemleri


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
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

22
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 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

23
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
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

24
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.

Ş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.

25
Şekil 1.19. Port çıkışından triyak kullanarak bir AC lambaya kumanda edilmesi

Ş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.12. Display Tasarımı


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 d c b a
0 0 1 1 1 0 0 1
İkili sistemde= 0011 1001, Onaltılık sistemde =39

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.

26
U 3
1 3
+ 5 V R B 71 2
R B 61 1
R B 51 0
R B 49
R B 38
R B 27
R 1 R B 16
1 0 K R B 0 / I N T
4 3
M C L R R A 4 / T O2 C K I
S W 1 R A 31

O S C 1 /C L K IN
R A 21 8
R E S E T R A 11 7
R A 0
1 6
O S C 2 / C L K O U T

I I I I I I I I I I I I

a
b

d
e

a
b

d
e

a
b

d
e

a
b

d
e

a
b

d
e

a
b

d
e

g
f

f
c

c
R 2
15
1 0 K P I C 1 6 F 8 4

I I I
I I I
I I I
I I I
I I I
I I I
C 1

I I I I I I I I I I I I
3 3 p F

G N D

G N D
G N D

G N D

G N D

G N D
U 4
1 1 5
2 A Y 0 1 4
3 B Y 1 1 3
C Y 2 1 2
Y 3 1 1
+ 5 V 6 Y 4 1 0
4 G 1 Y 5 9
5 G 2 A Y 6 7
G 2 B Y 7
7 4 L S 1 3 8

Şekil 1.20. Örnek dislay B portu bağlantısı

27
BÖLÜM 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ış gibi iki
seçenek içerir
Başlangıç ve bitiş belirtmede
kullanılır.
Çıkış; genellikle yazı
şeklindeki çıktılarda kulanılır.

Sembol Anlamı

Bağlantı bölümleri

28
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.

Çö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.
Şimdi de bu algoritmaya göre akış diyagramını çizelim:

29
Şekil 2.2. Örnek 2.1. için akış diyagramı

Ö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:

30
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.

Şimdide bu işlem için, akış diyagramını tasarlayalım.

31
Şekil2.3 Örnek 2.2. akış diyagramı.

32
Ö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.

33
Şekil2.4. Örnek 3 için akış diyagramı.

34
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)
metodlarla 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.

35
BÖLÜM 3: PIC 16F8X KOMUTLARI

3.1.Kullanılan 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 Kullanım Örnekleri

ADDLW : Bir sayı ile W’nin içeriğini topla


İngilizce Yazılımı:Add Literal with W
Kullanım Şekli: ADDLW k
İşlevi: W←W+k
Etkilenen Bayraklar: C,DC,Z
Periyot:1

Örnek:
ADDLW 05h
Komuttan önce W=60h ise
Komuttan sonra W=65h olur.

36
ADDWF : Bir register ile W’nin içeriğini topla
İngilizce Yazılımı:Add W with File register
Kullanım Şekli:ADDWF f,d
İşlevi: W←W+f veya f←W+f
Etkilenen Bayraklar:C, DC, Z
Periyot:1
Örnek:
ADDWF SAYI,1
Komuttan önce W=60h ve SAYI=05h ise
Komuttan sonra W=60h , SAYI=65 h olur.

Örnek 2:
ADDWF SAYI,0
Komuttan önce W=60h ve SAYI=05h ise
Komuttan sonra W=65h , SAYI=05 h olur.

ANDLW : Bir sayı ile W’Yi AND işlemi yapar


İngilizce Yazılımı:And Literal with W
Kullanım Şekli: ANDLW k
İşlevi: W←W AND k
Etkilenen Bayraklar: Z
Periyot:1
Örnek:
ADDLW 05h
Komuttan önce W=67h ise
Komuttan sonra W=05h olur.

ANDWF : Bir register ile W’yi AND yapar.


İngilizce Yazılımı:And W with File register
Kullanım Şekli:ANDWF f,d
İşlevi: W←W AND f veya f←W AND f
Etkilenen Bayraklar:Z
Periyot:1

37
Örnek:
ADDWF SAYI,1
Komuttan önce W=6Fh ve SAYI=15h ise
Komuttan sonra W=6Fh , SAYI=05 h olur.

Örnek 2:
ADDWF SAYI,0
Komuttan önce W=65h ve SAYI=0Fh ise
Komuttan sonra W=65h , SAYI=05 h olur.

BCF : Registerin istenilen bitini 0 yap


İngilizce Yazılımı:Bit Clear f
Kullanım Şekli:BCF f,b
İşlevi: f(b) ← 0
Etkilenen Bayraklar:Yok
Periyot:1

Örnek:
BCF SAYI,3
Komuttan önce SAYI=FFh ise
Komuttan sonra SAYI=F7h olur.

BSF : Registerin istenilen bitini 1 yap


İngilizce Yazılımı:Bit Set f
Kullanım Şekli:BSF f,b
İşlevi: f(b) ← 1
Etkilenen Bayraklar:Yok
Periyot:1
Örnek:
BCF SAYI,5
Komuttan önce SAYI=00h ise
Komuttan sonra SAYI=20h olur.

38
BTFSC : Registerin istenilen bitini test et ve bu bit 0 ise 1 konut atla
İngilizce Yazılımı:Bit Test f, Skip if Clear
Kullanım Şekli:BTFSC f,b
İşlevi: f(b) = 0 ⇒ bir komut atla
Etkilenen Bayraklar:Yok
Periyot:f(b)=1 ise 1 periyot
f(b)=0 ise 2 periyot
Örnek 1:
BTFSC SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2

Komuttan önce SAYI=00h ise


Komuttan sonra işlem işlem 2 ye gider.

Örnek 2:
BTFSC SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=FFh ise
Komuttan sonra işlem işlem 1 e gider.

BTFSS : Registerin istenilen bitini test et ve bu bit 1 ise 1 konut atla


İngilizce Yazılımı:Bit Test f, Skip if Set
Kullanım Şekli:BTFSS f,b
İşlevi: f(b) = 1 ⇒ bir komut atla
Etkilenen Bayraklar:Yok
Periyot : f(b)=0 ise 1 periyot
f(b)=1 ise 2 periyot
Örnek 1:
BTFSS SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=00h ise
Komuttan sonra işlem işlem 1 e gider.

39
Örnek 2:
BTFSS SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=FFh ise
Komuttan sonra işlem işlem 2 ye gider.

CALL Alt program çağırma komutudur.


İngilizce Yazılımı:Call Subrutine
Kullanım Şekli:CALL Altprogram
İşlevi: TOS (Top Of Stack)← PC+1
PC← Alt Program Başlangıç Adresi
Etkilenen Bayraklar:Yok
Periyot:2
Örnek:
İŞLEM CALL TOPLAMA
DEVAM ...
...
TOPLAMA ...

Komuttan sonra İşlem TOPLAMA adresinden devam eder. Bu arada DEVAM etiketinin
adresi stact’ta tutulur.

CLRF : Registerin içeriğini 00h yap


İngilizce Yazılımı:Clear f
Kullanım Şekli:CLRF f
İşlevi: f ← 00h
Etkilenen Bayraklar:Z
Periyot:1

Örnek:
CLRF SAYI
Komuttan önce SAYI=xxh ise
Komuttan sonra SAYI=00h olur.

40
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

Ö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
41
Ö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
Ö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

42
Örnek : MOVLW 0Fh
MOVWF SAYAC
TEKRAR DECFSZ SAYAC,1
GOTO TEKRAR
DEVAM ....

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.

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.

43
INCFSZ : Register içeriğini 1 artır, sonuç 0 ise
bir 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 TEKRAR
DEVAM ....

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.

44
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.

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

45
Ö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.

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

46
Ö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.

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.

47
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
İşlevi:

C Register (f)

Etkilenen Bayraklar:C
Periyot:1

48
Ö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.

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.

49
Ö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
Ö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.

50
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
Örnek:
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.

51
BÖLÜM 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 İ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.

52
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:

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:

+ 5 V o l t

1 0 0 n F t u s
14

1 0 K 1 7
4 R A 0
VDD

M C L R 1 6
O S C 2 / C L K O U T
R E S E T 1
1 0 K R A 2 2
R A 3 3 1 0 K
1 5 R A 4 / T O C K I
O S C 1 / C L K I6 N
3 3 p F R B 0 7/ I N T
R 3 P I C R B
1 6 F 88 4 1
1 8 R B 9 2
R A 1 R B 1 3 0
L E D 3 3 0 O h m R B 1 4 1
R B 1 5 2
5 R B 1 6 3
V s s R B 7

Şekil 4.1. Pic16f84 kullanarak buton ile led kontrol devresi.

53
Ş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
PCL EQU 02h ;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 EQU 09h ;EEPROM verisinin adresini tutan register.
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.

54
; Ş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-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 Ek-
B’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.

; Şimdi ana programa başlayalım:

55
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.
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.

56
Ş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 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
;tus bırakılana kadar bekle
tus3 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

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

57
Ö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.
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 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

58
goto tus1 ;tuş basılmamışsa geri git

tus2 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

tus3 btfss PORTA,0 ;tuşu kontrol et


goto tus3 ;tuş basılmamışsa geri git

bcf PORTA,1 ;ledi söndür.

tus4 btfsc PORTA,0 ;Tuşu kontrol et


goto tus4 ;tuş basılı ise geri git
;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 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
59
basit mantıkla, sensörden gelecek bilginin aynısının kendisi ile ilgili çıkışa
gönderilebileceğini görürüz. Bu mantıkla düşünülünce yangın söndürme kısmı
sadece bir oku-yaz programı olur. Depo için ise 2 sensör gerekir ki; birisi deponun
yarı seviyesini gösterecek, diğeri ise dolu olduğunu gösterir. Buna göre depo kısmı
için seviye yarının altında ise doldurma motorunu çalıştır, depo doldu ise motoru
durdur mantığı şeklinde düşünülür.

;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

START bsf STATUS,5


movlw b'00110000' ;RB7,RB6,RB3,RB2,RB1,RB0 çıkış
movwf TRISB
movlw 0Fh ;A portu giriş
movwf TRISA
bcf STATUS,5

deger clrf PORTB


clrf yedek
devam movf PORTA,w
andlw 0Fh

60
iorwf yedek,w
movwf PORTB

bos btfsc PORTB,4


goto dolu
bsf PORTB,6
bsf yedek,6

dolu btfss PORTB,5


goto devam
bcf PORTB,6
bcf yedek,6
goto devam

END

61
BÖLÜM 5: DÖNGÜLER VE ALT PROGRAMLAR
5.1. DÖNGÜ NEDİR?
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:

CLRF SAYAC
TEKRAR INCF SAYAC,F
MOVLW h’07’
SUBWF SAYAC,W
BTFSS STATUS,2
GOTOTEKRAR
DÖNGÜ GOTO DÖNGÜ
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)
62
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=
0mı?

Evet

Şekil 5.1. Döngü akış diyagramı


DÖNGÜ ÖRNEĞİ 2:

MOVLW h’0A’
MOVWF SAYAC
DÖNGÜ DECFSZ SAYAC,F
GOTODÖ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

63
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.

Aşağıda her komutun ne kadar cycle süreceğini görüyoruz.

ETİKET KOMUT PARAMETRE CYCLE


MOVLW h’0A’ 1
MOVWF SAYAC 1
DÖNGÜ DECFSZ SAYAC,F D=1, Y=2
GOTO DÖNGÜ 2

Şimdi de programın tamamının kadar cycle tutacağını hesaplayalım:

ETİKET KOMUT PARAMETRE CYCLE TOPLAM CYCLE


MOVLW h’0A’ 1 1*1
MOVWF SAYAC 1 1*1
DÖNGÜ 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:

64
Sayac1 ←FF

Sayac2←FF

Sayac2=sayac2-1

H
Sayac2=
0mı?

Sayac1=sayac1-1

H
Sayac1=
0 mı?

Şekil 5.2. İç içe döngü akış diyagramı

ETİKET KOMUT PARAMETRE CYCLE TOPLAM CYCLE


SÜRE MOVLW h’FF’ 1 1*1
MOVWF SAYAC1 1 1*1
DÖNGÜ1 MOVLW h’FF’ 1 1*255
MOVWF SAYAC2 1 1*255
DÖNGÜ2 DECFSZ SAYAC2,F D=1, Y=2 1*254*254
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.
65
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: 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
(Saniye)
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ı

+ 5 V o l t

1 0 0 n F
17
14

18
3
2
1

1 0 K
R A 4 /TO C K I
R A3
R A2
R A1
R A0
VD D

4 5 x L E D5 x 3 3 0 O h m
M C L R
R B
6
0 / I N T Y A Y A K I R M I Z I
R E S E T
R B
7
1 Y A Y A Y E S I L
1 0 K
R B
8
2 A R A C S A R I
1 5
O S C 1 / C L K I N
R B
9
3 A R A C Y E S I L
3 3 p F
P I C 1 6 F 8 4
R B
1
4
0 A R A C K I R M I Z
1 6
O S C 2 / C L K O U 1T 1
R B 51 2
5 R B 61 3
V s s R B 7

Şekil: 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
; Registerler
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h
; Değişkenler
66
ZD1 EQU 0Fh
ZD2 EQU 0Eh
zaman EQU 0Dh

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5 ; Page 1


movlw 0h ; 0000-0000 sayısını W registerine al
movwf TRISB ; PortB yi çıkış olarak ayarla
TRISB=00000000
bcf STATUS,5 ; Page 0
TOP 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
BEKLE1 movlw .200
movwf ZD1
D1 movlw .200
movwf ZD2
D2 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
BEKLE2 movlw .200
movwf ZD1
D11 movlw .200
movwf ZD2

67
D21 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
BEKLE3 movlw .200
movwf ZD1
D12 movlw .200
movwf ZD2
D22 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
BEKLE4 movlw .200
movwf ZD1
D14 movlw .200
movwf ZD2
D24 decfsz ZD2,F
goto D24
decfsz ZD1,F
goto D14
decfsz zaman,F

68
goto BEKLE4

goto TOP ; Tekrarla


END

5.2. ALT PROGRAMLAR:

Programlamada döngü kadar etkili bir diğer kullanım şekli de alt


programlardır. Bu sistemde işlemin birkaç yerinde lazım olan bir program parçasını
tekrar tekrar yazmak yerine, bu bölümü bir kez ayrı bir program gibi yazıp, bu
parçanın gerekli olduğu yerde programın bu kısmını çağırmak (ya da o kısma
atlamak) metodu kullanılır. Bu sadece bir program yazımından kısaltma ile kurtulmak
değildir. Bir tablodan istenilen verinin seçilmesi veya programın çok fazla hafıza
isteyip işlemcinizin bunu karşılayamadığı durumlarda, alt programlar adeta bir can
yeleğidir.
Alt program yazımının bir programı ne kadar kısaltacağını görebilmek için,
döngüler kısmında çözülen trafik ışığı öneğini birde alt program kullanarak çözelim.

Problem: 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
(Saniye)
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ı

Çözüm: Devre şekli üstte verilmiştir. Yine zamanlama için 200*200=40000 turluk
bekleme döngüsünü, 1 saniye olarak kabul ediyoruz.
;Trafik ışığı problemi,
;Lambalar:RB0:Yaya-kırmızı, RB1:Yaya-Yeşil
;RB2:Araç-sarı, RB3:Araç-Yeşil, RB4:Araç-Kırmızı
;Süre ve durumlar
;15 sn Araç-Yeşil,Yaya-Kırmızı
69
;5 sn Araç-Sarı,Yaya-Kırmızı
;15 sn Araç-Kırmızı,Yaya-Yeşil
;15 sn Araç-Sarı-Kırmızı,Yaya-Kırmızı
LIST P=16F84
; Registerler
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h
; Değişkenler
ZD1 EQU 0Fh
ZD2 EQU 0Eh
zaman EQU 0Dh

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5 ; Page 1


movlw 0h ; 0000-0000 sayısını W registerine al
movwf TRISB ; PortB yi çıkış olarak ayarla
TRISB=00000000
bcf STATUS,5 ; Page 0
TOP movlw 09h ;0 0 0 0 1 0 0 1
movwf PORTB ; Araç Yeşil, Yaya Kırmızı
movlw 0Fh
movwf zaman
call BEKLE ; Bekle 15 saniye

movlw 05h ;0 0 0 0 0 1 0 1
movwf PORTB ; Araç Sarı, Yaya Kırmızı
movlw 05h
movwf zaman
call BEKLE ; Bekle 5 Saniye

70
movlw 12h ;0 0 0 1 0 0 1 0
movwf PORTB ; Araç Kırmızı, Yaya Yeşil
movlw 19h
movwf zaman
call BEKLE ; Bekle 25 saniye

movlw 15h ;0 0 0 1 0 1 0 1
movwf PORTB ; Araç Sarı-Kırmızı, Yaya Kırmızı
movlw 05h
movwf zaman
call BEKLE ; Bekle 5 Saniye
goto TOP ; Tekrarla

;********************************************************
; BEKLE alt programı
;********************************************************
BEKLE movlw .200
movwf ZD1
D1 movlw .200
movwf ZD2
D2 decfsz ZD2,F
goto D2
decfsz ZD1,F
goto D1
decfsz zaman,F
goto BEKLE
return

END

ÖRNEK 5-1: Port B’de bağlı olan 8 adet ledi yakıp söndüren bir flip,flop programı
yazınız. Bu programı yazarken zaman gecikmesini alt programlar şeklinde yazınız?

ÇÖZÜM:
LIST P=16F84

71
INCLUDE “P16F84.INC”
S1 EQU h’00’
S2 EQU h’0D’
CLRF PORTB
BSF STATUS,5
CLRF TRISB
BCF STATUS,5
TEK MOVLW h’00’
MOVWF PORTB
CALL GECİKME
MOVLW h’FF’
MOVWF PORTB
CALL GECİKME
GOTO TEK

GECİKME MOVLW h’FF’ ;Alt program kısmı


MOVWF S1
DÖN1 MOVLW h’FF’
MOVWF S2
DÖN2 DECFSZ S2,F
GOTO DÖN2
DECFSZ S1,F
GOTO DÖN1
RETURN ;Altprogram sonu

END

Programın birinci kısmı port ayar işlemi yapmakta yani portB’nin tüm uçlarını
çıkış olarak ayarlamaktadır.İkinci kısım ise porta b’00000000’ bilgisi ile b’11111111’
sayısını sırası ile göndererek port ucundaki ledlerin sönmesini ve yanmasını
sağlamaktadır. Gecikme isimle son kısım ise porta yanma ya da sönme bilgisi
gönderildikten sonra bekleme süresini ayarlamakta ve alt program şeklinde
kullanılmaktadır.

SORU : Aynı programı farklı mantıklar ve teknikler kullanarak yazınız?

72
Problem 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.

LIST P=16F84
INCLUDE “P16F84.INC”
SAYAC1 EQU h’0C’
SAYAC2 EQU h’0D’
CLRF PORTB ;PORTB=0
BCF STATUS,0 ; Carry=0
BSF STATUS,5
CLRF TRISB
BCF STATUS,5

MOVLW h’01’
MOVWF PORTB
TEKRAR CALL BEKLE
RLF PORTB,F
BTFSS STATUS,0
GOTO TEKRAR

DUR GOTO DUR

BEKLE 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
GOTO DÖNGÜ1
RETURN
END
Soru= Programı işlemi sürekli yapacak hale getiriniz.

73
Problem 3: Yukarıdaki örnekten faydalanarak sağa ve sola doğru kayan ışık (kara
şimşek) programını yazınız?

LIST P=16F84
INCLUDE “P16F84.INC”
SAYAC1 EQU h’0C’
SAYAC2 EQU h’0D’
CLRF PORTB ;PORTB=0
BCF STATUS,0 ; Carry=0
BSF STATUS,5 ;Portb=Çıkış
CLRF TRISB
BCF STATUS,5
MOVLW h’01’
MOVWF PORTB

SOL CALL BEKLE


RLF PORTB,F
BTFSS PORTB,7
GOTO SOL
SAĞ CALL BEKLE
RRF PORTB,F
BTFSS PORTB,0
GOTO SAĞ
GOTO SOL
BEKLE 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
GOTO DÖNGÜ1
RETURN

74
END
Problem 4: Bir temizlik robotunun kendi kendine çalışarak ortamı temizlemesi
isteniyor. (Robot, düz zeminde rastgele yönlere hareket ederek, üzerinde taşıdığı
elektrik süpürgesinin çalışması ile zeminin süpürülmesi işleminin kendiliğinden
yapılmasını sağlayacaktır.) Bunun için robot üzerindeki 2 adet motordan bir tanesi
robotun o andaki istikametinde düz ilerlemesini sağlıyor. Diğeri ise robotun belli
açılarla dönmesini sağlıyor. Düz ilerlemeyi sağlayan robot kendisine 1 verilince
çalışıyor, 0 verilince duruyor. Dönmeyi sağlayan robot ise yine 0 verilince duruyor ve
her 1 saniye süresince verilen 1 değeri için 10 derece dönmeyi sağlıyor. Robotun
etrafına yerleştirilmiş 6 adet optik algılayıcı ise kendi istikametinde engel görünce 1
veriyor. Robutun düz istikametinde bir engel görüldüğünde 30 derece döndükten
sonra engelleri kontrol ettikten sonra yeni istikametinde ilerlemesi, eğer 30 derece
dönüşten sonra hala engel varsa 30 derece daha dönerek işleme devam etmesi
isteniyor. Devrenin prensip şemasını çiziniz ve programını yazınız.

Çözüm : Burada 6 sensör bağlanmış olmasına rağmen robot sadece düz istikamette
ilerleyeceğinden, robotun düz istikametindeki engelleri gösteren sensör haricindeki
sensörleri kullanmadan çözüm üretmek mümkündür. Tabii ki profesyonel devre
yapılıyor ise diğer sensörlerde kullanılarak robotun dar aralara girme durumu
engellenmiş olur. Ayrıca dar aralığa girip geri çıkamadığı durumlar için 360 derece
döndüğü halde düz ilerleyemeyecek, olursa bir sesli ikaz vermesi de düşünülebilir.
Ancak öğrenme amaçlı bu problemde sadece düz istikametteki sensörü dikkate
alarak çözüm yapacağız.

;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

75
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 ; 0000

START bsf STATUS,5


movlw h'FF' ;B portu giriş
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5

TOP clrf PORTA


kontrol btfsc PORTB,0
goto dondur
bsf PORTA,0
goto kontrol

dondur bcf PORTA,0


bsf PORTA,1
call BEKLE
goto TOP
;***********************************
; BEKLE 3 Saniye Altprogramı
;***********************************
BEKLE movlw .3
movwf D0
ZD1 movlw .200
movwf D1

ZD2 movlw .200


movwf D2

76
ZD3 decfsz D2,1
goto ZD3
decfsz D1,1
goto ZD2
decfsz D0,1
goto ZD1
return
END

Problem 5: Zeminden üst katlara yük taşıyan bir asansörün bakım sistemi için
şöyle bir düzenek isteniyor. Asansörün yukarı çıkıp aşağı dönüşü 1 tur sayılmak
kaydıyla 40.000 tur sonunda bakım zamanının geldiğine dair bir sarı ikaz lambasının
yanması isteniyor. Eğer bakım yapılmadan çalışmaya devam eder ise 48.000 turdan
sonra kırmızı ikaz lambasının yanması isteniyor. Şayet asansör bakım yapılmadan
2.000 tur daha çalıştırılırsa bu durumda asansörün çalışmasını engellemesi
isteniyor. Bakım yapıldığında tur sayısının sıfırlanarak aynı işlemin tekrar devreye
girmesi isteniyor. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve
programını yazınız.
(İpucu: Asansörün her bir turunu zeminde iken algılatma şeklinde düşünebilirsiniz.)

Çözüm: Burada esas olay asansörün iniş çıkış turlarını saydırmaktır. Normal sayıcı
mantığıyla düşündüğünüzde bir değişkenle sayabileceğiniz en büyük sayı 255’tir.
Bu şekilde düşündüğünüzde birler, onlar basamağı mantığı ile düşünüp 2 veya 4
değişken kullanarak program yazılabilir ki biraz uzunca bir program olur. Ancak iç
içe iki döngü ile yuş basmasını saydırırsak, bu durumda iç içe olmak üzere her ikisi
de 200 turluk 2 döngü ile 200*200=40000 tur sonunda döngü tamamlanır. Sonunda
40000 tur sonunda yapılacak işlem yaptırılır. 8000 ve 2000 tur içinde aynı teknik
kullanılabilir. Aşağıdaki çözüm bu mantığa göre tasarlanmıştır.

;Asansör koruma-bakım problemi


;RA0 ucunda asansor turlarını sayan buton sensor
;RB0 Sarı ışık ikaz
;RB1 Kırmızı ışık ikaz

77
;RB2 Asansor aktif/Pasif ucu, RB2=0 iken asansor calısır durumda
LIST P=16F84
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h

say EQU 0Ch ;


D0 EQU 0Dh ; döngü degiskeni 0
D1 EQU 0Eh ; döngü degiskeni 1
D2 EQU 0Fh ; döngü degiskeni 2

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw 0h
movwf TRISB
movlw 0fh
movwf TRISA
bcf STATUS,5

clrf PORTB
movlw .200 ;Asansor 40000 tur calıstı mı
movwf D1 ;sorusu icin 200*200=40000
ZD1 movlw .200 ;turluk dongu icinde
movwf D2 ;tus programı tekrarlanır
ZD2 call tus
decfsz D2,F
goto ZD2
decfsz D1,F
goto ZD1

bsf PORTB,0 ;40000 tur olmuştur SARI led yanar

78
movlw .40 ;Asansor 8000 tur daha calıstı mı?
movwf D1 ;sorusu icin 40*200=8000
ZD3 movlw .200 ;turluk dongu icinde
movwf D2 ;tus programı tekrarlanır
ZD4 call tus
decfsz D2,F
goto ZD4
decfsz D1,F
goto ZD3

bcf PORTB,0 ;48000 tur olmuştur SARI led söner


bsf PORTB,1 ;48000 tur olmuştur KIRMIZI led yanar

movlw .10 ;Asansor 2000 tur daha calıstı mı?


movwf D1 ;sorusu icin 10*200=2000
ZD5 movlw .200 ;turluk dongu icinde
movwf D2 ;tus programı tekrarlanır
ZD6 call tus
decfsz D2,F
goto ZD6
decfsz D1,F
goto ZD5

ZD7 bsf PORTB,2 ;50000 tur olmuştur KIRMIZI led zatan yanıktır,
goto ZD7 ;Asansor duması için RB2 ucu 1 yapılı ve
;Bu konumdan çıkmak için RESET butonuna
;basılana kadar beklenir.
;***********************************
; TUS Altprogramı
;***********************************
tus btfss PORTA,0 ;Asansorun 1 turu icin zemindeki
goto tus ;butona basılıp bırakıldı mı? şeklinde
tus2 btfsc PORTA,0 ;programla test etmek gerekir
goto tus2 ;tus ikilemesi gerekmez

79
return
END

5.3. ÇEVRİM TABLOLARI


Bazı programlarda, bir tablodan belirli değerlerin seçtirilmesi, sıkça lazım olan
bir durumdur. Bunun için CALL komutu RETLW komutu ile birlikte kullanılır.
Sistemde CALL komutu ile bir alt program çağırılırken eğer W registerinde bir değer
varsa ve bu değer PCL ile toplanırsa bu sistem bir index gibi kullanılır. Bu index ile
atlanılan adımda RETLW değer şeklinde bulunan komut satırındaki değer W
registerine aktarılarak alt programdan çıkılır ve böylece ilgili indexteki değer tespit
edilmiş olur. Bu işlemi bir örnekle görelim:

Problem 6: PortB’ye bağlı olan seven segment displayı kullanarak, 0 ile F


arasındaki sayıları beklemeler yaparak sayan programı tablo tekniğini kullanarak
yazınız?
LIST P=16F84
INCLUDE “P16F84.INC”
SAYAC1 EQU h’0C’
SAYAC2 EQU h’0D’
SAYAC EQU h’0E’

CLRF PORTB ;PORTB=0


BSF STATUS,5 ;Portb=Çıkış
CLRF TRISB
BCF STATUS,5

BAŞLA MOVLW h’00’


MOVWF SAYAC
DÖNGÜ MOVF SAYAC,W
ANDLW B‘00001111’
CALL CEV7
MOVWF PORTB
INCF SAYAC,F
CALL BEKLE
80
GOTO DÖNGÜ

CEV7SEG ADDLW PCL,W


RETLW h’3F’ ;0
RETLW h’06’ ;1
RETLW h’5B’ ;2
RETLW h’4F’ ;3
RETLW h’66’ ;4
RETLW h’6D’ ;5
RETLW h’7D’ ;6
RETLW h’07’ ;7
RETLW h’7F’ ;8
RETLW h’6F’ ;9
RETLW h’77’ ;A
RETLW h’7C’ ;B
RETLW h’39’ ;C
RETLW h’5E’ ;D
RETLW h’79’ ;E
RETLW h’71’ ;F

BEKLE 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
GOTO DÖNGÜ1
RETURN
END

81
BÖLÜM 6: INTERRUPT
6.1. INTERRUPT NEDİR:
Kelime anlamı olarak kesilim isteği anlamına gelen interrupt kelimesi,
işlemcinin herhangi bir programı icra ederken, bu programa dışarıdan gelen bir
sinyal sebebiyle ara verip, başka bir programa (interrupt alt programı) atlayıp,
atladığı programı tamamladıktan sonra tekrar geri dönüp ilk kaldığı programdan
devam etmesi işlemidir. Bu anlatımdan anlaşılacağı gibi interrupt bir alt program
çalıştırma işleminin aynısı gibidir. Ancak, alt programın çağrılma şekli farklıdır. Bu
fark ise normal alt programı çağırma işlemi CALL komutu ile yapılırken, interrupt alt
programının ise, normal programın herhangi bir anında dışarıdan gelecek bir sinyal
ile çağırılması olayıdır.
Uygulamada çok rastlanan bir örnekle konuyu açıklayalım: Bilgisayarınıza
bağlı bir yazıcıdan 40 sayfalık bir yazının çıkarılması için yazdırma işlemi başlattınız
ve sizde aynı zamanda bilgisayarda başka bir programı kullanıyorsunuz. Ancak,
yazıcınızda diyelim ki 25 adet kağıt takılı olsun. Bu 25 kağıt yazıldıktan sonra, kalan
15 sayfa yazılamayacağı için bilgisayarınız sizin kullandığınız programa ara vererek,
yazıcı ile ilgili bir mesajı ekrana çıkarır. İşte bu mesajın çıkarılma nedeni, yazıcınızın
kağıt bitmesi sebebiyle interrupt istemiş olmasıdır. Mesajı sis ekrandan kaldırdıktan
sonra eski kullandığınız programa tekrar kaldığınız yerden devam edebilirsiniz.
İnterrupt alt programının yazılımı normal alt program ile aynıdır, ancak alt
programın bitiş komutu RETFIE komutudur. Bu alt programın interrupt geldiğinde
kullanılması için 3 işlemin program içerisinde yapılmış olması gerekir. Bu işlemler:
1. İnterrupt alt programının adı, 04h adresine interrupt vektör adresi olarak
tanıtılmış olmalıdır.
Örnek:
ORG 04h
GOTO INTPRG
2. Interrupt ayarlarını sağlayan INTCON ve OPTION registerlerinin ayarlarının
yapılmış olması gerekir. Bu registerlerin herbir bitinin bir anlamı vardır. Bu sebeple
kullanılacak interrupt tipine göre ayarlanmış olmaları gerekir.
3. Kullanılan interrupt türüne göre interrupt geldiğinde INTCON registerinin
kullanılan interrupt ile ilgili bir biti 1 olmaktadır. İnterrupt alt programı
tamamlandığında yeni interrupt gelmediği halde, tekrar interrupt alt programının

82
çalışması istenmiyorsa, interrupt geldi anlamında 1 olan bitin alt program içerisinde
tekrar 0 yapılması gerekir.

6.2. INTERRUPT ÇEŞİTLERİ:


Interruptları genel olarak ikiye ayırmak mümkündür:
1. Mask Edilemeyen Interruptlar: Bu tür interrupt’ta interuptun işlemci tarafından
algılanması herhangi bir program mantığıyla engellenemez. Bu tür kesilime örnek
olarak işlemcilerin reset butonlarını göstermek mümkündür ki; tam olarak yukarıda
verdiğimiz tarife uymamakla birlikte reset tuşu programa ara verilip sistemin açılışa
dönmesini sağlayan bir interrupt şeklidir ve programla reset tuşu devre dışı
bırakılamaz.
2. Mask Edilebilen Interruptlar: Bu tür interruptlar yukarıda verilen interrupt
tarifine tam uyan interruptlardır. Bunlar istenirse öncelik sırasına dizilebileceği gibi,
istenmezse hiç interrupt gelmemiş gibi programlanarak, yok farz edilebilirler. Bu
işlemin nasıl olduğunu konunun ilerleyen detaylarında inceleyelim.
6.3. Pic16f84 için Interrupt çeşitleri:
Pic 16f84 işlemcisi için (MCLR=RESET hesaba katılmazsa) 3 tür interrupttan söz
etmek mümkündür.
1. RB0 Interrupt: Bu tür interruptta interrupt alt programı, işlemcinin B portunun 0
numaralı (RB0) ucundan gelecek bir sinyale göre işleme girer. Bu sinyal alçalan
kenar veya yükselen kenar şeklinde sürekli sinyal olabileceği gibi, bir puls sinyali de
olabilir. Tek sinyalde interrupt kontrol edilmesi istenilen yerlerde kullanışlı olur.
2. TMR0 (timer) Interrupt: Bu tür interrupt, işlemcinin içerisinde programdan
bağımsız çalışan bir sayıcının çalıştırılarak, sayıcının her 0’dan geçişte sisteme
interrupt vermesi esasına göre çalışan çeşididir ki, burada sayıcı option registerdeki
ayarlamalar sayesinde kendi içerisindeki osilatör sinyaline göre veya dışarıdan
gelecek olan (RA4/T0CKI ucundan) sinyalleri sayma esasına göre programlanabilir.
Zamana bağlı problemleri çözmede çok kullanışlı olur. Mesela saat, kronometre,
vb...
3. RB4..RB7 uçlarındaki bilginin değişmesi esasına göre tasarlanmış bir interrupt
çeşididir ki, iletişim ve güvenlik işlemlerinde kullanılması uygun olur.

Bu anlatılanlar ışığında INTCON register ve OPTION registerin içeriğine bakalım:

83
INTCON REGİSTERİ:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit0


GIE EEIE T0IE INTE RBIE TOIF INTF RBIF

Bit Adı Açıklama


No
Bit 7 GIE Tüm interrupt işlemlerini açma bayrağı
0: Tüm interruptlar disable
1: Tüm interruptlar enable
Bit 6 EEIE EEPROM hafızaya yazma işlemlerini tamamlama
interruptu
0: Disable
1: Enable
Bit 5 T0IE TMR0 sayıcısı interruptunu aktif yapma bayrağı
0: Disable
1: Enable
Bit 4 INTE Harici (RB0) interruptunu aktif yapma bayrağı
0: Disable (Harici interruptları geçersiz yapar-
algılanmaz)
1: Enable (Harici interruptları geçerli yapar-
algılanır)
Bit 3 RBIE RB/..RB4 değişimi interruptunu aktif yapma bayrağı
0: Disable (RB7..RB4 değişimi algılanmaz)
1: Enable (RB7..RB4 değişimi interrupt oluşturur)
Bit 2 TOIF TMR0 sayıcısı zaman aşımı bayrağı
0: Sayıcı normal saymaya devam ediyor
1: Sayıcı sayma süresini tamamlamış (FF-00 geçişi)
Bit 1 INTF Harici (RB0) interrupt bayrağı
0: Harici interrupt algılanmadı
1: Harici interrupt algılandı
Bit 0 RBIF RB/..RB4 değişimi interruptı bayrağı
0: (RB7..RB4 ) uclarında değişim yok
1: (RB7..RB4) uclarında değişimi var.

OPTION REGİSTER

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit Bit 1 Bit0


2
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

Bit Adı Açıklama


84
No
Bit 7 RBPU PORTB Pull Up Geçerli yapma biti
0: PORTB Pull Up’lar Geçersiz
1: PORTB Pull Up’lar Geçerli
Bit 6 INTEDG Harici interrupt tipi seçme biti
0: RB0/INT ucundan alçalan kenar tetikleme
1: RB0/INT ucundan yükselen kenar tetikleme
Bit 5 T0CS TMR0 sayıcısı sinyal kaynağı seçme biti
0: Dahili komut periyotu seçilir
1: Harici sinyal (RA4/TOCKI ucundan) periyotu seçilir
Bit 4 T0SE TMR0 harici sinyal kaynağı kenar seçme biti
0: RA4/T0CKI ucundan alçalan kenar tetiklemesi
1: RA4/T0CKI ucundan yükselen kenar tetiklemesi
Bit 3 PSA Frekans bölücü seçme biti
0: Frekans bölme sayısı TMR0 için geçerli
1: Frekans bölme sayısı WDT için geçerli
Bit 2 PS2 Frekans bölme sayısı biti 2 (Alttaki tabloya bakınız)
Bit 1 PS1 Frekans bölme sayısı biti 1 (Alttaki tabloya bakınız)
Bit 0 PS0 Frekans bölme sayısı biti 0 (Alttaki tabloya bakınız)

Frekans TMR0 WDT


Bölme Oranı Oranı
Sayısı
(Bit2-Bit1-
Bit0)
000 1/2 1/1
001 1/4 1/2
010 1/8 1/4
011 1/16 1/8
100 1/32 1/16
101 1/64 1/32
110 1/128 1/64
111 1/256 1/128

Yukarıdaki tablolar incelendiğinde INTCON registerinin 7 numaralı ucunun


bu işte en önemli register olduğunu anlamak mümkündür. Çünkü bu uc 0 olduğunda
tün interrupt sinyalleri DISABLE yani algılanmaz olur. Yukarıda anlatılan her bir
interrupt şeklinden kullanılacak olanı ayarlamak için birer uç (3-4-5) ve interrupt
geldiğinde bunu belirten birer uç (0-1-2)olmak üzere 6 uc programlanabilen interrupt
işlemlerine ayrılmıştır. Option register ise daha ziyade TMR0 ile ilgili ayarlar içindeir.
Option registerin 6 numaralı ucu ise RB0 ucunun alçalan ya da yükselen kenar
şeklinde tasarlanması için kullanılmaktadır.
Şimdi interrupt ile ilgili örnekleri inceleyerek, bu işi daha detaylı
öğrenmeye çalışalım.

85
Örnek 6-1: RB0 ucundan gelen sinyalleri sayacak ve ekrana gönderecek bir sayıcı
programını interrupt kullanarak yazınız.

Çözüm : RB0 interrupt ile 0-9 sayıcı örneği


; (Display RB7-RB4 uclarında 4056 ile bağlı)

list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h

org 00h
goto basla
org 04h ;İnterrupt vektör adresi veriliyor
goto saydır ;İnterrupt gelince saydır altprogramını çalıştırır

basla bsf STATUS,5


movlw 01h ;RB0 interrupt kullanıldığından RB= ucu giriş
movwf TRISB ;B portunun diğer ucları çıkış
movlw b'01000000' ;RB0 ucundan yükselen kenar tetiklemesi
;seçilmiş
movwf OPTION_REG
bcf STATUS,5

movlw b'10010000' ;Tüm interruptlar açık, RB0 interrupt aktif


;RB0 interrupt algılaması 0
movwf INTCON
clrf say ;Ekrana gidecek sayı 0 yapılmış

yaz SWAPF say,w ;Display üst nibble’a bağlı olduğundan


movwf PORTB ;ekrana gidecek bilgi swap edilerek alınmış
goto yaz

86
saydır movwf tmp ;W'deki değer geçici hafızaya alınmalı
bcf INTCON,INTF ;RB0 interrupt algılamasını tekrar 0 yap
;değilse tekrar int alt pr. Çalışır. Yeni gelecek
;interrupt’un algılanması için 0 yapılmalı
incf say,1 ;bu kısım normal 10luk sayıcı programıdır
movf say,w
sublw .10
btfss STATUS,2
goto devam
clrf say
devam movf tmp,w ;W'deki orijinal değer geri yüklenmeli
retfie
end

Örnek 6-2: TMR0 interruptunu kullanarak dahili sinyalin 256 peryodunu 1 kabul
ederek belirli zaman aralıklarıyla sayan 99 sayıcı tasarlayınız.

Çözüm: TMRO interrupt kullanarak 99 sayıcı örneği;


;Displaylar B portuna decoder ile bağlı
list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h

org 00h
goto basla
org 04h
goto saydır

basla bsf STATUS,5


clrf TRISB
movlw b'00000111' ;dahili sinyal 1/256 oranı
movwf OPTION_REG
bcf STATUS,5

87
movlw h'00'
movwf TMR0 ;Timer 0 başlangıç sayısı 00
movlw b'10100000' ;interruptlar açık, Timer 0 interrupt aktif
movwf INTCON ;Timer 0 zaman aşımı 0
clrf say

yaz movf say,w


movwf PORTB
goto yaz

saydır movwf tmp ;w’deki bilgi geçici değişkene yazılır


bcf INTCON,T0IF ;Timer 0 zaman aşımını tekrar 0 yap
incf say,1 ;değilse tekrar int alt pr. çalışır
movf say,w
sublw .10
btfss STATUS,2
goto devam
movf say,w
andlw h'F0'

addlw 10h
movwf say
sublw h'A0'
btfss STATUS,2
goto devam
clrf say

devam movlw h'01' ;TMR0 başlangıç sayısı 01h olarak ayarlanmış


movwf TMR0 ;Böylece 255 tur olunca ikaz vermesi sağlanır
movf tmp,w ;W'deki orijinal değer geri yüklenir
retfie
end
Örnek 6-3: TMR0 interruptunu kullanarak desimal moda çalışan 0-99 sayıcı
tasarlayınız.

88
Çözüm: TMRO interrupt kullanarak taramalı ekranda 99 sayıcı örneği
;Displaylar B portu üzerinde decoder ile paralel bağlı

list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h
org 00h
goto basla
org 04h
goto saydır
basla bsf STATUS,5
clrf TRISB
movlw 0Ch
movwf TRISA
movlw b'00000111' ;dahili sinyal oranı 1/256
movwf OPTION_REG
bcf STATUS,5

movlw h'00'
movwf TMR0 ;Timer 0 başlangıç sayısı 00
movlw b'10100000' ; Tüm interruptlar açık, TMR0 interrupt aktif
movwf INTCON ; TMR0 zaman aşımı 0 değerleri INTCON’a yüklendi
clrf say

yaz movf say,w


clrf PORTA
bsf PORTA,0
movwf PORTB
SWAPF say,w
clrf PORTA
bsf PORTA,1
movwf PORTB

89
goto yaz

saydır movwf tmp ; W'deki değer geçici hafızaya alınmalı


bcf INTCON,T0IF ;Timer 0 zaman aşımını tekrar 0 yap
incf say,1
movf say,w
sublw .10
btfss STATUS,2
goto devam
movf say,w
andlw h'F0'
addlw 10h
movwf say
sublw h'A0'
btfss STATUS,2
goto devam
clrf say

devam movlw h'01' ;TMR0 başlangıç sayısı 01h


movwf TMR0
movf tmp,w ;W'deki orijinal değeri geri yükle
retfie
end

Örnek 6-4 : TMR0 interruptunu kullanarak hex moda çalışan 0-FF sayıcı
tasarlayınız.

Çözüm:
; TMR0 interrupt örneği
; TMR0 ile süre tutuluyor ve her bir süre sonunda
;B portuna 7 segment decoder ile bağlı displaylarda (0-FF) saydırılıyor.

list p=16f84
include "p16f84.inc"

90
org 00h
goto basla
org 04h
goto saydır

basla bsf STATUS,5


clrf TRISB
movlw b'00000000' ;dahili sinyal 1/2 oranı
movwf OPTION_REG
bcf STATUS,5
movlw h'f9'
movwf TMR0 ;Timer 0 başlangıç sayısı 00
movlw b'10100000' ;interruptlar açık, Timer 0 interrupt aktif
;Timer 0 zaman aşımı 0
movwf INTCON
clrf PORTB

dongu goto dongu

saydır
bcf INTCON,T0IF ;Timer 0 zaman aşımını tekrar 0 yap
;değilse tekrar int alt pr. çalışır
incf PORTB,f
movlw h'f0' ;TMR0 başlangıç sayısı f0h
movwf TMR0
retfie
end

91
BÖLÜM 7: ADC KULLANIMI

Mikrodenetleyici kullanırken en çok rastlanan husus, bir fiziksel büyüklüğün


ölçülmesi ya da ayarlanması şeklindedir. Mesela ortam sıcaklığının ölçülmesi ya da
ayarlanması, ortam ışıklandırılması vb… Bu gibi durumlarda ADC kullanılması
gerekmektedir. Bazı pic serisi işlemcilerde kendi içerisinde ADC mevcuttur, ancak
biz burada 16f84 ile adc kullanarak yapılabilecek işlemlere bakacağız.
İşlemlerimizde ADC olarak ADC804 elemanını kullanacağız.
8 bit ADC uygulamaları için, B portunun ADC çıkışlarına birebir olacak şekilde
bağlandığını kabul edeceğiz. Böylece diğer işlemler için sadece A portunu
kullanacağız. Tabii ki burada dışarıdan çoğullama kullanılarak çok farklı çözümler
üretmenin mümkün olduğu unutulmamalıdır

V C C _ B A R U 2
1 6
O S C 2 / C L K O U T
1 7
R 2 1 8 R A 0
R 1 R 1 R A 1
R 2 R A 2
U 1 3 R A 3 4
R A 4 / T O C K M I C L 1R 5
6 1 8 6 O S C 1 / C L K I N
7 + I N D B 01 7 7 R B 0 / I N T
- I N D B 11 6 8 R B 1
1

R T 1 9 D B 21 5 9 R B 2
P T C 1 9 V R E F / D2 B 31 4 1 0 R B 3
4 C L K R D B 41 3 1 1 R B 4
C L K I N D B 51 R B 5
t R
R
3
1 D B 61
2
1
1
1
2
3 R B 6
2 C S D B 7 R B 7
2

3 R D 5
W R I N T R P I C 1 6 F 8 4

A D C 0 8 0 4

Şekil: ADC ile sıcaklık ölçme için ADC-PIC bağlantısı

Şekilde görüldüğü gibi ADC çıkışları B portuna direk girilmiştir. Burada


ADC’nin Vref/2 ucuna Vcc/2=2,5 Volt verildiği için ADC’nin çıkışındaki her bir sayı
5/256=19,53 milivolta karşılık gelmektedir. Böylece girişteki PTC ile R1 direncinden
oluşan gerilim bölücü devre sayesinde, çıkışında sıcaklık değişimi sebebiyle oluşan
her 19,53 milivolt değişimde bir sayı değişecektir. Burada kullanılan direncin değeri,
PTC’nin istenilen sıcaklıktaki değeri ile yaklaşık seçilirse sistemin çalışma
hassasiyeti artar.
Burada “Sıcaklık derecesine göre, ADC çıkışındaki sayı kaç olur?” sorusu
gündeme gelirse, bunun hesabını şöyle yapmak mümkündür.

92
Örnek 7-1: PTC’nin 200C ‘deki direnci 5000 Ohm ise ce R1 direncinin değeri 10000
Ohm ise ADC çıkışındaki sayıyı bulunuz?

ADC girişindeki gerilim: V = Vcc .RPTC /( R1 + RPTC ) = 5.5 /( 5 +10 ) = 1,66Volt

1 sayı 19,53 milivolt ise


x sayı 1,66 Volt olur

şeklinde orantı kurulduğunda x=1,66/19,53 = 85


Böylece 20 0C de bir şey kontrol edilecekse 85 sayısında işlemciye istenilen
işlem yaptırılacak şekilde komut yazılır. Örnek problemlerde bunu görebiliriz.

ÖRNEK7-2: Bir süpermarkette iç ortam sıcaklığının 22oC ile 25oC arasında


ayarlanması isteniyor. Bu iş için sıcaklığı ölçmek amacıyla aşağıda değerleri verilen
PTC kullanılmıştır. Gerekli devreyi çiziniz ve programını yazınız.
22oC de Ptc Direnci :22 K
25oC de Ptc Direnci :25 K

Çözüm : Burada, devrede bir harici ADC kullanılır ve PTC ile sabit bir direncin,
gerilim bölücü olarak kullanılmasından faydalanılır. PTC direncinin değişimine göre
de ADC’nin giriş voltajı (gerilim bölme kuralı ile) ile bu voltaja karşılık ADC’nin
üreteceği sayı hesaplanır. Sonrasında problem, girişteki sayı X’den küçükse A
işlemini yap, girişteki sayı Y’den büyükse B işlemini yap durumuna gelir.

+ 5 v
U 8
5 + 5 V
I N T R3
U 3 W R 2
1 3 1 1 R D 1
+ 5 V R B 71 2 1 2 D B 7 C S 1 5 0 p F R 4
R B 61 1 1 3 D B 6 4 1 0 K 1 0 k
R B 51 0 1 4 D B 5 C L K 1I N 9
R B 49 1 5 D B 4 C L K 9R R 4
R B 38 1 6 D B 3 V R E F / 2 R 5 C 2 R
R B 27 1 7 D B 2 7
R 1 R B 16 1 8 D B 1 - I N 6
1 0 K R B 0 / I N T D B 0 + I N
4 3 A D C 0 8 0 4
M C L R R A 4 / T O2 C K I
S W 1 R A 31 R 6
1
O S C 1 /C L K IN

R A 21 8 I S I T I C I K O N T R O L R T 3 1 0 k
R E S E T R A 11 7 P T C
R A 0 S O G U T U C U K O N T R O L
O S C 2 / C
1 6
L K O U T t
R 2
2
15

1 0 K P I C 1 6 F 8 4

C 1
3 3 p F

Şekil:Pic16f84 ile ortam sıcaklığını kontrol devresi

93
;Market ısısını 22C ile 25C arasında ayarlama işlemi
;B portu giriş yapılıp ADC üzerinden sıcaklık bilgisi okunacak
;PTC ile gerilim bölücü direnç 25 K bağlanmış olup
;22c de 120 sayısı, 25C de 128 sayısı B portundan okunuyor
;RA0 Isıtıcı kontrol çıkışı
;RA1 Soğutucu kontrol çıkışı
LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw h'FF' ;B portu giriş
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5

sil clrf PORTA

soguk movf PORTB,w


sublw .120
btfss STATUS,0
goto sicak
movlw 01h
movwf PORTA
goto soguk

sicak clrf PORTA


stest movf PORTB,w

94
sublw 80h
btfsc STATUS,0
goto sil
movlw 02h
movwf PORTA
goto stest
END

95
BÖLÜM 8:ÖRNEK PROBLEMLER:
Aşağıda işlenen tüm konuları içerisine alan çözülmüş örnekler verilmiştir. Bu
örneklerde esas amaç, gerçek hayattaki problemlerin mikroişlemciye uyarlanmasını
sağlamaktır. Ayrıca bu örnekler programlamanın değişik durumlarını öğretmesi
açısından faydalı olacaktır.

ÖRNEKPROBLEM 1: Bir süpermarkette kapıların otomatik çalışması istenmektedir.


Bu iş için kullanılacak optik sensörler görüş açısındaki cismi algılayınca 1, boşta iken
0 vermektedirler. Bir kapının giriş-çıkış şeklinde çalışması için gerekli devreyi
tasarlayınız. Kapı ortasında kimsenin sıkışmaması için gerekli tedbiri alınız.

Çözüm: Burada en az 3 sensöre ihtiyaç olacaktır. Bunlar kapıda biri olduğunu


algılayan sensör ile kapı tam açık ya da kapı tam kapalı şeklindeki değerleri veren
limit switch şeklindeki kapı açık-kapalı sensörleridir. Bunlar olduğunda problem
kapıda biri varsa ve kapı tam açık değilse kapı açma motorunu çalıştır. Kapıda
kimse yoksa ve kapı kapalı değilse kapı kapatma motorunu çalıştır şeklinde
düşünülür.
;Otomatik kapı sorusu çözümü
;RB0,RB1 uclarında kapıda biri var işareti veren seösörler bağlı
;RB2 de kapı tam açık sensörü bağlı
;RB3 te kapı tam kapalı sensörü bağlı
;RA0 ucunda kapıyı açan motor bağlı
;RA1 ucunda kapıyı kapatan motor bağlı

LIST P=16F84
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h

X1 org 0h ; Power on
goto START ; 0000
START bsf STATUS,5
movlw h'FF' ;B portu giriş

96
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5

sil clrf PORTA


kontrol movf PORTB,w
andlw 03h ;sadece RB0 ve RB1 bilgilerini ayırmak için
btfsc STATUS,2 ;kapıda biri yoksa ANDLW işleminin sonucu 0 dır
goto kapat

ac btfsc PORTB,2
goto sil
movlw 01h
movwf PORTA
goto kontrol

kapat btfsc PORTB,3


goto sil
movlw 02h
movwf PORTA
goto kontrol

END

ÖRNEKPROBLEM 2: Bir süpermarkette iç ortam aydınlığının 100 Lüx’ün üzerinde


ayarlanması isteniyor. Bu iş için aydınlık derecesini ölçmek amacıyla aşağıda
değerleri verilen LDR kullanılmıştır. Ayrıca aydınlatma lambaları iki ayrı grup altında
birleştirilmiştir. Buna göre, ışık miktarı 80 Lüx’den az iken her 2 grup lambanının
yanması, 80-100 Lüx arasında ise 1 grup lambanın yanması isteniyor. Eğer, ışık
miktarı 100 Lüxün üzerinde ise lambaların sönük olması isteniyor. Gerekli devreyi
çiziniz ve programını yazınız.
80 Lüx’de Ldr Direnci :100 K
90 Lüx’de Ldr Direnci :90 K
100 Lüx’de Ldr Direnci :80 K

97
Çözüm : Yine ADC gerektiren bir örnek. Burada aydınlığı ölçecek LDR ile bir gerilim
bölücü direnç kullanarak ve kritik aydınlık değerlerinde ADC’nin üreteceği sayı
hesaplanarak, büyük-küçük kıyaslamaları ile problem çözülür.
;Market aydınlığını 100 lüxe ayarlama işlemi
;B portu giriş yapılıp ADC üzerinden aydınlık bilgisi okunacak
;LDR ile gerilim bölücü direnç 100 K bağlanmış olup
;80 Lüx de 128 sayısı, 100 Lüx de 113 sayısı B portundan okunuyor
;RA0 1. grup lamba kontrol çıkışı
;RA1 2. grup lamba kontrol çıkışı
LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h
da EQU 11h

X1 org 0h ; Power on
goto START ; 0000
START bsf STATUS,5
movlw h'FF' ;B portu giriş
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5
sil clrf da
siyah movf PORTB,w
sublw .128
btfsc STATUS,0
goto gri
movlw 03h
movwf da
goto yaz

98
gri movf PORTB,w
sublw .113
btfss STATUS,0
goto l1
clrf da
goto yaz

l1 movlw 01h
movwf da
yaz movf da,w
movwf PORTA
goto sil
END

ÖRNEKPROBLEM 3: Bir cam üretim tesisinde, hareketli bant sistemi üzerindeki


ürünlerin kalitesi 4 ayrı noktadaki optik sensörlerle kontrol ediliyor. Bu sensörlerin
herbiri malzeme normal ise 0, problemli ise 1 veriyor. Herbir sensörün kendi
yanında bir adet imha pistonu mevcut olup, herhangi bir sensörden hatalı imalat
bilgisi gelirse, ona bağlı olan pistonun 1 mili saniye süreyle ileri gidip sonra tekrar
geri gelmesi isteniyor. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve
programını yazınız.

ÇÖZÜM:
;Cam üretim tesisi problemi
;RA0 ,RA1,RA2,RA3 ucları hatalı üretim sensörleri
;RB0, RB1,RB2, RB3 ucları piston kontrol çıkışları

LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h
D0 equ 11h ;Zaman bekletme için değişken

99
X1 org 0h ; Power on
goto START ; 0000
START bsf STATUS,5
movlw 00h ;RB7,RB6,RB3,RB2,RB1,RB0 çıkış
movwf TRISB
movlw 0Fh ;A portu giriş
movwf TRISA
bcf STATUS,5
sil clrf PORTB

devam movf PORTA,w


andlw 0Fh
movwf PORTB
call BEKLE
goto sil
;********************************************************
; BEKLE 1 milisaniye Altprogramı
;********************************************************
BEKLE movlw .40
movwf D0
ZD decfsz D0,1
goto ZD
return
END

ÖRNEKPROBLEM 4: Bir asansör sisteminin fazla yük konusundaki problemleri


çözme konusu şu şekilde ayarlanıyor. Eğer asansördeki yük 3000 kilogramdan az
ise tek motor devreye girerek asansörü çalıştırıyor. Eğer yük 3000-5000 kilogram
arasında ise iki adet motor ile sistemin çalışması sağlanıyor. Eğer yük 5000
kilogramdan fazla ise, bu durumda asansörün hareket etmemesi ve aşırı yük
alarmının devreye girmesi isteniyor. Bu problemin çözümü için kullanılan basınç
sensörü hiç yük yokken değeri 1000 ohm olup elemanın direnç değeri her 1
kilogramda 1 ohm artmaktadır. Bu işlem için gerekli devrenin prensip şemasını
çiziniz ve programını yazınız.

100
ÇÖZÜM:
;Asansör için aşırı yük koruma işlemi
;B portu giriş yapılıp ADC üzerinden ağırlık bilgisi okunacak
;Ağırlık sensörü ile gerilim bölücü direnç 6000 Ohm bağlanmış olup
;3000 kg da 102 sayısı, 5000 kg da 128 sayısı B portundan okunuyor
;RA0 1. motor kontrol çıkışı
;RA1 2. motor kontrol çıkışı
;RA3 alarm çıkışı
LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h
da EQU 11h

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw h'FF' ;B portu giriş
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5

sil clrf da

agır movf PORTB,w


sublw .128
btfsc STATUS,0
goto orta
movlw 04h
movwf da
goto yaz

101
orta movf PORTB,w
sublw .102
btfss STATUS,0
goto l1
movlw 01h
movwf da
goto yaz

l1 movlw 03h
movwf da
yaz movf da,w
movwf PORTA
goto sil
END

ÖRNEKPROBLEM 5: 60 saniye süre içerisinde, istenilen süreye ayarlanabilen ve


ayarlanan süreden birer saniye aralıklarla geri sayarak süre tamamlandığında bir zili
çalan kronometre (zaman rolesi) yapılmak isteniyor. Bu işlem için gerekli devreyi
tasarlayınız ve programını yazınız.

ÇÖZÜM:
;RA0 ucu ayar butonu her basışta 1 geri saydırır
;RA1 ucu zaman başlatma butonudur, basılınca sistem
;geri sayar ve diğer buton iptal olur
;Süre 0 olunca RA2 ucundaki zil çıkışı 1 olur
;B portunda 2 adet 4056 ile iki display bağlıdır
LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h
sayi EQU 0Ch ; PORTB'ye gönderilecek sayı
D1 EQU 0Eh ; BEKLEME SAYACI 1

102
D2 EQU 0Fh ; BEKLEME SAYACI 2

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw 0h
movwf TRISB
movlw 03h
movwf TRISA
bcf STATUS,5

movlw 60H
movwf sayi

TOP movf sayi,W


movwf PORTB

ayar btfsc PORTA,0


goto eksil

ates btfss PORTA,1


goto ayar
say movf sayi,w
movwf PORTB
call BEKLE
decf sayi,1
movf sayi,W
andlw 0Fh
sublw 0Fh
btfss STATUS,2
goto sifir

onluk decf sayi,1


decf sayi,1

103
decf sayi,1
decf sayi,1
decf sayi,1
decf sayi,1
goto say

sifir movf sayi,W


sublw 0h
btfss STATUS,2
goto say
dur bsf PORTA,2
goto dur

eksil decf sayi,1


movf sayi,W
andlw 0Fh
sublw 0Fh
btfss STATUS,2
goto sifir2

onluk2 decf sayi,1


decf sayi,1
decf sayi,1
decf sayi,1
decf sayi,1
decf sayi,1
goto yaz

sifir2 movf sayi,W


sublw 0h
btfss STATUS,2
goto yaz
goto TOP

yaz movf sayi,w

104
movwf PORTB
goto ayar
;********************************************************
; BEKLETME ALT PROGRAMI
;********************************************************
BEKLE movlw .200 ;200*200 lük iki döngü yaklaşık 1 saniye
movwf D1 ;kabul edilecektir.
ZD1 movlw .200
movwf D2
ZD2 decfsz D2,1
goto ZD2
decfsz D1,1
goto ZD1
return

END

ÖRNEKPROBLEM 6: Dönen platform şeklindeki bir alış-veriş reyonunda sisteminin


reyondaki malın çok azalması veya normalden fazla olması problemleri çözme
konusu şu şekilde ayarlanıyor. Reyondaki yük 300 kilogramdan az ise tek motor
devreye girerek reyonun dönmesini sağlıyor; eğer yük 300-500 kilogram arasında
ise iki adet motor ile sistemin çalışması sağlanıyor. Şayet yük 500 kilogramdan fazla
ise bu durumda sistemin hareket etmemesi isteniyor ve yük 700 kilogramdan fazla
ya da 100 kilogramdan az ise yine sistemin çalışmayıp bir ikaz alarmının devreye
girmesi isteniyor. Bu problemin çözümü için kullanılan basınç sensörü hiç yük
yokken değeri 100 ohm olup elemanın direnç değeri her 1 kilogramda 1 ohm
artmaktadır. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını
yazınız.
ÇÖZÜM:
;Dönen platform için aşırı yük koruma işlemi
;B portu giriş yapılıp ADC üzerinden ağırlık bilgisi okunacak
;Ağırlık sensörü ile gerilim bölücü direnç 600 Ohm bağlanmış olup
;300 kg da 102 sayısı, 500 kg da 128 sayısı
;700 kg da 146 sayısı B portundan okunuyor

105
;RA0 1. motor kontrol çıkışı
;RA1 2. motor kontrol çıkışı
;RA3 alarm çıkışı
LIST P=16F84
STATUS EQU 3h
PORTB EQU 6h
TRISB EQU 6h
PORTA EQU 5h
TRISA EQU 5h
da EQU 11h

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw h'FF' ;B portu giriş
movwf TRISB
movlw 00h ;A portu çıkış
movwf TRISA
bcf STATUS,5

sil movlw 04
movwf da

hafif movf PORTB,w


sublw .102
btfss STATUS,0
goto orta
movlw 01h
movwf da
goto yaz

orta movf PORTB,w


sublw .128
btfss STATUS,0

106
goto agir
movlw 03h
movwf da
goto yaz

agir movf PORTB,w


sublw .146
btfss STATUS,0
goto yaz
movlw 00h
movwf da

yaz movf da,w


movwf PORTA
goto sil
END

ÖRNEKPROBLEM 7: Bir pic16f84 buton şeklinde çalışan bir algılayıcının önünden


geçen parçaları sayan 0-F sayıcı şeklinde çalışıyor. Ayrıca sayıcı olarak çalışan bu
pic16f84’ün 11h adresindeki sayıyı (bu sayı sayıcının ekranda gösterdiği sayıdır) bir
butona basılınca diğer bir pic16f84’ün 12h adresineaktarılmasını sağlıyor. Diğer
pic16f84 ise birinciden gelen sayıyı alıyor ve ekranda gösteriyor . Bu sistem için
gerekli devreyi çiziniz ve her iki pic16f84’te olması gereken pogramları yazınız.
(İpucu: Sayıcı kısmını, haberleşme kısmını ve sayıları ekranda gösterme kısmını
ayrı alt programlar şeklinde tasarlayınız.)

ÇÖZÜM:
;Pic1 programı
;Pic ler arası interrupt kullanarak iletişim örneği
;1 nolu pic RB1 ucundan delen sinyalleri sayıyor
;ve RB2 ucundaki butona basılınca o andaki sayıyı
;RB4-7 üzerinden 2. pice gönderiyor.
;RA0-3 üzerinde 4056 ile display bağlı

107
list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h
tmp2 equ 13h

org 00h
goto basla
org 04h
goto intprg

basla bsf STATUS,5


clrf TRISA
movlw b'00000111'
movwf TRISB
movlw b'01000000' ;Yükselen kenar tetiklemeli RB0
movwf OPTION_REG
bcf STATUS,5

movlw b'10010000' ;interruptlar açık, RB0 interrupt aktif


movwf INTCON

sil clrf say


clrf tmp
sayar movf say,w
movwf PORTA

tus btfss PORTB,1


goto tus2
incf say,1
movf say,w
sublw 0Fh
btfss STATUS,2
goto sayar
goto sil

108
tus2 btfss PORTB,2
goto sayar
swapf say,w
movwf PORTB
bsf PORTB,3
bsf tmp,0
bekle btfsc tmp,0
goto bekle
clrf PORTB
goto sayar

intprg movwf tmp2


clrf tmp
bcf INTCON,INTF
movf tmp2,w
retfie

end

*******

;2 nolu pic programı

;Pic ler arası interrupt kullanarak iletişim örneği


;1 nolu pic RB1 ucundan delen sinyalleri sayıyor
;ve RB2 ucundaki butona basılınca o andaki sayıyı
;RB4-7 üzerinden 2. pice gönderiyor.
;RA0-3 üzerinde 4056 ile display bağlı

list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h

109
org 00h
goto basla
org 04h
goto oku

basla bsf STATUS,5


clrf TRISA
movlw b'11110001'
movwf TRISB
movlw b'01000000' ;Yükselen kenar tetiklemeli RB0
movwf OPTION_REG
bcf STATUS,5

movlw b'10010000' ;interruptlar açık, RB0 interrupt aktif


movwf INTCON

sil clrf say


goster movf say,w
movwf PORTA
goto goster

oku movwf tmp


bcf INTCON,INTF
SWAPF PORTB,w
andlw 0Fh
movwf say
bsf PORTB,3
movf tmp,w
clrf PORTB
retfie

end

110
Örnek Sorular: Aşağıda kendinizi geliştirebilmeniz için örnek birkaç soru verilmiştir.

Örnek Soru 1: 7 segment display kullanarak bir display sistemi tasarlayınız ve bu


sistemde istenilen bir kelimeyi ekranda gösterecek programı yazınız?

Örnek Soru 2: Bir basketbol maçı için skorbord tasarlayalım. Öyle ki iki adet
butondan birincisi her basışta ekrandaki sayıyı 1 artıracak. İkincisi her basışta sayıyı
1 azaltacak. Üçüncü bir buton ise sistemi başlangıca döndürecek olsun. Ayrıca
artırma ve azaltma butonları basıldığı anda değil biraz basılı tutulunca artırma ve
azaltma işlemini yerine getirsin. Başa alma butonu ise dokunulduğu anda sistemi
başa alsın.

Örnek Soru 3: Bir elektronik termometre tasarlayınız ve uygun programı yazınız?

Örnek Soru 4: Bir ohmmetre tasarlayınız ve uygun programı yazınız?

Örnek Soru 5: Bir şifreli kilit sistemi tasarlayınız?

111
UYGULAMALAR:

Kitabın bu bölümünde daha öndeki bölümlerde verilen örnekler ve problemlere


ek olarak değişik uygulamalar verilmiştir. Bu uygulamalar sınıf içi uygulamalara uygun
olacak şekilde seçilmiştir. Bu bölümde, öğrencinin programlama mantığının iyi
derecede geliştirilmesinin yanında, mekanik uygulama yaparak pratik bilgi ve
becerisinin gelişmesi, devre tasarlayabilir hale gelmesi, ayrıca zaman döngüleri ile tablo
mantığının kullanılması ve interrupt içeren programlar yazma-çalıştırma ve deneme
becerisi kazanması amaçlanmaktadır. Böylece gerçek hayattaki problemlere çözüm
geliştirmede daha verimli olunması sağlanacaktır.
Bu çalışmaların tamamında deney adımları aynı şekildedir. İlk adım, programın
bilgisayara yazılması, ikinci adım bilgisayarda denenmesi, üçüncü adım programın
mikrodenetleyiciye kaydedilmesi ve son adım programın mekanik devrede
denenmesidir. Şimdi bu adımları sırasıyla inceleyelim:

UYGULAMA ADIMLARI

1. Deney için gerekli asm dosyasını MPLAB programında yazınız. Programınızı


ISIM.ASM şeklinde isim vererek kaydediniz.
2. Aynı isimle proje oluşturarak programınızı çalışır hale getiriniz.. (Bakınız: MPLAB
kullanımı)
3. Programınızı mplab yardımıyla deneyiniz. Programın içerisinde döngü işlemi
varsa süreleri kısaltarak deneyiniz. Programın testi bittikten sonra döngü süreleri
ile ilgili rakamları olması gereken değerlerle değiştirip yeniden BUILD ALL işlemi
yapınız.
4. PICALLW programını çalıştırınız. FILE menüsünden OPEN FILE seçeneği ile
daha önce çalıştırdığınız ISIM.ASM dosyasının ISIM.HEX dosyasını çağırınız.
Üstteki pencerelerde entegre adının ve programlayıcı adının doğru seçilmiş
olmasına dikkat ediniz.
5. CONFIG mönüsünden RC OSİLATÖR tipini seçiniz. WDT kullanılmıyor ise WDT
seçeneğinin yanındaki tik işaretini kaldırınız. (Bakınız: Picallw kullanımı)
6. Programlama setinizin bağlantılarını yapınız. (Programlama kablosunu Printer
portuna takınız. Güç bağlantılarını yapınız.
7. Programlama setine güç uygulayınız. Setin yeşil ışığı yanıyor ise set hazırdır.
Picallw programı üzerindeki PROGRAM butonuna tıklayarak pic’i programlayınız.

112
Eğer hata mesajı almış iseniz ders öğretmenine müracaat ediniz. Eğer hata
mesajı yok ise pic normal programlanmış demektir.
8. Programlanmış pic’i programlama setinden çıkararak deney için hazırlanmış
devreye takınız.
9. Deney devresinin güç bağlantılarını dikkatlice yapınız. (+5 Volt ve 0 Volt)
10. Sisteme güç vererek çalışmasını izleyiniz.
11. Önemli not: Deneylerin başlangıcında kullanılacak uygulama devresinin yapısı
kısaca verilmiştir. Buradaki bazı uygulamalarda, kullanacağınız uygulama
devresine uymayan kısımlar vardır. Bu durumları program içerisinde gerekli
değişiklikleri yaparak düzenleyiniz.

Burada başlangıçta anlatılan MPLAB kullanımı ve Piallw kullanımını


inceleyelim:

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 seçilir.

113
Bu seçim yapıldığında aşağıdaki ekran karşımıza gelir.

114
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.

Gelen ekrandan kullanacağınız işlemciyi belirleyiniz (Bizim örneğimizde Pic16f84)

115
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.

Yeni programınızı yazabilmek için boş bir sayfa açmalısınız. Bunun için;
File/New Source seçiniz.
116
Bu işlemden sonra aşağıdaki boş sayfa karşınıza gelir ve programınızı buraya
yazabilirsiniz.

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.

117
Esli dosyanızı çağırdığınızda veya yeni yazdığınız programın yazımını
tamamladığınızda aşağıdaki şekilde bir görüntü oluşacaktır.

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.

118
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…

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.

119
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.

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

120
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.

Ş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.

121
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.

122
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.

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.

123
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.

124
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.

Eğer programın çalışması esnasında sadece bir iki yerdeki değişim izlenmek isteniyorsa
Windows/New Watch Window seçilir.

125
Çıkan ekranda istenilen register seçilir. Örnekte PortA seçilmektedir.

Seçim tamamlandığında Watch_1 şeklinde gelen ekranda A portundaki sayı ikilik, onluk
ve onaltılık sistemde gösterilir.

126
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.

Yeni gelen pencerede 12 adet buton mevcuttur ve bu butonların her birini işlemcinizin
bir ucuna bağlı olarak gösterebilirsiniz.

127
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:

Gelen pencereden Assign Pin seçelim ve yine gelen pencerede RA2’yi çift tıklayalım.

128
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.

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.

129
PICALLW KULLANIMI

MPLAB’da deneyip hazır ettiğiniz programı mikrodenetleyicinize yüklemek için elinizde


mevcut ise mplab ile uyumlu mikrochip ürünü bir yükleyici (Picstart gibi) kullanabilirsiniz.
Bu mevcut değilse internetten de devresini indirebileceğiniz P16PRO devresini kurarak
picallw programı ve bu set yardımıyla mplabda hazırladığınız programı
mikrodenetleyicinize yükleyebilirsiniz.
İlk iş picallw.exe programını çift tıklayarak çalıştırınız.

Sonra File/Open program seçeneğini kullanarak hazırladığınız programın uzantısı hex


olan kaynak kodları dosyasını açınız.

130
Open program seçildiğinde çıkan ekranda başka program adı görülebilir, kendi
programınızı bulup seçiniz.

131
Dosyayı bulup Tamam seçeneğini seçtiğinizde ekran aşağıdakine benzer şekilde
değişir. Görüntü program komutlarının durumuna göre farklılık gösterebilir.

Şimdi P16PRO setinizin bilgisayarla iletişimini kurması için setinizin data kablosunu
bilgisayarınızın printer portuna takınız. Setinizin güç bağlantısını yapıp devreye güç
uygulayınız. Set üzerindeki yeşil ışık yanıyor ise her şey yolundadır. Yüklemeye
geçmeden önce son yapmanız gereken işlem konfigürasyon işlemidir. Bu işlem için
programdaki CONFIG butonunu tıklayınız.

132
Çıkan ekranda osilatör tipini, watchdog timer ve power up timer seçeneklerini
programınıza ve devrenize uygun olacak şekilde seçiniz. Eğer pic üzerindeki programın
başkaları tarafından okunmasını istemiyorsanız protection kısmındaki Code prtoect 0
kısmını seçebilirsiniz. Deneme çalışmalarında bu kısmı seçmeyiniz.
Artık programınız yüklenmeye hazırdır ve şimdi ekrandaki programınız üzerindeki
program butonunu tıklayınız. Eğer bir problem yoksa ekranda bazı sayılar görünecek ve
sonunda “Device Was Successfuly Programmed in 10 Seconds” (Alet 10 saniyede
başarıyla programlandı) mesajını alacaksınız. Böylece yazdığınız program artıc
mikrodenetleyicinize kaydolmuştur. Artık setinizi kapatıp işlemcinizi buradan çıkararak
uygulama devresinde deneyebilirsiniz.

133
DENEY 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.

;PIC 16F84
;WATCHDOG DEVRE DIŞI

list p=16f84

status equ 03
portb equ 06 ; port adresi
trisb equ 86h ;
s1 equ 0Ch
s2 equ 0Dh
giden equ 0Eh

org 0 ; reset vektörü


goto init

init clrf portb


bsf status,5
clrf trisb
bcf status,5

main movlw 01h


movwf giden
tekrar movf giden,0
movwf portb
call bekle
rlf giden,1
goto tekrar

134
bekle movlw .210
movwf s1
a1 movlw .210
movwf s2
d2 decfsz s2,1
goto d2
decfsz s1,1
goto a1
return

end

DENEY 2:

;İ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 ;

135
#define ac porta,1 ; A portunun 1.bitine bağlı buton
#define kapa porta,2 ; A portunun 2.bitine bağlı buton
#define led 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.yazmaç sayfasını seç.
movlw 0fh
movwf trisa ; A portunu giriş yap.
clrf trisb ; B portunu çıkış yap.
bcf status,5 ; 0.yazmaç sayfasına dön.

main btfsc ac ; AC butonuna basılıp basılmadığını kontrol et,


; basılmışsa sonraki adımı atla.
goto main ; Basılana kadar döngüye gir.
bsf led ; LED'i yak.
test 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.

DENEY 3 :

; 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

136
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 ; Power on
goto START ; 0000

START bsf STATUS,5


movlw 0h
movwf TRISB
movlw 0fh
movwf TRISA
bcf STATUS,5

TOP1 movlw 00H


movwf say
TOP2 movf say,W
movwf PORTB
call TUS

incf say,1
movf say,w
sublw 0Ah
btfss STATUS,2
goto TOP2
goto TOP1

137
;***********************************
;TUS Subrutine
;***********************************
TUS btfss PORTA,0
goto TUS
call DELAY
BIRAK btfsc PORTA,0
goto BIRAK
return

DENEY 4:

;0-9 yukarı-aşağı sayıcı


;Program buton sayıcı RA0 butonuna her basışta yukarı sayar
;RA1 butonuna basınca aşağı sayar (0-9 Arası)
;Yukarı ve asagı tuslarına beraber basılırsa 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 0 Fh ; delay counter 2

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw 0h
movwf TRISB
movlw 0fh

138
movwf TRISA
bcf STATUS,5

TOP1 movlw 00H


movwf say
TOP2 movf say,W
movwf PORTB

Y_TEST btfss PORTA,0


goto A_TEST
call Y_TUS
A_TEST btfss PORTA,1
goto Y_TEST
call A_TUS
GOTO Y_TEST

;***********************************
;YUKARI SAY TUSU Subrutine
;***********************************
Y_TUS btfss PORTA,0
goto Y_TUS
call DELAY
Y_BIRAK btfsc PORTA,0
goto Y_BIRAK

incf say,1
movf say,w
sublw 0Ah
btfss STATUS,2
goto S_CIKIS
movlw 0h
movwf say
S_CIKIS movf say,W
movwf PORTB
return

139
;***********************************
;ASAGI SAY TUSU Subrutine
;***********************************
A_TUS btfss PORTA,1
goto A_TUS
call DELAY
A_BIRAK btfsc PORTA,1
goto A_BIRAK

decf say,1
movf say,w
sublw h'FF'
btfss STATUS,2
goto DEVAM
movlw 09h
movwf say
DEVAM movf say,W
movwf PORTB
return
;***********************************
; DELAY Subroutine
;***********************************
DELAY movlw .2
movwf D0
ZD0 movlw .2
movwf D1
ZD1 decfsz D1,F
goto ZD1
decfsz D0,F
goto ZD0
retlw 00
END

140
DENEY 5:

;0-99 yukarı-aşağı butonlu sayıcı


;Program buton sayıcı RA0 butonuna her basışta yukarı sayar
;RA1 butonuna basınca aşağı sayar (0-99 Arası)
;Yukarı ve asagı tuslarına beraber basılırsa yukarı sayar
;Displaylar B portunda 7 segment decoder ile bağlanmıştır.
LIST P=16f84

STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h

say EQU 11h ; counter to turn on the pins on PortB


D0 EQU 12h ; delay counter 0
D1 EQU 13h ; delay counter 1
D2 EQU 14h ; delay counter 2
TEMP EQU 15h ; Geçici register

X1 org 0h ; Power on
goto START ; 0000

START bsf STATUS,5


movlw 0h
movwf TRISB
movlw 0fh
movwf TRISA
bcf STATUS,5

TOP1 movlw 00H


movwf say
TOP2 movf say,W

141
movwf PORTB

Y_TEST btfss PORTA,0


goto A_TEST
call Y_TUS
A_TEST btfss PORTA,1
goto Y_TEST
call A_TUS
GOTO Y_TEST
;***********************************
;YUKARI SAY TUSU Subrutine
;***********************************
Y_TUS btfss PORTA,0
goto Y_TUS
call DELAY
Y_BIRAK btfsc PORTA,0
goto Y_BIRAK

incf say,1
movf say,w
andlw .15
sublw .10
btfss STATUS,2
goto S_CIKIS

movf say,W
andlw h'f0'
addlw .16
movwf say
andlw h'f0'
sublw h'A0'
btfss STATUS,2
goto S_CIKIS
movlw 00h
movwf say

142
S_CIKIS movf say,W
movwf PORTB
return
;***********************************
;ASAGI SAY TUSU Subrutine
;***********************************

A_TUS btfss PORTA,1


goto A_TUS
call DELAY
A_BIRAK btfsc PORTA,1
goto A_BIRAK

decf say,1
movf say,w

andlw .15
sublw .15
btfss STATUS,2
goto DEVAM

movf say,W
andlw h'f9'
movwf say

andlw h'f0'
sublw h'F0'
btfss STATUS,2
goto DEVAM
movlw 99h
movwf say

DEVAM movf say,W


movwf PORTB

143
return
;***********************************
; DELAY Subroutine
;***********************************
DELAY movlw .2
movwf D0
ZD0 movlw .2
movwf D1
ZD1 decfsz D1,F
goto ZD1
decfsz D0,F
goto ZD0
retlw 00
END

DENEY 6 :
;Tarama mantığı kullanarak 0-9 sayıcı yapımı
; Tablo programı örneği

list p=16f84
include "p16f84.inc"
sayı equ 11h
org 00h
goto basla

basla bsf STATUS,5


clrf TRISB
bcf STATUS,5
t2 movlw 00h
movwf sayı

t1 movf sayı,w
call tablo
movwf PORTB

144
call bekle
incf sayı,1
movf sayı,w
sublw 0ah
btfss STATUS,2
goto t1
goto t2

bekle return

tablo addwf PCL,f


retlw h'3f'
retlw h'06'
retlw h'5b'
retlw h'4f'
retlw h'66'
retlw h'6d'
retlw h'7d'
retlw h'07'
retlw h'7f'
retlw h'6f'
retlw h'77'
retlw h'7c'
retlw h'39'
retlw h'5e'
retlw h'79'
retlw h'71'
retlw h'80'
end
;***********************************
; DELAY Subroutine
;***********************************

DELAY movlw .2
movwf D0

145
ZD0 movlw .2
movwf D1
ZD1 decfsz D1,F
goto ZD1
decfsz D0,F
goto ZD0
retlw 00
END

DENEY 7:

;Display Örneği 1 SABİT YAZI YAZDIRMA


;Bu program taramalı çalışan 6 display üzerinde sabit bir yazıyı yazar.
;Display bağlantısı:
;a=RB0
;b=RB1
;c=RB2
;d=RB3
;e=RB4
;f=RB5
;g=RB6
;Sıralama d1,d2,d3,d4,d5,d6
;Select ucları RA2,RA1,RA0 üzeine bağlanmış 3 to 8 mux ile yapılmaktadır.
;Multiplexerin Y0 çıkışı boş bırakılmıştır.
;Diğer uçlar sırayla d1..d6 ya bağlanmış ve Y7 boş bırakılmıştır.
;Örnek data : -OGUZ- şeklindedir.

LIST P=16f84
; Registerler
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h

146
TRISB EQU 6h
; Değişkenler
D1 EQU 11H
D2 EQU 12H
D3 EQU 13H
D4 EQU 14H
D5 EQU 15H
D6 EQU 16H

X1 org 0h
goto START

START bsf STATUS,5 ; Bank 1


clrf TRISB ; PortB çıkış
clrf TRISA ; PortA çıkış
bcf STATUS,5 ; Bank 0

hazır movlw 40h ;1. harf datasını D1 adresine gönder


movwf D1

movlw 3fh ;2. harf datasını D2 adresine gönder


movwf D2

movlw 7dh ;3. harf datasını D3 adresine gönder


movwf D3

movlw 3eh ;4. harf datasını D4 adresine gönder


movwf D4

movlw 5bh ;5. harf datasını D5 adresine gönder


movwf D5

movlw 40h ;6. harf datasını D6 adresine gönder


movwf D6

147
tt call yazar ;Yazı yazma alt programını çağır
goto tt ;Yazma işlemini sürekli yap

yazar movf D1,w ;1. datayı 1. displayda göster


clrf PORTA
movwf PORTB
movlw 01h
movwf PORTA

movf D2,w ;2. datayı 2. displayda göster


clrf PORTA
movwf PORTB
movlw 02h
movwf PORTA

movf D3,w ;3. datayı 3. displayda göster


clrf PORTA
movwf PORTB
movlw 03h
movwf PORTA

movf D4,w ;4. datayı 4. displayda göster


clrf PORTA
movwf PORTB
movlw 04h
movwf PORTA

movf D5,w ;5. datayı 5. displayda göster


clrf PORTA
movwf PORTB
movlw 05h
movwf PORTA

movf D6,w ;6. datayı 6. displayda göster


clrf PORTA

148
movwf PORTB
movlw 06h
movwf PORTA
return

end

Bu örnekteki yazı yazma modelinde harflerin sabit olması sebebiyle ek bir bilgiye
ihtiyaç olmaksızın istediğimiz yazıyı ekrana çıkartmak mümkün olmaktadır. Ancak
dataların değiştiği programlarda bu işlem şu ana kadar öğrendiğimiz komutlarla pek
pratik olmaz. Bu sebeple çok fazla sayıdadatanın sırasıyla porta gönderilmesi gibi
durumlarda tablo mantığını kullanmak gerekir. Tablo mantığında veriler birbirini izleyen
adreslere sırası ile yerleştirilir. Sonra bir indeks mantığıyla istenilen adresteki data
çağrılmış olur. Burada indeks oluşturmak için datanın kaçıncı sırada olduğu
bilineceğinden, bu sıra sayısını bir değişkene aktarıp, tablonuın başlangıcına atladıktan
sonra, bu aktarılan değeri PCL (program Counter) registerindeki sayı ile topladığımızda
bizi istenilen datanın adresine aktarır. Buradan RETLW komutu ile istediğimiz datayı
alıp programa geri dönmek mümkün olacaktır. Bunu aşağıdaki kayan yazı örneği ile
deneyelim.

DENEY 8:

;Display Örneği 2 KAYAN YAZI YAZDIRMA


;Bu program taramalı çalışan 6 display üzerinde sabit bir yazıyı kaydırarak yazar.
;Display bağlantısı:
;a=RB0
;b=RB1
;c=RB2
;d=RB3
;e=RB4
;f=RB5
;g=RB6
;Sıralama d1,d2,d3,d4,d5,d6
;Select ucları RA2,RA1,RA0 üzeine bağlanmış 3 to 8 mux ile yapılmaktadır.

149
;Multiplexerin Y0 çıkışı boş bırakılmıştır.
;Diğer uçlar sırayla d1..d6 ya bağlanmış ve Y7 boş bırakılmıştır.
;Örnek data : -bAhAr GELdI hOSGELdI- şeklindedir.

LIST P=16f84
; Registerler
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h
PCL EQU 02h
; Değişkenler
ZD1 EQU 0Fh
ZD2 EQU 0Eh
h_ad EQU 17h
ilk EQU 18h
;Display değişkenleri adresleri
D1 EQU 11H
D2 EQU 12H
D3 EQU 13H
D4 EQU 14H
D5 EQU 15H
D6 EQU 16H

X1 org 00h
goto START

START bsf STATUS,5 ; Bank 1


clrf TRISB ; PortB çıkış
clrf TRISA ; PortA çıkış
bcf STATUS,5 ; Bank 0

tekrar movlw .30 ;Harf adedini tespit et


movwf h_ad

150
movlw 00h ;İlk data adresi 0 olacak
movwf ilk

hazır movf ilk,w ;data adresindeki harfi almak için index ayarla
call tablo ;tablodan harfi seç
movwf D1 ;ilhili display adresine gönder
incf ilk,1 ;İndexi 1 artır

movf ilk,w ;Aynı işlemi 2. display için tekrarla


call tablo
movwf D2
incf ilk,1

movf ilk,w ;Aynı işlemi 3. display için tekrarla


call tablo
movwf D3
incf ilk,1

movf ilk,w ;Aynı işlemi 4. display için tekrarla


call tablo
movwf D4
incf ilk,1

movf ilk,w ;Aynı işlemi 5. display için tekrarla


call tablo
movwf D5
incf ilk,1

movf ilk,w ;Aynı işlemi 6. display için tekrarla


call tablo
movwf D6

decf ilk,1 ;Bir sonraki tur için indexi ayarla (4 azalt)


decf ilk,1

151
decf ilk,1
decf ilk,1

movlw .1 ;Bir turun ekrandaki süresini ayarla


movwf ZD1

t2 movlw .200
movwf ZD2

t1 call yazar ;Ekrana yazma programını döngü süresince tekrar


tekrar çağır
decfsz ZD2,1
goto t1

decfsz ZD1,1
goto t2

decfsz h_ad,1 ;Mesajın tamam olup olmadığını kontrol et


goto hazır

goto tekrar ;Mesaj tamam ise baştan başla


;Display adreslerindeki dataları ekrana yazdıran alt program
yazar movf D1,w ;d1 adresindeki datayı al
clrf PORTA ;PortA'yı sil
movwf PORTB ;d1 datasını portB'ye gönder
movlw 01h ;A portundan 1. displayı seç
movwf PORTA

movf D2,w ;Aynı işlemi ikinci display için tekrarla


clrf PORTA
movwf PORTB
movlw 02h
movwf PORTA

movf D3,w ;Aynı işlemi üçüncü display için tekrarla

152
clrf PORTA
movwf PORTB
movlw 03h
movwf PORTA

movf D4,w ;Aynı işlemi dördüncü display için tekrarla


clrf PORTA
movwf PORTB
movlw 04h
movwf PORTA

movf D5,w ;Aynı işlemi beşinci display için tekrarla


clrf PORTA
movwf PORTB
movlw 05h
movwf PORTA

movf D6,w ;Aynı işlemi altıncı display için tekrarla


clrf PORTA
movwf PORTB
movlw 06h
movwf PORTA
return

;Mesaj datalarını tutan alt program


tablo addwf PCL,1 ;Mesaj harfler tablosu
retlw 00h ;İlk 5 data 00 (boşluk)
retlw 00h
retlw 00h
retlw 00h
retlw 00h
retlw 7ch ;Gerçek data başlangıç adresi
retlw 77h
retlw 74h
retlw 77h

153
retlw 50h
retlw 00h
retlw 7dh
retlw 79h
retlw 38h
retlw 5eh
retlw 06h
retlw 00h
retlw 74h
retlw 3fh
retlw 6dh
retlw 7dh
retlw 79h
retlw 38h
retlw 5eh
retlw 06h ;Dataların sonu
retlw 00h ;Sonunda 6 adet boşluk
retlw 00h
retlw 00h
retlw 00h
retlw 00h
retlw 00h
end

154
EK-1: P16F84.INC dosyasının içeriği
LIST
; P16F84.INC Standard Header File, Version 2.00 ;Microchip Technology, Inc.
NOLIST
; This header file defines configurations, ;registers, and other useful bits of
; information for the PIC16F84 microcontroller. ;These names are taken to match
; the data sheets as closely as possible.

; Note that the processor must be selected before ;this file is


; included. The processor may be selected the ;following ways:
; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F84
; 2. LIST directive in the source file
; LIST P=PIC16F84
; 3. Processor Type entry in the MPASM full-;screen interface
;===================================================
; Revision History
;===================================================
;Rev: Date: Reason:
;2.00 07/24/96 Renamed to reflect the name change ;to PIC16F84.
;1.01 05/17/96 Corrected BADRAM map
;1.00 10/31/95 Initial Release
;===================================================
; Verify Processor
;===================================================
IFNDEF __16F84
MESSG "Processor-header file mismatch. ;Verify selected processor."
ENDIF
;===================================================
; Register Definitions
;===================================================
W EQU H'0000'
F EQU H'0001'
;----- Register Files-------------------------------

155
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'
;----- STATUS Bits ---------------------------------
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
;----- INTCON Bits ---------------------------------
GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
;----- OPTION Bits ---------------------------------

156
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'
;----- EECON1 Bits ---------------------------------
EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'
;===================================================
; RAM Definition
;===================================================
__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'
;===================================================
; Configuration Bits
;===================================================
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
LIST

157

You might also like