MİKRO DENETLEYİCİLER 1 DERS NOTLARI (Final) Prof. Dr. Hakan Ündil Güz

Benzer belgeler
5. BÖLÜM - DÖNGÜ (ÇEVRİM) ve Z BAYRAĞI

MİKRO DENETLEYİCİLER II DERS NOTLARI (Vize) Prof. Dr. Hakan Ündil Bahar

16F84 ü tanıt, PORTB çıkış MOVLW h FF MOWF PORTB

MİKRO DENETLEYİCİLER II DERS NOTLARI (VİZE KONULARI) Prof. Dr. Hakan Ündil Bahar-Vize

KONFİGÜRASYON BİTLERİ

MİKRODENETLEYİCİLER I DERS NOTLARI Prof. Dr. Hakan Ündil Güz (Vize sonuna kadar olan kısımdır.)

# PIC enerjilendiğinde PORTB nin 0. biti 1 olacak #PIC enerjilendiğinde PORTA içeriğinin tersini PORTB de karşılık gelen biti 0 olacak

1. PORTB ye bağlı 8 adet LED i ikili sayı sisteminde yukarı saydıracak programı

BSF STATUS,5 ;bank1 e geçiş CLRF TRISB ;TRISB= BCF STATUS,5 ;bank0 a geçiş

KOMUT AÇIKLAMALARI VE ÖRNEKLERİ

DERS 7 PIC 16F84 PROGRAMLAMA İÇERİK. PIC 16F84 örnek programlar Dallanma komutları Sonsuz döngü

MİKRODENETLEYİCİLER II DERS NOTLARI Prof. Dr. Hakan ÜNDİL Bahar-FİNAL KISMI

W SAYAC SAYAC SAYAC. SAYAC= ise, d=0 W

B.Ç. / E.B. MİKROİŞLEMCİLER

MİKROİŞLEMCİLER VE MİKRO DENETLEYİCİLER 2 DERS NOTLARI Prof. Dr. Hakan Ündil Bahar-Final

Deney No Deney Adı Tarih. 3 Mikrodenetleyici Portlarının Giriş Olarak Kullanılması / /201...

BÖLÜM 3 3. PIC 16F8X KOMUTLARI 3.1.KULLANILAN SEMBOLLER: 3.2.KOMUTLAR VE KULLANIM ÖRNEKLERİ

Mikroişlemciler Ara Sınav---Sınav Süresi 90 Dk.

MİKRODENETLEYİCİLER 2 DERS NOTLARI Prof. Dr. Hakan ÜNDİL Bahar-Final Kısmı

MİKRODENETLEYİCİLER II DERS NOTLARI Prof. Dr. Hakan ÜNDİL Bahar-FİNAL KISMI

Assembler program yazımında direkt olarak çizgi ile gösterilmemesine rağmen ekranınız ya da kağıdınız 4 ayrı sütunmuş gibi düşünülür.

PIC TABANLI, 4 BASAMAKLI VE SER

UYGULAMA 05_01 MİKRODENETLEYİCİLER 5.HAFTA UYGULAMA_05_01 UYGULAMA_05_01. Doç.Dr. SERDAR KÜÇÜK

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu

PIC MİKROKONTROLÖR TABANLI MİNİ-KLAVYE TASARIMI

PIC MIKRODENETLEYICILER-3: GECĠKME ve KESME PROGRAMLARI

PIC MİKRODENETLEYİCİLERİN HAFIZA YAPISI. Temel olarak bir PIC içerisinde de iki tür hafıza bulunur:

3.2 PIC16F84 Yazılımı PIC Assembly Assembler Nedir?

PIC 16F84 VE TEK BUTONLA BĐR LED KONTROLÜ

Sistem Gereksinimleri: Uygulama Gelistirme: PIC Mikroislemcisinin Programlanmasi: PIC Programlama Örnekleri -1

LCD (Liquid Crystal Display )

Hacettepe Robot Topluluğu

IŞIĞA YÖNELEN PANEL. Muhammet Emre Irmak. Mustafa Kemal Üniversitesi Mühendislik Fakültesi. Elektrik-Elektronik Mühendisliği Bölümü

Hacettepe Robot Topluluğu

LCD (Liquid Crystal Display)

MİKRODENETLEYİCİLER I DERS NOTLARI Güz-Final. 1. BÖLÜM GİRİŞ ve SAYI SİSTEMLERİ 1.1. Devrelendirilmiş Lojik

Komutların İşlem Süresi

