mİkrodenetleyİcİler i ders notlari · göre tümleyeni elde edilirse artık çıkarma işlemi...

41
1 MİKRODENETLEYİCİLER I DERS NOTLARI Prof. Dr. Hakan Ündil 2017-2018 Güz 1. BÖLÜM GİRİŞ ve SAYI SİSTEMLERİ 1.1. Devrelendirilmiş Lojik Şimdiye kadar Sayısal Devreler ve Sayısal Tasarım gibi dersler almış olan öğrenciler Mikroişlemci ve Mikrodenetleyici kavramlarıyla karşılaşınca önce bir sınıflandırma ve özet yapma ihtiyacı ortaya çıkmaktadır. Lojik (Sayısal / Mantık) Devreleri genel olarak 3 ana grupta inceleyebiliriz ; A) Kombinezonsal Lojik Devreler (K.L.D.): Bu tür sayısal (lojik) devrelerde herhangi bir andaki çıkışlar, sadece girişler tarafından belirlenir. Devre lojik kapılardan oluşur ve hafıza elemanı içermez. Bir başka ifadeyle K.L.D. ‘lerde çıkışlar zamana bağlı değildir, çıkışlarındaki işaretler yanlızca girişlere bağlı olarak yazılabilir. B) Ardışıl Lojik Devreler (A.L.D.): Devrenin çıkışlarındaki işaretler sadece girişlerin fonksiyonu olmayıp aynı zamanda Ardışıl Lojik Devrenin o andaki durumuna bağlıdır. Nasıl ki bir arkadaşımıza söylediğimiz bir söz onun neşeli yada morali bozuk oluşuna göre (durumuna göre) farklı tepkisine neden olabilir. Öyle de A.L.D. lerde çıkışlar bir önceki durum ve girişler tarafından belirlenmektedir. O halde bu tür lojik devreler Hafıza elemanı bulundururlar. Yukarıdaki şekilde e(t) zamana bağlı değişen Girişleri, s(t) zamana bağlı değişen Çıkışları, t (saat işareti) zamanın değişimini temsil etmektedir. Periyodik olan bu sinyallere “clock(saat) darbeleri” de denir.

Upload: others

Post on 23-Jan-2020

25 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

1

MİKRODENETLEYİCİLER I

DERS NOTLARI Prof. Dr. Hakan Ündil

2017-2018 Güz

1. BÖLÜM

GİRİŞ ve SAYI SİSTEMLERİ

1.1. Devrelendirilmiş Lojik Şimdiye kadar Sayısal Devreler ve Sayısal Tasarım gibi dersler almış olan öğrenciler Mikroişlemci

ve Mikrodenetleyici kavramlarıyla karşılaşınca önce bir sınıflandırma ve özet yapma ihtiyacı ortaya

çıkmaktadır.

Lojik (Sayısal / Mantık) Devreleri genel olarak 3 ana grupta inceleyebiliriz ;

A) Kombinezonsal Lojik Devreler (K.L.D.):

Bu tür sayısal (lojik) devrelerde herhangi bir andaki çıkışlar, sadece girişler tarafından belirlenir.

Devre lojik kapılardan oluşur ve hafıza elemanı içermez. Bir başka ifadeyle K.L.D. ‘lerde çıkışlar zamana

bağlı değildir, çıkışlarındaki işaretler yanlızca girişlere bağlı olarak yazılabilir.

B) Ardışıl Lojik Devreler (A.L.D.):

Devrenin çıkışlarındaki işaretler sadece girişlerin fonksiyonu olmayıp aynı zamanda Ardışıl Lojik

Devrenin o andaki durumuna bağlıdır. Nasıl ki bir arkadaşımıza söylediğimiz bir söz onun neşeli yada

morali bozuk oluşuna göre (durumuna göre) farklı tepkisine neden olabilir. Öyle de A.L.D. lerde çıkışlar

bir önceki durum ve girişler tarafından belirlenmektedir. O halde bu tür lojik devreler Hafıza elemanı

bulundururlar.

Yukarıdaki şekilde e(t) zamana bağlı değişen Girişleri, s(t) zamana bağlı değişen Çıkışları, t (saat

işareti) zamanın değişimini temsil etmektedir. Periyodik olan bu sinyallere “clock(saat) darbeleri” de denir.

Page 2: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

2

Bunlar genellikle “Kare dalga” şeklinde işaretlerdir. Devrenin durum değiştirme anlarını ve çalışma hızını

belirler.

Ardışıl Lojik Devreler, “Senkron” ve “Asenkron” ardışıl lojik devreler diye ikiye ayrılırlar:

a) Senkron Ardışıl Lojik Devrelerde işlemler, yukarıda gösterildiği gibi saat (clock) işaretleri ile

senkronize (eş zamanlı) olarak gerçekleştirilir. Bütün Flip Floplar (hafıza elemanları) aynı saat işareti ile

aynı anda konum (durum) değiştiriler. Bu tip lojik devrelere “dijital saat devresi” örnek olarak verilebilir.

b) Asenkron Ardışıl Lojik Devreler ise; devrenin girişindeki değişimlere bağlı olarak işlemler

ardarda (farklı zaman dilimlerinde) gerçekleşir. Bu tür devrelerde periyodik saat işareti bulunması şart

değildir. Para atıldığı zaman harekete geçen (durum değiştiren) bir meşrubat makinesi bu tür devrelere

örnek verilebilir.

C) Programlanmış Lojik Devreler (P.L.D.):

P.L.D. de devrenin çalışması veya çıkışlarında elde edilecek işaretler, hafızadaki programa (komut

devresine) bağlıdır. Bu dersin konusunu teşkil edecek olan devreler bu tür lojik devrelerdir.

Burada da Ardışıl Lojik Devrelere benzer şekilde saat (clock) girişi vardır, ancak her “t” anında bir

işlem ya da komut (toplama, çıkarma, lojik VEYA ,OR gibi) gerçekleşir. Benzer olarak e(t):girişler ;

s(t):çıkışlar olmak üzere “n” tane giriş ve “m” tane de çıkışa sahip bu tür bir sistemi daha detaylı bir

şekilde aşağıdaki gibi çizmek mümkündür :

Sistemin genelde birden fazla giriş ve çıkışları vardır. Burada işlemleri yapan bir Mikroişlemci ve

programı saklamak için elektrik kesildiğinde silinmeyen bir “Komut Hafızası” ile üzerinde işlem yapılan

ve neticede elde edilecek datayı (veriyi) saklamak için “Data (Veri) Hafızası” kullanılmaktadır. Yapılacak

bir işleme, örneğin “çıkarma işlemi”ne ait komut/komutlar Komut Hafızası’nda saklanır.

Komut hafızasından komutlar çeşitli kontrol devreleri yardımıyla mikroişlemciye sırasıyla

gönderilerek burada icra edilmesi (yürütülmesi) sağlanır.

Page 3: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

3

1.2. Sayı Sistemleri

Sayı sistemleri iyi anlaşılmadan mikroişlemcilerle (ya da mikrodenetleyicilerle) uğraşmak ve

onların kullanımlarını anlamak imkansız gibidir. Bu nedenle çeşitli örnekler üzerinde sayı sistemleri ve

dönüşümlerini anlamaya çalışalım.

Gerçekte bilgisayarlarda sadece 0 ve 1 ‘ler ile (ikili tabanda) işlem yapıldığını hemen hepimiz

biliriz. Ancak pratik hayatta çeşitli fiziksel büyüklüklerden onlu (desimal) tabanda söz ederiz. Örnek

olarak 25OC sıcaklıktan bahsederken bunun “desimal” olduğunu belirtmesek de o şekilde anlaşılmakta

olduğunu düşünürüz. Öte yandan mikroişlemcilerde uzun ikili sayılarla (8-16 bit gibi) çalışırken çok

sayıda 0 lar ve 1 ‘ler yanyana gelince söyleme ve algılama zorluğu yaşarız. Bu durumda 16’lı taban

kullanarak bu engeli aşmaya çalışırız. Bu nedenle sayı dönüşümlerinin çok iyi bilinmesi gerekir.

1.2.1 Bazı Temel Dönüşüm Örnekleri : ( * : Çarpı anlamındadır)

1) 7392 = 7*103 + 3*10

2 + 9*10

1 + 2*10

0 = (7392)10 On tabanı (desimal) bir sayının açılımı

2) (23,62)10 = 2*101 + 3*10

0 + 6*10

-1 + 2*10

-2 Desimal virgüllü bir sayının açılımı

3) (4021,2)5 = 4*53 + 0*5

2 + 2*5

1 + 1*5

0 + 2*5

-1 = (511.4)10 Beş tabanı bir sayı ve desimal karşılığı

4) (101)2 = 1*22 + 0*2

1 + 1*2

0 = (5)10 İkili tabanda (Binary) bir sayı ve

desimal karşılığı

5) (57)16 = 5*161 + 7*16

0 = (87)10 16’lı tabanda bir sayının 10’lu tabanda

karşılığı

1.2.2. Desimal, Heksadesimal ve Binary Temel Dönüşüm Tablosu

Aşağıdaki tabloda 0 – 15 arasındaki desimal sayıların heksadesimal ve binary tabandaki

karşılıkları verilmiştir. Bu tablonun akılda tutulması mikroişlemci ya da mikrodenetleyicilerle çalışırken

büyük kolaylık sağlamaktadır.

