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

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

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

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

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

# 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 DENETLEYİCİLER II DERS NOTLARI (Vize) Prof. Dr. Hakan Ündil Bahar

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

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

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

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

KOMUT AÇIKLAMALARI VE ÖRNEKLERİ

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

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.

KONFİGÜRASYON BİTLERİ

DERS 12 PIC 16F84 ile KESME (INTERRUPT) KULLANIMI İÇERİK

PIC MIKRODENETLEYICILER-3: GECĠKME ve KESME PROGRAMLARI

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

# 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

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.

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

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

Komutların İşlem Süresi

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

KESME (INTERRUPT) NEDİR?

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

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

LCD (Liquid Crystal Display )

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu

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

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

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

BÖLÜM 1

Hacettepe Robot Topluluğu

DERS 13 PIC 16F84 ile DONANIM SAYICI KULLANIMI İÇERİK KESME

PIC Mikrodenetleyicileri

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

LCD (Liquid Crystal Display)

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

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

PIC TABANLI, 4 BASAMAKLI VE SER

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

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

PIC16F877A nın Genel Özellikleri

MİKRODENETLEYİCİLER ÖRNEK PROGRAMLAR

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

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

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

ELEKTRİK-ELEKTRONİK TEKNOLOJİSİ

MIKROBILGISAYARLAR ve PIC PROGRAMLAMA TEST ÇALIŞMA SORULARI

Mikro denetleyicili Uygulama devresi bileşenleri

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

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

PİC BASİC PROFESSİONAL

Hacettepe Robot Topluluğu

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

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

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

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

PROGRAMLANABİLİR ZAMANLAYICI

BİLİŞİM TEKNOLOJİLERİ

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Ü

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

ROBOT KOL BİTİRME PROJESİ DÖNEM İÇİ RAPORU

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Ü

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

Hacettepe Robot Topluluğu

ONDOKUZ MAYIS ÜNİVERSİTESİ

Mikroişlemciler. Microchip PIC

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

Teorik Bilgi DENEY 7: ASENKRON VE SENKRON SAYICILAR

PICBIT_PLC İLE LOJİK TASARIM. Doç. Dr. Murat UZAM Niğde Üniversitesi Mühendislik-Mimarlık Fakültesi Elektrik-Elektronik Mühendisliği Bölümü

PIC MCU ile UYGULAMALAR

PIC MCU da Komutların İşlem Süresi

Mikroişlemciler Laboratuar Deney Föyü

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İ

DEVRELENDİRİLMİŞ LOJİK

8 Ledli Havada Kayan Yazı

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

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

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

Komutların İşlem Süresi

BÖLÜM 2 INTERRUPT ve TIMER İŞLEMLERİ

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

İÇİNDEKİLER 1. KLAVYE KLAVYE RB KLAVYE RBHIGH DİSPLAY... 31

BÖLÜM 7 Kesmeler.

DERS 11 PIC 16F84 ile ALT PROGRAMLARIN ve ÇEVRİM TABLOLARININ KULLANIMI İÇERİK. Alt Program Çevrim Tabloları Program Sayıcı ( Program Counter PC )

PİC HAKKINDA KISA KISA BİLGİLER GİRİŞ/ÇIKIŞ PORTLARI

BM-311 Bilgisayar Mimarisi

Yığın MİKROİŞLEMCİ SİSTEMLERİ. Yığın. Örnek MİB için Yığın. Yığma İşlemi. Çekme İşlemi

SAYISAL MANTIK LAB. PROJELERİ

T.C. NİĞDE ÜNİVERSİTESİ MÜHENDİSLİK-MİMARLIK FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ BİTİRME ÖDEVİ

BM-311 Bilgisayar Mimarisi. Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

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İ

İKİLİ SAYILAR VE ARİTMETİK İŞLEMLER

T.C. NİĞDE ÜNİVERSİTESİ MÜHENDİSLİK-MİMARLIK FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ BİTİRME ÖDEVİ

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

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 MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ELEKTRİK ELEKTRONİK TEKNOLOJİSİ

7 Segment Display ve Kesmeler (Interrupts) Hafta6-7. Dr. Bülent Çobanoğlu-SAÜ 1

Transkript:

MİKRODENETLEYİCİLER II DERS NOTLARI Prof. Dr. Hakan ÜNDİL 2017-2018 Bahar-FİNAL KISMI BÖLÜM 7 - LOJİK İŞLEM KOMUTLARI 7.1. RLF Komutu (Bir bit Sola Kaydırma) Bir file register içinde bulunan bitlerin (C bayrağı üzerinden) birer bit sola kaydırılması işlemidir. Bu durumda en solda bulunan (7. bit), C bayrağına geçmekte, daha önce C bayrağında bulunan bit ise en sağdaki (0.) bite geçmektedir. Bu komutla f. registerdeki sayı 2 ile çarpılabilir. Komutun formatı; RFL FİLE REGISTER, d W yada F (Sonucun Yeri) Komutu şematik olarak gösterirsek; ÖNEMLİ NOT: Çarpma işlemlerinde komuttan önce C(bayrağı)=0 yapılmalıdır. Örnek: PORTB ye gelen sayıyı GELEN adlı registere aktardıktan sonra 2 ile çarpan program parçası yazınız. PORTB de h C8 bulunduğuna göre çarpma sonrası GELEN Registerindeki değeri ve asıl cevabı bulunuz. RLF (Çarpma) Komutundan Önce (En soldaki C bayrağıdır) 7 6 5 4 3 2 1 0 C 0 1 1 0 0 1 0 0 0 PORTB ye gelen sayı h C8 =12.16 1 +8.16 0 = (200) 10 RLF (Çarpma) Komutundan Sonra C 1 1 0 0 1 0 0 0 0 GELEN Reg. da h 90 (sola ötelenip 2 ile çarpılmış) Asıl Cevap, ( C bayrağından gelen 1 ile h 90 birlikte) = h 190 = 1.16 2 +9.16 1 +0.16 0 = (400) 10 1