HUNRobotX - Makaleler - Gecikme Kodları Hazırlama ve Gecikme Rutini Hazırlayıcı. Makaleler Gecikme Kodları Hazırlama ve Gecikme Rutini Hazırlayıcı

T.C. MİLLÎ EĞİTİM BAKANLIĞI DENİZCİLİK MİKRODENETLEYİCİ 2

PIC16F877A nın Genel Özellikleri

Bu yürütme, Prof. Dr. Hakan ÜNDİL (Bir haftalık derse ait ders notudur)

PIC Mikrodenetleyiciler. Hazırlayan:Öğr.Gör.Bülent ÇOBANOĞLU 1

Program Kodları. void main() { trisb=0; portb=0; while(1) { portb.b5=1; delay_ms(1000); portb.b5=0; delay_ms(1000); } }

# PIC enerjilendiğinde PORTB nin 0. biti 1 olacak #PIC enerjilendiğinde PORTA içeriğinin tersini PORTB de karşılık gelen biti 0 olacak

MİKROİŞLEMCİ (MİKROPROSESÖR - CPU) NEDİR? Prof. Dr. Hakan ÜNDİL (Bir haftalık derse ait ders notudur)

Bank değiştirme Bir banktan diğerine geçmek için STATUS register denilen özel registerin 5. ve 6. bitinin durumunu değiştirmek gerekir.

Yrd.Doç. Dr. Bülent ÇOBANOĞLU. Sakarya Üniversitesi, Teknoloji Fakültesi

8 Ledli Havada Kayan Yazı

Mikroişlemci: Merkezi işlem biriminin fonksiyonlarını tek bir yarı iletken tümleşik devrede birleştiren programlanabilir sayısal elektronik devre

DEVRELENDİRİLMİŞ LOJİK

Hyper Terminal programı çalıştırıp Uygun COM portu ve iletişim parametrelerinin ayarları yapılıp bekletilmelidir.

MİKRODENETLEYİCİLER ÖRNEK PROGRAMLAR

ELEKTRİK-ELEKTRONİK TEKNOLOJİSİ

MTM 305 MĠKROĠġLEMCĠLER

MIKROBILGISAYARLAR ve PIC PROGRAMLAMA TEST ÇALIŞMA SORULARI

HUNRobotX - Makaleler - Hız Ayarlı Çoklu DC Motor Kontrolü. Makaleler Hız Ayarlı Çoklu DC Motor Kontrolü

ÖĞRENME FAALİYETİ-1 1. MİKRODENETLEYİCİ PROGRAMI YAZMA

T.C FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ EET-302 MİKROİŞLEMCİLER LABORATUVARI DENEY FÖYÜ

Program AkıĢ Kontrol Yapıları

SAYI SİSTEMLERİ. Sayı Sistemleri için Genel Tanım

BLM221 MANTIK DEVRELERİ

T.C FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ EET-302 MİKROİŞLEMCİLER LABORATUVARI DENEY FÖYÜ

Sayı sistemleri-hesaplamalar. Sakarya Üniversitesi

BÖLÜM 1 ALT PROGRAMLAR 1.1.ALTPROGRAM NEDİR?

PIC16F87X te ADC MODÜLÜNÜN KULLANIMI

DERS 5 PIC 16F84 PROGRAMLAMA İÇERİK. PIC 16F84 bacak bağlantıları PIC 16F84 bellek yapısı Program belleği RAM bellek Değişken kullanımı Komutlar

Mikrobilgisayarda Aritmetik

ONDOKUZ MAYIS ÜNİVERSİTESİ

Her bir kapının girişine sinyal verilmesi zamanı ile çıkışın alınması zamanı arasında çok kısa da olsa fark bulunmaktadır -> kapı gecikmesi

ELEKTRİK-ELEKTRONİK TEKNOLOJİSİ

T.C. MİLLÎ EĞİTİM BAKANLIĞI MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ENDÜSTRİYEL OTOMASYON TEKNOLOJİLERİ

BUTON KONTROLÜ. Pull-Down Bağlantı (Ters Bağlantı) Butona basılmadığında Giriş=1 Butona basıldığında Giriş=0

BILGISAYAR ARITMETIGI

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

PIC MİKRODENETLEYİCİ KULLANARAK BİR SİSTEMİN TELEFONLA UZAKTAN KONTROLÜ

TUŞ TAKIMI (KEYPAD) UYGULAMALARI