Desimal (10`lu) Heksadesimal (16`lı) Binary (2`li)

0

0 0000

1

1

0001

2

2

0010

3

3

0011

4

4

0100

5

5

0101

6

6

0110

7

7

0111

8

8

1000

9

9

1001

10

A

1010

11

B

1011

12

C

1100

13

D

1101

14

E

1110

15

F

1111

Page 4: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

4

1.2.3. Bazı Örnek Çevirme İşlemleri:

1) (0010 0111 0001 , 1111 1100) 2 = ( ? )16 (İkili tabandaki(binary) sayı önce dörtlü gruplar halinde

düzenlenerek yukarıdaki Dönüşüm Tablosu yardımıyla

16’lı tabana(heksadesimal) çevrilir.

( 2 7 1 , F C )16 olduğundan sonuç (271,FC)16 olarak bulunur)

2) (41)10 = (?) 2 ( Desimal bir sayıyı binary sayıya çevirmek için sürekli 2 ‘ye böler ve aşağıda

gösterildiği gibi kalanları ters sırayla alırsak sayının ikili

tabandaki karşılığını elde ederiz )

Bölme işleminde kalanları 1-0-0-1-0-1 şeklinde tersten yazarsak sonuç olarak

(41) 10 = (101001)2 elde edilir.

Aynı işlem (41) 10 sayısını önce onaltılı(heksadesimal), daha sonra ikili(binary) tabana çevrilerek

de yapılabilir;

(2 sayısı ikili tabanda 0010 ve 9 sayısı ise 1001 olduğuna göre)

(41)10 = (29)16 = (0010 1001)2

Baştaki sıfırlar dikkate alınmazsa 2’ye bölerek elde edilen ile aynı

sonuç elde edilmiş ve bölme sayısı azalmış olur.

3) (0,263)10 = (?)16

Verilen sayı ondalıklı (virgüllü) bir sayı olduğu için bu defa 16 ‘ya bölmeyip 16 ile çarpacağız.

0,263 * 16 = 4 ,208

0,208 * 16 = 3 ,328

0,328 * 16 = 5 ,248

Burada bölme yerine çarpma yapıldığından her alınan sonucun tam sayı kısmı baştan sona doğru

(ters yönde değil !) sıralanarak aşağıdaki sonuç bulunur. Sayı ondalıklı olduğu için elbette sayıya “0,“ ile

başlanması gereklidir.

(0,263)10 = (0,435)16 olarak heksadesimal karşılığı bulunmuş olur

4) (CA , 03)16 = ( ? ) 2

Bu çevirme işleminde ise her heksadesimal (16 ‘lı) sayının binary (ikili) karşılığı alınıp yan yana

konularak netice basitçe elde edilir. Daha önce verilen dönüşüm tablosundan

(C)16= (1100)2 , (A)16= (1010)2, (0)16= (0000)2, (3)16= (0011)2 olduğu bilindiğinden

(CA,03)16 = (1100 1010,0000 0011)2 şeklinde ikili tabandaki sonuç elde edilir.

Page 5: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

5

1.3. Tümleyen Kavramı ve Kullanımı:

Özellikle çıkartma işlemleri ile negatif sayıların binary olarak (ikili tabanda) temsil edilebilmesi

için önemli olan “tümleyen” kavramı mikroişlemciler ile uğraşanlar için temel kavramlardan biridir.

Bir sayının iki tür tümleyeni tanımlanabilir:

1- Tabana göre tümleyen

2- [Taban – 1] e göre tümleyen

Tümleyen kavramını doğrudan örnekler üzerinde inceleyerek anlamaya çalışalım:

1.3.1. Örnek Tümleyen İşlemleri:

(52520)10 Tabana göre tümleyeni 105 - 52520 = 100000 – 52520 = (47480)10

(Sayı 5 hane olarak verilmiş, taban da 10 olduğuna göre, 10 5 ‘

den verilen sayı

çıkartılarak tabana göre tümleyen bulunuyor.)

(0,3267)10 Tabana göre tümleyeni 100 – 0,3267 = 1

– 0,3267 = (0,6733)10

( Sayının tam kısmı yok ! , 10 0 = 1 ‘den verilen sayı çıkarılmış. )

(101100)2 Tabana göre tümleyeni 26 - (101100)2 = (64)10 - (44)10 = (20)10 = (010100)2

(26 sayısı binary karşılığı (1000000)2 = (64)10 dir)

Benzer şekilde (Taban-1)’e göre tümleyen için;

(52520)10 (Taban-1)'e göre tümleyeni 105 - 52520 - 1= (47479)10

(Yukardaki “tabana göre“ olan sonuçtan 1(bir) çıkarılırak netice

bulunur)

(0,3267)10 (Taban-1)'e göre tümleyeni 100 - 0.3267 - 10

-4 = (0.6732)10

(Verilen sayı virgülden sonra 4 haneli olduğundan 10 -4

çıkarılmıştır)

(101100)2 (Taban-1)'e göre tümleyeni 26 - (101100)2 –1 = 64 - (44)10 -1 = (19)10

= (010011)2 olur.

Pratik Tümleyen İşlemi ile Kolay çözüm:

Yukarıdaki işlemlerde her iki tümleyeni bulunan ikili tabandaki (101100)2 sayısını ele alalım;

(101100)2 Bu sayıda 1 gördüğümüz yere 0, 0 gördüğümüz yere 1 koyalım.

(010011)2 Sayısını elde ederiz. Bu sayı yukarıda bulunan (taban-1)‘e göre

tümleyen olur.

Bu sayıya (1) eklersek bu defa tabana göre tümleyen elde edilir.

(010100)2 (1 ekleme işleminde, son iki basamak 11 olduğundan bunlar 00 yapılır,

bir üst basmak 1 olur)

Page 6: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

6

1.3.2. Binary (2’li) ve Heksadesimal(16’lı) Tabanda Örnek İşlemler:

Biz ikili tabandaki işlemleri genellikle 8 basamaklı (bit) olarak yapacağız.(Bunun sebebi, ilerde

incelenecek PIC mikrodenetleyicinin 8 hane (bit) veri işlemesidir, böylece buna bir hazırlık yapılmaktadır.)

Aşağıdaki örnekler hem binary (ikili) hem de heksadesimal (16 ‘lı) tabanda yapılmış ve sonuçların

aynı olduğu gösterilmiştir.

1- 8 basamaklı (bitlik) Örnek Bir Toplama İşlemi: Binary Heks. Desimal Binaryde 0+0=0, 0+1 ve 1+0=1, 1+1=0 (elde 1) dir.

0110 1100 6 C 108 Heks. İşlemde, önce C+F için 12+15=27 den 16 ( taban)

+ 0111 1101 + 7 F + 127 çıkarılmış yani 27-16=11 = (B)16 elde edilmiştir.

1110 1011 E B 235 Elde sonraki 6+7=13 e eklenerek 14=(E)16 aşağıya

yazılmıştır. Sonuç heksadesimal olarak EB olur.

Not: Her üç tabandaki sonuçların birbirleriyle uyuştuğunu kontrol edersek;

(1110)2= (E)16 ve (1011)2 =(B)16

(EB)16 = 14.161+11.16

0 = (235)10 olduğundan sonuçlar uyuşmaktadır.

2- 8 haneli(bitlik ) Örnek Bir Çıkarma İşlemi:

Binary Hex Desimal

1000 1100 8 C 140

- 0111 1111 - 7 F - 127

0 D 13

Bu işlemin sonucunu bulabilmek için normal yoldan çıkartma işlemi yapabiliriz.(Bunun için klasik

şekilde Binary’de önce en sağdaki 0 dan 1 çıkarmaya çalışacak, çıkmadığı için bir üst(solundaki)

basamaktan 1 borç alıp bu haneye 2 olarak yansıyan sayıdan 1 çıkarıp işlemlere sol başa doğru devam

edecektik)

Fakat bu tarz çıkartma, borç alarak devam edeceği için toplamaya göre oldukça zahmetli olacaktır.

Mikroişlemci içindeki lojik devreler de işlemin bu şekilde gerçekleşmesi için tasarlanmamıştır. Bu yüzden

gerçekte mikroişlemci içinde çıkartma işlemi, toplamaya çevrilerek yapılır. Bu metod aşağıdaki alt

bölümde tümleyen aritmetiği kullanılarak incelenecektir.

1.3.3. Tümleyen Aritmetiği ile Çıkartma

Çıkartmada tümleyen aritmetiği kullanılması işi oldukça basitleştirmektedir. Zira, ikinci sayının tabana

göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler

bu yolu kullanmaktadır.

Buna göre daha önce anlatıldığı gibi örnekteki birinci sayı (1000 1100) aynen bırakılır, üzerinde

herhangi bir işlem yapılmaz !

İkinci sayının ( örnekte 0111 1111) tabana göre tümleyeni bulunur. Yani bu sayı negatifleştirilerek

işlemin toplamaya dönüştürülmesi sağlanır. Zira örn. 45 sayısından 26 sayısını çıkartmakla 45 sayısını (-26)

ile toplamak aynı işlemdir. Burada 26 sayısının tümleyeni (- 26) sayısı olmaktadır.

Ancak, daha önce tümleyen kavramı konusunda verilen örneklerden de bilindiği gibi tümleyen bulma

işlemi de yine çıkartma işlemleri gerektirmektedir. Yani biz çıkartmadan kaçarken karşımıza yine çıkartma

işlemi çıkmaktadır. Bu sebeple yukarıda bahsedilen kolay yol kullanılarak aşağıdaki gibi çıkartma

yapılabilir.

* İkinci sayı olan (0111 1111)2 sayısının tabana göre tümleyeni basit ve kısa olarak iki aşamada

bulunabilir:

Page 7: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

7

1. Önce bu sayıda 1 olan bitler (basamaklar) 0 ; 0 olan bitler ise 1 yapılır.

Böylece sayımız (1000 0000) 2 olacaktır. Bu sayı, ikinci sayının (taban - 1) ‘e göre tümleyenidir.

2. Daha sonra bu sayıya 1 eklediğimizde artık tabana göre tümleyen elde edilmiş olacaktır. İkinci

sayının tabana göre tümleyeni olan (1000 0001)2 sayısı elde edildiğinden artık işlem toplamaya dönüşmüş

olmaktadır. Bu durumda ikinci sayının tabana göre tümleyenini alarak çıkartmayı toplamaya

dönüştürdüğümüze göre işlemin toplamaya çevrilmiş son halini tekrar yazalım:

Binary: 1000 1100 Hex : 8 C

+ 1000 0001 + 8 1

1 0000 1101 1 0 D (1101)2 = (D)16 olduğunu hatırlayınız.

Buradaki sonucun başında bulunan “1” aslında tümleyen aritmetiği kullandığımız için büyük sayıdan

(8C)16 , küçük sayı (81)16 çıkarıldığını (borç olmadığını) göstermektedir. Tersi olsa yani küçükten büyük

sayıyı çıkartmaya çalışsaydık sonucun başında “0 ” olacaktı. Burada çıkartma işleminin neticesi baştaki

“1” dikkate alınmadan (0000 1101)2 = (0D)16 olarak elde edilmiş olur.

1.4. İşaretli Sayılar Kavramı:

Mikrodenetleyicilerde dolayısıyla mikroişlemcilerde işaretli sayıların da kullanılması

gerekmektedir. Örneğin tasarlamak istediğimiz pratik bir devre sırasında (- 5oC) gibi bir sıcaklık değeri

karşımıza çıkabilir. Bu nedenle mikroişlemcide negatif sayıların da temsil edilmesi ve işlenebilmesi

gerekir. Bu da aslında sadece “0” ve “1” lerle işlem yapan mikroişlemcilerde negatifliğin bir şekilde temsil

edilmesi ihtiyacı olduğu anlamına gelir.

1.4.1. İşaretli Sayıların Kullanımı

Bu amaçla genelde “en soldaki bit” sayının işaretini göstermek için ayrılır. Bu bit “0” ise sayı

pozitif, “1” ise negatif kabul edilir. Buna “işaret biti” denilir. (Not: Mikroişlemci hesap yaparken bunu

bilmez. Çünkü bu programcının kafasındaki bir varsayımdır, sayıya bir bakış açısıdır. Yoksa mikroişlemci

için işaretli sayılarla yapılan işlemin işaretsiz sayılarla yapılan işlemlerden farkı yoktur. Bazı

mikroişlemcilerde işaret bitinin değeri bir başka özel bitle belirtilmektedir)

Pozitif Sayılar:

İşaretsiz karşılığı ile aynı şekilde gösterilir. Örnek olarak desimal (+25) sayısını ele alalım; (İkili

tabanda en soldaki basamağın yanındaki nokta, işaret bitini ayırt etmek için kullanılmıştır.)

(+25)10 = (+19)16 = (0.001 1001)2 (Baştaki “0.“ sayının pozitif olduğunu gösteriyor)

Burada (+25)10 işaretli desimal sayısı mikroişlemci içindeki hafızada (19) heksadesimal sayısı ile

temsil edilmektedir. Bir başka ifadeyle işaretsiz pozitif bir sayının [örnekte (25)10 ] mikroişlemcide

gösterimi ile aynı değerde işaretli gösterimi (+25)10 arasında hiçbir fark yoktur. İkisi de hafızada

(0001 1001)2 =(19)16 şeklinde yer alır.

Negatif Sayılar:

Sayının, pozitif karşılığının tabana göre tümleyeni ile temsil edilirler.

Bir pozitif sayı asla, sol baştaki işaret biti 0 yerine 1 konarak negatif yapılamaz !

Yukarıdaki pozitif sayı örneğinde;

Page 8: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

8

(+25)10 = (0.001 1001)2 = (+19)16

olduğunu bulmuştuk. Aynı sayının negatifini, (- 25)10 ‘i bulmaya çalışalım;

(+25)10 = (+19)16 sayısının tabana göre tümleyeni (-25)10 = (-19)16 olacaktır ve daha önce

çıkartma işlemi örneğinde verildiği gibi bunu pratik olarak şu şekilde elde ederiz :

Önce (+25)10 = (+19)16 = (0.001 1001) 2 ikili sayısında 0 yerine 1 ; 1 yerine 0 yazalım.

Karşımıza çıkan bu sayı (taban-1) ‘e göre tümleyen olan (1.110 0110)2 olacaktır .

Bu sayıyı bir arttırdığımızda tabana göre tümleyeni buluruz : (1.110 0111) 2

İşte bu bulduğumuz (1.110 0111)2 sayısı, (+25)10 ‘in tabana göre tümleyeni olan (-25)10 sayısının

mikrodenetleyicideki temsil ediliş biçimidir. Zaten sayının ilk biti (1.) olduğundan sayının negatif olduğu

açıkça anlaşılmaktadır. Burada soldaki ilk bitten (1.) sonra konan nokta, sayıları işaretli olarak düşündüğümüzü

(yorumladığımızı) ifade ediyor. Tekrar ifade edelim ki mikroişlemcide içindeki hesaplamada

işaretli/işaretsiz sayı gösteriliş farkı YOKTUR.

Mikroişlemcinin hafızasında bu (- 25)10 sayısı (1.110 0111)2 = (E7)16 şeklinde temsil edilecektir.

Biz işaretli sayılarla çalışıyorsak mikroişlemcide (E7) sayısını bir sonuç olarak gördüğümüzde fiziksel

cevabın yani (E7) nin tabana göre tümleyeni olan ( -19)16 = (- 25)10 olduğunu bilmemiz gerekir. (Örnek olarak bu cevap -25

oC şeklinde sıcaklık değerine karşılık gelebilir.)

1.4.2. İşaretli Sayılarla Çeşitli Örnekler:

1) (+60)10 + (+62)10 = (+122)10 olduğunu gösterelim: (İkili tabanda yaparsak)

0.011 1100

+ 0.011 1110

0.111 1010 = (+122)10 elde edilir.

Burada en baştaki (0.) sonucun pozitif olduğunu gösterir. İki pozitif sayının toplamının pozitif olarak elde

edilmesi normal bir sonuçtur.

2) (+60) 10 + (+70) 10 = (+130)10 olduğunu gösterelim:

0.011 1100

+ 0.100 0110

1.000 0010 sonucu elde edilir.

Dikkat edilirse sonucun ilk biti 1 çıktığı için sonuç negatif ( ! ) gözükmektedir. Halbuki matematikte iki

pozitif sayının toplamı daima pozitiftir.

Bu durumda işaretli sayılar gözüyle yapılan bu toplama işleminin sonucunda işaretin, dolayısıyla neticenin

hatalı olarak elde edildiği görülmektedir. O halde işaretli işlemlerde belli bir değerin aşılmaması hususunda

dikkatli olunmalıdır. Bunun nedeni bölüm sonunda açıklanacaktır.

3) (- 60) 10 + ( - 62) 10 = (- 122 )10 olduğunu gösterelim:

(+60) 10 = (0.011 1100)2 olduğu önceki örnekten bilindiğine göre buna 2 eklersek pratik

yoldan (+62) 10 = (0.011 1110)2 sayısını elde edebiliriz. (Ya da 62 yi ardarda 2 ‘ye böleriz)

Şimdi bu sayıların negatif karşılıklarını bulmak için tabana göre tümleyenlerini alırsak;

Page 9: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

9

(+60) 10 = (0.011 1100)2 (Önce 0 yerine 1, 1 yerine 0 koyalım)

=> (1.100 0011) 2 ( Bu sayıya da 1 eklersek )

(- 60)10 = (1.100 0100) 2 bulunur. (Bir üstteki sayıda sağ dörtlü 0011 yani 3 idi,1 ekleyince

0100=4 oldu)

Benzer şekilde (+62) 10 = (0.011 1110)2 için tümleyen işlemi yaparsak;

( - 62) 10 = (1.100 0010) 2 elde edilir. Şimdi bu negatif sayıları toplayalım:

1.100 0100

+ 1.100 0010

1.000 0110 sonucu baştaki 1. dikkate alınıca negatif olarak bulunur.

Bu ikili tabandaki mikroişlemci sonucu doğrudan 10’lu tabana çevrilirse (-122)10 bulunamaz!

Çünkü Negatif Sayılar konusunda belirtildiği gibi negatif sayılar mikroişlemcide tümleyenleri ile temsil

edildiklerinden önce sonucun tekrar tümleyeni alınarak pozitif 122 bulunur ve aldığımız tümleyenden

dolayı başına “-“ eklenerek gerçek (fiziksel) cevap olan (- 122)10 elde edilecektir.

Bu işlemi yukarıdaki bilgisayar sonucundan hareketle yaparsak; (Tümleyen için yine 0 yerine 1, 1 yerine

0 konup daha sonra 1 eklenmiştir)

1.000 0110 => 0.111 1001 => 0.111 1010 yaparak (+122)10 elde edilir .

Bu son aldığımız tümleyenden dolayı ve yukardaki sonuçta da görüldüğü gibi fiziksel (asıl)

cevap negatiftir yani (-122)10 dir.

4) (-60) 10 + (-70) 10 = (-130) 10 işlemini yine işaretli ve 8 bit olarak yapmaya çalışalım:

(+60)10 = (0.011 1100)2 ve (+70)10 = (0.011 1100) 2 olduğunu önceki örnekten biliyoruz.

Bu iki sayının negatiflerini bulmak için taban`a göre tümleyenini alalım:

1.100 0100 = (C4)16 = (-60)10 ,

1.011 1010 = (BA)16 = (-70 )10 değerlerini buluruz.

Bu sayıları toplarsak( - 130)10 değerini yani gerçek sonucu bulamayacağız, yine sonucun hatalı

olduğunu göreceğiz . (Bunu tümleyen kullanarak işlemi yapıp gösteriniz)

ÖNEMLİ SONUÇ : İşaretli sayılarla yapılan işlemlerde

Sonuç; (–128)10 = (-80)16 ‘den küçük ( desimal olarak -129, -130... gibi)

ya da (+127)10 = (+7F)16 ‘den büyük (desimal olarak +129, +130... gibi) ise ,

bir başka ifade ile sağdaki bitlerden işaret bitine bir etki gelmiş ise sonucun işareti, dolayısıyla sonuç

hatalı olacaktır.

Page 10: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

10

İşaretli işlemlerde doğru netice bulmak için sonucun desimal karşılığı (-128)10 ‘den küçük ya

da (+127)10 ‘den büyük olmamalıdır. Böyle durumda 16 bit olarak işlem ve programlama yapılmalıdır.

16 bit toplama konusu ilerde incelenecektir.

2. BÖLÜM

MİKROİŞLEMCİ ve MİKRODENETLEYİCİLERE

GENEL BAKIŞ ve PIC

2.1. Mikroişlemci (Mikroprosesör) Nedir?

CPU (Merkezi İşlem Birimi) olarak da adlandırılır. Bir bilgisayar programının yapmak istediği

işlemleri icra eder, yerine getirir. CPU, hafızada bulunan komutları sırasıyla ile işler. Bu işleme, komutun

hafızadan alınıp getirilmesi (Fetch), kodunun çözülmesi (decode) ve işlemin yerine getirilmesi (Execute)

gibi aşamaları gerektirir. Merkezi İşlem Birimleri (CPU) Kişisel Bilgisayarlarda (PC) kullanıldıkları gibi ,

sanayi tezgahları, ev aletleri ve cep telefonları gibi kontrol gereken birçok alanda da kullanılırlar. Ancak

Mikroişlemciler tek başına çalışamazlar. İhtiyaç duydukları bazı ilave elemanlar vardır. Bu elemanlar temel

olarak ;

1 ) Giriş ( Input ) Ünitesi