Program Parçası MOVF PORTB,W ; PORTB yi Aküye aktar MOVWF GELEN ;Aküyü GELEN adlı Registere kopyala BCF STATUS,0 ; C bayrağını sıfırla RLF GELEN,F ; GELEN Registerini C bayrağı ile sola ötele Örnek : Bir programla önce PORTB ye h 01 yükleyin. Daha sonra 1 defa bu biti sola kaydıran Program Parçasını yazınız.. Bu işlemin daha iyi görülebilmesi için üst üste 2 kere GECIKME alt programı kullanın. (GECIKME Alt Programı Gösterilmeyecektir) Program Parçası BSF STATUS, 5 ; Bank1 e geç CLRF TRISB ; PORTB yi tamamen Çıkış yap BCF STATUS, 5 ; Bank0 a geç MOVLW h 01 MOVWF PORTB ;PORTB ye 01 yaz CALL GECIKME ; Gecikme sağla CALL GECIKME ; Bir kere daha Gecikme sağla RLF PORTB,F ; PORTB yi 1 bit sola ötele (NOT: GECIKME Alt Programı Gösterilmemiştir...2 kere kullanılması Gecikme süresini 2 katına çıkarır) 7.2. RRF Komutu (Bir Bit Sağa Kaydırma) RRF komutu da RLF komutuna benzer olup fark bu defa kaydırma işleminin (C bayrağı üzerinden) sağa olması dolayısıyla bu defa en sağdaki bit (0.bit) C bayrağına geçecektir. Daha önce C bayrağında bulunan bit ise bu sefer en soldaki (7.bite) geçecektir. Bu komutla registerdeki sayı 2 ye bölünebilir. Komut formatı; RRF FİLE REGİSTER, d Sonucun gideceği yer (destination) W yada F Mesela MEM adlı bir file registere h 38 sayısını yazın. C bayrağını da (C= 1) yapın. RRF komutunun icrasından önce ve sonraki durum: 2

Yukarıdaki işlem için yazılabilecek Program Parçası : MOVLW h 38 ; Aküye (38) 16 yükle MOVWF MEM ; W yi MEM adresine sakla BSF STATUS,0 ; C=1 yap,istendi, (C, STATUS un 0. Bitidir) RRF MEM, F ; MEM i Sağa bir bit ötele (ÖNEMLİ NOT: Normalde bölme işlemlerinde komuttan önce C=0 yapılmalıdır.) 7.3. COMF ve SWAPF Komutları COMF komutu ile istenen bir file register içinde tüm bitlerde (0) lar (1) ve (1) ler (0) yapılabilir (1 e (taban-1) göre tümleyen işlemi!.. ). Komut formatı; COMF FILE REGISTER, d Sonucun gideceği yer (destination ) (W yada F yazılır ) Örnek: HAFIZA1 adlı registere (1F) 16 yüklendikten sonra bunun tersini bularak HAFIZA2 adlı registere saklayan Program Parçasını yazın. Program Parçası : HAFIZA1 0001 1111 = h 1F MOVLW h 1F MOVWF HAFIZA1 HAFIZA2 COMF HAFIZA1, W MOVWF HAFIZA2 1110 0000 = h E0 SWAPF komutu ise bir file register içindeki ilk dört bit (Yüksek anlamlı kısım) ile son dört bitlerin (Düşük anlamlı kısım) yerlerini değiştirir. Komut formatı; SWAPF FILE REGISTER, d (d yerine F ya da W yazılır) Örnek: PORTB ye ( 3F ) 16 yazdıktan sonra ilk ve son 4 lü bitlerin yerini değiştiren ve sonucu Aküye yükleyen bir Program parçası yazın. 3

Program Parçası : MOVLW MOVWF SWAPF h 3F PORTB PORTB, W 7.4. ANDLW ve ANDWF Komutları ANDLW Komutu Akümülatördeki sayıyı, sabit bir sayı ile Lojik AND (VE) işlemine tabi tutar. Sonucu tekrar Aküye yazar. AND (VE) işleminden bilindiği gibi işlemin sonunda her iki sayıda 1-1 olan bitler 1; diğerleri 0 olarak neticelenecektir. Komut formatı ve Doğruluk Tablosu; ANDLW Sabit sayı Bu komutla bir sayının (veri) istenen bitleri (0) yapılırken diğerleri olduğu gibi bırakılır. Bunun için normalde sabit sayı maske seçilirken, sıfır yapılmak istenenler (0), diğerleri (1) olarak seçilmelidir. Örnek: Akümülatör içinde (3C) 16 sayısı olsun. Bu sayının 2.,3. ve 6. bitlerini (0) yapıp diğerlerini aynen bırakan komutu yazalım. Sonuçta sayı ne olur? Önce W deki sayıya hiç bakmadan 2., 3., 6. bitleri 0, öteki bitleri 1 olan bir maske seçelim: 7 6 5 4 3 2 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 0 = Bit Sıra No =h B3 (Maske, 2,3,6. Bitler sıfır seçildi) =h 3C (Aküde bulunan sayı) =h 30 (Lojik AND(VE) işleminin sonucu) Bu maskeyle W 'deki sayıyı (h 3C yi) Lojik VE işlemine tabi tutmak için gerekli komut : ANDLW h B3 olacaktır. Sonucu bulmak için ise, W deki sayı (3C) 16 verildiğine göre bu sayının 2.,3. ve 6. bitlerinin sıfırlanmış halini yazmamız gerekir. (3C) 16 de 6. bit zaten 0 olduğuna göre, (3C) 16 yi binary yazın ve sadece 2. ve 3. bitlerini sıfırlayın. O da (30) 16 olarak elde edilecektir. ANDWF Komutu Bu komut ANDLW komutuna benzer olup bu defa W ile herhangi bir file register arasında Lojik AND (VE) işlemi gerçekleştirilir. Sonuç ise ya W ye ya da F ye yazılır. Komut formatı: 4

File Register ANDWF, d (Sonucun yeri, d yerine W ya da F yazılır) Örnek: PORTB registerinin içinde b 00101100 sayısı olsun. W Registerine de b 11011111 değerini (maske) yerleştirelim. (Burada 5. Bit sıfırlanmaktadır) Bu iki sayıyı Lojik AND (VE) işlemine tabi tutarak neticeyi yine PORTB ye yazalım. Bunun için gerekli program parçası : MOVLW b 00101100 ; W Registerine 2C yükle. ANDWF PORTB, F ; PORTB ile W yi AND (VE) işlemine tabi tut ; ve sonucu yine PORTB ye yaz 7.5. IORLW ve IORWF Komutları IORLW Komutu Sabit sayı ile Akü arasında Lojik OR (VEYA) işlemini yapar ve sonucu yine Aküye yazar. Bu komut istenen bir biti/bitleri 1 yapıp diğerlerini aynen bırakmak için kullanılabilir. Komut Formatı: IORLW Sabit sayı şeklindedir. Bu amaçla seçilecek sabit sayıda (Maske de), (1) yapılmak istenen bitler (1), değiştirilmesi istenmeyen bitler (0) seçilmelidir. Örnek: Aküde (W Registerinde) bulunan sayının 5., 6., 7. bitleri 1 yapılıp diğer bitler aynen bırakılmak istensin. Önce Maskemizi seçelim; 7 6 5 4 3 2 1 0 1 1 1 0 0 0 0 0 = E0 (Aküde 1 yapılacak bitler 1 seçildi) NOT: Burada Maske seçimi işlemi için Aküde bulunan sayının bilinmesine gerek yoktur. Hangi sıradaki bitlerin (burada 5,6,7 idi) 1 yapılacağının bilinmesi yeterlidir. Soruda Sayı Aküdedir denildiği için program parçasında sayıyı W ya yükleme komutuna ihtiyaç yoktur. Bu durumda gerekli program parçası (tek komut) IORLW b 1110 0000 olacaktır. Örnek: Yukarıdaki örnekte W daki sayımız (04) 16 olsaydı sonuç ne olurdu? W ile Maske arasında OR (VEYA) işlemi: (sonuç h E4 olacaktır) 5

