Mikrodenetleyiciler

Transkript

Mikrodenetleyiciler
MİKRO DENETLEYİCİLER 1
DERS NOTLARI (Final)
Prof. Dr. Hakan Ündil
2014-2015 Güz
1.1. 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
açılımı
= 7*103 + 3*102 + 9*101 + 2*100 = (7392)10
1
karşılığı
karşılığı
karşılığı
0
-1
-2
2) (23,62)10 = 2*10 + 3*10 + 6*10 + 2*10
3
2
1
0
-1
3) (4021,2)5 = 4*5 + 0*5 + 2*5 + 1*5 + 2*5 = (511.4)10
On tabanı (desimal) bir sayının
Desimal virgüllü bir sayının açılımı
Beş tabanı bir sayı ve desimal
4) (101)2
= 1*22 + 0*21 + 1*20 = (5)10
İkili tabanda (Binary) bir sayı ve desimal
5) (57)16
= 5*161 + 7*160 = (87)10
16’lı tabanda bir sayının 10’lu tabanda
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
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1
10
11
12
13
14
15
A
B
C
D
E
F
1010
1011
1100
1101
1110
1111
1.2.3. Bazı Örnek Çevirme İşlemleri:
1) (0010 0111 0001 , 1111 1100) 2 = ( ? )16 (İkili tabandaki(binary) sayı önce dörtlü gruplar halinde
(
2
7
1
2) (41)10 = (?) 2
,
F
C
)16
düzenlenerek yukarıdaki Dönüşüm Tablosu
yardımıyla 16’lı tabana(heksadesimal) çevrilir.
olduğundan sonuç (271,FC)16 olarak bulunur)
( 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
2
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.
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.
3

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
 (010011)2
olur.
 (010100)2
Bu sayıda 1 gördüğümüz yere 0, 0 gördüğümüz yere 1 koyalım.
Sayısını elde ederiz. Bu sayı yukarıda bulunan (taban-1)„e göre tümleyen
Bu sayıya (1) eklersek bu defa tabana göre tümleyen elde edilir.
(1 ekleme iĢleminde, son iki basamak 11 olduğundan bunlar 00 yapılır,
bir üst basmak 1 olur)
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ı) tabanda yapılmıĢ ve
sonuçların aynı olduğu gösterilmiĢtir.
1- 8 haneli(bitlik) Örnek Bir Toplama İşlemi:
Binary
0110 1100
+ 0111 1101
1110 1011
Heks.
6C
+ 7F
EB
Desimal
108
+ 127
235
Binaryde 0+0=0, 0+1 ve 1+0=1, 1+1=0 (elde 1) dir.
Heks. İşlemde, önce C+F için 12+15=27 den 16 ( taban)
çıkarılmış yani 27-16=11 = (B)16 elde edilmiştir.
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.160 = (235)10 olduğundan sonuçlar uyuĢmaktadır.
2- 8 haneli(bitlik ) Örnek Bir Çıkarma İşlemi:
Binary
1000 1100
- 0111 1111
Hex
8C
-7F
0D
Desimal
140
- 127
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)
haneden 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.
4
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:
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
+ 1000 0001
1 0000 1101
Hex :
8C
+81
1 0D
(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)
5

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;
(+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 -25oC ş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.
6
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
0.011 1100
+ 0.100 0110
1.000 0010
olduğunu gösterelim:
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;
(Önce 0 yerine 1, 1 yerine 0 koyalım)
(+60) 10 = (0.011 1100)2
=> (1.100 0011) 2
(- 60)10 = (1.100 0100) 2
( Bu sayıya da 1 eklersek )
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 .
7
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ü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.
İş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.
………………….
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
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
8
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ı?
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.
9
5.1. Karşılaştırma İşlemi ve Çıkarma Komutu
SAYAC her zaman azalan yönde çalıĢmaz. Bazı uygulamalarda SAYAC‟ın arttırılması istenir.
SAYAC‟ın “1” arttırılması için INCF komutu kullanılır. Her döngüde SAYAC‟ ın arttığı durumlarda
SAYAC değeri istenen bir sayı ile çıkartma komutu kullanılarak karĢılaĢtırılır. EĢitlik sağlanınca döngü
sona erdirilir. Örnek olarak (09) kere tekrarlanan TEKRAR etiketli bir döngü düzenleyelim:
SAYAC‟ ı sıfırla
Program parçası
SAYAC‟ ı 1 arttır
W
h„09‟
W‟ den SAYAC‟ı çıkart
HAYIR
STATUS
2. biti 1 mi?
TEKRAR
CLRF
INCF
MOVLW
SUBWF
BTFSS
GOTO
END
EVET
SON
10
SAYAC
SAYAC, F
h„09‟
SAYAC, W
STATUS, 2
TEKRAR
; SAYAC ‘ı 1 arttır
; SAYAC’dan W yi çıkart
; Z bayrağı 0 mı?
; Değilse TEKRAR ‘a git
Programda SAYAC o ana kadar ki tekrar sayısını belirtir. Çıkarma komutu ile SUBWF ile
STATUS registerinde bulunan Z ( Sıfır biti=bayrağı ) ve C ( Elde biti=bayrağı ) etkilenir. Z bayrağı, bir
iĢlemin sonucu =0 olduğunda Z=1 olan bir bayraktır. C ise 1. bölümde incelelen toplama iĢlemindeki
elde, çıkarma iĢlemindeki borç ifade eden bayraktır. 7. bitten 8‟e taĢmak suretiyle ortaya çıkar.
STATUS
Register
2
0
Z
C
Elde bayrağı
Sıfır bayrağı
Bu noktada yukarıda kullanılan iki Çıkartma Komutunu daha ayrıntılı inceleyelim;

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
d yerine W yada f yazılır.
,d
(f – W) Ģeklindeki çı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 dallanma
gerçekleĢtirilir.
File registeri > W ise
File registeri = W ise
File registeri < W ise

Z=0 C=1
Z=1 C=1
Z=0 C=0
olur.
NOT: Yukarıdaki programda kullanılan SUBWF SAYAC, W komutu ile SAYAC’tan W
çıkarılarak sonuç W ‘ye yazılır , Ancak bu programda sonucun yani farkın ne olduğu bizi
ilgilendirmemekte biz farkın sıfır olup olmadığı ile ilgilenmekteyiz .
Bir baĢka bir örnek olarak aĢağıdaki program parçasında önce HAFIZA adı verilen ve daha önce
EQU komutu ile tanımlanmıĢ bir registere h„35‟ sayısını yazalım. Bu sayı W‟ ye yüklenen sayıdan
küçük yada büyük ise PORTB‟ nin 0. bitini ( 1 ) yapalım. Aksi takdirde (DEVAM) adresine gönderelim.
Gerekli program parçası:
Program parçası
DEVAM
MOVLW
MOVWF
MOVLW
SUBWF
BTFSC
GOTO
BSF
...........
h„35‟
HAFIZA
( SAYI )
HAFIZA, W
STATUS, 2
DEVAM
PORTB, 0
; HAFIZA registerine h’35’ yaz
; ( SAYI )’yı Aküye yükle.
; HAFIZA’dan W’ yi çıkar
;RB0=1 yap.
NOT: ( SAYI ) yerine h„28‟, h„35‟, h„4A‟ gibi bir bytelık çıkarılacak sayılardan 2.sayı yazılacaktır.
DEVAM etiketi program parçasının sonunda (çıkıĢında) yer almaktadır.
11

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. C bayrağı ( =0 ) ise PORTB‟ nin 3., 4., ve 5. bitlerine ( 1 ) , diğerlerine (0)
yüklensin. Aksi halde ilerdeki DEVAM etiketinin bulunduğu komuta gitmek üzere bir program parçası
yazalım.
Program parçası
DEVAM
MOVLW
SUBLW
BTFSC
GOTO
MOVLW
MOVWF
…….
h„40‟
h„50‟
STATUS, 0
DEVAM
b„00111000‟
PORTB
; W’ye h’40’ yükle
; h’50’ den W deki h’40’ ı çıkart.
; C bayrağı = 0 mı?
; Değilse DEVAM adresine git.
; C=0 ise PORTB nin istenen bitlerini (1) yap
Örnek Program : PIC 16F84 için bir program 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.
;PROGRAM 7.ASM---08 / 10 / 2010
LIST
P = 16F84
INCLUDE “P16F84.INC”
CLRF
PORTB
BSF
STATUS, 5
; Bank 1’ e geç
CLRF
TRISB
; B portu çıkış
BCF
STATUS, 5
; Bank 1’ e geç
MOVLW
h„09‟
SUBLW
h„1A‟
; h’1A’ sayısından W ‘deki 09 sayısını çıkar
MOVWF
PORTB
; Fark Port B’ ye yazıldı
MOVF
STATUS, W ; STATUS Reg.’ i W’ ye aktarıldı
END
; SON
Örnek Program : (00)16‟ dan baĢlayarak (08)16‟ e kadar sayıları (00, 01, 02, ....., 08) (sayıcı gibi)
PORT B‟ ye yazan bir program PIC16F84 için assembly dilinde yazınız.
;PROGRAM8.ASM----06 / 10 / 2010
LIST
P = 16F84
INCLUDE “P16F84.INC”
SAYAC
EQU
h„0E‟
; Sayaç genel amaçlı RAM de (0E) adresinde olsun.
BSF
STATUS, 5
; Bank 1 ‘e geç
CLRF
TRISB
; Port B tamamı çıkış
BCF
STATUS, 5
; Bank 0 ‘a geç
CLRF
SAYAC
; SAYAC’ı sıfırla
TEKRAR MOVF
SAYAC, W
; SAYAC ‘ı W ‘ ye yükle
MOVWF PORT B
; PORTB ‘den yolla
INCF
SAYAC, F
; SAYAC’ ı 1 arttır
MOVLW h„09‟
SUBWF
SAYAC, W
; (SAYAC – W) ‘yi bul ve sonucu W ‘ye yaz
12
BTFSS
GOTO
END
5.1.
; Z bayrağı 1 mı?
; Değilse TEKRAR’ a git
; Son
STATUS, Z
TEKRAR
Döngü Kullanmak
Bazen belli iĢlem ya da iĢlemlerin belirli sayıda tekrarlanması istenebilir. Böyle bir durumda
örnek olarak SAYAC isimli bir file register kullanılabilir. Genellikle tekrar sayısı (SAYAC)‟ a
yüklendikten sonra her döngüde (SAYAC) 1 azaltılarak SAYAC = h‟00‟ a ulaĢılana kadar döngü
devamı ettirilir. SAYAC = h‟00‟ olduğunda program döngüden çıkarak yoluna devam eder.
Bu amaçla DECFSZ komutu kullanılabilir. Bu komut her icra edildiğinde ilgili file register
(burada SAYAC) 1 azaltılır ve SAYAC = h‟00‟ olunca bir sonraki komuta atlanır. Aksi halde
(SAYAC  h‟00‟ ise) DECFSZ komutundan hemen sonraki (sıradaki) komut icra edilir.
Bu komutun formatı (kullanılıĢ biçimi): (File Register yerine SAYAC kullanılmıştır)
DECFSZ
SAYAC
,
d
W yada F
Ģeklindedir.
AĢağıdaki örnek 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= h‟00‟ olana kadar SAYAC=00 mı? sorusuna “HAYIR” cevabı alınacak ve
azaltma devam edecektir. Döngü bitince de PORTB‟ ye ( FF ) yüklenmektedir.
.
Program Parçası
.
MOVLW
MOVWF
TEKRAR DECFSZ
GOTO
MOVLW
MOVWF
h‟FF‟
SAYAC ; SAYAC’a FF yükle
SAYAC, F ; SAYAC’ı 1 azalt
TEKRAR ; SAYAC=0 değilse
h„FF‟
;SAYAC=0 ise
PORTB
;PORTB ye W yi yaz
.
.

Örnek : PORTA‟ nın 2. bitine (RA2) bağlı butona 10 kere basıldıktan sonra PORTB‟ nin 0.
bitine (RB0) bağlı LED‟ in yakılması isteniyor (Her butona basılması arasında 25 komut peryodu
beklenmesi arzu edilmektedir. Böylelikle butondan doğan parazitler engellenmiş ve bir basışta 10
kere basılmış gibi sayılmasının önüne geçilmiş olacaktır. Bekleme süresi yetersiz ise
arttırılabilir). Gerekli program parçasını PIC 16F84 için assembly dili ile yazınız.
Program Parçası
MOVLW
MOVWF
TEST BTFSC
GOTO
NOP
d„10‟
SAYAC
PORTA, 2
TEST
; SAYAC’a d’10’ sayısı yaz.
; RA2= 0 mı?
; Değilse TEST etmeye devam et
; İşlem yapma, 25 tane NOP peşpeşe yazılacak
13
.
.
.
.
NOP
DECFSZ
GOTO
BSF
...
;(NOP : İşlem yapma,1 peryot bekle komutudur )
; Üstte toplam 25 adet NOP komutu var.
; SAYAC’ı 1 azalt sonuç (00) mı?
; Değilse TEST ‘e git
; Evetse, PORTB nin 0. bitini 1 yap.
SAYAC, F
TEST
PORTB, 0
Yukarıdaki örnekte 25 adet NOP (İşlem yapma) kullanılmıĢtır. Böyle bir sistemde bütona iki
basma arasındaki bekleme süresi arttırılmak istenirse bu sayı arttırılır. Ancak bu durumda program
hafızasının gereksiz dolması gibi bir sorunla karĢılaĢırız. Bunun yerine ilerde incelenecek zaman
geciktirme programları kullanılır.
Karşılaştırma İşlemi ve Çıkarma Komutları
5.2.
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.
STATUS
Register
2
0
Z
C
Elde bayrağı
Sıfır bayrağı



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.
SUBWF (Çıkarma) 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 :
14
File registeri > W ise
File registeri = W ise
File registeri < W ise
Z = 0 ve C = 1
Z = 1 ve C = 1
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:
SAYAC‟ ı sıfırla
SAYAC‟ ı 1 arttır
W
h„09‟
W‟ den SAYAC‟ı çıkart
HAYIR
Program Parçası
CLRF
TEKRAR INCF
MOVLW
SUBWF
BTFSS
GOTO
SAYAC
SAYAC, F
h„09‟
SAYAC, W
STATUS, 2
TEKRAR
; SAYAC’ı sıfırla
; SAYAC ‘ı 1 arttır
; SAYAC’dan W yi çıkar
; Z bayrağı 1 mı?
; Değilse TEKRAR ‘a git.
Z = 1 mi?
EVET
SON
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ğı )
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
MOVWF
MOVLW
SUBWF
BTFSC
h„35‟
HAFIZA
(SAYI)
HAFIZA, W
STATUS, 2
; HAFIZA registerine h’35’ yaz
; ( SAYI )’yı Aküye yükle.
; HAFIZA’dan W’ yi çıkar
; Z=0 mı?
15
GOTO
BSF
...........
DEVAM
; Değilse DEVAM’a git
; Evetse RB0=1 yap.
DEVAM
PORTB, 0
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 (Çıkarma) 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ı
DEVAM
MOVLW
SUBLW
BTFSC
GOTO
MOVLW
MOVWF
…….
h„40‟
h„50‟
STATUS, 2
DEVAM
b„00111000‟
PORTB
; W’ye h’40’ yükle
; h’50’ den W deki h’40’ ı çıkart.
; Z bayrağı = 0 mı? (Sayılar farklı mı?)
; Değilse (=eşitse) DEVAM adresine git.
; C=0 ise PORTB nin istenen bitlerini (1) yap
Ö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
SUBLW
MOVWF
MOVF
h„09‟
h„1A‟
; h’1A’ sayısından W ‘deki 09 sayısını çıkar
PORTB
; Fark PORTB’ ye yazıldı
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
TEKRAR MOVF
MOVWF
INCF
MOVLW
SUBWF
BTFSS
GOTO
DEVAM
..........
SAYAC
SAYAC, W
PORTB
SAYAC, F
h„09‟
SAYAC, W
STATUS, Z
TEKRAR
; SAYAC’ı sıfırla
; SAYAC ‘yı W ‘ ye yükle
; PORTB den yolla
; SAYAC’ ı 1 arttır
; (SAYAC – W) ‘i bul ve sonucu W ye yaz
; Z bayrağı 1 mı?
; Değilse TEKRAR’ a git.
; Z=1 ise yoluna devam et...
16
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
CALL
RETURN
DECFSZ (Sayaç  0 ise 1 peryot )
RETLW
RETFIE
INCFSZ (Sayaç  0 ise 1 peryot )
BTFSC (Test Biti =1 ise 1 peryot )
BTFSS (Test Biti =0 ise 1 peryot )
Prog. Sayacına veri yazan komutlar
5.3.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.
Peryot x İcra Sayısı
Komut
TEKRAR
MOVLW
MOVWF
DECFSZ
GOTO
h„FF‟
SAYAC
SAYAC, F
TEKRAR
Toplam :