2 ) Çıkış (Output ) Ünitesi

3 ) Hafıza (Memory ) Ünitesi ‘dir.

Bu elemanlar CPU dışında olduklarından aralarındaki iletişimi Veri Yolu (Data Bus) ve Adres

Yolu (Address Bus) ile Kontrol hatları (Control Lines) denilen lojik iletim hatları sağlar. Intel, AMD,

Cyrix mikroişlemci üreticilerinden bazılarıdır. Şu anda ayrı olarak mikroişlemcilerin sadece kişisel

bilgisayarlarda PC’lerde kullanıldığını söylersek pek yanlış olmaz. Kontrol işlemlerinde, sanayide,

haberleşmede CPU ile birlikte yukarıda sözü edilen ek elemanları da içinde bulunduran

mikrodenetleyiciler (mikrokontrolörler) tercih edilir.

2.2. Mikrodenetleyici (Mikrokontrolör) Nedir?

Bir bilgisayar içinde bulunması gereken Hafıza , Giriş/Çıkış ünitesi gibi elemanların CPU ile

birlikte tek bir entegre (chip) içerisinde üretilmiş haline Mikrodenetleyici (Mikrokontrolör) denir.

Çevre üniteleri hariç olmak üzere CPU, kalıcı ve uçucu Hafızalar ile Giriş/Çıkış ünitelerinin hepsi bir

mikrodenetleyiciyi oluşturur. Böylece hem yer ve enerji tasarrufu yapılıp maliyet düşürülürken hem de

tasarım kolaylaştırılmış ve programlama işlemi basitleştirilmiş olur.

Aşağıdaki şekilde bir mikrodenetleyicinin genel bir yapısı verilmiştir.

Bir Mikrodenetleyicinin Basit Yapısı :

Page 11: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

11

Günümüzde mikrodenetleyiciler otomobillerden kameralara , cep telefonlarından oyuncaklara kadar

sayılamayacak kadar pekçok alanda kullanılır. Mikrodenetleyiciler birçok firma tarafından üretilmektedir.

Microchip , Arm, Intel , Motorola , SGS Thomson, Hitachi gibi …

Her üreticinin en az birkaç mikrodenetleyicisi vardır. Mesela , Microchip firması 12C508 , 16C84 ,

16F84 ve 16F877 gibi çok sayıda farklı mikrodenetleyicilere sahiptir ve bunlar hemen, hemen aynı

komutlarla programlanırlar. Mikrodenetleyici adlarında bulunan harfler/rakamlar aynı aile içinde farklı

özelliklere sahip (hafıza yapısı ve miktarı, hız gibi) elemanları ifade eder. Bir uygulama yapmadan önce

hangi firmanın, hangi numaralı mikrodenetleyicisinin kullanılacağı tespit edilmelidir. Bunun için Katalog

(Data sheet) adı verilen kaynaklardan ya da internetteki ilgili sitelerden faydalanılabilir.

2.3. Bir Mikrodenetleyici İçinde Bulunan Temel Özellikler :

Çok farklı özelliklere sahip mikrodenetleyiciler bulunmakla birlikte bir mikrodenetleyicide bulunan

en temel (ortak) özellikler aşağıdaki gibi sıralanabilir.

1 ) Programlanabilir Dijital (Sayısal) Girişler / Çıkışlar

2 ) Programlanabilir Analog Girişler

3 ) Seri Girişler / Çıkışlar

4 ) Darbe (Pals) – PWM (Darbe genişlik modulasyonu) işareti Çıkışları

5 ) Harici (İlave) hafıza bağlanabilme

6 ) Dahili Program hafızası seçenekleri ( ROM , PROM, EPROM , Flash gibi )

7) Zamanlayıcı , Sayıcı ve Kesme gibi özellikler.

Bu özelliklerin yanısıra çok sayıda farklı özelliklere sahip mikrodenetleyiciler bulunsa da yukarıda

belirtilenler genellikle bulunması istenen zorunlu özellikler olarak sayılabilir.

2.4. Mikrodenetleyici Seçimi

Mikrodenetleyici seçerken öncelikle uygulama ihtiyacımızın tamamını karşılamasına sonra da

fiyatına bakarız. Ayrıca yazılım ( program ) desteğinin ve araçlarının (derleyici, simulatör , emulatör v.s.)

bulunup bulunmadığına bunların ücretli olup olmadığına dikkat ederiz. Yazılı yayınlarda ve internette bol

miktarda uygulama programları bulunabilmesi de bize örnek olması açısından faydalıdır. Sayılan özellikler

göz önüne alınırsa (şu an için) Microchip firması tarafından üretilen kısaca PIC olarak ifade edilen

mikrodenetleyicilerin kullanılması oldukça avantajlı gözükmektedir.

2.5. PIC Mikrodenetleyicilere ve Programlanmasına Genel Bakış

PIC İngilizce’de “Çevre Üniteleri Kontrol edici Arabirim” anlamı taşıyan kelimelerin baş harflerinden

oluşmuştur. PIC’in temel ve basit birçok özelliklerini içeren PIC16F84 ‘ün incelenmesi başlangıç için

daha yararlı olacaktır. Bu mikrodenetleyicide program hafızası Flash tipidir. Ve elektrik kesilse bile

içlerindeki bir defa yüklenmiş program silinmemektedir. Yeni başlayanlar ve araştırma yapanlar için

kolayca yazılıp silinebilen özelliğe sahip olan Flash Program Hafızalı PIC ‘ler bu açıdan büyük kolaylık

sağlamaktadır. Program hafızası EPROM olanlar da elektriksel olarak yazılmakta ise de programı silmek

için üzerinde bulunan penceresinden 10 -15 dakika UV (Ultraviole) ışını uygulamak gerekir. Bu notlarda

PIC16F84 için öğrenilenler büyük ölçüde PIC 16/17 ailesinin tamamı için de geçerlidir.

2.5.1. PIC Mikrodenetleyicilerin Avantajları :

1 ) Destek Yazılımları internetten ücretsiz sağlanır.

2 ) Çok yaygın ve ucuzdur. Hem profesyonel hem de amatör kullanıma uygundur.

Page 12: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

12

3) İnternette ve kitap/dergilerde çok sayıda örnek programlar mevcuttur.

4) Çok az ve basit birkaç elemanlarla ( birkaç direnç , kondansatör ) donanımları kurulabilir.

5 ) Komut sayısı az ve kullanımı basittir.

6 ) Daha üst seviye diller için (PIC C, CCS, PicBasic gibi) Derleyiciler’e (compiler) sahiptir.

7) Ayrıca PIC ‘lerdeki BUS (Lojik yollar) yapısı PIC ‘lerin RISC işlemci olarak

tanıtılmasını dolayısıyla diğer mikroişlemcilere göre hızlarının fazla olmasını sağlar.

2.5.2. Bir PIC Programlamak İçin Enaz (Asgari) Gerekenler :

1) Bir PC ( Kişisel Bilgisayar )

2) Bir metin editörü (Not defteri gibi) kullanmayı bilmek

3) PIC Assembler (derleme) programına ( MPASM, MPLAB gibi ) sahip olmak

4) PIC programını entegreye yüklemek (programlamak) için gerekli Programlayıcı donanım ve

yazılımına sahip olmak

5) Kullanılacak PIC mikrodenetleyicisini edinmek

6) Programlamadan sonra devremizi çalıştırmak için bir DC güç kaynağı , direnç-kondansatör

kristal gibi birkaç elektronik eleman, breadboard (deneme kartı), ölçü aletine de sahip olmak

gerekir.

2.5.3. Programlayıcı Donanımı Ve Yazılımı

Makine diline çevrilmiş icra edilebilir programın (*.hex uzantılı dosya) PIC ‘e yüklenmesi için bir

“Programlayıcı” ya ihtiyaç vardır. Piyasada özel bir mikrodenetleyiciyi yada ailelerini programlayan

programlayıcılar bulunduğu gibi her tür mikrodenetleyici ve hafızayı programlayan Üniversal

Programlayıcılar da vardır. Bunlar yazılımları ile satıldıkları gibi bu yazılımları (sürücüleri) yeni

mikrodenetleyiciler piyasaya çıktıkça internetten yüklenmekte ve güncellenebilmektedir.

PIC için MPASMwin ya da MPLAB tarafından derlenerek elde edilen (hex) uzantılı bu dosyanın

PIC ‘e yazılması için programlayıcı ile birlikte her zaman bir de yazılıma ihtiyaç olduğundan önce bu

yazılım PC’ye yüklenmeli ve programlayıcı özelliğine göre PC’ye USB yada RS232 arabirimi üzerinden

bağlandıktan sonra programlamaya başlanmalıdır.

2.5.4. PIC Mikrodenetleyicilerin Türleri ve Özellikleri

Microchip firması tarafından üretilen farklı PIC grupları (aileler) vardır. Bu aile isimleri verilirken

kelime boyu (komut kelimesi de denen bu kavram ilerde açıklanacaktır.) dikkate alınmıştır. Ancak program

yazılırken aynı komutlar kullanılsa bile bu komutların program hafızasında bulunan makine dili

(heksadesimal) karşılıkları farklı kelime boylarında olabilir. Mesela ;

PIC 12CXXX / PIC 12FXXX ailesi 12 ya da 14 bit,

PIC 16C5XX ailesi 12 bit,

PIC 16CXXX / PIC 16FXXX ailesi 14 bit,

PIC 17CXXX / PIC 18FXXX ailesi 16 bit kelime boyuna sahiptirler.

Biz programcı olarak bu kelime boyları ile fazla ilgilenmeyiz . Bizim için seçtiğimiz PIC ‘in

komutlarının görevlerini , kullanma kural ve özelliklerini bilmek yeterlidir. Bu özelliklerden kasıt, PIC ‘in

komutları ile kullanım formatları, hafıza tipi ve miktarı, giriş/çıkış (I/O) portu (ucu) sayısı , analog giriş

kabul edip etmemesi v.s. gibi özelliklerdir. Bunları kataloglardan ve www.microchip.com sitesi ile farklı

sitelerden elde etmek mümkündür.

Page 13: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

13

2.6. PIC Mikrodenetleyicilerin Hafıza Yapısı

Bir PIC içersinde temel olarak iki tür hafıza bulunur :

o Program Hafızası

o Veri Hafızası

2.6.1. Program Hafızası Türleri:

Farklı özelliklerde “Program Hafızalarına” sahip PIC ‘ler mevcuttur. Bunlardan başlıcaları

ROM,PROM, EPROM, Flash olarak sayılabilir. Bu hafızalarda normal program komutları heksadesimal

biçimde o PIC’e özgü kelime boyuna sahip olarak yer alır. Program hafızaları her zaman kalıcı bir

hafızadır. Hangi türde PIC kullanılacağı uygulama ve üretim miktarları dikkate alınarak belirlenir.

En çok kullanılan program hafızası türleri :

ROM : Sadece okunabilir hafıza olarak bilinir. Bu tip program hafızaları genellikle fabrikasyon

olarak bir kere yazılırlar. Ucuzdurlar. Ancak çok sayıda programlanmışlarsa ve programda hata

olduğu sonradan anlaşılırsa üretilen entegrelerin atılmasını gerektir. Örn: PIC 16CR84 gibi.

PROM : ROM’a benzer olup fabrika yerine kullanıcı tarafından bir kere programlanırlar. Daha

sonra değiştirilemezler. ROM’a göre biraz daha pahalıdırlar. OTP olarak da adlandırılırlar.

EPROM : Elektriksel olarak kullanıcı tarafından programlanabilirler. Hafıza hücrelerine uygun

elektrik işaretleri ile ( genellikle besleme gerilimlerinin üzerinde bir gerilimle) program kaydı

yapılır. Elektrik kesilse de program silinmez. Silmek ve yenisini yazmak için ultraviole (UV)

ışınının belirli bir süre penceresinden uygulanması lazımdır.Programlama yapıldıktan sonra

EPROM’un silinmemesi için pencereli olanların pencereleri ışık geçirmeyen bantla kapatılır. Örn:

PIC16C74 pencereli EPROM tipi bir PIC ‘dir.

FLASH : Düşük besleme gerilimi ile hem programlanıp hem de UV ışınına gerek kalmadan

elektriksel olarak silinebilir tiptir. Uygulama geliştirme (deneme) maksatları için elverişlidir.