Bit No: 7 6 5 4 3 2 1 0 W Reg. 0 0 0 0 0 1 0 0 Maske 1 1 1 0 0 0 0 0 Sonuç 1 1 1 0 0 1 0 0 IORWF Komutu Bu komut da IORLW komutuna benzer olup fark, işlemin file register ile akü arasında yapılmasıdır. Maske W de ya da bir file registerde bulunabilir. Sonuç ise ister W ye, ister File Register da elde edilebilir. Komut Formatı: IORWF File Register, d (d yerine W ya da F yazılır) 7.6. XORLW ve XORWF Komutları XORLW Komutu Bu komut ise W Registeri ile verilen sabit sayı arasında EXOR (Özel VEYA) işlemi gerçekleştirerek sonucu W ye yazar. Komut Formatı: XORLW Sabit Sayı şeklindedir. Bu komut da W de bulunan 8 bitlik sayının istenen bitlerinin tersini almak diğer bitleri aynen bırakmak için kullanılabilir. Bu maksatla belirlenecek maskede tersi alınmak istenen bitler (1), diğerleri (0) seçilmelidir. Örnek: Önce Aküye (3B) 16 sayısını yükledikten sonra bu sayının sadece 1., 3., 5., 7. bitlerinin tersini alıp neticeyi PORTB ye yazmak için gerekli komutları verin. Bu durumda sonuç ne olur? MOVLW h 3B ;W ye (3B) yaz XORLW b 10101010 ; maskede 7,5,3,1. bitler 1, yapıldı MOVWF PORTB ; Sonuç PORTB ye yazıldı W ile sabit sayı arasında XOR (Özel VEYA) işlemi Bit No: 7 6 5 4 3 2 1 0 W Reg.de(3B) 0 0 1 1 1 0 1 1 Maske (AA) 1 0 1 0 1 0 1 0 Sonuç (91) 1 0 0 1 0 0 0 1 6

XORWF Komutu Bu komut da XORLW komutuna benzer olup burada aynı işlem W ile file register arasında yapılır. İşlem sırası önemli olmadığı için maskeyi W ya asıl sayıyı File Registere ya da tersini yazmak mümkündür. NOT: XORLW veya XORWF komutları iki tane 8 bitlik sayının aynı olup olmadıklarını (karşılaştırma) test etmek için kullanılabilir. Sayılar aynı ise XOR lanınca sonuç (00) 16 olacağından Z bayrağı (1) olacaktır. Aksi takdirde Z bayrağı (0) kalacaktır.( Z bayrağının STATUS un 2. biti olduğunu hatırlayın) Örnek: PORTA da bulunan sayı, (09) 16 dan farklı ise PORTA test edilmeye devam edilecek, sayı (09) 16 a eşit ise bu sayı PORTB ye yazılacaktır. Karşılaştırma için Lojik Komut kullanılacaktır. Gerekli Program Parçasını yazınız. Program Parçası: TEST MOVLW h 09 XORWF PORTA,W ; W ile PortA ya Lojik XOR işlemi uygula BTFSS STATUS,2 ; Z bayrağı 1 mi?(sonuç=0 mı?) GOTO TEST ; Değilse TEST e, ilk komuta git MOVF PORTA, W ; Evetse PortA yı W ye aktar MOVWF PORTB ; W yi PortB ye yaz Mesela, PORTA ya gelen sayı (07) 16 olsa ve (09) 16 ile XORWF işlemi yapıldığında; 0000 0111 (07) 0000 1001 (09) 0000 1110 (0E) Sonuç 0 dan farklı olduğuna göre test etmeye devam eder Benzer şekilde bir baytlık veriyi sıfır sayısı ile karşılaştırmak için IORLW veya IORWF komutları kullanılabilir. Örnek: PORTA daki sayının (00) 16 olup olmadığını test eden, sıfır ise ILERI etiketine atlayan aksi takdirde test etmeye devam eden bir program parçasını bir Lojik komutla yazın. Program Parçası: TEST MOVF PORTA,W ; PortA yı W ye kopyala (yaz) IORLW h 00 ; W ile (00) arasında Lojik VEYA uygula BTFSS STATUS, 2 ; Sonuç=0 mı ( Z=1 mi?) GOTO TEST ; Değilse TEST e git GOTO ILERI ; Evetse ILERI etiketli komuta git. Örnek : PORTA nın mevcut bütün bitleri normalde (1) iken PORTA nın 0,1,2. Bitlerin (RA0,RA1,RA2) hepsine sıfır uygulanınca PORTB ye (0F) 16 yükleyen aksi halde test etmeye devam eden bir program için akış diyagramı çizerek assembly programı yazınız. 7

Maske: 7,6,5. bitler PORTA da yok, değerleri (0)dır; 2,1,0. Bitler test edilecek; 3. ve 4. Bitler normalde (1) verildi. Program : 7 6 5 4 3 2 1 0 Bit No 0 0 0 1 1 0 0 0 Maske LIST P=16F84 INCLUDE P16F84.INC BSF STATUS,5 MOVLW h FF MOVWF TRISA ;PortA Giriş CLRF TRISB ;PortB Çıkış BCF STATUS,5 ;Bank0 a geç TEST MOVLW b 00011000 ;Maskeyi W ye yaz XORWF PORTA,W ;PortA ile XOR işlemi BTFSS STATUS,2 ; Z bayrağı 1 mi? GOTO TEST ;Değilse TEST e MOVLW h 0F ;Evetse W ye 0F yaz MOVWF PORTB ; PortB ye aktar END 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. 8