1x1
1x1
1 x 254 + 2
+
2 x 254
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.
4 MHz
1MHz 
4
1μs
Bir dahili komut peryodu. Yani bir komut bu sürede yürütülür
17
Peryot Sayısı
1
1
Komut
MOVLW h„53‟
MOVWF SAYAC
TEKRAR
dir)
DECFSZ
SAYAC, F
GOTO
1 x 82 + 2
TEKRAR
+
(Programda h’53’= d’83’
2 x 82
250 peryot
O halde bu program parçası ile 1s x 250 = 250 s gecikme süresi elde edilmiĢ olur.
5.3.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 ).
5.3.5.
İçiçe iki Döngü kullanan bir Akış Diyagramı ve Program Parçası
AkıĢ Diyagramı ve Programı 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.
SAYAC 1
h„FF‟
SAYAC 2
h„FF‟
SAYAC 2
0 mı?
HAYIR
SAYAC 2‟ yi
1 azalt
EVET
SAYAC 1
0 mı?
HAYIR
SAYAC 1‟ i
1 azalt
EVET
Komut
MOVLW
h„FF‟
MOVWF
SAYAC 1
TEKRAR1 MOVLW
MOVWF
İcra sayısı x Komut Peryodu
1
1
h„FF‟
SAYAC 2
1 x 255
1 x 255
18
TEKRAR2 DECFSZ
GOTO
DECFSZ
GOTO
SAYAC2, F
TEKRAR2
SAYAC1, F
TEKRAR1
1 x 255 x 255
2 x 255 x 255
1 x 255
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 . 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.
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 :
Ana
Program
CALL ALTP
STACK REG
END
Ġlk Komut
Alt
Program
RETURN
Bu iĢlemleri sırayla yazarsak;
1. Ana program baĢlangıçtan itibaren çalıĢır.
19
CALL _ ALTP komutu ile Alt programın ilk komutuna atlanır.
Ana programdan ayrılma adresi STACK Registere otomatik olarak saklanır.
Alt program ilk komuttan itibaren icra edilir.
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.
2.
3.
4.
5.
Ģ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ı
MOVF
CALL
MOVWF
almalıdır.)