Dezavantajı hafızaya erişim (okuma/yazma) hızları EPROM ‘lara göre düşüktür. Örn: 16F84 bu tip

hafızaya sahiptir.

2.6.1. PIC16F84 ‘de Program Hafızasının Yapısı ve Haritası :

Laboratuarda uygulanacak PIC16F877 ‘den önce kendimize daha basit bir örnek olarak PIC16F84

mikrodenetleyicisini inceleyeceğiz. Seçtiğimiz PIC16F84 de 1K word’luk (kelime) program hafızası

vardır. Her bir hafıza hücresi içerisine 14 bit uzunluğundaki (=kelime boyu) program komutları saklanır.

Bunların her birine “ Komut Kelimesi “ ya da kısaca “Komut” denir. Program hafızası Flash tipte olup

program çalışması esnasında sadece okunabilir. PIC’in beslemesi kesilince silinmez.

Page 14: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

14

PIC16F84 için Program Hafıza Haritasını Çizelim :

Program hafızasında sadece assembly komutlarının heksadesimal (hex) karşılıkları

saklanır.Yukarıdaki haritada “İçeriği” şeklinde ifade edilen komutlar PIC16F84 için 14 bittir yani 14 bit

kelime uzunluğundadır. Ancak toplam adres ( 210

= 1024 ) olmasına rağmen Program hafıza haritasında

son adresin (1023)10 = (3FF)16 olma sebebi ilk adresin sıfırdan (000)16 başlamasıdır. İlk adres (001) 16 den

başlasaydı son adres ( 1024 )10 =(400)16 olacaktı.

2.6.2. PIC16F84 ‘de Veri (Data) Hafızası :

Her PIC ‘de bulunan diğer bir hafıza türüdür. Bu hafıza genellikle RAM türü Geçici Bilgi

Depolama alanıdır. Ayrıca PIC16F84 ’de EEPROM denilen 64 byte’lık kalıcı veri hafızası türü de veri

saklama amaçlı kullanılır. Ancak bu hafızanın kullanılması daha ileri programlama bilgisi gerektirmektedir.

Aşağıda incelenecek “File Registerleri” de (STATUS, PORTA,TRISA gibi) RAM tipi Veri

Hafızasında yer alırlar. Bu sebeple PIC’in enerjisi kesildiğinde burada bulunan veriler silinir. Enerji

verildiğinde hangi registerlerin rastgele ya da hangi belirli değerleri alacağı Veri Hafızasına ait dağıtılan

Özel Fonksiyon Registerleri tablosundan görülebilir. Buna o registere ait Power-on Reset değeri denir.

PIC16F84 ‘de Veri (Data) Hafıza Yapısı ve Haritası ve Banklar

Dersimiz için örnek aldığımız PIC16F84 ‘ün (0x00 … 0x4F) adres aralığında toplam ( 50 )16 =

(80)10 adet 8 bit uzunluğunda veri (data) hafıza adresi vardır. Bunların bir kısmı Özel Fonksiyon

Registerleri denilen ve yine 8 bit uzunluğunda olan lojik bilgi saklayıcılara (register) ayrılmıştır. Bu Özel

Fonksiyon Registerleri dışında kalan hafıza alanları Genel Veri saklama alanı olarak kullanılabilir. Mesela,

5 + 3 = 8 işleminde 5 , 3 , 8 sayıları (verileri) 8 bit uzunluğunda olduğu için 05 , 03 , 08 şeklinde buraya

saklanabilir. İlerde bu konular daha ayrıntılı incelenecektir.

(NOT: Aşağıdaki tabloda “0x” kendinden sonra gelen sayının heksadesimal olduğunu belirtir, örn: 0x4F =

(4F)16 = h’4F’ aynı sayıların farklı gösteriliş biçimleridir.)

Page 15: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

15

16F84 için Veri (Data) Hafızası Register Haritası :

Yukarıdaki Özel Fonksiyon Registerleri ve Genel veri depolama alanı (taralı alan) programın

çalışması esnasında kullanılan değişkenleri geçici olarak saklamak için kullandığımız veri alanlarıdır.

Ayrıca haritada gösterilmeyen ve Bank 0 bulunan 0x50 den 0x7F’e kadar olan alan boştur ve

rezerve olarak ayrılmıştır. Benzer şekilde Bank 1 için de 0xD0 ile 0x7F aralığı boştur. Bu tablodaki veri

alanları hafızanın tipine dayanarak RAM hafıza olarak da adlandırıldığını yeniden hatırlayalım.

PIC 16F84 ün Veri (RAM) hafızası 2 Sayfadan (Bank) meydana gelir:

Bank 0 ‘a ait adresler 0x00 – 0x4F

Bank 1 ’e ait adresler 0x80 – 0xCF adres aralığındadır.

Bir Bank’ın içindeki herhangibir registeri ( Bank0 veya Bank1 ) kullanabilmek için o Bank’a

geçmek gerekir. İlk enerji verildiğinde PIC “Bank 0” da açılır. Yukarıda kısmî olarak verilen Register haritası incelenirse bazı Özel Fonksiyon Registerlerinin her

iki bankta ortak olduğu görülür. (IND,PCL ,STATUS , FSR gibi…) Dolayısıyla böyle bir registere

programlama sırasında her iki bankta iken de (bank değiştirmek gerekmeksizin) erişilebilir.

Örnek olarak STATUS’un bulunduğu 0x03 adresine yazılan bir veriyi , 0x83 adresinden okumak

mümkündür.

PIC16F84 için Bank 0‘de [0x00 ….. 0x0B] adresleri arası özel fonksiyon registerlerine

ayrılmıştır. Benzer şekilde Bank 1 ‘de [0x80 …. 0x8B] arası yine özel fonksiyon registerlerine tahsis

edilmiştir.

Ayrıca RAM Genel Veri saklama alanları olarak adlandırılan (0x0C - 0x4F) adres aralığı ile

(0x8C - 0xCF) adres aralığı yine birbirlerinin kopyasıdır. Örneğin 0x1B adresi ile 0x9B adresleri gerçekte

aynı verileri içermektedir (Ayna Özelliği). Bir başka ifadeyle burada otomatik kopyalama işlemi söz

konusudur.

Bank değiştirme işlemi programlama sırasında tekrar incelenecektir.

2.6.3. Özel Bir Register ( W : Akümülatör )

Akümülatör PIC16F84 ‘de Veri Hafızası Register haritasında görülmemesine rağmen sıkça

kullanılan ve “Geçici Depolama Registeri” de denebilecek bir registerdir. 8 bit uzunluğundadır. Diğer File

Registerlerinden veri okur, yazarken bu W registerinden faydalanırız. Ayrıca registerler arası veri

kopyalama ile tüm aritmetik işlemler ve bazı atama işlemleri için bu W registerini kullanmak şarttır.

Meselâ ; iki register (PORTA ve PORTB gibi) içindeki verileri toplamak istersek bunlardan birinin W ‘ye

kaydedilmiş olması gerekir. (05) ile (03) ü toplamak için önce (05)’i örn. PORTA ya, (03)’ü de W ‘ye

yazmak gerekir. Daha sonra toplama komutu ile sonuç 08 olarak PORTB de elde edilebilir.

Page 16: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

16

Not: Bu işlemlerin hangi komutlarla ve nasıl yapılacağı tablo halinde verilen Assembly

komutları, özellikleri ve kullanımı ile daha iyi anlaşılacaktır.

2.7. PIC16F84’ ün Bacak (pin) Yapısı ve Portları

PIC16F84 mikrodenetleyicisi 18 bacağa (pin) sahiptir. Şekilde görüldüğü gibi VDD ( + ) , VSS ( - )

besleme uçlarıdır. En ideal besleme gerilimi +5V olsa da gerçekte PIC, (+2V) .... (+6V) arası çalışır. RAx

ve RBx ile ifade edilen portlardan dışarı alınan akım yeterli değilse transistor veya röle kullanılarak akım

arttırılabilir. Bütün CMOS Lojik entegrelerde olduğu gibi burada da kullanılmayan PORT girişleri +5V

(Lojik 1) a bağlanmalıdır. Asla boşta bırakılmamalıdır. Portlar ve besleme uçları dışında saat işaretinin

üretilmesi ya da dışarıdan başka bir kaynaktan uygulanması için kullanılan OSC1 ve OSC2 uçları vardır.

MCLR ucu ise Reset işlemi için kullanılır. RA4 ve RB0 bitleri farklı amaçla da kullanılabilmektedirler.

CMOS olarak üretilen ve Flash tipi hafızaya sahip PIC16F84 ‘de dışarıdan uygulanan CLK (saat)

işareti kesilir ve tekrar uygulanırsa program kaldığı yerden devam eder.

2.8. PIC16F84 ‘de Port Çıkış İken Maksimum Akımlar :

PIC16F84 ‘de bir PORT’a ait olan bir bit ya Giriş ya da Çıkış olarak programlanarak kullanılır.

PORT biti çıkış olarak kullanıldığı zaman iki tür akım söz konusudur. PORT’dan içeri çekilebilen (sink)

ve PORT’tan dışarı alınabilen (source) akımları. Bu durumlardaki maksimum akım değerleri hiçbir zaman

aşılmamalıdır. Bu değerler seri bir direnç üzerinden bir LED’i rahatlıkla sürebilecek seviyededir.

Sink Akımı : (+5 volt) beslemeden PORT’un içine doğru akan akımdır. Bu durumda PORT’dan

içeri akacak maksimum akım 25 mA dir. PORT’tan içeri daha fazla akıtılan akım PIC ‘in

bozulmasına sebep olabilir. Bu tür bağlantıda ancak PORT biti = (Lojik) 0 yapıldığında LED

yanacaktır.

Page 17: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

17

Source Akımı : PORT’un içinden toprağa doğru akan akımdır. Bu durumda akacak

maksimum akım 20 mA dir. Yine PORT’tan dışarı bu değerden fazla akım çekilirse PIC

bozulabilir. Bu tür bağlantıda PORT biti = (Lojik)1 yapıldığında LED yanacaktır

2.9. Osilatör ( Saat / Clock ) Devresi

PIC ‘in program hafızasında bulunan komutların çalışması ;

dalga şeklindeki kare dalga ( saat/clock sinyali ) ile olur.

PIC’in çalışabilmesi için gerekli bu işaret ya dışarıdan bir osilatör kaynak üzerinden uygulanır ya

da ilgili bacaklara bazı elemanlar bağlanarak PIC içersinden üretilmesi sağlanır. OSC1/ CLK IN denilen

PIC16F84’ün 16 nolu bacağı, dışarıdan kare dalganın uygulanabileceği yerdir PIC’e kristal/rezonatör/RC

bağlandığı zaman bu sinyal PIC’in içerden üretilir. Bu durumda dışarıdan kare dalga (clock) uygulamaya

gerek kalmaz.

PIC 16F84 ‘de en çok kullanılan osilatör tipleri şunlardır :

1 ) RC Tipi ( Direnç / Kondansatör )

2 ) XT Tipi ( Kristal veya Seramik Rezonatör )

3 ) HS Tipi ( Yüksek Hızlı Kristal / Seramik Rezonatör )

4 ) LP Tipi ( Düşük Frekanslı Kristal )

Osilatör tipi komut olarak veya programlama esnasında belirtilmelidir. Bu osilatör yapılarından sık

kullanılan ikisinin tipik bağlantıları aşağıda gösterilmiştir.

1) RC Tipi Bağlantı : Bu amaçla kullanılan tipik bağlantı şöyledir. Hassas zamanlama

gerektirmeyen tasarımlar için elverişlidir.

2) XT, HS, LS Tipi Bağlantı : Bu bağlantılarda her iki OSC bacağı kullanılır. C1 ve C2 değerleri

15-22 pF civarında seçilebilir.

Page 18: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

18

2.10. Reset ( ) Bacağı ve Devresi

Program herhangi bir nedenle kilitlenirse ya da programı yeniden (baştan) çalıştırmak istersek

dışardan PIC ‘i Reset yapmamız gerekir. Aslında PIC ’e başlangıçta uygulanan besleme gerilimi belirli bir

seviyeye ulaşınca programı başlatan bir RESET devresi ( Power-on–reset ) PIC’in içinde zaten vardır.

Ayrıca PIC16F84 ‘de RESET fonksiyonu gören 4 nolu bacakta ucu vardır. Master Clear (Ana

Silme /Başlatma) kelimelerinden oluşturulmuş ucu ile lojik resetleme gerçekleşir.. Yani,

Resetleme işlemi için bu girişe önce kısa bir süre lojik 0 verilmeli, daha sonra lojik 1 uygulayarak ,

programın enerji uygulandığı andaki duruma (başa) dönüp tekrar başlaması sağlanmalıdır. Bunun için

aşağıdaki gibi tipik bir Reset devresi kullanılabilir.

3. BÖLÜM

PIC16F84 ve ASSEMBLY DİLİ PROGRAMI

Biz programlarımızı PIC16F84 ‘ye ait 35 farklı komuttan oluşan assembly programlama dili ile

yazacağız. (Not: Bu komutlar Lab. da incelenecek 40 bacaklı PIC16F877 için de geçerlidir) Basit bir

metin editöründe (not defteri gibi) yazılacak olan program ( *.asm = asm uzantılı text dosyası ) PIC’in

çalıştırabileceği hale dönüştürülmelidir (derlenmelidir). Bu işlem PIC için en basit olarak MPASM

denilen bir Assembler derleme programı ile yapılmakta ve sonuçta ( *. hex ) uzantılı ve icra edilebilir

bir dosya elde edilmektedir. Makine Dili de denilen bu program artık PIC ’e yüklenmeye (kaydedilmeye)

hazırdır. Eğer MPASM, derleme sonrasında hata mesajları vermişse bunların (* .asm ) dosyası üzerinde

düzeltilmesi ve tekrar derlenmesi gerekir. MPLAB derleyici programı da MPASM ile benzer işi

görmekle birlikte simülasyon imkanı veren bazı ilave özellikler içermektedir.

3.1. PIC16F84 Assembly Dili

Bir metin editöründe assembly dili kuralları ile yazılan assembly komutlarını ( hex ) kodlara

çevirmek (derlemek) için en basit PIC assembler programı olarak MPASM’nin kullanılabileceği daha önce

belirtilmişti. Assembly dili aslında yapılacak işlerin sırasıyla , komutlar halinde yazılmasından başka bir şey