NOT: 2) 8 bitlik işaretsiz çıkartmada (0...255) 10 = (0.FF) 16 aralığında elde edilen sonuçta; C = 1 ise sonuçta Borç yoktur (Yani, 1.sayı 2.sayıdan BÜYÜK yada EŞİT dir) C = 0 ise sonuçta Borç vardır (Yani, 1.sayı 2. sayıdan KÜÇÜK dür) NOT: 3) İşaretli sayılarla yapılan çıkartma işlemlerinde neticedeki C bayrağı dikkate alınmaz. Eğer sonuç ( -128... +127) aralığı içinde ise sadece 7. bit işareti tayin eder! Bu bit 0 ise sonuç pozitif, 1 ise sonuç negatiftir! 8.1. 8 Bit Toplama: PIC16F84 de 8 bit toplama için 2 komut mevcuttur: 1) ADDLW Komutu: Sabit sayı ile W (Aküde) bulunan sayıyı toplar ve neticeyi W ye yazar. Örn: ADDLW h 08 ; h 08 sayısını W ye ekler. 2) ADDWF Komutu : W (Aküde) bulunan sayı ile File registeri toplar ve sonucu File registere ya da Aküye yazar. Örn: ADDWF MEM, F ; W ile MEM registeri toplanır, ;sonuç tekrar MEM e yazılır. Çeşitli Heksadesimal (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 aküye h 5D yazdıktan sonra bu sayıyı h 42 ile toplayıp neticeyi hem aküye ve hem de PORTB ye yazmak için 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 İşlemi hem 16 lı (heksadesimal) hem de 2 li (binary) tabanda yaparsak; 9

Heks. olarak; Binary olarak; (PIC de yapıldığı tarzda) 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. 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 akünün içeriği çıkarılarak sonuç W ye yazılır. Örn: SUBLW h 09 ; h 09 dan W registeri çıkarılır, fark W ye yazılır. SUBWF komutunda ise File registerden W(akü) çı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 fark yine MEM e yazılır. Örn: SUBWF h 20, W ; 0x20 adresinde bulunan sayından W çıkarılır,w ye yazılır Çeşitli Çıkartma İşlem Örnekleri: 1) h 08 2) h 08 h 09 h 07 h FF (Binaryde Tümleyen Arit. kullanarak) h 01 C bayrağı = 0 (Borç var) C bayrağı = 1 (Borç yok) Örnek : a) PORTA da bulunan sayıdan h 0A sayısını çıkaran ve neticeyi PORTB ye yazan bir program parçası yapınız. b) a) şıkkında PORTA da h 1B varsa sonucu ve C bayrağının değerini veriniz. MOVLW h 0A ; Aküye h 0A yaz SUBWF PORTA, W ; PORTA (0A) MOVWF PORTB ; Sonuç PORTB ye 10

İşlem: Heks. Komplement Aritmetiği İle (PIC de yapıldığı tarzda) 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 : a) MEM1 adlı registerdeki sayıdan h 4C sayısını çıkardıktan sonra elde edilen sayı negatif olduğu bilindiğine göre tüm bitlerin tersini alıp 1 ekleyerek tabana göre tümleyenini (pozitif karşılığını) bulduktan sonra cevabı PORTB ye yazan bir program parçası yazınız. b) MEM1 de h 35 bulunduğuna göre işlemi hem elle heksadesimal olarak hem de PIC de yapıldığı gibi (Binary olarak Tümleyen Aritmetiği ile) yapınız. C bayrağını bulunuz. MOVLW h 4C ; Aküye h 4C yazar SUBWF MEM1, F ; MEM1 den Aküyü çıkarır, sonucu MEM1 e yazar COMPF MEM1, F ; MEM1 de 0 yerine 1, 1 yerine 0 koyar. INCF MEM1 ; 1 arttırır, tabana göre tümleyeni bulur. MOVF MEM1, W ; MEM1 i W ye aktarır. MOVWF PORTB ; Asıl Cevabı PORTB ye yazar. İşlemi Hex. Yapalım Binary Yapalım(PIC de yapıldığı tarzda) h 35 0011 0101 1. Sayı aynen 0011 0101 h 4C 0100 1100 Tabana göre tümleyeni 1011 0100 h -17 1110 1001 (C=0; negatif) Tümleyen alınırsa 0001 0111 Asıl Cevap:( -17) 16 (Heks. İşlemde de bulmuştuk) BÖLÜM 9 DÖNÜŞÜM TABLOLARI (LOOKUP TABLEs) Dönüşüm tabloları bir kodu bir başka koda dönüştürmek için kullanılır. Örnek olarak belli bir sayı ile o sayıyı göstergede yakmak için göstergeye uygulanması gereken sayı arasında fark vardır. 3 sayısını herhangi bir şekilde bir mikrodenetleyiciye bağlı display ya da göstergede yazmak için 3 sayısının ikili tabandaki karşılığından farklı bir dijital (sayısal) bilginin mikrodenetleyiciden (PIC den) gönderilmesi gerekir. (NOT: 7 Segment (Parçalı) Gösterge konusu FİNAL e dahil değildir.) 11

9.2. Step Motor Kontrolü Uygulaması PIC ile step motor kontrolü yapmak diğer motorlarına göre oldukça kolaydır. Ancak önce step motorun çalışma prensibi bilinmelidir. Bu motor Relüktans Motor denilen ve yaygın olarak kullanılan motora oldukça benzerdir. Her motorda olduğu gibi bu motorda da duran (stator) ve dönen (rotor) kısımlar mevcuttur. Dönen kısım ( rotor ) sabit mıknatıstır. Duran kısım ( stator )'da motorun tipine bağlı olarak sargılar bulunur. Motorun dönmesi için belli bir sırayla bu sargılara enerji verilmelidir. Prensip magnetik konularından bilindiği gibi aynı kutupların itmesi, farklı kutupların çekmesi şeklinde özetlenebilir. Motorun adım sayısını bu sargıların sayısı da belirler. Bu sargıların bağlantı şeklinde farklı olabilir. Elimizde aşağıdaki gibi unipolar (tek kutuplu) türde bir step motor olduğunu farzedelim: X 1 Y 1 ROTOR X 2 Y 2 1.Adım 0 olsun 45 Ortak Uç Bu motorda 5 uç bulunmaktadır ve tam dönüşü 8 adımda tamamlamaktadır. Bu adımlardan ilk üçünü ( sağa dönüş için ) çizelim. 2. Adım 3. Adım 90 Akım hangi yönde geçerse N, S kutupları ona göre oluşur. Bu durumda pozisyonlara göre X ve Y de bulunması gereken seviyeleri yazarsak Doğruluk Tablosu : ADIM X 1 X 2 Y 1 Y 2 1. 1 0 0 0 2. 1 0 0 1 3. 0 0 0 1 4. 0 1 0 1 5. 0 1 0 0 6. 0 1 1 0 7. 0 0 1 0 8. 1 0 1 0 12