CIKART AltProgramı
PORTA,W
CIKART
PORTB
CIKART
SUBWF
PORTB,W
RETURN
(Altprogram END komutundan önce yer
Ö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.
Program Parçası
MOVLW
MOVWF
CALL
MOVLW
MOVWF
CALL
GOTO
GECIKME Altprogramı
h‟00‟
PORTB
GECIKME
h‟FF‟
PORTB
GECIKME
TEKRAR
GECIKME MOVLW
h‟FF‟
MOVWF
SAYAC1
DONGU1
MOVLW
h‟FF‟
MOVWF
SAYAC2
DONGU2 DECFSZ
SAYAC2,F
GOTO
DONGU2
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
20
SAYAC2 EQU
BSF
CLRF
BCF
DEVAM MOVLW
MOVWF
CALL
MOVLW
MOWF
CALL
GOTO
h„0D‟
STATUS,5
TRISB
STATUS,5
h„00‟
PORTB
GECİKME
h„FF‟
PORTB
GECİKME
DEVAM
GECİKME MOVLW
MOWF
TEKRAR1 MOWF
TEKRAR2 DECFSZ
GOTO
DECFSZ
GOTO
RETURN
END
h„FF‟
SAYAC1
SAYAC2
SAYAC2, F
TEKRAR2
SAYAC1, F
TEKRAR1
BAġLA
16F84‟ ü
tanıt, PORTB
çıkıĢ
PORTB‟ yi sıfırla
CALL GECĠKME
PORTB
h„FF‟
CALL GECĠKME
BÖLÜM 7. ARİTMETİK İŞLEMLER
7.1.
RLF Komutu (Bir bit Sola Kaydırma)
Bir file register içinde bulunan bitlerin birer bit sola kaydırılması iĢlemidir. Bu durumda en solda
bulunan ( 7. bit ) C ( elde ) bayrağına geçmekte, daha önce C‟ de bulunan bit ise en sağdaki ( 0.) bite
geçmektedir. Komutun formatı;
RFL
FİLE REGISTER
,
d
W yada F ( Sonucun Yeri )
Komutu Ģematik gösterirsek;
Program Örneği : Bir programla önce PORTB ye h‟01‟ yükleyin. Daha sonra 1 defa bu biti sola
kaydırın. Bu iĢlemin daha iyi görülebilmesi için üst üste 2 kere GECIKME alt programı kullanın.
GECİK1
GECİK2
; PROGRAM.ASM
LIST
P = 16F84
INCLUDE
“ P16F84.INC”
EQU
h„0C‟
EQU
h„0D‟
BCF
STATUS, 0
21
; Elde yi sıfırla
BASLA
16F84‟ ü tanıt
PORTB çıkıĢ
PORTB
01
BEKLE
BSF
CLRF
BCF
MOVLW
MOVWF
CALL
CALL
RLF
GOTO
STATUS, 5
TRISB
STATUS, 5
h„01‟
PORTB
GECIKME
GECIKME
PORTB,F
BEKLE
; Bank1’e geç
; PORTB Çıkış
; Bank0’a geç
;PORTB’ ye 01 yaz
; Bekleme yap
; Tekrar Bekleme yap
; 1 bit sola ötele
CALL GECIKME
GECIKME MOVLF
MOVWF
DONGU 1 MOVLW
MOVWF
DONGU2 DECFSZ
GOTO
DECFSZ
GOTO
RETURN
END
CALL GECIKME
RLF PORT B
SON
7.2.
h„FF‟ ; Önceki Gecikme Alt Prog ile aynı
GECIK1
h„FF‟
GECIK2
GECIK2, F
DONGU2
GECIK1, F
DONGU1
RRF Komutu (Bir Bit Sağa Kaydırma)
RRF komutu da RLF komutuna benzer olup fark bu defa kaydırma iĢleminin sağa olması
dolayısıyla en sağdaki bit (0.bit) C ( elde ) bayrağına geçecektir. Daha önce C bayrağında bulunan
bit ise bu sefer en soldaki (7.bite) geçecektir. Komut formatı;
RRF FİLE REGİSTER
,
d
Sonucun gideceği yer
W yada F
Mesela MEM adlı bir file registere hex 30 sayısını yazın. Aynı anda C bayrağı da (C= 1) ise RRF
komutunun icrasından önce ve sonraki durum:
Bu iĢlem için kullanılacak program komutları :
MOVLW
MOVWF
RRF
h„49‟
MEM
MEM, F
; W Registerine (49)16 yükle
; W „ yi MEM adresine sakla
; MEM ‟ i Sağa bir bit ötele Ģeklinde olacaktır.
22
BÖLÜM 8 - ARİTMETİK İŞLEMLER
PIC Mikrodenetleyicilerde aritmetik iĢlem komutları diğer komutlar kadar gerekli olmakta,
özellikle toplama, çıkartma ve (2n =2,4,8,16) ile çarpma ve (2n =2,4,8,16) ile bölme iĢlemleri bu
komutlarla kolaylıkla gerçekleĢtirilebilmektedir.
PIC16F84 „de bulunan Temel Aritmetik ĠĢlem Komutları Ģöylece özetlenebilir :


ADDLW : Bir sabiti W register ile toplar. Ve sonucu yine W registerine yazar.
ADDWF : W register ile File registeri toplar. Sonucu File registere ya da W„ye
yazar.
SUBLW : Bir sabitten W‟ yi çıkarır. Ve sonucu yine W registerine yazar
SUBWF : File registerden W‟ yi çıkarır. Sonucu File registere yada W „ye
yazar.
RLF
: C bayrağı üzerinden bitleri sola kaydırır (döndürür) [2 ile çarpma].
RRF
: C bayrağı üzerinden bitleri sağa kaydırır (döndürür) [2 ile bölme].
( Dağıtılan Komut tablosunu ve önceki dönem konularını inceleyiniz)




NOT: 1) 8 bit toplamada C (elde-carry) bayrağı sonucun 8 bit dıĢına taĢıp taĢmadığını
gösterir. ġayet toplama komutu sonunda