Page 19: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

19

değildir. Komutlar ise İngilizce dilindeki karşılıklarının baş harflerinin birleşmesinden meydana gelir ve

tablo halinde verilmiştir.

Assembly Dilinde Program Yazarken Dikkat Edilecek hususlar:

1) Noktalı Virgül ( ; ) : Bir satırın başına (;) konursa o satır ( hex ) koda dönüştürülmez. Bu satır

sadece bilgi amaçlıdır. Daha sonra programı değiştirir ya da geliştirirken hatırlamak istediklerimizi (;) den

sonra yazabiliriz. Bir komuttan sonra da (;) konarak bundan sonra açıklama yazmak mümkündür.

2) Program Bölümleri : Assembly programının da Başlık , Atama , Program ve Sonuç bölümleri

vardır. Editör önce sanal olarak 3 kolona bölünür.

Bunlar Etiket, Komut, Adres(ya da Data) olarak sıralanabilir. Örnek komutlar üzerinde

inceleyelim.

1)Etiket 2)Komut 3)Adres (yada Data)

Eğer bu üç kolona yazarken sağa / sola kayma yapılırsa derleme sırasında MPASM ‘den

uyarı (warning) alınır. Oysa düzenli (3 kolona göre) yazılmış , noktalı virgüllerle (;) ile gerekli

açıklamalar yapılmış programlar anlaşılır , kalıcı ve gelişmelere açık olacaktır.

3) Etiketlerin Özellikleri : Birinci kolonda yer alan Etiketler PIC hafızasındaki bir adresin

atandığı ve hatırlatmayı kolaylaştıran kelimelerdir. Mesela 16F84 de PORTB nin 0x06 adresinde olduğu

belli olduğuna göre (bknz. Özel Fonksiyon Registerleri tablosu) her sefer 0x06 yı hatırlamak ve yazmaktan

kurtulmak için ( başlangıçta bir kere )

PORTB EQU 0x06

komutu yazarak 0x06 yerine PORT B kullanmaya hak kazanırız. ( EQU eşitleme, atama demektir).

Ayrıca tarafımızdan adres atanmayan etiketler de vardır. BASLA , DONGU gibi….

GOTO DONGU ; DONGU etiketine git

komutu etiketi DONGU olan satıra ( komuta ) gitmeyi sağlar. Etiketleri kullanırken ; 1. kolona yazmaya ,

bir harfle başlamaya , Türkçe karakter kullanmamaya (DÖNGÜ değil DONGU), küçük / büyük harf

duyarlılığına ( DONGU yerine başka yerde dongu yazılmaz ) dikkat edilmelidir.

Page 20: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

20

3.2. PIC16F84’de Assembly Dili Komutları

PIC 16F84 de toplam 35 komut vardır. Bu komutlar farklı şekillerde guruplandırılabilirse de biz

PIC komutlarını 4 ana grupta toplayarak inceleyeceğiz :

1 ) Byte Yönlendirmeli Komutlar

2 ) Bit Yönlendirmeli Komutlar

3 ) Sabitle Çalışan Komutlar

4 ) Kontrol Komutları

Komutlar yazılırken bazı kısaltma harfleri kullanılır. Bunlar ;

f : File register (Veri hafızasında bir adres ya da etiket )

d : Destination ( Hedef, komut sonucunun gönderildiği yer )

d = W ise ( sonuç W registerine kaydedilir )

d = F ise ( sonuç komutta belirtilen File registerine kaydedilir )

k : Sabit veya adres etiketi

b : Bit veya Binary sayı ( Örn :b’00001111‘ ) ifade eder.

d : Desimal sayı ifade eder ( Örn :d’18’ gibi… )

h : Heksadesimal sayı ( Örn : h’4F’ gibi… ) ifade eder

Şimdi bu komut gruplarını ve formatlarını (kullanılış biçimlerini) örneklerle açıklayalım:

1 ) Byte Yönlendirmeli Komutlar : Bir bayt (register) üzerinde işlem yapan komut türüdür.

Örnekler :

MOVF 0x03 ,W ; 0x03 adresinin içeriğini W (Akümülatör ) ‘nin içine kopyala.

MOVF PORTA ,W ; PORTA nın içeriğini W nin içine kopyala.

MOVF STATUS ,W ; STATUS registerini W nin içine kopyala.

2 ) Bit Yönlendirmeli Komutlar : Bir register yada adresinde bulunan bitlerden sadece biri

üzerinde işlem yapan komutlar bu gruba girer.

Page 21: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

21

Örnekler :

BCF 0x03 , 5 ; 0x03 adresindeki registerin (STATUS’un) 5. bitini 0 yap.

BSF 0x05 , 3 ; 0x05 adresinde bulunan PORTA nın 3. bitini 1 yap.

BCF PORTB , 3 ; PORTB nin 3. bitini 0 yap

3 ) Sabit İşleyen Komutlar : Bu tür komutlar belli bir sabit sayıyı işler.

Örnekler :

MOVLW 0x2F ; W registerine 2F yazar ( yükler )

MOVLW h’17’ ; W registerine h’17’ yazar ( yükler )

ADDLW b’00011111‘ ; O anda W registerinde bulunan sayıya ( 0001 1111 ) = ( 1F )16 ekler.

4 ) Kontrol Komutları : Program akışını değiştiren komutlar bu tür komutlardır.

Örnekler :

GOTO DONGU ; Program şartsız olarak DONGU etiketli satıra gider.

GOTO BASLA ; Program şartsız olarak BASLA etiketli satıra gider.

CALL GECIKME ; Program GECIKME etiketli altprograma gider.

3.3. Assembly Dilinde Sayı ve Karakter Yazılışları

Assembly dilinde program yazarken sayılar çeşitli formatlarda (biçimlerde) yazılabilir.

Hexadesimal sayılar için:

Atamalarda (EQU komutu gibi) 0x03 , 3 , 03 , 03h , h ‘ 03 ‘ şekillerinden biri kullanılabilir.

Ancak diğer komutlarda 0x03 , h ‘03’ ya da 03 tarzı tercih edilir.

Örnek olarak PORTB ‘ye 06 veri hafızası adresini atamak için ;

PORTB EQU 0x06

6

06

06h

h’06’ şekillerinden herhangi biri yazılabilir.

Ancak atama dışındaki komutlarda örn. W registerine (03) yüklemek için;

MOVLW 0x03 , MOVLW h’03’ , MOVLW 03 biçimlerinden biri yazılır.

Page 22: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

22

(Not: Biz Derslerimizdeki programlarda genellikle h’03’ formatını tercih edeceğiz.)

Binary ( ikili ) sayılar için :

b’0010 0101‘ şeklinde yazılır.

Örn : ( 0010 1100 )2 sayısını W (akümülatör) e yüklemek için gerekli komut ;

MOVLW b’0010110’ şeklinde ikili tabanda yazılabilir.

Desimal sayılar için :

Desimal sayılar ise başına d harfi konup yine tırnak içinde yazılır. d‘18‘ , d’255’ gibi.

Örn : (15)10 sayısını W ye yüklemek için ;

MOVLW d’15’ yazılır.

ASCII karakterler için ;

Tırnak içinde karakterin kendisi yazılır .

Genellikle RETLW komutu ile beraber kullanılır. Örn :

RETLW ‘B’

RETLW ‘X’ gibi komutlar B ve X karakterlerinin ASCII karşılığı olan sayıyı W registerine

yazar ve daha sonra inceleneceği gibi altprogramdan geri gönderir.

3.4. Assembly Dilinde İlk PIC16F84 Programı:

Önce basit bir program yazarak programın yazılma aşamalarını inceleyelim.

Örnek olarak enerji verince PIC16F84 ‘ün PORTB’yi tamamen çıkış yaptıktan sonra 0. ve 2.

bitlerini (RB0, RB2) lojik (1); diğerlerini de Lojik (0) yapan bir program yazalım.

PORTB

Bu durumda (0 0 0 0 0 1 0 1)2 = (05)10 sayısının PORTB ye yüklenmesi gerekecektir.

Elimizdeki File Register tablosunda Özel Fonksiyon Registerlerinde PORTB ‘nin 0x06 adresinde,

PORTB ‘yi çıkış olarak yönlendirmek için kullanacağımız TRISB ‘nin 0x86 adresinde ve Bank

değiştirmek için kullanacağımız STATUS registerlerinin 0x03 adresinde olduğunu bulalım.

Bu soru için sadece bu programda ilgileneceğimiz söz konusu 3 registeri adresleriyle

beraber Bank0 ve Bank1 ‘de gösterirsek aşağıdaki şekilde görülecektir.

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

0 0 0 0 0 1 0 1

Page 23: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

23

3.4.1. Bank Değiştirme İşlemi :

Daha önce de belirtildiği gibi herhangi bir file registere ulaşmak için o registerin bulunduğu Bank’a

geçmek şarttır. Burada PORTB den dışarı lojik değerler almak istediğimize göre önce PORTB yi Çıkış

olarak yönlendirmek gerekir. Bunun için de PORTB yi Yönlendirme için TRISB kullanılacaktır. TRISB,

Bank1 de bulunduğu ve PIC’e enerji verildiğinde PIC’in Bank0 ‘dan başladığı hatırlanırsa Bank1’e

geçmemiz gerekir.

16F84 ‘de Veri hafızasındaki Özel Fonksiyon Registerlerinden STATUS Registerinin 5. biti (RP0)

Bank değiştirme için kullanılır. Bir bit yönlerdirmeli Komutla RP0 = 1 yapılırsa BANK 1 ‘e geçilmiş

olacaktır. Program devam ederken tekrar Bank0’a dönmek istersek yine RP0=0 yapılmalıdır.

O halde burada STATUS ‘un 5. bitini (RP0=1) yaparak BANK 1 ‘e geçelim;

(STATUS EQU h’03’ komutu ile önceden atanmış yani tanımlanmış olduğu kabulu ile)

BSF STATUS , 5 ; STATUS 5. biti RP0=1 yapılarak Bank1 ‘e geçilir.

Tersine Bank1 de iken Bank0’a dönülmek istenirse;

BCF STATUS , 5 ; ile de aynı RP0 = 0 yapılarak Bank 0’a geçilebilir

3.4.2. PORTB ‘yi Yönlendirme (Giriş/Çıkış Yapma) İşlemi :

Yönlendirme işlemi için ilgili PORT’a karşılık gelen TRIS registerini belirli bitlerle yüklemek

gerekir.

* Önemli: Bir portu çıkış yapmak için ilgili TRIS registeri bitlerini “0”, giriş yapmak için “1”

yapmak gerekir.

Bu örnekte normal olarak PORTB , TRISB registeri ile yönlendirilecektir. PORTB ‘yi çıkış

yapacağımıza göre TRISB de tüm bitler (0) yapılarak PORTB tamamen ÇIKIŞ olması sağlanmalıdır.

Bu durumda ;

Sonuç olarak (00)16 sayısının TRISB registerine yüklenmesi gerekir.

Page 24: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

24

Şimdi örnek Programımızda kullanılan komutları yazarken sırasıyla açıklayalım:

(Hatırlatma: Açıklamalar “ ; “ den sonra yazılır ve derleyici tarafından değerlendirilmez !!! )

3.4.3. Programımızı yazalım

Buna göre yukarıdaki açıklamalara göre verdiğimiz ornek.asm olarak adlandıracağımız ilk

programı yazalım. İlk satırdan sonraki LIST ile hangi PIC’i kullandığımız, END ile de programın sona

erdiği belirtilir.

;ORNEK.ASM – 01/10/ 2010 ;Programı hatırlamak için ad ve tarihi yazıldı

LIST P = 16F84 ; Başlık Bölümü, kullanılan PIC bildiriliyor.

BSF h’03’,5 ; h’03’ de bulunan STATUS 5. biti 1 yap ve Bank1 ‘ e geç

MOVLW h’00’ ; W registerine ( 00 )16 sayısını yükle

MOVWF h’86’ ; h’86’ daki TRISB ye (00) yaz ve PORTB yi tamamen çıkış yap.

BCF h’03’,5 ; Bank0 ’a geç. Giriş/Çıkış işlemi bitti

MOVLW h’05’ ; W registerine ( 05 )16 sayısını yükle

MOVWF h’06’ ; W deki sayıyı PORTB ye yükle

END ; SON

Atama Komutu (EQU) Kullanarak Tekrar Yazalım

Özel Fonksiyon Register adresleri hatırlanması zor olabilmektedir. Bu sebeple başlangıçta EQU

komutu ile tanımlanmaktadır. Bu durumda h’06’ , h’03’ gibi adresler yerine PORTB, STATUS gibi

isimler (etiketler) doğrudan kullanılabilir. Bu şekilde anlaşılırlık da artmaktadır. Aksi takdirde yukarıdaki

gibi herbir registere ait adresin doğrudan kullanılması gerekir..

Bu şekilde aynı programı tekrar yazalım.

;ORNEK.ASM – 01/10/ 2015 ;Programı hatırlamak için adı ve tarihi yazıldı

LIST P = 16F84 ; Başlık Bölümü, kullanılan PIC bildiriliyor.

PORTB EQU h’06’ ; 0x06 adresi PORTB ‘ye atandı

STATUS EQU h’03’ ; 0x03 adresi STATUS’a atandı

TRISB EQU h’86’ ; 0x86 adresi TRISB ‘ye atandı

BSF STATUS,5 ; Giriş/Çıkışı ayarlamak için Bank1 ‘ e geç

MOVLW h’00’ ; W registerine ( 00 )16 sayısını yükle

MOVWF TRISB ; PORTB tamamen Çıkış yapıldı.

BCF STATUS,5 ;. Giriş/Çıkış işlemi bitti, Bank0 ’a geç

MOVLW h’05’ ; W registerine istenen ( 05 )16 ‘i yükle

MOVWF PORTB ; W deki sayıyı PORTB ye yükle

END ; SON

Ve yukarıdaki örnek programın icrasından sonra sonuçta PORTB çıkışında LED ler varsa RB0 ve

RB2 ye bağlı bulunanların yandığı diğerlerinin söndüğü görülür.

Page 25: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

25

3.5. MPASM Programı ile Derleme ve Önemli Dosyalar:

Aslında bilgisayar ekranında tek bir pencereden ibaret olan MPASM denilen programda bazı

dosyaların üretilmesi için yapılan ayarlar çok önemli bir rol oynamaz. Ancak özellikle programda hata varsa