T.C. MİLLÎ EĞİTİM BAKANLIĞI MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ENDÜSTRİYEL OTOMASYON TEKNOLOJİLERİ

Bu dersimizde pic pinlerinin nasıl input yani giriş olarak ayarlandığını ve bu işlemin nerelerde kullanıldığını öğreneceğiz.

Program akıģı sırasında belirtilen satır numaralı yere gitmek için kullanılır. Genel formu: [<satır numarası>] GOTO <satır numarası 1> GOTO n

MİKRODENETLEYİCİ GELİŞTİRME SETİ TASARIM VE UYGULAMALARI. öğrencilerine eğitimleri esnasında iş hayatında karşılaşabilecekleri kontrol işlemleri ve

Yrd. Doç.Dr. Bülent ÇOBANOĞLU. Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 1

MEB YÖK MESLEK YÜKSEKOKULLARI PROGRAM GELİŞTİRME PROJESİ. 1. Tipik bir mikrobilgisayar sistemin yapısı ve çalışması hakkında bilgi sahibi olabilme

ÖĞRENME FAALİYETİ-1 ÖĞRENME FAALİYETİ 1

MİKROİŞLEMCİ (Microprocessor) NEDİR?

Hacettepe Robot Topluluğu

Giriş MİKROİŞLEMCİ SİSTEMLERİ. Elektronik Öncesi Kuşak. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Kuşak. Bilgisayar teknolojisindeki gelişme

PİC BASİC PROFESSİONAL

Sayıtlama Dizgeleri. (a n a n-1 a n1 a n0. b 1 b 2 b m )r. simgesi şu sayıyı temsil eder.

Hacettepe Robot Topluluğu

Fatih University- Faculty of Engineering- Electric and Electronic Dept.

Bölüm 3 Toplama ve Çıkarma Devreleri

BİLİŞİM TEKNOLOJİLERİ

YILDIZ TEKNİK ÜNİVERSİTESİ ELEKTRİK - ELEKTRONİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ. EasyPic6 Deney Seti Kullanım Kılavuzu

T.C. MİLLÎ EĞİTİM BAKANLIĞI MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ELEKTRİK ELEKTRONİK TEKNOLOJİSİ

T.C. MİLLÎ EĞİTİM BAKANLIĞI ELEKTRİK ELEKTRONİK TEKNOLOJİSİ MİKRODENETLEYİCİYLE ANALOG İŞLEMLER 523EO0022

Bir işaretli büyüklük sayısında en soldaki basamak bir işaret içerir. Diğer basamaklarda ise sayısal değerin büyüklüğü (mutlak değeri) gösterilir.

BÖLÜM 1

T.C. MİLLÎ EĞİTİM BAKANLIĞI MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ELEKTRİK ELEKTRONİK TEKNOLOJİSİ

DENEY-1. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

PIC UYGULAMALARI. Öğr.Gör.Bülent Çobanoğlu

Transkript:

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 25 O C 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*10 3 + 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*10 1 + 3*10 0 + 6*10-1 + 2*10-2 Desimal virgüllü bir sayının açılımı 3) (4021,2) 5 = 4*5 3 + 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*2 2 + 0*2 1 + 1*2 0 = (5) 10 İkili tabanda (Binary) bir sayı ve desimal karşılığı 5) (57) 16 = 5*16 1 + 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 1