olur. Tabloda (1) olarak görülenler motora göre farklı gerilimler (12V veya 24V gibi) olabilir. Ayrıca pratikte motor akımı, PIC port akımından fazla olduğu için transistörlerle akımı kuvvetlendirmek gerekir. Adımlar arası yeterli gecikme sağlanmaz ise kutuplaşma süresi az gelir ve motor doğru şekilde dönmez ve motorda sadece titreşim oluşabilir. Zaman diyagramında olayı çizersek; X 1 (RB3) X 2 (RB2) Y 1 (RB1) HATIRLATMA: 8 ADIM = 2 3 = 8 Y 2 (RB0) Örnek : Step Motor Kontrolü için yukarıda Doğruluk Tablosu ve Zaman Diyagramı verilen işaretleri PORTB' den üreten bir program parçası yazınız. Motor devamlı olarak ileri yönde dönecektir. (GECIKME alt programı gösterilmeyecektir. X 1 için RB3, X 2 için RB2, Y 1 için RB1 ve Y 2 için RB0 bağlantıları yapılacaktır). Program Parçası: TEKRAR MOVLW h 00 MOVWF SAYAC ; SAYAC sıfırlandı GIT MOVF SAYAC, W ; SAYAC ı Aküye aktar CALL DONUSUM ; DONUSUM alt programına atla. MOVWF PORTB ; Alt programdan gelen W değerini PORTB ye yaz CALL GECIKME ; GECIKME alt programına(gösterilmemiştir) git,bekle,gel INCF SAYAC, F ; SAYAC ı bir arttır MOVLW h 08 ; Son olarak SAYAC=07 dir, INCF ile (08) oldu SUBWF SAYAC,W ; SAYAC dan Aküyü çıkart, İkisi eşitse netice (00) 16 olur BTFSS STATUS,2 ; Z=1 mi? GOTO GIT ; Değilse saymaya devam et. GOTO TEKRAR ; Evetse motorun yeniden 1. Adımından başla DONUSUM Alt Programı DONUSUM ADDWF PCL, F ; PCL + W işlemini yap, neticeyi PCL ye yaz RETLW b'0000 1000' ; 1. ADIM, W=h 00 için buraya gelir,w=h 08 ile döner RETLW b'0000 1001' ; 2. ADIM RETLW b'0000 0001' ; 3. ADIM RETLW b'0000 0101' ; 4. ADIM RETLW b'0000 0100' ; 5. ADIM RETLW b'0000 0110' ; 6. ADIM RETLW b'0000 0010' ; 7. ADIM RETLW b'0000 1010' ; 8. ADIM, W=h 07 için buraya gelir, W=h 0A ile döner 13

*********** BÖLÜM 10 - KESMELER ( INTERRUPTs ) Kesme alt programları, normal alt programlardan farklı olarak belli bir harici olay ya da mikrodenetleyici içindeki zamanlayıcı (timer)/sayıcının (counter) belli bir konuma gelmesiyle tetiklenen (başlayan) özel alt programlardan başka bir şey değildir. Kesmeler sayesinde komut sayısı azaltılabilir, programın çalışması özellikle acil işlemler için hızlandırılabilir ve yazımı basitleşir. Kısaca Kesme, mikrodenetleyicinin o anda yapmakta olduğu işi bırakıp saklanması gereken değişkenleri/registerleri bir yere kaydettikten sonra kesme alt programına atlaması ve bu alt programda işini bitirdikten sonra daha önce kaydettiği değişkenleri de alarak ana programa (asıl işine) geri dönmesidir. Bir başka ifadeyle kesmede, CALL komutu yerine donanımsal (hardware) değişkenlerle alt programa gidilmektedir. Adım adım incelersek: (1) PIC16F84' de bir kesme meydana geldiğinde o anda çalışan komut tamamlanır. (2) Programın kaldığı adres Stack Register e otomatik olarak saklanır. (3) Program akışı h'004' adresine atlar (Program Sayacına bu adres yüklenir). (4) Burada (h'004' de) bulunan GOTO komutu ile ilgili adrese yani kesme alt programının ilk satırına atlanır. (5) Kesme altprogramı çalışır. (6) RETFIE komutu ile geri dönebilmek için ana programda kaldığı adresi STACK Register den okumak üzere gider. (7) Kaldığı ana program adresine geri döner ve ana programa devam eder. O halde kesme olayını PIC16F84 için basit olarak çizersek; 14

10.1. INTCON ( KESME KONTROL ) REGİSTERİ INTCON registeri, veri hafızasındaki özel fonksiyon registerler inde h'0b' (Bank 0 da) ve h'8b' adreslerinde (Bank 1' de) bulunur. Kesme işleminin çalışmasını kontrol eden bu register de, her bir kesme kaynağı için bir izin biti (6.,5. ve 4. Bitler ) bir de genel (global) kesme izin biti (7. Bit) vardır. Ayrıca 3 kesme için durumu gösteren bayraklar (2.,1. ve 0. Bitler) bulunmaktadır. Register içindeki bitler/bayraklar ve açıklamaları aşağıda verilmiştir. Bit 7 ( GEI ) : Bütün kesmelere izin biti; 0 yapılırsa tüm kesmeler iptal, kesme kullanılmayacak 1 yapılırsa aktif edilmiş kesmeler geçerli Bit 6 ( EEIE ) : EEPROM hafıza için yazma işlemi tamamlandı kesmesi izin biti ; 0 yapılırsa bu tür kesme iptal 1 yapılırsa bu tür kesme geçerli 15

Bit 5 ( T0IE ) : TMR0 sayıcı kesmesi izin biti; 0 yapılırsa İptal 1 yapılırsa Geçerli, TMR0 ın h FF den h 00 a geçişinde kesme oluştur. Bit 4 ( INTE ) : Harici kesme izin biti. ( RB0/INT' den gelen sinyal ile ) 0 yapılırsa İptal, harici kesme kabul edilmez 1 yapılırsa Geçerli, harici kesme kabul edilir. Bit 3 ( RBIE ) : PORTB' de RB4, RB5, RB6, RB7 bitleri değişiklik kesmesi izin biti 0 yapılırsa İptal, 1 yapılırsa Geçerli, RB4...RB7 deki değişiklikte kesme oluşturur. Bit 2 ( T0IF ) : TMR0 sayıcısı/zamanlayıcısı zaman aşımı bayrağı 0 okuyorsak henüz zaman aşımı yok 1 okuyorsak zaman aşımı var. (TMR0, h FF den h 00 a geçiş yapmış.) Bit 1 ( INTF ) : Harici kesme bayrağı ( RB0 / INT ucundan gelen sinyal ile ) 0 okuyorsak Harici kesme yok (gelmedi) 1 okuyorsak Harici kesme geldi Bit 0 ( RBIF ) : PORTB "değişiklik" bayrağı 0 okuyorsak RB4,RB5,RB6, RB7' den herhangi birinde değişim yok. 1 okuyorsak RB4.. RB7' den az birinde değişim var. 10.2. KESME KAYNAKLARI NELERDİR? PIC16F84' de kesme 4 farklı kaynaktan gelebilir : 1 ) Harici Kesmeler: RB0/INT' bitinden gelen sinyalle harici bir kesme oluşturabilmek için aşağıdaki işlemler uygulanmalıdır: a) PIC16F84 ün harici kesme ucu RB0/INT giriş olarak yönlenmelidir. b) INTCON' da Bit 4 (INTE) (örn; BSF komutu ile) 1 yapılmalıdır. Böylece gelecek harici kesmeye izin verilmiş olur. Ancak GIE de (1) yapılarak bu iznin geçerli olması, kesmenin algılanması sağlanmalıdır. c) Burada RB0/INT girişinden uygulanacak işaretin hangi kenarla etkili olacağı belirlenmelidir. Bunun için veri hafızasında Bank1' de h'81' adresinde bulunan OPTION_REG adlı özel fonksiyon registerinin 6. biti (INTEDG) ayarlanmalıdır. INTEDG = 0 yapılırsa (örn; BCF komutu ile ) düşen kenar, INTEDG = 1 yapılırsa (örn; BSF komutu ile) yükselen kenar etkin olur ve ancak bu geçiş ile kesme meydana gelir. d) Harici kesmenin oluşmasından sonra INTCON registerinin 1. biti (INTF) bayrağı PIC16F84 tarafından "1" yapılarak kesmenin geldiği bize bildirilir. Bu suretle gidilecek kesme alt programında bu bayrak tekrar programcı tarafından INTF = 0 yapılmalıdır. 16

