Professional Documents
Culture Documents
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.
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)
HAFIZA
KONTROL
ÜNİTESİ
µ P
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.
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ı:
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
Data Bus
Kontroll Bus
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:
İş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.
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.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.
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.
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.
11
Şekil.1.4. Pic16f84 ün temel fonksiyonel blok diyagramı
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.
13
Şekil-1.5. Pic mikrokontrollörün yapısı
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
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
16
1.7. Portların 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:
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
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
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.
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
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
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
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
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ı:
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:
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
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.
25
Şekil 1.19. Port çıkışından triyak kullanarak bir AC lambaya kumanda edilmesi
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
27
BÖLÜM 2. PROGRAMLAMA MANTIĞI
Sembol Anlamı
Genel işlemler, işlemin ne
olduğu kutu içerisine yazılır.
Sembol Anlamı
Bağlantı bölümleri
28
El ile bilgi girişi
Ö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.
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:
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:
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.
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
Ö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.
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.
Örnek:
BCF SAYI,3
Komuttan önce SAYI=FFh ise
Komuttan sonra SAYI=F7h 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
Örnek 2:
BTFSC SAYI,3
GOTO İŞLEM1
GOTO İŞLEM2
Komuttan önce SAYI=FFh 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.
Komuttan sonra İşlem TOPLAMA adresinden devam eder. Bu arada DEVAM etiketinin
adresi stact’ta tutulur.
Ö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.
Örnek:
CLRWDT
Komuttan önce WDT=xxh ise
Komuttan sonra WDT=00h olur.
İşlevde belirtilen diğer değerler atanır.
Örnek 2:
COMF SAYI,1
Komuttan önce W=07h ve SAYI= 30h ise
Komuttan sonra W=07h ve SAYI= CFh olur.
Örnek 2:
DECF SAYI,0
Komuttan önce W=6Fh ve SAYI=15h ise
Komuttan sonra W=14h , SAYI=15h olur.
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.
Örnek :
İŞLEM1 GOTO İŞLEM2
Komuttan sonra işlem sırası, işlem2 ye gider.
Ö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.
Ö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.
Örnek:
MOVLW 05h
Komuttan önce W=xxh ise
Komuttan sonra W=05h olur.
45
Örnek:
MOVF SAYI,0
Komuttan önce W=6Fh ve SAYI=15h ise
Komuttan sonra W=15h , SAYI=15h olur.
Örnek:
NOP
Açıklama : 1 periyot süresince bekletir.
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.
Ö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
Ö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.
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.
Örnek:
SUBLW 65h
Komuttan önce W=60h ise
Komuttan sonra W=05h olur.
49
Örnek 2:
SUBWF SAYI,0
Komuttan önce W=60h ve SAYI=65h ise
Komuttan sonra W=05h , SAYI=65 h olur.
Örnek 2:
ADDWF SAYI,0
Komuttan önce W=60h ve SAYI=65h ise
Komuttan sonra W=56h , SAYI=65 h olur.
Ö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.
Ü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.
Ö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
53
Şimdi programımızı yazalım:
list p=16f84
54
; Şimdi ana programa başlayalım:
Ö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.
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
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:
include “pic16f84.inc”
org 0h ;Reset vektörü adresi
goto basla ;Reset işl. Prg.
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.
include “pic16f84.inc”
org 0h ;Reset vektörü adresi
goto basla ;Reset işl. Prg.
58
goto tus1 ;tuş basılmamışsa geri git
Çö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.
X1 org 0h ; Power on
goto START ; 0000
60
iorwf yedek,w
movwf PORTB
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
döngü
Sayac ←0A
Sayac=sayac-1
Hayır
Sayac=
0mı?
Evet
MOVLW h’0A’
MOVWF SAYAC
DÖNGÜ DECFSZ SAYAC,F
GOTODÖNGÜ
DEVAM XXXX
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.
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ı?
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
X1 org 0h ; Power on
goto START ; 0000
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
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
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
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.
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
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
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.
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
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.
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
X1 org 0h ; Power on
goto START ; 0000
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
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
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
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.
83
INTCON REGİSTERİ:
OPTION REGİSTER
85
Örnek 6-1: RB0 ucundan gelen sinyalleri sayacak ve ekrana gönderecek bir sayıcı
programını interrupt kullanarak yazınız.
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
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.
org 00h
goto basla
org 04h
goto saydır
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
addlw 10h
movwf say
sublw h'A0'
btfss STATUS,2
goto devam
clrf say
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
89
goto yaz
Ö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
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
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
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?
Çö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
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
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.
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
ac btfsc PORTB,2
goto sil
movlw 01h
movwf PORTA
goto kontrol
END
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
ÇÖ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
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
sil clrf da
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
ÇÖ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
movlw 60H
movwf sayi
103
decf sayi,1
decf sayi,1
decf sayi,1
decf sayi,1
goto say
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
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
sil movlw 04
movwf da
106
goto agir
movlw 03h
movwf da
goto yaz
ÇÖ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
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
end
*******
list p=16f84
include "p16f84.inc"
say equ 11h
tmp equ 12h
109
org 00h
goto basla
org 04h
goto oku
end
110
Örnek Sorular: Aşağıda kendinizi geliştirebilmeniz için örnek birkaç soru verilmiştir.
Ö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.
111
UYGULAMALAR:
UYGULAMA ADIMLARI
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.
MPLAB KULLANIMI
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.
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.
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.
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
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:
;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
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:
;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
DENEY 3 :
136
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h
X1 org 0h ; Power on
goto START ; 0000
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:
X1 org 0h ; Power on
goto START ; 0000
138
movwf TRISA
bcf STATUS,5
;***********************************
;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:
STATUS EQU 3h
PORTA EQU 5h
PORTB EQU 6h
TRISA EQU 5h
TRISB EQU 6h
X1 org 0h ; Power on
goto START ; 0000
141
movwf PORTB
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
;***********************************
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
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
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
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:
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
147
tt call yazar ;Yazı yazma alt programını çağır
goto tt ;Yazma işlemini sürekli yap
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:
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
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
151
decf ilk,1
decf ilk,1
t2 movlw .200
movwf ZD2
decfsz ZD1,1
goto t2
152
clrf PORTA
movwf PORTB
movlw 03h
movwf PORTA
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.
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