10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 15 F 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 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; göre) (2 sayısı ikili tabanda 0010 ve 9 sayısı ise 1001 olduğuna (41) 10 = (29) 16 = (0010 1001) 2 aynı BaĢtaki sıfırlar dikkate alınmazsa 2 ye bölerek elde edilen ile 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 10 5-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 10 0 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 (2 6 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 10 5-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 10 0-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 2 6 - (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 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) 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 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.16 1 +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) 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 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 (- 5 o C) 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 -25 o C ş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 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; (+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. 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 SAYAC ı 1 arttır W h 09 W den SAYAC ı çıkart HAYIR STATUS 2. biti 1 mi? SON EVET Program parçası CLRF SAYAC TEKRAR INCF SAYAC, F ; SAYAC ı 1 arttır MOVLW h 09 SUBWF SAYAC, W ; SAYAC dan W yi çıkart BTFSS STATUS, 2 ; Z bayrağı 0 mı? GOTO TEKRAR ; Değilse TEKRAR a git END 10

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 Z 0 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 d yerine W yada f yazılır. (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 Z = 0 C = 1 File registeri = W ise Z = 1 C = 1 File registeri < W ise 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ı 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 GOTO DEVAM BSF PORTB, 0 ;RB0=1 yap. DEVAM... 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 h 40 ; W ye h 40 yükle SUBLW h 50 ; h 50 den W deki h 40 ı çıkart. BTFSC STATUS, 0 ; C bayrağı = 0 mı? GOTO DEVAM ; Değilse DEVAM adresine git. MOVLW b 00111000 ; C=0 ise PORTB nin istenen bitlerini (1) yap MOVWF PORTB. Ö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 STATUS, Z ; Z bayrağı 1 mı? GOTO TEKRAR ; Değilse TEKRAR a git END ; Son 5.1. 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 h FF MOVWF SAYAC ; SAYAC a FF yükle TEKRAR DECFSZ SAYAC, F ; SAYAC ı 1 azalt GOTO TEKRAR ; SAYAC=0 değilse MOVLW h FF ;SAYAC=0 ise MOVWF 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 d 10 MOVWF SAYAC ; SAYAC a d 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 13

... ;(NOP : İşlem yapma,1 peryot bekle komutudur ). NOP ; Üstte toplam 25 adet NOP komutu var. DECFSZ SAYAC, F ; SAYAC ı 1 azalt sonuç (00) mı? GOTO TEST ; Değilse TEST e git BSF PORTB, 0 ; Evetse, PORTB nin 0. bitini 1 yap.... 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. 5.2. Karşılaştırma İşlemi ve Çıkarma Komutları 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 Z 0 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 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: SAYAC ı sıfırla SAYAC ı 1 arttır W h 09 W den SAYAC ı çıkart 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. HAYIR Z = 1 mi? SON EVET 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 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ı? 15

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 (Çı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 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. Ö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... 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 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 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. 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. 4MHz 1MHz 1μs Bir dahili komut peryodu. Yani bir komut bu sürede yürütülür 4 17

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.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ı? SAYAC 1 0 mı? EVET HAYIR HAYIR SAYAC 2 yi 1 azalt SAYAC 1 i 1 azalt EVET 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 18

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. 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 END STACK REG Alt Program Ġlk Komut RETURN Bu iģlemleri sırayla yazarsak; 1. Ana program baģlangıçtan itibaren çalıģır. 19

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

SAYAC2 EQU BSF CLRF BCF DEVAM MOVLW MOVWF CALL MOVLW MOWF CALL GOTO GECİKME MOVLW MOWF TEKRAR1 MOWF TEKRAR2 DECFSZ GOTO DECFSZ GOTO RETURN END h 0D STATUS,5 TRISB STATUS,5 h 00 PORTB GECİKME h FF PORTB GECİKME DEVAM 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ı; Komutu Ģematik gösterirsek; RFL FİLE REGISTER, d W yada F ( Sonucun Yeri ) 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. ; PROGRAM.ASM LIST P = 16F84 INCLUDE P16F84.INC GECİK1 EQU h 0C GECİK2 EQU h 0D BCF STATUS, 0 ; Elde yi sıfırla 21

BASLA 16F84 ü tanıt PORTB çıkıģ PORTB 01 CALL GECIKME CALL GECIKME RLF PORT B SON BSF STATUS, 5 ; Bank1 e geç CLRF TRISB ; PORTB Çıkış BCF STATUS, 5 ; Bank0 a geç MOVLW h 01 MOVWF PORTB ;PORTB ye 01 yaz CALL GECIKME ; Bekleme yap CALL GECIKME ; Tekrar Bekleme yap RLF PORTB,F ; 1 bit sola ötele BEKLE GOTO BEKLE GECIKME MOVLF h FF ; Önceki Gecikme Alt Prog ile aynı MOVWF GECIK1 DONGU 1 MOVLW h FF MOVWF GECIK2 DONGU2 DECFSZ GECIK2, F GOTO DONGU2 DECFSZ GECIK1, F GOTO DONGU1 RETURN END 7.2. 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 h 49 ; W Registerine (49) 16 yükle MOVWF MEM ; W yi MEM adresine sakla RRF MEM, F ; 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 (2 n =2,4,8,16) ile çarpma ve (2 n =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; 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 NOT: 3) ĠĢ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.1. 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: ADDWF MEM, F ; W ile MEM registeri toplanır, sonuç tekrar MEM e yazılır. Çeşitli Hex. (16 lı tabanda) Toplama İşlemleri: 1) h 09 2) h 03 3) h F8 4) h FE h DE h FB h 08 h 08 h E7 h FE 1 h 00 1 h 06 C Bayrağı : 0 oldu. C Bayrağı : 0 oldu. C Bayrağı : 1 oldu C Bayrağı :1 oldu 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 h 5D ; h 5D yi W ye yükle ADDLW h 42 ; h 42 ile topla MOVWF PORTB ;W deki sonuç PORTB ye ĠĢlemleri yaparsak : ĠĢlemi hem 16 lı (heksadesimal) hem de 2 li (binary) tabanda yaparsak; Heks. olarak; Binary olarak; 5D 0101 1101 42 0100 0010 9F 1001 1111 C bayrağı = 0 C bayrağı = 0 (Sonuç FF den küçük olduğu için) 8.2. 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ı 32 A6 Y. sayısı 2E 9C 1. sayı alt byte (XL) 2. sayı alt byte (YL) 1. sayı üst byte (XH) 2. sayı üst byte (YH) Önce toplama iģlemini yapalım: Hex. Desimal Binary 32 A6 12966 0011 0010 1010 0110 + 2E 9C + 11932 + 0010 1110 1001 1100 61 42 24898 0110 0001 0100 0010 Akış Diyagramı Program Parçası XL EQU h 0C ; XL için 1 byte lık yer ayır. XH EQU h 0D ; XH için 1 byte lık yer ayır. YL EQU h 0E ; YL için 1 byte lık yer ayır. YH EQU h 0F ; YH için 1 byte lık yer ayır. BASLA MOVLW h A6 MOVWF XL MOVLW h 32 MOVWF XH MOVLW h 9C MOVWF YL MOVLW h 2E ; Verilen değerler X,Y lere yazıldı. 25