e) Kesme altprogramı içinde PIC tarafından otomatik olarak GIE=0 yapıldığından gelebilecek 2. bir kesmeye izin verilmemiş olur. f) Kesme altprogramı biterken istenirse yeni kesmelere izin vermek veya vermemek için programcı tarafından INTE = 1 ya da 0 yapılabilir ya da RETFIE komutu ile ana programa dönüldükten sonra bu işlem gerçekleştirilebilir. Yeni bir kesmenin algılanması için ana programa dönülürken zaten PIC tarafından tekrar GIE=1 yapılmaktadır. 2 ) TMR0 Sayıcı Kesmesi: Yine özel fonksiyon registerleri arasında h'01' adresinde (Bank 0' da) bulunan TMR0 denilen sayıcının h'ff' dan h'00' a geçişi esnasında oluşur. Bu kesme için, INTCON' da 5. bit olan T0IE=1 ve 7. bit olan GIE=1 yapılmalıdır. Kesmenin gerçekleştiği, sayıcının h'ff' dan h'00' a geçişi ile PIC tarafından T0IF=1 yapılır. Harici kesmeye benzer şekilde bu bayrak kesme altprogramı içinde sıfırlanır. Ana programa dönüldükten sonra yeni kesme kabul edilmek isteniyorsa programcı tarafından T0IE=1, istenmiyorsa T0IE=0 yapılabilir. 3 ) PORTB' deki Seviye Değişikliği Kesmesi: INTCON' daki RBIE =1 ve GIE=1 ile bu kesmeye izin verilebilir. RB4, RB5, RB6, RB7 bitlerinin herhangi birinde bir değişiklik (0'dan 1'e ya da 1'den 0'a) meydana gelirse PIC tarafından RBIF=1 yapılır. Bu kesme algılandıktan sonra programcı tarafından RBIF = 0 yapılarak suretiyle bu bayrak silinmelidir. Bu kesmeyi oluşturmak için söz konusu bitler giriş yapılmalıdır. RB0... RB3' deki değişikliklerden kesme oluşturmak mümkün değildir. 4) EEPROM yazma işlemi tamamlandı kesmesi : Bu derste incelenmeyecektir. HATIRLATMA 1: Kesme kullanırken Program, normal olarak; LIST INCLUDE ORG GOTO ORG GOTO P=16F84 PIC16F84.INC h'000' BASLA h'004' KESME_ALTPR BASLA Ana Program KESME_ALTPR RETFIE END Kesme Alt Programı 17

şeklinde yapılandırılır. Böylece BASLA etiketi ile başlayan asıl Programın ve KESME_ALTPR etiketli kesme programının nerede olduğu (hangi etiketle başladığı da) anlaşılır. Kesme oluştuğu anda programın kesme vektörüne yani h'004' adresine atlaması 3-4 peryot gecikme getirir. Yapılan işte zamanlama hassas ise buna dikkat edilmelidir. HATIRLATMA 2: Kesme Sırasında W ve Status Register lerinin Saklanması: Yukarıda da belirtildiği gibi dört kesme kaynaklardan biri kesme oluşturursa PC (Program Sayacı)' nın değeri STACK Register e otomatik olarak kaydedilir. Bu sayede RETFIE komutu sonrası kesmenin oluştuğu ana programdaki komutun bir altındaki komuta geri dönebilir. Kesmenin ne zaman geleceği bilinemediği için ana programda o esnadaki W ve STATUS registerlerinin korunması gerekebilir. Böyle bir durumda kesme alt programının başında bu registerler saklanıp sonunda tekrar geri yüklenmelidir. Bu maksatla bayraklardan etkilenmeyen SWAPF komutundan faydalanmak uygun olur. Dersteki örneklerimizde bu saklama işlemi uygulanmayacaktır. 10.3. KESME ALT PROGRAMLARI Bir kesme oluşup kesme alt programına atlanınca INTCON registerinin 7. biti PIC tarafından otomatik olarak (GIE)=0 yapılır. Bu nedenle kesme altprogramında iken yeni kesme oluşması mümkün olmaz. Kesme alt programı çalıştıktan sonra RETFIE (=kesme alt programından dön) komutu ile tekrar otomatik olarak (GIE) = 1 olur. Artık ana programa dönülmüş ve istenirse yeni kesme alınmaya hazır hale gelinmiştir. Örnek : PIC16F84' ün RB0/INT bitine 0 (1 den 0 a inen kenar ile) PORTB nin 4. ve 5. bitlerinin tersini alan bir program parçasını ve kesme alt programını yazarak basitleştirilmiş PIC devresini çiziniz. (Harici Kesme uygulaması) Basitleştirilmiş PIC Devresi 18

Program Parçası: (Prog. Parçası olduğu için LIST, INCLUDE gibi komutlar yoktur) ORG h'000' GOTO BASLA ORG h'004' GOTO KESME_ALTPR... BASLA BSF STATUS, 5 ; Bank 1' e geç MOVLW h'0000 0001' ; RB0/INT Giriş, MOVWF TRISB ; Diğer PORTB bitleri Çıkış MOVLW h 90 ; GIE ve INTE harici kesme izin bitleri (1) MOVWF INTCON ; Kesme Kontrol Registeri ayarlandı BCF OPTION_REG,6 ; INTEDG=0, düşen kenar ile kesme oluşsun. BCF STATUS, 5 ; Bank 0' a geç DONGU GOTO DONGU ; Bu satırda (komutta) kesme gelmesini bekle.... ; Başka işlem yapılmayacaksa Bekleme için ; SLEEP komutu da kullanılabilir. Kesme Alt Programı KESME_ALTP BCF INTCON, 1 ; Harici Kesme bayrağını (INTF) sil. MOVLW h'0011 0000' ;W ye 4.ve 5. bitlerin tersini alacak maskeyi yaz XORLW PORTB, F ; PORTB yi W ile özel VEYA işlemine ; tâbi tut. Sonucu yine PORTB ye yaz. RETFIE ; Kesme alt programından dön. Örnek : PORTB nin RB4,RB5,RB6 veya RB7 bitlerinden herhangi birinde meydana gelen bir değişim ile kesme alt programında PORTA dan gelen sayı alınarak SAYI adlı registere aktarılacak burada 4 ile çarpıldıktan sonra h 25 ile toplanacaktır. Gerekli program parçasını ve kesme alt programını yazınız. Basitleştirilmiş PIC devresini çiziniz. (Not: Prog. Parçası istendiği için LIST, ORG, INCLUDE komutları yazılmayacaktır.) Basitleştirilmiş PIC Devresi Program Parçası:... 19