veya değişiklikler yapmak istendiğinde bazı dosyaların üretilmesi faydalı olacaktır.

Bu nedenle aşağıdaki iki dosya ;

Hata dosyası için ( ornek .ERR ) : Error File

Programın toplu özeti için ( ornek .LIST ) : List File mutlaka üretilmelidir.

Ayrıca uyarı ve hataları birlikte almak için “Warning and Errors “ seçeneğini;

Processor için kullanacağımız ”16F84“ tercihini seçiniz. Hex dosyası formatı için “INHX8M” i

işaretleyiniz. Derlemek için “Browse” ikonu ile ornek.asm yi bulunduğu klasörde bulup “Tamam”a

tıklamak yeterli olacaktır. Sonuçta çıkan pencerede “Assembly Successful” mesajı alınırsa derlemenin

başarılı olduğu ve artık hex dosyasının bir programlayıcı kullanarak PIC 16F84 e yüklenebileceği anlaşılır.

Aslında MPASM ile derleme sırasında toplam 5 – 6 tane dosya üretmek mümkünse de ornek. lst

ve ornek. err dosyaları programcı için ayrı bir önem taşımaktadır.

List Dosyası : Bu dosya assembly programını yazarken kullandığımız metin editöründen (Not

Defteri) açılabilir. Bu dosya içinde her komutun program hafızasındaki

adresi,komutların hex karşılıkları, etiket ve etiket adresleri ile kullanılan ve boş

hafıza miktarı bulunur.

Hata Dosyası : Bu dosya da kullandığımız editör ile açılabilir. Programda komut

ya da etiket hatası varsa hatalı satır numarası bu dosyada görülür.

Mesela ; ornek.asm ‘de programı yazarken 8. satırda bir hata yapmış ve

BSF STATUS,5 yerine

BFS STATUS,5 şeklinde komutu yazmış olalım. Bu durumda ;

Error 122 C:\MPASM\ORNEK.ASM 8 : Illegal opcode (STATUS)

ifadesi ile karşılaşır. Bu hata mesajı ile derlenen dosyanın yeri, ne tür hata olduğu ve hatanın ilgili olduğu

register belirtilir. Bu hatanın *.LST dosyasında da hatanın yapıldığı satırdan hemen sonra belirtilmesi

programcıya kolaylık sağlar. Dolayısıyla sadece LIST dosyası bile yeterli olabilmektedir.

3.6. Include Dosyalar

Yukarıda belirtildiği gibi Assembly dilinde programlar yazarken kullanılacak register adreslerini

(EQU) komutu ile tanımlamak hem kolaylık sağlamakta hem de anlaşılırlığı arttırmakta idi. Ancak

özellikle programımızda çok sayıda register kullanıyorsak her sefer bu tanımları tekrar tekrar yapmak

gereksiz gibidir. Bu işlem programı da şişirecektir.

Bunun yerine Include Dosya kullanarak aynı isimli her PIC için sabit olan bu tanımları her

programda yeniden yapmaktan kurtulmuş oluruz.

Mesela; P16F84.INC “hazır” dosyası PIC16F84 için gerekli tanımları içerir ve MPASM klasörü

içinde (*.asm) dosyamızla aynı yerde bulunmalıdır. Programımız içinde Include Dosyası kullanabilmemiz için (PIC16F84 de)

INCLUDE “P16F84.INC” satırını programa yazmamız yeterlidir.

Artık her File Register için kullanılan (EQU) komutları kalktığı için Assembly programımız kısalıp

sadeleşecektir.

Page 26: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

26

Sadece Genel Amaçlı RAM bölgesinde ilerde kullanacağımız (SAYAC gibi) özel bir değişkenimiz

için

SAYAC EQU h’0C’

şeklinde EQU komutu yazmamız gerekecektir. İlerdeki örneklerde bu tür komut tanımlamaları verilecektir.

3.7. Konfigürasyon Bitleri

Bu bitler PIC’ e gerilim verildiği anda geçerli kuralları belirlemek içindir. Mesela; PIC devremizin

saatini (osilatörünü) RC tipi olarak kullanacaksak bunu bildirmemiz lazımdır.

Benzer şekilde;

Watchdog timer’ i (WDT) devreye sokmak veya çıkarmak,

Power-on Reset özelliğini devreye sokmak ya da çıkarmak,

Programı korumayı devreye almak veya almamak için bu konfigürasyon bitleri kullanılır.

Program içersinde bir satır olarak Konfigürasyon Bitlerini vermek üzere bu komutun yazılışına ait

bir örnek şöyle verilebilir:

_CONFIG _CP_ ON & WDT_OFF & PWRTE_OFF & RC_OSC

Prog. Koruma var Watchdog Timer OFF Power-on Reset Yok Osilatör Tipi (RC)

Burada;

& : “ve” demektir.

_ : Alt çizgi boşluk yerine kullanılıyor

OFF : Yok, devre dışı anlamına gelir. ON yazılsaydı devrede anlamında olacaktı.

Aslında konfigürasyon bitleri programa yazılmadan programlama esnasında da doğrudan

belirlenebilir. Zira bütün programlayıcı programları bu imkanı vermektedir.Ama her programlamada bir

hata yapmamak için program içinde yazmak daha kalıcı olacaktır

3.8. Akış Diyagramı Çizimi :

Genellikle program yazmadan önce akış diyagramı çizmekte büyük yarar vardır. Akış

Diyagramları, daha sonra programcının veya programı geliştirecek bir başkasının rahatça anlayabileceği

tarzda olmalıdır. Asıl olan budur. Aşağıda akış diyagramı için kullanılan bazı standart semboller verilmiştir.

Kullanılan Temel Semboller :

Çok basit programlarda akış diyagramına gerek olmazsa da biz burada bir örnek olarak çizelim.

Programcı, programı yazarken rahatça anlaşılacak şekilde akış diyagramını vermelidir.

Page 27: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

27

Aşağıda örnek programımıza ait akış diyagramı ve program birlikte gösterilmiştir. Her akış

diyagramı sembolünün yanında bir ya da daha fazla komut karşılığı yazılmıştır.

Akış diyagramı yukarıda görüldüğü gibi her zaman bir tek komuta karşılık gelmeyebilir. İstenirse

akış diyagramı sembollerinin içine gerekli komut doğrudan yazılabilir. Bütün mesele programcının yada

ilerde programı geliştirecek bir başka kişinin akış diyagramını anlayabilmesidir.

3.8.1. Programlanmış Bir PIC‘in Denenmesi

İlk deneme için fazla zaman harcamadan bir breadboard (delikli deneme tahtası) üzerinde PIC’e ve

osilatör devresine bağlanması gereken birkaç direnç , kondansatör ve kristal gibi elemanlardan faydalanmak

mümkündür. Çıkışları gözlemek için ise başlangıçta LED veya LED gösterge (Display) kullanmak uygun

olacaktır. Eğer devre doğru bağlanmış ve uygun DC gerilim ile beslenmiş ise programın çalışmaması

halinde programdaki hataların incelenmesi ve assembly dili üzerinde hatalar düzeltildikten sonra yeniden

derlenip PIC ‘e yüklenmesi gerekir. Ancak besleme olarak +5 Volttan fazla doğru gerilim uygulanan ya da

portlarından aşırı akım çekilmeye çalışılan PIC’lerin heran bozulma tehlikesiyle karşı karşıya olduğu

unutulmamalıdır.

Pratik Uygulamalı bir Örnek Program : Aşğıdaki devrede PIC’ e enerji verildiği anda önce

PORTB’yi tamamen sıfırladıktan sonra PORTA ‘da basılı bütona karşılık gelen PORTB deki LED’ leri

söndüren bir program yazalım.

Page 28: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

28

Programda INCLUDE komutu kullanalım,

;PROGRAM1.ASM ---------1/ 11 / 2015

LIST P = 16F84

INCLUDE “P16F84.INC”

CLRF PORTB ; PORTB yi tamamen sıfırla

BSF STATUS,5 ; Yönlendirme için BANK 1’ e geç

CLRF TRISB ; PORTB nin tümünü Çıkış yap.

MOVLW h‘FF’

MOVWF TRISA ; TRISA’ yı FF yükle, PORTA tamamen Giriş.

BCF STATUS,5 ; BANK 0’ a geç

MOVF PORTA,W ; PORTA’ yı oku sonucu W’ ye yaz

MOVWF PORTB ; W ‘ yi PORT B’ ye yaz (kopyala)

DONGU GOTO DONGU ; Sonsuz Döngü, bu komutta bekle

END ; Son

NOT: END komutundan önceki “ DONGU GOTO DONGU ” komutu kullanılmayabilir.Bu komut

programın sonlandırılmadan bu satırda bekletilmesini sağlar.

Pratik Gerçekleştirme İçin Gerekli Adımlar:

1) Programı yazıp PROGRAM1.ASM olarak kayıt (save) ediniz.

2) MPASM ile derleme yapıp (PROGRAM1.hex) dosyasını elde ediniz. Programlayıcıya PIC’ i

yerleştirip Konfigürasyon bitlerine dikkat ederek programı yükleyiniz. Konfigürasyon bitleri için

Osilatör tipi : RC

PWRT : ON

WDT : OFF

CP : OFF olmak üzere yukarıda anlatıldığı şekilde komut olarak yazılabilir.

Not: INCLUDE dosya kullanıldığı için 16F84.INC dosyasının da aynı klasör (directory) içinde

bulunmasını sağlamayı ihmal etmeyin.

3) Devreyi aşağıdaki gibi kurun.

NOT 1: RA0, RA3 girişleri de (+) beslemeye bağlıdır. Yani Lojik 1 almaktadır.

NOT 2: PIC devrelerinde besleme gerilimi (+ 5V) en az 0,1 F bir kondansatör ile şaseye bağlanmalıdır.

4) Devreye enerji vermeden A1, A2, A4 butonlarına tek yada birlikte basınız.

5) Basılan buton ve yana LED ilişkisini inceleyin.

NOT3: Hiçbir butona basılmazsa PORTA bitlerinin harici pull-up dirençleri (10k) dolayısıyla LED’ leri

yaktığı görülecektir. Zira PORTA normalde (1) olup basınca (0) olmaktadır.

6) Durum değiştirirken önce istediğiniz butonlara basın sonra RESET yapın.

Sonsuz Döngü: PIC16F84 de duraklama komutu olmadığı için Döngü kullanılmaktadır.

Programda bekleme yerine yeni butonların durumu okunmak isterse,

“DONGU GOTO DONGU” komutu yerine “GOTO OKU” yazılmalıdır.

Artık PIC’i RESET yapmaya gerek kalmadan tuşlara bastıkça LED değişmelerini görülebilir.

Page 29: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

29

4. BÖLÜM

KARAR İÇİN BİT TEST ETME ve DÖNGÜ

Bir programın her zaman aynı işlemleri yapması istenmez. Bu durumda belli bir parametreye ya da

bite bağlı olarak farklı işlemler yapması arzu edilebilir. PIC16F84 için herhangibir file registerin herhangi

bir bitine bağlı olarak farklı program parçaları yürütülerek program akışı devam ettirilebilir.

Test işlemi herhangi bir işlemin sonucuna, elde ya da borç olup olmadığına ve pek çok farklı

duruma bağlı olarak gerçekleştirilebilir. Ve sonuca göre program devam eder. Bu nedenle önce, şimdiye

kadar sadece 5. bitinin (RP0) görevini öğrendiğimiz STATUS registerinin bitlerini biraz daha ayrıntılı

olarak incelemek uygun olacaktır.

4.1 STATUS Register

Bu register PIC 16F84 ‘in Veri Hafızasında Bank0 da 0x03 ve Bank1 de 0x83 adreslerinde

bulunur. STATUS Registerinin içerdiği bitler ve görevleri kısaca şöyledir:

C (bit 0) : Elde Bayrağı denir. En soldaki bitte taşma varsa bu bit (1) olur.

DC (bit 1) : Dijit Elde Bayrağı adını alır. İkili tabanda işlem sırasında alt dörtlüden

üst dörtlüye (bit 3 den bit 4’e) elde geçişinde ( 1 ) olur.

Z (bit 2) : Sıfır bayrağı denir. Bir aritmetik yada mantık komutun sonucu = 0 ise bu

bayrak ( 1 ) olur.

PD (bit 3) : Enerji kesilme biti.

PIC’ e enerji verilince yada CLRWDT komutu çalışınca ( 1 ) olur.

SLEEP komutu ile ( 0 ) olur.

T0 (bit 4) : Zamanlayıcı süresi doldu biti.

PIC’ e enerji verildiğinde CLRWDT ve SLEEP komutu ile ( 1 ) olur.

WDT zamanlayıcısı zamanı dolduğu vakit (0) olur.

RP1–RPO (bit 6–bit 5) : Bank seçme bitleridir. ( 00 ) yapılırsa Bank 0, ( 01 )

yapılırsa Bank 1 seçilmiş olur (16F84’ de toplam 2 Bank olduğundan

daima RP1 = 0 kalmalıdır).

IRP (bit 7) : PIC 16F84’ de daima ( 0 ) kalmalıdır. Diğer PIC’lerde dolaylı adresleme için

kullanılır.

4.2 . Karar İçin Bit Test Etmek Herhangi bir file register içindeki herhangi bir bit test edilerek programın farklı şekilde

yönlenmesi sağlanabilir. Bu maksatla PIC16F84 ’de BTFSC ve BTFSS komutları kullanılır.Test

sonucuna göre ya bir komut atlanabilir yada bir sonraki (sıradaki) komuttan devam edilebilir. Böylece

Program farklı şekilde dallandırılmış olur. Bu tür komutlar gerektiren programlarda Akış Diyagramı

kullanılması programın yazılması ve takibini kolaylaştırır.

4.2.1. BTFSC Komutu:

Bu komut ingilizcede “File Register bitini test et, bu bit = (0) ise bir sonraki komuta atla” anlamına

gelmektedir. Söz konusu bit (1) ise BTFSC’nin hemen altındaki (sıradaki) komut yapılır.

Komut Formatı:

BTFSC File Register ,b

b yerine (0,........,7 arası bir sayı yazılır)

şeklindedir. Bir örnek program parçası ve ilgili akış diyagramı ile birlikte komutun çalışmasını inceleyelim:

Page 30: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

30

Evet

Hayır

PORTA,

bit 3

0 mı?

Tekrar Test