MOVWF YH ; X ve Y byte ları ayrılan registerler yükle. TOPLA MOVF XL, W ADDWF YL, W ; XL ve YL yi topla. MOVWF PORTB ;Sonucu PORTB ye yaz BTFSC STATUS, 0 ; C = 0 mı? INCF XH, F ; Hayırsa XH ı (1) arttır CALL GECIKME ;Gecikme alt prog. çağır MOVF XH, W ADDWF YH, W ; YH ile XH ı topla. MOVWF UST ; Sonucu UST e yaz CALL GECIKME ;Gecikme altprogramını çağır GOTO BASLA 8.3. 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 08 h 09 h 07 h FF (Binaryde Tümleyen Arit. kullanarak) h 01 C bayrağı = 0 (sonuç negatif) 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 h 0A SUBWF PORTA, W ; PORTA (0A) MOVWF PORTB ; Sonuç PORTB ye 26

İşlem: Hex. Komplement Aritmetiği İle h 1B 0001 1011 0001 1011 h 0A 0000 1010 1111 0110 h 11 0001 0001 C bayrağı = 1(Borç yok) 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 h 4C SUBWF MEM1, F COMPF MEM1, F ; 0 1, 0 1 koyar. INCF MEM1 ; 1 arttırır, tabana göre komplement i(tümleyeni) bulur. MOVF MEM1, W ; MEM1 i W ye alır. MOVWF PORTB ; sonucu PORTB ye yazar. Hex. Yapalım Binary Yapalım h 35 0011 0101 0011 0101 h 4C 0100 1100 1011 0100 h -17 1110 1001 (negatif) PORTB de RB4, RB2, RB1, RB0 bağlı LED ler yanacaktır. Tümleyen alınırsa 0001 0111 17 8.5. 16 Bit (İki byte) Çıkartma: h 17 (C=0) Cevap: - 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 2E B2 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. Hayır Alt byteları çıkar (Borç varmı?) C = 0 mı? Evet 1. sayının üst byte ından (1) çıkar Üst byteları çıkar 27

Ö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 MEM2L, W SUBWF MEM1L, F ; MEM1L den MEM2L yi çıkart. BTFSS STATUS, 0 ; C = 0 mı? (Borç var mı?) DECF MEM1H, F ; Evetse MEM1H dan 1 eksilt MOVF MEM2H, W ; Hayırsa W MEM2H SUBWF MEM1H, F ; Üst byte sonucunu yine MEM1H a yaz. MOVF MEM1L, W ; W MEM1L MOVWF PORTB ; Alt byte sonucunu PORTB ye TEST BTFSC PORTA, 0 ; RA0 a basıldı mı? GOTO TEST ; Hayırsa TEST e git. MOVF MEM1H, W ; Evetse MEM1H ı W ye aktar. MOVWF PORTB ; Üst byte ı PORTB ye yükle. ********* 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 28