Program Parçası BSF STATUS, 5 ; Bank 1' e geç MOVLW b '0001 1111' ;PORTA nın mevcut 5 biti de Giriş MOVWF TRISA MOVLW b '1111 0000 ' ;RB4,5,6,7 Değişimi algılayacak Giriş, MOVWF TRISB ; Diğerleri Çıkış MOVLW h 88 ;GIE ve RBIE, PORTB Değişim kesme izin bitlerini (1)yap MOVWF INTCON ;Kesme Kontrol Registeri bu kesme için ayarlandı BCF STATUS, 5 ; Bank 0' a geç DONGU GOTO DONGU ; Bu satırda (komutta) kesme gelmesini bekle.. ; Başka işlem yapılmayacaksa Bekleme için ; SLEEP komutu da kullanılabilir. Kesme Alt Programı KESME_ALTP BCF INTCON, 0 ; PORTB Değişim Kesme bayrağını (RBIF) sil. MOVF PORTA,W ; PORTA yı Aküye al MOVWF SAYI ; Aküyü SAYI Registerine aktar. BCF STATUS,0 ; Çarpmadan önce C bayrağını sil RLF SAYI,F ; SAYI Reg. 2 ile çarp, yine SAYI ya yaz RLF SAYI,F ; SAYI Reg. tekrar 2 ile çarp, yine SAYI ya yaz MOVLW h 25 ; Aküye h 25 yükle ADDWF SAYI,F ; SAYI Reg. Akü ile topla, yine SAYI ya yaz RETFIE ; Kesme alt programından dön. BÖLÜM 11 - DONANIM SAYICILARI Daha önce incelendiği gibi bir gecikme yapmak istediğimizde GECIKME alt programı kullanmak gerekiyordu. Bu sırada hiçbir işlem yapmadan belli bir süre bekleniyordu. Buna yazılım zamanlayıcısı (software timer) denir. Bu alt program esnasında PIC herhangi bir işlem yapamadığı için özellikle uzun süreli beklemeler için donanım zamanlayıcısı (hardware timer) tercih edilir. Böyle bir zamanlayıcı aynı zamanda sayıcı olarak da kullanılabilir. PIC16F84 iki tip zamanlayıcıya sahiptir. Biri TMR0 adında özel fonksiyon registerleri içinde h 01 adresindedir. Diğeri WDT (watchdog timer) şeklinde genelde PIC deki kilitlenmelere karşı kullanılır. 11.1. TMR0 Zamanlayıcısı/Sayıcısı 8 bit uzunluğunda bu register h 00 dan ya da herhangi bir sayıdan başlayarak ileri yönde sayar. İstenilen anda programla bu register sıfırlanabilir, okunabilir ve bir sayı yüklenebilir. Sayı artışı harici veya dahili kaynakla yapılabildiği gibi programlanabilen frekans bölme değeri sayesinde bu sayma hızı değiştirilebilir. Ayrıca izin verildiği takdirde sayıcı değeri h FF den h 00 a geçişi anında (zaman dolunca) bir kesme üretilebilir. Bu taşma anında T0IF bayrağı (1) olur. 20

11.2. OPTION REGISTER Bu register de yine özel fonksiyon registerleri içinde Bank 1 de h 81 adresinde bulunur. Görevleri arasında PORTB nin çıkışlarına yazılımla PIC içinden pull-up dirençleri bağlanmasında, kesme işaretinin yükselen yada düşen kenarla aktif olacağının seçilmesinde, frekans bölme sayısını ve bu sayının TMR0 ya da WDT ye ait olduğunu belirlemede ve TMR0 sayıcı olarak kullanıldığında hangi kaynakdaki pulslerin hangi kenarlarını sayacağını programlamada kullanılır. Bu bitler: RBPU : PORTB pull-up direçleri devreye alma (1: iptal ; 0:devrede) INTEDG: Harici kesme kenar seçme biti (0:düşen kenarla ; 1:yükselen kenarla) T0CS: TMR0 hangi sinyalle sayacak? (0:dahili clock ile; 1:harici RA4/T0CK ile) T0SE: TMR0, RA4/T0CK girişindeki hangi kenarla sayacak? (0:düşen kenarla ; 1:yükselen kenarla) PSA: Frekans bölücü hangi zamanlayıcı için geçerli (0:TMR0 için; 1:WDT için) PS2,PS1,PS0: Frekans bölme sayısı (Aşağıda verilmiştir) Frekans Bölme Sayısının (PSx) Kullanımı: OPTION_REG de PS0, PS1, PS2 bitleri ya WDT' ye uygulanacak clock (saat) işaretini ya da TMR0 ın clock işaretini böler. Bu bitler ayarlanarak sayma hızı değiştirilebilir. 2 3 = 8 olduğundan 8 farklı bölme sayısı ( oranı ) elde edilebilir. Bunlar; Bölme sayısı (PSx) TMRO WDT ( PS0, PS1, PS2 ) için oran için oran 000 1 / 2 1 / 1 001 1 / 4 1 / 2 010 1 / 8 1 / 4 011 1 / 16 1 / 8 100 1 / 32 1 / 16 101 1 / 64 1 / 32 110 1 / 128 1 / 64 111 1 / 256 1 / 256 TMR0 ve WDT için Oranın Etkisi: Sayma işlemi için verilen oranlar kaç (dahili komut periyodunda ) bir üst sayıya geçileceğini tespit eden değerlerdir. Mesela PS2, PS1, PS0 bitleri ( 011 ) yapılırsa ( 4 MHz kristalde ) 1 s komut peryodunda çalışmada TMR0 için oran (1/16) olduğundan 16 * 1 s = 16 s de bir sayıcı bir üst sayıya geçecektir. Aynı bitleri (011) WDT için kullanırsak oran (1/8) olacağından bu defa 21