C = 0 ise sonuç 8 biti (h‟FF‟ sayısını) aĢmamıĢtır.
C = 1 ise sonuç 8 biti (h‟FF‟ sayısını) aĢmıĢtır.
NOT: 2) 8 bitlik iĢaretsiz çıkartmada (0......255)10 = (0….FF)16 aralığında elde edilen sonuçta;
NOT: 3)
8.1.

C = 1 ise sonuç pozitiftir.
[Yani 1.sayı 2.sayıdan BÜYÜK‟ dür].
Borç (ödünç) yoktur…

C = 0 ise sonuç negatiftir.
[Yani 1.sayı 2. sayıdan KÜÇÜK‟ dür].
Borç (ödünç) vardır…
ĠĢaretli sayılarla yapılan çıkartma iĢlemlerinde C bayrağı dikkate alınmaz.
Eğer ( -128 ..... +127) aralığı dıĢına çıkılmamıĢsa sadece 7. bit (Sonuç byte‟ının en
solundaki bit) iĢareti tayin eder! Bu bit „0‟ ise sonuç pozitif, „1‟ ise sonuç negatiftir !
 Bu dönemki çalıĢmalarda iĢaretli sayılar üzerinde iĢlem yapılmayacaktır.
8 Bit Toplama:
PIC16F84‟ de 8 bit toplama için 2 komut mevcuttur:
1) ADDLW Komutu: Sabit sayı ile W (Aküde) registerinde bulunan sayıyı toplar ve
neticeyi W registerine yazar.
Örn:
ADDLW
h‟08‟
; h’08’ sayısını W’ ye ekler.
2) ADDWF Komutu : W registerinde bulunan sayı ile File registeri toplar ve sonucu
File registere yada W registere yazar.
23
Örn:
MEM, F ; W ile MEM registeri toplanır,
sonuç tekrar MEM’ e yazılır.
ADDWF
Çeşitli Hex. (16 „lı tabanda) Toplama İşlemleri:
1)
h‟09‟
h‟DE‟
h‟E7‟
C Bayrağı : 0 oldu.