PORTB’nin 5.

bitini (1) yap

Aşağıdaki program parçası PORTA’ nın 3. bitini (RA3) test etmekte bu bit (0) ise

PORTB’ nin 5. bitini (1) yapmakta ; aksi halde test etmeye devam etmektedir.

(Bundan böyle, sadece sorudaki işlemin yapıldığı Program bölümü ya da komutları “Program

Parçası”olarak adlandırılacaktır.)

Program Parçası

TEST BTFSC PORTA, 3 ; PORTA nın 3. biti =0 mı?

GOTO TEST ; Değilse tekrar TEST’e git

BSF PORTB, 5 ; 3. bit =0 ise PORTB nin

5. biti=1 yap

NOT: PORTA ve PORTB’ nin önceden tanımlandığı kabul

edilmiştir.

4.2.2. BTFSS Komutu:

Bu komut BTFSC komutuna benzerdir. Ancak, file register bitinin (0) yerine (1) olup olmadığını

test etmektedir. Bu bit eğer (1) ise bir komut atlanmakta; değilse (0 ise) sıradaki komuttan devam

edilmektedir.

Komut Formatı:

BTFSS File Register ,b

b yerine (0,........,7 arası bir sayı yazılır)

Aşağıdaki örneği inceleyelim.

PORTA ‘nın 2. bitine (RA2=0) uygulanınca PORTB ‘nin (RB0,.........,RB3) bitlerini (1)

yapan bir programın tamamını akış diyagramı ile birlikte yazalım.

; PROGRAM 2.ASM…...09 / 10 / 2010

LIST P = 16F84

INCLUDE “P16F84.INC”

BSF STATUS, 5 ;

CLRF TRISB ; PORTB Çıkış

MOVLW h‘FF’

MOVWF TRISA ; PORTA Giriş

BCF STATUS, 5

TEST BTFSC PORTA, 2 ; RA2=0 mı?

GOTO TEST ; Hayırsa TEST’e git

MOVLW h‘0F’ ; Evetse W ye (0F) yaz

MOVWF PORTB ; W yi PORTB ye kopyala.

END ; Son

Page 31: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

31

4.2.3. Çeşitli Örnekler:

Örnek Program : PORTA’ nın 1. bitine (RA1) bağlı bütona basıldığında Lojik(0) aksi halde

(normalde) Lojik (1) üretilmektedir. Butona basılı olarak enerji verildikten sonra PORTB’ deki

RB4’ e bağlı (LED4) yakacak, daha sonra bütondan el çekilince PORTB’ nin tüm çıkışlarını (1)

yapan bir programı akış diyagramı ile birlikte yapınız.

(Akışın Devamı Yan Tarafta)

;PROGRAM3.ASM….........05/10/ 2010

LIST P = 16F84

INCLUDE “P16F84.INC”

BSF STATUS, 5

CLRF TRISB ; PORTB Çıkış

MOVLW h‘FF’

MOVWF TRISA ;PortA Giriş

BCF STATUS, 5 ; Bank 0 ‘ a geç

BSF PORTB, 4 ; RB4 ‘ü 1 yap.

TEST BTFSS PORTA, 1 ;RA1 =1 mi?

GOTO TEST ;Değilse TEST’e git.

MOVLW h‘FF’ ; Evetse buraya gel.

MOVWF PORTB ;PortB ‘nin tümünü 1 yap.

END ; Son

Örnek Program : PORTA’ nın 4. bitine bağlı ve normalde (0) durumunda olan butona basılınca

(1) gönderilmektedir. PORTA’ nın 4. bitine 1 (RA4 = 1) gelince B portuna bağlı 8 LED’ in

tamamının yanması istenmektedir. Akış diyagramı ile birlikte programı PIC16F84 için yazınız.

;PROGRAM 4.ASM--------11 / 10 / 2010

LIST P = 16F84

INCLUDE “P16F84.INC”

BSF STATUS, 5 ; Bank 1 ‘e geç

CLRF TRISB ; PORTB Çıkış

MOVLW h‘FF’

MOVWF TRISA ; PORTA Giriş

BCF STATUS, 5 ; Bank 0 ‘ a geç

TEST BTFSS PORTA, 4 ; RA4=1 mi?

Page 32: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

32

GOTO TEST ;Değilse TEST ’e git

MOVLW h‘FF’

MOVWF PORTB ;PortB ‘ye FF yaz.

END

Örnek Program : Enerji verildiği anda PORTA ‘nın 3. ve 4. bitleri (RA3, RA4) Lojik 1 iken her

ikisine de Lojik (0) verildiğinde PORTB ‘nin 5. , 6. , 7. bitlerini (1), diğerlerini (0) yapan aksi

takdirde RA3 ve RA4’ü test etmeye devam eden bir assembly programını PIC16F84 için yazınız.

; PROGRAM5.ASM-------------11 / 10 / 2010

LIST P = 16F84

INCLUDE “P16F84.INC”

BSF STATUS, 5 ; Bank 1’ e geç

CLRF TRISB ; PORTB tamamı Çıkış

MOVLW h‘FF’

MOVWF TRISA ; PORTA Giriş

BCF STATUS ; BANK 0’ a geç

TEST BTFSC PORTA, 3 ; PORTA’ nın 3. biti 0 mı?

GOTO TEST

BTFSC PORTA, 4 ; PORTA’ nın 4. biti (RA4= 0) mı?

GOTO TEST

MOVLW b‘11100000’ ; W ‘ye h‘E0’ yükle.

MOVWF PORTB ; PortB ‘ye h’E0’ yükle END

4.3. Döngü Kullanmak

Bazen belli işlem ya da işlemlerin belirli sayıda tekrarlanması istenebilir. Böyle bir durumda

SAYAC adıyla bir register tanımlanarak kullanılabilir. [Bunun için programda tercihan INCLUDE

komutundan sonra SAYAC EQU h’0C’ şeklinde tanımlama yapılmalıdır.]

Genellikle tekrar sayısı (SAYAC)’ a yüklendikten sonra her seferinde (SAYAC) 1 azaltılarak

Page 33: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

33

SAYAC =(00)16’ a ulaşılana kadar Döngü devamı ettirilir. SAYAC = (00)16 olduğunda program Döngüden

çıkarak yoluna devam eder.

Bu amaçla DECFSZ komutu kullanılması kolaylık sağlar.Bu komut her icra edildiğinde bu

register ( burada SAYAC ) 1 azaltılır ve SAYAC =(00)16 olunca bir sonraki komuta atlanır. Aksi halde

(SAYAC 0 ise) DECFSZ komutundan hemen sonraki (sıradaki) komut icra edilir. Bu komutun formatı:

DECFSZ SAYAC , d d yerine W yada F gelecektir!

Aşağıdaki program parçası ve akış diyagramında PORTB ‘nin ve SAYAC’ ın daha önce

tanımlandığı farz edilmiştir. Önce SAYAC’a h’FF’ sayısı yüklenmiş ve SAYAC azaltılmaya başlanmıştır.

SAYAC=(00)16 olana kadar HAYIR cevabı alınacak ve azaltma devam edecektir. Döngü bitince PORTB’

ye (FF) yüklenmektedir.

.

Program Parçası

. MOVLW h’FF’

MOVWF SAYAC ; SAYAC’a FF yükle

TEKRAR DECFSZ SAYAC, F ; SAYAC’ı 1 azalt

GOTO TEKRAR ; SAYAC=00 değilse

MOVLW h‘FF’ ;SAYAC=00 ise

MOVWF PORTB ;

.

.

Örnek Program : PORTA’ nın 2. bitine bağlı butona 10 kere basıldıktan sonra PORTB’ nin 0. bitine bağlı

LED’ in yakılması isteniyor (Her butona basılması arasında 25 peryot beklenmesi arzu edilmektedir.

Böylelikle butondan doğan parazitler engellenmiş ve bir basışta 10 kereyi birden saymasının önüne

geçilmiş olacaktır ). Gerekli programı PIC 16F84 için assembly dili ile yazınız.

; PROGRAM 6.ASM------------05 / 10 / 2010

LIST P = 16F84

INCLUDE “P16F84.INC”

SAYAC EQU h‘0C’ ; Veri Hafızasının Genel amaçlı kısmının ilk adresi

BSF STATUS, 5 ; Giriş/Çıkış İşlemi

CLRF TRISB

MOVLW h‘FF’

MOVWF TRISA

BCF STATUS, 5

MOVLW d‘10’

MOVWF SAYAC ; SAYAC’a desimal 10 sayısı yaz.

TEST BTFSC PORTA, 2 ; RA2= 0 mı?

GOTO TEST ; Değilse TEST etmeye devam et

NOP ; İşlem yapma, 25 tane NOP peşpeşe yazılacak

.

. ;(NOP : İşlem yapma,1 peryot bekle komutudur )

.

NOP ; Üstte toplam 25 adet NOP komutu var.

DECFSZ SAYAC, F ; Sayacı 1 azalt sonuç 0 mı?

Page 34: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

34

STATUS

Register

2

Z

0

C Elde bayrağı

Sıfır bayrağı

GOTO TEST ; Değilse TEST ‘e git

BSF PORT B, 0 ; Evetse, PORTB nin 0. bitini 1 yap.

END

Yukarıdaki örnekte 25 adet NOP (İşlem yapma) kullanılmıştır. Böyle bir sistemde bütona iki

basma arasında bekleme süresi arttırılmak istenirse (pratikte şarttır) bu sayı arttırılır. Ancak bu durumda

hafızanın gereksiz dolması gibi bir sorunla karşılaşırız. Bunun yerine 2. bir sayaç tanımlayarak az sayıda

(aşağıdaki örnekte 3 tane ) NOP’ un defalarca icrası ( mesela 255 kere) sağlanabilir.

5. BÖLÜM

KARŞILAŞTIRMA İŞLEMİ VE ÇIKARMA

KOMUTLARI

Döngüde kullanılan SAYAC veya benzeri bir file register her zaman azalan yönde çalışmaz. Bazı

uygulamalarda SAYAC’ın artan yönde sayması istenir. SAYAC’ın “1” arttırılması için INCF komutu

kullanılabilir. Her döngüde SAYAC değeri arttıkça istenen SAYAC değerine ulaşılıp ulaşmadığını

belirlemek için istenen sayı ile SAYAC değeri çıkartılarak karşılaştırılır. Çıkartma sonucu olan (Fark)

sıfıra eşit olduğunda yani eşitlik sağlanınca döngü sona erdirilir.

Bu işlemde çıkartma komutu gerektiğinden önce 2 adet olan çıkartma komutlarını inceleyelim.

Bunun için de STATUS registerinde önemli 2 bayrak olan Z ve C bayraklarına göz atalım.

Page 35: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

35

STATUS’un 2. biti olan Z bayrağı, bir işlemin sonucu sıfır olduğunda (Z=1) olan bir

bayraktır. Aksi halde yani sonuç sıfırdan farklı ise (Z=0) olur.

STATUS’un 0. biti olan C bayrağı, elde bayrağı olarak adlandırılırken çıkarma

işlemlerinde borç yoksa bu bayrak (1), borç varsa (0) değerini alır.

5.1. Çıkartma Komutları

SUBWF Komutu:

Bu komut, o andaki file registerinin içeriğini W registerinden çıkarır ve sonucu W yada file

registerine yazar. Komut Formatı;

SUBWF File registeri , W yada f şeklindedir.

Çıkarma sonucunda Z ve C bayraklarının değerleri çıkartılan iki sayı arasındaki ilişki bilgisini taşır.

Daha sonra bu bayrakların aldıkları değerlere göre programda dallanma gerçekleştirilebilir.

(File registeri – W) şeklindeki çıkartma işlemi için muhtemel durumlar şu şekilde

verilebilir :

File registeri > W ise Z = 0 ve C = 1

File registeri = W ise Z = 1 ve C = 1

File registeri < W ise Z = 0 ve C = 0

Örnek olarak SAYAC adlı file registeri sıfırladıktan sonra (09) olana kadar birer arttıran Z

bayrağını yani iki sayının eşitliğini test eden TEKRAR etiketli bir döngü düzenleyelim:

Program Parçası

CLRF SAYAC ; SAYAC’ı sıfırla

TEKRAR INCF SAYAC, F ; SAYAC ‘ı 1 arttır

MOVLW h‘09’

SUBWF SAYAC, W ; SAYAC’dan W yi çıkar

BTFSS STATUS, 2 ; Z bayrağı 1 mı?

GOTO TEKRAR ; Değilse TEKRAR ‘a git.

Program parçasındaki SAYAC değeri o ana kadar ki arttırma sayısını belirtir. Burada çıkarma

komutu olan SUBWF kullanılarak SAYAC değerinden aküye yüklenmiş (09) sayısı çıkartıldığında

sonucun durumuna göre STATUS registerinde bulunan Z ( Sıfır biti=bayrağı ) ve C ( Elde biti=bayrağı )

SAYAC’ ı sıfırla

W h‘09’

SAYAC’ ı 1 arttır

W’ den SAYAC’ı çıkart

Z = 1 mi?

EVET

HAYIR

SON

Page 36: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

36

etkilenir. SAYAC= 09 olduğunda yani fark sıfır ise (sıfır bayrağı olan) Z=1 olacaktır. Burada C

bayrağına ihtiyaç yoktur.

Yukarıdaki programda kullanılan SUBWF SAYAC, W komutu ile SAYAC’tan W

çıkarılarak sonuç W ‘ye yazılır , Ancak bu program parçasında sonucun yani farkın ne

olduğu bizi ilgilendirmemektedir. Biz bu farkın sıfır olup olmadığı ile ilgilenmekteyiz .

Bir başka bir örnek olarak aşağıdaki program parçası ile önce HAFIZA adı verilen ve daha önce

tanımlanmış bir adrese h‘35’ sayısını yazalım. Bu sayı akümülatöre (W’ ye) yüklenen sayıdan küçük

yada büyük ise (eşit değilse, Z=0 ise) PORTB’ nin 0. bitini ( RB0=1) yapalım. Aksi takdirde (DEVAM)

etiketine gönderelim.

Program parçası

MOVLW h‘35’

MOVWF HAFIZA ; HAFIZA registerine h’35’ yaz

MOVLW (SAYI) ; ( SAYI )’yı Aküye yükle.

SUBWF HAFIZA, W ; HAFIZA’dan W’ yi çıkar

BTFSC STATUS, 2 ; Z=0 mı?