8 * 1 s = 8 s de bir üst sayıya geçilecektir. WDT' nin son değere varması da buna göre gerçekleşecektir. Örnekler: 1 ) Bölme sayısı ( 000 ) olarak seçilen bir TMRO sayıcısı kesme işaretini kaç s aralıklarla üretir? ( İhtar: Kesme işareti, ya da kesme bayrağının (1) yapılması h FF dan h 00 geçişi anında gerçekleşmekteydi ). f OSC = 4 MHz i ele alalım. Komut peryodu için f komut = 4 MHz / 4 = 1 MHz T komut = 1 / 1 MHz = 1 / 10-6 = 1 s olur. ( 000 ) için oran ( 1 / 2 ) olduğundan sayıcı 2 komut peryodunda ( T komut ) bir artıyor. TMRO 1 s = T komut h'00' h'01' h'02' 2 s 2 s TMR0 registerinin h'00' dan h'ff' e varıp tekrar h'00' a geçişi için toplam ( 256 ) 10 sayma gerektiğine göre; 256 * 2 s = 512 s de bir TMR0 kesme işareti üretilmektedir yani T0IF=1 yapılmaktadır. 2 ) PS2, PS1, PS0 bitleri ( 111 ) 2 seçilirse TMR0 için sayma aralığı süresi ve kesme üretme aralıkları ne olur? F OSC = 4 MHz alınırsa T komut = 1 s olur. ( 111 ) için bölme oranı ( 1 / 256 ) olduğuna göre; Sayma aralığı süresi 256 * 1 s = 256 s olur. Kesme aralıkları 256 s * 256 = 65536 s 65,5 ms olacaktır. Frekans Bölme Bitlerinin (PS2,PS1,PS0) Atanması TMR0 sayıcısını doğrudan (frekans bölmeden) beslemek için ( oran: 1/1 ) yapılacak iş, bölme sayısını doğrudan WDT ' ye atamaktır. PSx değeri WDT' ye atandığında TMR0 a yazmak için kullanılan CLRF, MOVWF, BSF gibi komutlar bu PS2, PS1, PS0 değerlerini sıfırlayarak yeni PSx değerleri girmeye hazırlanma imkanı verir. PSx değerini TMR0 dan WDT ye yada WDT den TMR0 a atama işlemi yapılırken PSx değerlerinin sıfırlanması sebebiyle PIC' in çalışması sırasında istenmeyen RESET ler ortaya çıkabilir. Bunu önlemek için; TMR0' dan WDT'ye PSx Değerlerini Atamak için Program Parçası: BCF STATUS, 5 ; Bank0 a geç, zira TMR0 Bank0 da CLRF TMR0 ; TMR0 ve mevcut PS2,PS1,PS0 bitlerini sil BSF STATUS, 5 ; Bank1 e geç, OPTION_REG bank1 de. 22

CLRWDT MOVLW b'xxxx1xxx' ;Yeni PS2,1,0' ları ve diğer bitleri WDT için W' ye yaz MOVWF OPTION_REG ;OPTION_REG' e yaz BCF STATUS, 5 ; Tekrar Bank0 a geç ; WDT sayıcısını sil.register değil her zaman sadece yazılır WDT' den TMR0 ' a PSx Değerlerini Atamak için Program Parçası: CLRWDT ; WDT' nin içeriğini ve PS2,1,0 değerlerini sil BSF STATUS, 5 ;Bank1 e geç, OPTION_REG h 81 yani Bank1 de. MOVLW b'xxxx0xxx' ; TMR0' ı ve PSx değerlerini ve sinyal kaynağını seç. MOVWF OPTION_REG ; W' yi OPTION_REG' e yaz BCF STATUS, 5 ; Tekrar Bank0 a geç TMRO Sayıcısı Nasıl Kullanılır? TMR0' ı kurmak (setup) için yukarıdaki program parçasından faydalanılır ve böylece gerekli PSx değerleri diğer bitlerle birlikte yüklenmiş olur. TMR0 sayıcısının saymasını başlatmak için TMR0 registerine bir sayı ( byte ) yazılır. Saymaya başlama sayısını ( kesme aralığını ) değiştirmek için TMR0' a h'00' dışında bir sayı yazılabilir. Bu durumda TMR0 sayıcısı bu sayıdan h'ff' e kadar sayacaktır. TMRO' ın Çalıştığı Nasıl Anlaşılır? Bu registeri herhangi bir anda okumak suretiyle TMR0 registerinin bir bitini test ederek h'ff' den h'00' a geçiş anında oluşan kesme işaretini, dolayısıyla ilgili bayrağı ( T0IF ) test ederek ( = 1 mi? ) ( TMR0 sayarken diğer program komutlarının aksamadan icra edildiğini hatırlayalım ). Neler Yapılmadığı Takdirde TMR0 Saymaya devam eder? CLRF TMR0 komutu ile silinmezse TMR0' a bir sayı yazılmadığı takdirde PIC RESET yapılmadığı sürece Her kesme oluşunca sayma işlemi daima h'00' dan başlar. Bu sebeple eğer her sefer belli bir yerden sayması isteniyorsa kesme alt programında istenen sayma başlangıç değeri tekrar yüklenmelidir. TMR0' ı Durdurmak Mümkün müdür? Hayır. PIC çalıştığı müddetçe TMR0 devamlı sayar. Ancak bundan faydalanmak istenmezse (kesme oluşturması istenmiyorsa) ilgili izin biti ( TOIE = 1 ) yapılmaz. Fakat her FF 00 geçişinde yine de sayıcı T0IF bayrağını 1 yapmaya devam eder. 23

Örnek : PORTB ' nin 1. bitine (RB1) bağlı bir LED' i yakıp söndüren bir program parçasını TMR0 sayıcısı kullanarak yazınız ( Akış diyagramı da çizilecektir ). Çözüm : TMR0 için bölme oranını 1 / 256 yapalım. Yine de LED in yanıp sönmesi fark edilmeyebilir. Bu yüzden 4 Mhz kristal yerine RC tipi osilatör ile daha düşük komut frekansı sağlanırsa LED' in yanıp sönmesi daha rahat görülür. Akış Diyagramı Parçası GECIKME Alt Programı Program Parçası CLRWDT ;Önceki PS değerleri sil ve WDT yi sıfırla. MOVLW b 11010111 ; TMR0 ı programla,frekans bölücü,kaynak vs seç MOVWF OPTION_REG ; Değeri yaz BCF STATUS,5 ; Bank0 a dön. YAK BSF PORTB,1 ; LED i yak 24

CALL GECIKME ; Gecikme yap SONDUR BCF PORTB,1 ; LED i söndür CALL GECIKME ; Gecikme yap GOTO YAK ; Yakıp söndürmeye devam et. GECIKME CLRF TMR0 ; TMR0 a h 00 değeri ver. TEST BTFSS TMR0,6 ; 6. bit (1) oldu mu? GOTO TEST ; Olmadıysa 6. biti tekrar test et. RETURN ; Alt programdan dön. Faydalanılan Kaynaklar : 1- Mikroişlemciler Ders Notları 1-2 (6502), 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- PIC Microcontroller Uygulama Devreleri, Gökhan DİNÇER 6- Microchip PIC16F8X ve PIC16F877 PIC Data Sheet, 7- www.microchip.com web adresi. 25