1
MİKRODENETLEYİCİLER I
DERS NOTLARI Prof. Dr. Hakan Ündil
2014-2015 Güz
(Vize sonuna kadar olan kısımdır.)
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
2
denir. 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.
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
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
5
(CA,03)16 = (1100 1010,0000 0011)2 şeklinde ikili tabandaki sonuç elde edilir.
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
(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
( Sayının tam kısmı yok ! , 10 0 = 1 ‘den verilen sayı çıkarılmış. )
(101100)2 Tabana göre tümleyeni 2 6 - (101100)2 = (1000000)2 - (101100)2 = = (010100)2
(26 sayısı binary karşılığı (1000000)2 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
(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
(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 = (111111)2- (101100)2 =
= (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)
6
1.3.2. Binary (2’li) ve Heksadesimal(16’lı) Tabanda Örnek İşlemler:
Biz ikili tabandaki işlemleri genellikle 8 haneli (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ı) hem de Desimal (10’lu)
tabanda yapılmış ve sonuçların aynı olduğu gösterilmiştir.
1- 8 haneli(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 ikili tabanda 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 gerek lojik devreler gerekse kullanılan yazılımlar 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 metot 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şlemleri çıkmaktadır.
Bu sebeple yukarıda bahsedilen pratik tümleyen yolu kullanılarak çıkartma aşağıdaki gibi yapılabilir.
7
* Yukarıdaki örnekte ikinci sayı olan (0111 1111)2 sayısının tabana göre tümleyeni basit ve kısa
olarak iki adımda bulunabilir:
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 yukarıdaki çıkartma örneğindeki 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 ve 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. Mesela 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:
Sayının işaretsiz karşılığı ile aynı şekilde gösterilir. Örnek olarak desimal (+25) sayısını ele
alalım;
(+25)10 = (+19)16 = (0.001 1001)2 (Baştaki “0.“ sayının pozitif olduğunu gösteriyor)
(İkili tabanda en soldaki basamağın yanındaki nokta, işaret bitini ayırt etmek için kullanılmıştır.)
Burada (+25)10 işaretli desimal sayısı mikroişlemci içindeki hafızada (19) heksadesimal sayısı
ile temsil edilmektedir.
8
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;
(+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ıyı 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 (asıl) cevabın (E7) nin tabana göre tümleyeni olan ( -19)16 = (- 25)10 olduğunu bilmemiz ve
bulmamız 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 olup olmadığını inceleyelim :
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.
9
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;
(+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. (taban-1 olan 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ınca negatif olduğu anlaşılır.
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 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ümleyenlerini alalım:
1.100 0100 = (-60)10 ,
1.011 1010 = (-70 )10 değerlerini buluruz.
10
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ç; (-80)16 =(–128)10 ‘den küçük ( Desimal olarak -129, -130... gibi)
ya da (+7F)16 = (+127)10 ‘den büyük (Desimal olarak +129, +130... gibi) ise ,
bir başka ifade ile sayı bitlerden işaret bitine bir etki gelmiş ise sonucun işareti, dolayısıyla sonuç
hatalı olacaktır.
8 bit işlemler için iş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İKRODENETLEYİCİLERE GENEL
BAKIŞ ve PIC
3. BÖLÜM - PIC16F84 ve ASSEMBLY DİLİ
PROGRAMI
(Bu iki bölüm derste işlenen Power Point Dosyada bulunmaktadır,
Programınızın web sayfasına bakınız)
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 veya 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 (7.) 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
11
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.
(Not: Her komutun hangi bayrağı etkilediği komut tablosunda belirtilmiştir)
4.2 . Karar İçin Bit Test Etmek
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 atlanır yada bir sonraki (sıradaki) komuttan devam edilir. 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 komut atla” anlamına
gelmektedir. Test edilen 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:
Örnek : 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.
(NOT: Bundan böyle, sadece soruda bahsedilen işlemin yapıldığı Program bölümü ya da komutları
“PROGRAM PARÇASI”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 etiketli komuta git
BSF PORTB, 5 ; 3. bit =0 ise PORTB nin 5. biti=1 yap
-----------
12
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)
Örnek : PORTA ‘nın 2. bitine (RA2=0) uygulanınca PORTB ‘ye h’0F’ yükleyen aksi halde test
etmeye devam eden bir assembly program parçasını akış diyagramı ile birlikte yazalım.
Program Parçası
---------
TEST BTFSC PORTA, 2 ; RA2=0 mı?
GOTO TEST ; Hayırsa TEST etiketli komuta git
MOVLW h‘0F’ ; Evetse W ye (0F) yaz
MOVWF PORTB ;W yi PORTB ye kopyala.
----------
4.2.3. Çeşitli Örnekler:
Örnek : Önce PORTB’nin 4. Bitine bağlı LED 4 yakıldıktan sonra PORTA’nın 1. Bitinde
(RA1) Lojik 1 var ise PORTB’ nin tüm çıkışlarını (1) yapan aksi halde test eden bir program
parçasını akış diyagramı ile birlikte yazınız.
Program Parçası
--------
BSF PORTB, 4 ;RB4 ‘ü 1 yap.LED4 ü yak
TEST BTFSS PORTA, 1 ;RA1 =1 mi?
GOTO TEST ;Değilse TEST etiketli komuta git.
MOVLW h‘FF’ ; Evetse buraya gel.
MOVWF PORTB ;PortB ‘nin tümünü 1 yap.
--------
13
Örnek : PORTA’ nın 4. bitine bağlı ve normalde (0) veren bir butona basılınca (1)
gönderilmektedir. Söz konusu bütona basılınca PORTB ye bağlı 8 LED’ in tamamının
yanması istenmektedir. (LED ler source tipi bağlıdır) Soruda söz edilen kısmın Akış diyagramı
ile birlikte program parçasını PIC16F84 için yazınız. Sadece büton bağlantısını gösteriniz.
Program Parçası
-----------
TEST BTFSS PORTA, 4 ; RA4=1 mi?
GOTO TEST ; Değilse TEST ’e git
MOVLW h‘FF’ ; Aküye h’FF’ yaz
MOVWF PORTB ; Aküyü PortB aktar.
-----------
(Büton Bağlantısı yandadır.)
Örnek : PORTA ‘nın 3. ve 4. bitleri (RA3, RA4) Lojik (0) ise 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 tamamen yazarak akış diyagramını çiziniz.
; PROGRAM.ASM-------------11 / 10 / 2014
LIST P = 16F84 ; PIC’i tanıt.
INCLUDE “P16F84.INC” ; PIC’in registerlerini tanıt
BSF STATUS, 5 ; Bank 1’ e geç
CLRF TRISB ; PORTB’nin tamamı Çıkış
MOVLW h‘FF’
MOVWF TRISA ; PORTA’nın tamamı Giriş
BCF STATUS ; BANK 0’ a geç
TEST BTFSC PORTA, 3 ; PORTA’ nın 3. biti(RA3= 0) 0 mı?
GOTO TEST ; Değilse TEST etiketli komut git.
BTFSC PORTA, 4 ; PORTA’ nın 4. biti (RA4= 0) mı?
GOTO TEST ; Değilse TEST etiketli komut git.
MOVLW b‘11100000’ ; Aküye h‘E0’=b’11100000’ yükle.
MOVWF PORTB ; PortB ‘ye h’E0’ yükle END
*******
Vize Sınavı Sonudur.
Derslerde işlenen farklı örnekler de vizeye dahildir
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
Top Related