GOTO DEVAM ; Değilse DEVAM’a git

BSF PORTB, 0 ; Evetse RB0=1 yap.

DEVAM ...........

NOT: (SAYI) yerine bir bytelık (h‘28’, h‘35’, h‘4A’ gibi ) çıkarılacak (karşılaştırılacak)

sayılardan 2.sayı yazılacaktır. DEVAM etiketi program parçasının sonunda (çıkışında) yer

almaktadır.

SUBLW Komutu:

SUBWF komutuna benzer olup bu komutla sabit sayıdan W ‘nin içeriği çıkarılır. Sonuç yine W

registerine yazılır. Komut formatı aşağıda verilmiştir.

SUBLW k ; Burada k, W’nın çıkarılacağı sabit sayıyı temsil etmektedir.

Örnek olarak bu komutu kullanarak W registerine h‘40’ yazdıktan sonra, h‘50’ sayısından W ’de

bulunan sayıyı çıkartalım. (W deki sayı h’50’ ile karşılaştırılıyor) Z bayrağı ( =0 ) ise PORTB’ nin 3., 4., ve

5. bitlerine (1) , diğerlerine (0) yüklensin. Aksi halde ilerdeki DEVAM adresine dallanmak üzere bir

program parçası yazalım.

Program parçası

MOVLW h‘40’ ; W’ye h’40’ yükle

SUBLW h‘50’ ; h’50’ den W deki h’40’ ı çıkart.

BTFSC STATUS, 2 ; Z bayrağı = 0 mı? (Sayılar farklı mı?)

GOTO DEVAM ; Değilse (=eşitse) DEVAM adresine git.

MOVLW b‘00111000’ ; C=0 ise PORTB nin istenen bitlerini (1) yap

MOVWF PORTB

DEVAM …….

Page 37: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

37

Örnek : PIC 16F84 için bir program parçası yazarak h‘1A’ sayısından h‘09’ sayısını

çıkarınız ve farkı PORTB’ ye yazınız. STATUS registerinin içeriğini de W’ ye aktarınız.

MOVLW h‘09’

SUBLW h‘1A’ ; h’1A’ sayısından W ‘deki 09 sayısını çıkar

MOVWF PORTB ; Fark PORTB’ ye yazıldı

MOVF STATUS, W ; STATUS Reg.’ i W’ ye aktarıldı

Örnek : (00)16’ dan başlayarak (08)16’ e kadar sayıları (00, 01, 02, ....., 08) (İleri Sayıcı gibi)

PORTB’ ye yazan bir program parçasını PIC16F84 için assembly dilinde yazınız.

CLRF SAYAC ; SAYAC’ı sıfırla

TEKRAR MOVF SAYAC, W ; SAYAC ‘yı W ‘ ye yükle

MOVWF PORTB ; PORTB den yolla

INCF SAYAC, F ; SAYAC’ ı 1 arttır

MOVLW h‘09’

SUBWF SAYAC, W ; (SAYAC – W) ‘i bul ve sonucu W ye yaz

BTFSS STATUS, Z ; Z bayrağı 1 mı?

GOTO TEKRAR ; Değilse TEKRAR’ a git.

DEVAM .......... ; Z=1 ise yoluna devam et...

5.2. Zaman Geciktirme Döngüleri

Bazı programlarda GECİKME bloğu kullanıldığı yani hiçbir şey yapmadan bir süre

beklenmesi gerektiği daha önce belirtilmişti. Örnek olarak bir tuşa basılıp basılmadığını test eden

bir programın bir süre tuşun basılı kaldığını algılaması gerekir. Burada o süre kadar beklemek

gerekebilir.

5.2.1. Zaman Geciktirme Nasıl Yapılır ?

Zaman geciktirme için ya yazılım ya da donanımsal geciktirme imkanlarından

yararlanmak gerekir. Gecikme sağlamak için Yazılım kullanıldığında her komutun icra süresi

bilinmeli ve ona göre toplam GECİKME hesaplanmalıdır. RC tipi osilatör kullanıldığında bu

elemanların sıcaklığa bağlı değer değiştirilmelerinden dolayı hassas bir gecikme süresi elde etmek

mümkün olmaz. Böyle bir durumda kristal / rezonatör kullanılması şarttır. Çok uzun gecikmeler

için CPU’nun verimli çalışması açısından Donanım Gecikmesi kullanılması elverişli olacaktır.

5.2.2. Komut Peryodu Nedir ?

PIC16F84 genellikle 4 MHz’ de çalıştırılır ve bu frekans içerde 4’ e bölünerek f = 1 MHz’ lik

dahili komut frekansı elde edilir. T= 1/f olduğundan T= 1 us (mikrosaniye) bir komutun icra

süresidir.

Bazı komutlar ise 2 peryotta icra edilir. Bunlar :

GOTO RETFIE

CALL INCFSZ (Sayaç 0 ise 1 peryot )

RETURN BTFSC (Test Biti =1 ise 1 peryot )

DECFSZ (Sayaç 0 ise 1 peryot ) BTFSS (Test Biti =0 ise 1 peryot )

RETLW Prog. Sayacına veri yazan komutlar

Page 38: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

38

5.2.3. Tek Döngü İle Maksimum ve Minimum Gecikme

Bir SAYAC registeri içine “FF” yazarsak maksimum, “01” yazarsak minimum gecikme elde

edilir. Aşağıdaki programda maksimum gecikme sağlamak için SAYAC’a (FF)16 = (255)10 yüklenmiştir.

Komut Peryot x İcra Sayısı

MOVLW h‘FF’ 1x1

MOVWF SAYAC 1x1

TEKRAR DECFSZ SAYAC, F 1 x 254 + 2

GOTO TEKRAR + 2 x 254

Toplam : 766 komut peryodu

Örnek : 4 MHz bir osilatörden beslenen PIC 16F84’ de 250 s gecikme sağlamak için bir

GECİKME rutini ( program parçası ) yazalım.

sμ1MHz14

MHz4 Bir dahili komut peryodu. Yani bir komut bu sürede yürütülür

Komut Peryot Sayısı

MOVLW h‘53’ 1

MOVWF SAYAC 1

TEKRAR DECFSZ SAYAC, F 1 x 82 + 2 (Programda h’53’= d’83’

dir)

GOTO TEKRAR + 2 x 82

250 peryot

O halde bu program parçası ile 1s x 250 = 250 s gecikme süresi elde edilmiş olur.

5.2.4. İçiçe İki Döngü İle Daha Fazla Gecikme

Tek döngüde SAYAC (FF) ile yüklense bile 766 peryot gecikme sağlanmakta idi. Bu süre az

gelebilir. Bu durumda içiçe 2 yada daha fazla döngü kullanılabilir. Bu amaçla kullanılacak bir çift döngü

rutin için akış diyagramı ve programı yapalım ( süre maximum olsun ).

İçiçe iki Döngü kullanan bir Akış Diyagramı ve Program Parçası

Bunun için kullanılabilecek bir Akış Diyagramı ve Program Parçası aşağıda verilmiştir. Böyle bir

program için elde edilebilecek yaklaşık Gecikme süresi de aşağıdaki tabloda verilmiştir.

Page 39: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

39

SAYAC 2

0 mı?

SAYAC 1 h‘FF’

SAYAC 2 h‘FF’

SAYAC 1

0 mı?

EVET

EVET

HAYIR

HAYIR

SAYAC 2’ yi

1 azalt

SAYAC 1’ i

1 azalt

Komut İcra sayısı x Komut Peryodu

MOVLW h‘FF’ 1 MOVWF SAYAC 1 1

TEKRAR1 MOVLW h‘FF’ 1 x 255

MOVWF SAYAC 2 1 x 255

TEKRAR2 DECFSZ SAYAC2, F 1 x 255 x 255

GOTO TEKRAR2 2 x 255 x 255

DECFSZ SAYAC1, F 1 x 255

GOTO TEKRAR1 2 x 255

Toplam : 196606 peryot

1 s (mikro saniye) dahili komut peryodu için 196606 s = 0,196 saniye ~ = 0.2 saniyelik

yaklaşık gecikme elde edilir. SAYAC1 ile SAYAC2 farklı da olabilir. Bu durumda (255)

yerine o sayının karşılığı olan desimal sayı hesaba katılmalıdır.

Daha fazla gecikme elde etmek için bir SAYAC daha (SAYAC3 gibi) tanımlanarak bu zaman

geciktirme döngüsünün en dışına içiçe iki döngüde olduğu gibi ekleme yapılabilir. Fakat bu tarzdaki çok

uzun döngüler mikroişlemciyi meşgul edeceğinden asıl yapılması gereken diğer işlemler aksayacaktır. Bu

durumda donanım gecikmesi (timer) kullanmak tercih edilir.

6. BÖLÜM

ALT PROGRAMLAR

Program içerisinde birden fazla kullanılacak rutinler ( program parçaları ) varsa bunlar tekrar

yazılmaz. Bu suretle hem Program Hafızası tasarrufu sağlanır hem de programın okunabilirliği arttırılır.

Bunun için tekrar kullanılacak program parçaları ALTPROGRAM olarak düzenlenir .

Bu maksatla Ana (asıl) Programdan Alt Programa CALL komutu ile gidilir, RETURN komutu ile

ana programdaki CALL komutunu hemen takip eden komuta geri dönülür. Dönüşün PIC içersinde

gerçekleştirilebilmesi için CALL komutuyla atlanırken geri dönüş adresinin saklanması gerekir. Bunun

için STACK REGISTER denilen özel bir registerden faydalanılır. Bu işlem otomatik yapıldığı için

programcının bu işlemle ayrıca ilgilenmesi gerekmez.

Page 40: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

40

CALL ALTP

END

STACK REG

RETURN

İlk Komut

Ana

Program

Alt

Program

6.1. Bir Alt Programın Çağrılması ile PIC İçersindeki Olaylar

Bir alt programın çalışmasını şematik çizersek ve numaralanmış olarak gerçekleşen

işlemleri gösterirsek :

Bu işlemleri sırayla yazarsak;

1. Ana program başlangıçtan itibaren çalışır.

2. CALL _ ALTP komutu ile Alt programın ilk komutuna atlanır.

3. Ana programdan ayrılma adresi STACK Registere otomatik olarak saklanır.

4. Alt program ilk komuttan itibaren icra edilir.

5. RETURN komutu ile karşılaşınca Alt programın bittiği anlaşılır ve Ana programda kaldığımız

yere geri dönülür.

6. STACK Registerde saklanmış ayrılma adresi alınır.

7. Ana program devam eder ve normal olarak END komutu ile son bulur.

şeklinde Alt Programa ait aşamalar elde edilir. Burada Programcı sadece CALL komutunu ve alt programı

yazmak ve bunların isimlerinin (etiketin) aynı olmasını sağlamakla yükümlüdür. Alt Program sonuna

RETURN yazılması, tüm programın (ana ve alt Programın) en altında END komutu bulunması zorunludur.

Diğer yukarıda sıralanan işlemler zaten PIC tarafından otomatik olarak yapılmaktadır.

6.2. Altprogramlı Program Parçası Örnekleri

Örnek : Bir çıkartma işlemi için ana programda 2. sayı PORTA ve akümülatöre alınacak daha

sonra altprogram çağrılıp burada PORTB deki 1. sayıdan 2. sayı çıkarılarak tekrar ana programa

dönülecektir ve sonuç tekrar PORTB ye yüklenecektir. Gerekli Program parçası ile altprogramı

yazınız.

Program Parçası CIKART AltProgramı

MOVF PORTA,W CIKART SUBWF PORTB,W

CALL CIKART RETURN

MOVWF PORTB (Altprogram END komutundan önce yer

almalıdır.)

Örnek : Bir AltProgram şeklinde bir Zaman Geciktirme Döngüsü kullanarak PORTB’ye bağlı

LED’lerin tamamını belli aralıklarla yakıp söndüren bir Program Parçası yazınız.

Page 41: MİKRODENETLEYİCİLER I DERS NOTLARI · göre tümleyeni elde edilirse artık çıkarma işlemi toplamaya dönüşmüş olmaktadır ki bütün mikroişlemciler bu yolu kullanmaktadır

41

16F84’ ü

tanıt, PORTB

çıkış

BAŞLA

PORTB’ yi sıfırla

PORTB h‘FF’

CALL GECİKME

CALL GECİKME

Program Parçası GECIKME Altprogramı

MOVLW h’00’ GECIKME MOVLW h’FF’

MOVWF PORTB MOVWF SAYAC1

CALL GECIKME DONGU1 MOVLW h’FF’

MOVLW h’FF’ MOVWF SAYAC2

MOVWF PORTB DONGU2 DECFSZ SAYAC2,F

CALL GECIKME GOTO DONGU2

GOTO TEKRAR DECFSZ SAYAC1,F

GOTO DONGU1

(Altprogram END komutundan önce yer almalıdır.)

Program Örneği: Gecikme altprogramı kullanarak Port B’ ye bağlı tüm LED’ leri yakıp

söndüren bir program için akış diyagramı çizerek gerekli assembly programını PIC 16F84 için

yapınız.

;PROGRAM.ASM 15 / 10 / 2009

LIST P = 16F84

INCLUDE “ P16F84.INC”

SAYAC1 EQU h‘0C’ ;16F84 de genel amaçlı RAM (Veri Hafızasında) ilk adres

SAYAC2 EQU h‘0D’

BSF STATUS,5

CLRF TRISB

BCF STATUS,5

DEVAM MOVLW h‘00’

MOVWF PORTB

CALL GECİKME

MOVLW h‘FF’

MOWF PORTB

CALL GECİKME

GOTO DEVAM

GECİKME MOVLW h‘FF’

MOWF SAYAC1

TEKRAR1 MOWF SAYAC2

TEKRAR2 DECFSZ SAYAC2, F

GOTO TEKRAR2

DECFSZ SAYAC1, F

GOTO TEKRAR1

RETURN

END

Faydalanılan Kaynaklar :

1- Mikroişlemciler (6502) Ders Notları 1 - 2, Y.Doç. Dr. Hakan ÜNDİL

2- Mikrodenetleyiciler ve PIC Programlama, Orhan ALTINBAŞ

3- PIC Mikrodenetleyiciler , Fevzi AKAR – Mustafa YAĞIMLI

4- Adım Adım PIC Programlama, Yaşar BODUR

5- Microchip PIC16F8X ve PIC16F877 PIC Data Sheet