h‟03‟
h‟FB‟
h‟FE‟
C Bayrağı : 0 oldu.
2)
h‟F8‟
4)
h‟FE‟
h‟08‟
h‟08‟
1 h‟00‟
1 h‟06‟
C Bayrağı : 1 oldu
C Bayrağı :1 oldu
3)
O halde sonuç h‟FF‟ den büyükse toplama iĢleminde C bayrağı= (1) olmaktadır.
Örnek : Önce W registerine h‟5D‟ yazdıktan sonra bu sayıyı h‟42‟ ile toplayıp neticeyi hem W
registerine ve hem de PORTB‟ye yazmak için akıĢ diyagramı çizerek assembly program parçasını
yazınız. Sonucu ve C bayrağını bulunuz.
MOVLW
ADDLW
MOVWF
h‟5D‟
h‟42‟
PORTB
; h’5D’ yi W ye yükle
; h’42’ ile topla
;W deki sonuç PORTB ye
ĠĢlemleri yaparsak :
ĠĢlemi hem 16‟lı (heksadesimal) hem de 2‟li (binary) tabanda yaparsak;
Heks. olarak;
5D
42
9F
C bayrağı = 0
8.2.
Binary olarak;
0101 1101
0100 0010
1001 1111
C bayrağı = 0 (Sonuç FF’den küçük olduğu için)
16 Bit (İki Byte) Toplama :
Toplama iĢleminde h‟FF‟ = d‟255‟ (1 byte)‟ den daha büyük sayılar kullanıyorsak toplama
yapmadan önce bu sayıyı 2 byte‟lık parçalar halinde ifade ederiz. Ve sonucu da 2 byte olarak buluruz.
Örnek olarak h‟019F‟ sayısını ele alalım. Burada „01‟ i ise üst byte ve „9F‟ i alt byte, olmak
üzere 16 bitlik (16’lı olarak 4 haneli) sayıyı iki kısma ayırırız. Daha sonra toplanacak diğer sayıyı da
aynen ikiye ayırıp alt byte‟ları birlikte, üst byte‟ları da yine kendi aralarında topladıktan sonra alt
byte‟ların toplamını bir registere, üst byte‟ların toplamını bir baĢka registere yazarız.
Bu arada alt byte‟ların toplamından (elde-carry) oluĢursa bu eldeyi üst byte‟lardan birine eklemek
gerekir. Bu durumda akıĢ diyagramını bu program parçası için çizersek:
24
Örnek : h‟32A6‟ sabit sayısı ile h‟2E9C‟ sabit sayısını toplayarak sonucun alt-byte‟ını
PORTB‟ ye yazın. Daha sonra Program parçası GECIKME alt programına giderek neticenin
bu kez üst-byte‟ını UST‟ adlı registere gönderip yine GECIKME‟ ye gidecek ve tekrar en
baĢa dönerek iĢlemleri sürekli tekrarlayacaktır. AkıĢ diyagramını çizip, program parçasını
yazın (GECIKME alt programı yazılmayacaktır).
X. sayısı
Y. sayısı
32
2E
1. sayı üst byte (XH)
1. sayı alt byte (XL)
A6
9C
2. sayı alt byte (YL)
2. sayı üst byte (YH)
Önce toplama iĢlemini yapalım:
Hex.
Desimal
32 A6
+ 2E 9C
61 42
Akış Diyagramı
Binary
12966
+ 11932
24898
0011 0010 1010 0110
+ 0010 1110 1001 1100
0110 0001 0100 0010
Program Parçası
XL
XH
YL
YH
EQU
EQU
EQU
EQU
BASLA MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
h‟0C‟
h‟0D‟
h‟0E‟
h‟0F‟
; XL için 1 byte’lık yer ayır.
; XH için 1 byte’lık yer ayır.
; YL için 1 byte’lık yer ayır.
; YH için 1 byte’lık yer ayır.
h‟A6‟
XL
h‟32‟
XH
h‟9C‟
YL
h‟2E‟
; Verilen değerler X,Y lere yazıldı.
25
MOVWF
TOPLA MOVF
ADDWF
MOVWF
BTFSC
INCF
CALL
MOVF
ADDWF
MOVWF
CALL
GOTO
8.3.
; X ve Y byte’ları ayrılan registerler yükle.
YH
XL, W
YL, W
PORTB
STATUS, 0
XH, F
GECIKME
XH, W
YH, W
UST
GECIKME
BASLA
; XL ve YL yi topla.
;Sonucu PORTB ‘ye yaz
; C = 0 mı?
; Hayırsa XH’ı (1) arttır
;Gecikme alt prog. çağır
; YH ile XH ‘ı topla.
; Sonucu UST ‘e yaz
;Gecikme altprogramını çağır
8 Bit Çıkartma:
PIC16F84 Mikrodenetleyicisinde 2 tür çıkartma komutu vardır. Daha önce karĢılaĢtırma iĢlemi
için (Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve
SUBWF Ģeklindedir. Kısaca hatırlarsak;

SUBLW komutunda sabit sayıdan W registerinin içeriği çıkarılarak sonuç W‟ ye yazılır.
Örn:

SUBLW
h‟09‟
; h’09’ dan W registeri çıkarılır, sonuç W’ ye yazılır.
SUBWF komutunda ise File registerden W çıkarılır ve sonuç W‟ ye yada File registere yazılır.
Örn:
SUBWF
MEM, F
; MEM adı ile tanımlı registerin içeriğinden W çıkarılır
; ve sonuç F’ e yazılır.
Örn:
SUBWF
h‟20‟, W
;0x20 adresinde bulunan sayından W çıkarılır,Wye yazılır
İşaretsiz Sayılarla Çeşitli Çıkartma İşlemleri:
1)
h„08‟
2)
h‟09‟
h‟FF‟ (Binaryde Tümleyen Arit. kullanarak)
C bayrağı = 0 (sonuç negatif)
h‟08‟
h‟07‟
h‟01‟
C bayrağı = 1 (sonuç pozitif)
Örnek : PORTA‟ da bulunan h‟1B‟ sayısından h‟0A‟ sayısını çıkaran ve neticeyi PORTB‟ ye
yazan bir program parçasını ve ilgili akıĢ diyagramı ile yapınız. Sonucu ve C bayrağının değerini veriniz.
MOVLW
SUBWF
MOVWF
26
h‟0A‟
PORTA, W
PORTB
; PORTA – (0A)
; Sonuç PORTB ye
İşlem: Hex.
Komplement Aritmetiği İle
h‟1B‟
h‟0A‟
h‟11‟
C bayrağı = 1(Borç yok)
0001 1011
0000 1010
0001 1011
1111 0110
0001 0001
C bayrağı = 1 olur.
Örnek : MEM1 adlı registerde bulunan h‟35‟ sayısından h‟4C‟ sayısını çıkardıktan sonra elde
edilen „negatif‟ sayıyı PORTB‟ deki LED‟ leri yakarak ( 1 yaparak) gösteren bir program parçası yazınız.
Yanacak LED‟ leri ve C bayrağını bulunuz.
Program Parçası:
MOVLW
SUBWF
COMPF
INCF
MOVF
MOVWF
h‟4C‟
MEM1, F
MEM1, F
MEM1
MEM1, W
PORTB
;0
1, 0
1 koyar.
; 1 arttırır, tabana göre komplement’i(tümleyeni) bulur.
; MEM1 ‘i W’ ye alır.
; sonucu PORTB’ ye yazar.
Hex. Yapalım
Binary Yapalım
h‟35‟
h‟4C‟
h‟-17‟
0011 0101
0100 1100
PORTB‟ de RB4, RB2, RB1, RB0
bağlı LED‟ ler yanacaktır.
0011 0101
1011 0100
1110 1001 (negatif)
Tümleyen alınırsa
0001 0111
h‟17‟(C=0)
17
8.5.
16 Bit (İki byte) Çıkartma:
16 bit toplamaya benzerdir. Eksilen ve çıkan sayıların üst ve
alt byte‟ları için birer olmak üzere 4 byte kullanılması gerekir.
Örnek olarak h‟53A8‟ sayısından h‟24F6‟ sayısını çıkarmak için;
Borç
Genel bir „akıĢ diyagramı parçası‟ çizersek :
53 A8
yandaki gibi bir durum ortaya çıkacaktır.
24 F6
Alt byteları çıkar
Hayır
(Borç
varmı?)
C = 0 mı?
2E B2
Evet
 Bu defa altbyte‟ların çıkartılamasından borç kaldıysa
1. sayının üstbayt‟ından [burada 53’den] (1) çıkarılmalıdır.
1. sayının üst byte‟ından
(1) çıkar
Üst byteları çıkar
27
Cevap: -
Örnek : Yukarıda verilen 2 byte‟lık 1.sayının sırasıyla düĢük ve yüksek anlamlı byte‟lar olmak
üzere MEM1L ve MEM1H adlı registerlerde bulunduğu , yine 2 byte‟lık 2. sayının MEM2L ve MEM2H
adlı registerlerde mevcut olduğunu varsayarak çıkarma iĢlemini yapınız. Sonucun alt byte‟nı PORTB „ye
yazınız, üst byte‟nı ise RA0 biti = 0 olduktan sonra yine PORTB‟ ye gönderilmesini sağlayan bir
program parçası yazınız .
Program Parçası:
CIKAR MOVF
SUBWF
BTFSS
DECF
MOVF
SUBWF
MOVF
MOVWF
TEST BTFSC
GOTO
MOVF
MOVWF
MEM2L, W
MEM1L, F
STATUS, 0
MEM1H, F
MEM2H, W
MEM1H, F
MEM1L, W
PORTB
PORTA, 0
TEST
MEM1H, W
PORTB
; MEM1L ‘den MEM2L ‘yi çıkart.
; C = 0 mı? (Borç var mı?)
; Evetse MEM1H’ dan 1 eksilt
; Hayırsa W
MEM2H
; Üst byte sonucunu yine MEM1H’a yaz.
;W
MEM1L
; Alt byte sonucunu PORTB’ ye
; RA0’ a basıldı mı?
; Hayırsa TEST’ e git.
; Evetse MEM1H ‘ı W ’ye aktar.
; Üst byte’ ı PORTB’ ye yükle.
*********
Faydalanılan Kaynaklar :
12345-
MikroiĢlemciler (6502) Ders Notları 1 - 2, Y.Doç. Dr. Hakan ÜNDĠL
Mikrodenetleyiciler ve PIC Programlama, Orhan ALTINBAġ
PIC Mikrodenetleyiciler , Fevzi AKAR – Mustafa YAĞIMLI
Adım Adım PIC Programlama, YaĢar BODUR
Microchip PIC16F8X ve PIC16F877 PIC Data Sheet
28

Benzer belgeler