Hacettepe Robot Topluluğu



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

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

Hacettepe Robot Topluluğu

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

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

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

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

# 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

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

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

PIC TABANLI, 4 BASAMAKLI VE SER

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

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

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

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

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

KOMUT AÇIKLAMALARI VE ÖRNEKLERİ

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

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu

LCD (Liquid Crystal Display )

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

KONFİGÜRASYON BİTLERİ

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

LCD (Liquid Crystal Display)

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

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

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

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

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.

PIC16F877A nın Genel Özellikleri

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

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

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

PIC16F87X te ADC MODÜLÜNÜN KULLANIMI

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

MİKRODENETLEYİCİLER ÖRNEK PROGRAMLAR

Hacettepe Robot Topluluğu

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

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

Hacettepe Robot Topluluğu

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

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

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

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

Hacettepe Robot Topluluğu

PD103 BUTON LED UYGULAMA DEVRESİ UYGULAMA ÖRNEKLERİ MALZEME LİSTESİ

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

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

MIKROBILGISAYARLAR ve PIC PROGRAMLAMA TEST ÇALIŞMA SORULARI

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

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

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

7 Segment Display Kullanımı Ve LOOK-UP (dönüşüm tablosu) oluşturma

8 Ledli Havada Kayan Yazı

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

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.

PIC Mikrodenetleyicileri

KONTROL VE OTOMASYON KULÜBÜ

7. Port Programlama. mikroc Dili ile Mikrodenetleyici Programlama Ders Notları -42- Şekil 2.1. Atmega16 mikrodenetleyici pin şeması

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

# 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

EEProm 24C08 UYGULAMA AMAÇ 24C08 MCU_VCC. e r : d e G. Sayfa - 1

EEM 306 Mikroişlemciler ve Lab. Doç.Dr. Mehmet SAĞBAŞ

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

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

void setup() fonksiyonu: Bu fonksiyon program ilk açıldığında bir kere çalışır ve gerekli kalibrasyon, setup komutlarını buraya yazarız.

Hacettepe Robot Topluluğu

PIC 16F877 nin kullanılması

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

PIC Mikrodenetleyiciler. Hazırlayan:Öğr.Gör.Bülent ÇOBANOĞLU 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İ) ENDÜSTRİYEL OTOMASYON TEKNOLOJİLERİ

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İ

3.3. İki Tabanlı Sayı Sisteminde Dört İşlem

Haftalık Ders Saati Okul Eğitimi Süresi

ELEKTRİK-ELEKTRONİK TEKNOLOJİSİ

Yrd. Doç. Dr. Caner ÖZCAN

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

Paralel ve Seri İletişim. Asenkron/Senkron İletişim. Şekil 2: İletişim Modları

Mikroişlemcilerde Aritmetik

PIC MIKRODENETLEYICILER-3: GECĠKME ve KESME PROGRAMLARI

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

EEM 419-Mikroişlemciler Güz 2017

ELEKTRİK-ELEKTRONİK TEKNOLOJİSİ

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

TUŞ TAKIMI (KEYPAD) UYGULAMALARI

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.

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

1. Ders Giriş. Mikroişlemcili Sistem Uygulamaları

ONDOKUZ MAYIS ÜNİVERSİTESİ

Çizgi İzleyen Robot Yapımı

Deney 8: ALU da Aritmetik Fonksiyonlar

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

BLGM423 Gömülü Sistem Tasarımı

Akış Kontrol Mekanizmaları

Komutların İşlem Süresi

LPC2104 Mikro Denetleyicisini KEIL İle Programlamak

Yrd. Doç. Dr. Caner ÖZCAN

Mikroişlemci Nedir? Mikrodenetleyici Nedir? Mikroişlemci iç yapısı Ders Giriş. Mikroişlemcili Sistem Uygulamaları

BİLİŞİM TEKNOLOJİLERİ

Transkript:

Hacettepe Robot Topluluğu

PIC Assembly Dersleri 3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı

HUNRobotX - PIC Assembly Dersleri 3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı Yazan: Mustafa Tufaner, Düzenleyen: Canol Gökel - 9 Aralık 2007 Bazı Özel İşlev Yazmaçları Geçen dersimizde PIC mikrodenetleyicilerinin rom/ram yapısından ve PIC programlamada kullanacağımız PIC Assembly komutlarından bahsetmiştik. Ram konusundayken sizlere de belirtildiği gibi ram şemasındaki bazı ram'lerin isimleri önceden verilmişti. Tek başına isim/etiket ram için bir anlam ifade etmese de bu isimlerin datasheet'te yazması, bu ramlerin önceden seçilip mikrodenetleyicinin kullanımında olduğunu bizlere belirtmeye yeter. Bu ram'lere de yine önceden değindiğimiz üzere SFR (Special Function Register/Ozel İşlev Yazmacı/Kaydedicisi) denilmektedir. Bunların özelliği tabii ki mikrodenetleyicinin işleyişiyle bağlantılı olmalarından geliyor. Biz de bu özel yazmaçlardan bazılarını kullanarak programımıza daha rahat yön verebileceğimiz gibi yazmaçlardan bazıları ile PIC mikrodenetleyicisinin içinde bulunan bazı elemanlardan da faydalanabileceğiz. Status (Durum) Yazmacı Mikrodenetleyicinin yaptığı aritmetik ve mantıksal işlemlerle ilgili bazı özellikler ile reset durumuyla ve hangi ram bank'ının kullanıldığıyla ilgili verileri içeren yazmaca STATUS yazmacı diyoruz. IRP RP1 RP0 TO PD Z DC C bit 7 bit 0 STATUS Yazmacı 5. Bit (RP0): Hangi ram bank'ının seçildiğini belirtir. Eğer 0 ise 0. ram bank'ı 1 ise 1. ram bank'ı seçilidir. 2. Bit (Z): Zero (Sıfır) biti. Eğer yapılan işlemin sonucu sıfırsa bu bit 1 olacaktır. Eğer işlemin sonucu sıfırdan farklı ise 0 olacaktır. 0. Bit C: Carry (Taşma) / Barrow (Ödünç) biti. Eğer toplama işleminin sonucunda taşma varsa yani sonuç 255'ten büyükse yada çıkarma işleminde ödünç kullanılmamışsa yani çıkarılan çıkandan büyükse (sonuç pozitifse), ya da bit kaydırma komutlarından taşan bit 1 ise Carry biti 1'dir. Toplama işleminin sonucu 255'ten küçükse yani taşma yoksa, çıkarma işleminde ödünçe

3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı ihtiyaç varsa yani sonuç negatifse, bit kaydırma işlemlerinde taşan bit 0 ise Carry biti 0'dır. Yukarıda STATUS yazmacının size şu aşamada lazım olabilecek bitleri verilmiştir. Bu bitleri kavradıktan sonra daha detaylı bilgi için datasheet'e bakabilirsiniz. Şimdi açıkladığımız bitleri bazı örnek komutlar vererek pekiştirelim. MOVLW D'42' ; Ondalık 42 sayısını W'ya yükle MOVWF TOPLANACAK1 ; İsimli ram'e w'daki 42 sayısı yüklendi MOVLW D'108' MOVWF TOPLANACAK2 ; İsimli ram'e 108 sayısı yüklendi ; İki ram bank'ını yani 2 yazmacı toplayabilmemiz için birisinin ; içeriğini W'ya atıp diğer yazmaçla toplamalıyız MOVFW TOPLANACAK1 ADDWF TOPLANACAK2,W ; İki yazmacı toplayıp sonucu W'ya yazdık Yukarıdaki son satırda 42 ve 108 sayılarını topladık. Bu toplama işleminin STATUS yazmacında etkilediği bitleri kontrol edelim. Eğer mikrodenetleyicinin yaptığı işlem STATUS yazmacının bitleri ile ilgiliyse, bu bitler yapılan işlemin sonucuna göre yeni değerlerini alacaklardır. Örneğin, RRF komutu sadece Carry bitini ilgilendirmektedir. Bu yüzden sonuç ne olursa olsun Z biti etkilenmeden önceki değerini korurken taşan basamağa göre C biti yeni değerini alacaktır. Yaptığımız toplama işlemine dönelim: Hatırlatma: 8 bitlik bir sayıyı 2 heksadesimal basamak ile gösterebiliriz. Her heksadesimal basamak 4 bite denk gelecektir. 0010 1010 + 0110 1100 1001 0110 2 A + 6 C 9 6 En üst bitten taşma yok ve sonuç sıfırdan farklı. O halde: C biti = 0, Z biti = 0 Şimdi de topladığımız sayıların 32 ile 224 olduğunu varsayalım: 0010 0000 + 1110 0000 2 0 + E 0

HUNRobotX - PIC Assembly Dersleri 1 0000 0000 1 0 0 Dikkat: Kullandığımız Ram'ler ve W 8 bitlik olduğu için sonucun sadece alt 8 biti (heks 2 basamak) kaydedilir. En üst bitten taşma var (Sonuç > 255) ve Sonuç = 0. O halde: C biti = 1, Z biti = 1 Bir çıkarma işleminin status yazmacına etkisini inceledikten sonra bit kaydırma işlemini kontrol edelim. MOVLW D'40' SUBLW D'25' ; Desimal 40 sayısını W'ya yükle ; L - W sonucunu W'ya kaydet Dikkat: Pic Assembly dilindeki çıkarma işlemlerinde W hep çıkarılır. 1 0001 1001-0010 1000 1101 0001 1 1 9-2 8 F 1 Dikkat: 25-40 = 241! PIC'te negatif sayılar bulunmadığı için sonuç 256'nın tamlayanı biçiminde yazılır. En üst bit ödünç aldı (sonuç negatif) ve sonuç sıfırdan farklı. O halde: C biti = 0, Z biti = 0 Görüldüğü üzere bir çıkarma işleminin sonucunun negatif olup olmadığını Carry bitini kontrol ederek öğrenebiliriz. Çıkarma işleminde ödünç alma işlemine ihtiyaç duyuyorsanız elde edeceğiniz sonuç negatif olacaktır. Bu ödünç alma olayından dolayı Carry biti 0 olacaktır. Eğer ödünç almaya ihtiyacımız olmasaydı Carry biti 1 olacak ve elde edeceğimiz sonuç da pozitif olacaktı. Özetleyecek olursak Carry biti 0 ise sonuç negatif, carry biti 1 ise sonuç pozitiftir. Başka bir deyişle ödünç alınmışsa Carry 0, alınmamışsa 1'dir (ters çalışmaktadır.). Bit Kaydırma Komutlarının Çalışma Biçimi İlk olarak RLF komutunun çalışma biçimine bakalım:

3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı X X X X X X X X X Carry Biti Sola kaydırmada en sağda boş kalan bit yerine Carry bitindeki değer atanırken en soldan taşan bit Carry'ye (STATUS taşma bitine) yazılır. RRF komutu için de tam tersi söz konusudur. Görüldüğü gibi RRF ve RLF komutları Carry bitinin içeriğini doğrudan değiştirebilmektedir. Carry bitinin önceki içeriği de bitleri kaydırılan değişkenin içeriğini etkilemektedir. BCF STATUS, C ; Carry bitini sıfırla MOVLW B'1000000' ; Ondalık 128 sayısını W'ya yükle MOVWF ROTA ; W'daki değeri ROTA'ya yükle RLF ROTA ; ROTA değişkenindeki bitleri sola kaydır 1 0 0 0 0 0 0 0 0 Carry Biti Değişken üzerinde bit kaydırma işlemi uygulanıyor 0 0 0 0 0 0 0 0 Değişkenin son hali C biti ROTA değişkeninin 7. bitinin içeriği olan 1 değerini saklayacaktır, bu yüzden C = 1. Her ne kadar sonuç 0 gibi gözükse de bit kaydırma komutları tam olarak mantık ya da aritmetik işleminden sayılmadığı için Z bitini etkilemezler. Mantık işlemi demişken, herhangi bir mantıksal işlemin sonucu 0 ise Z biti 1 olacaktır. Aynı şekilde mantıksal işlemin sonucu 0'dan farklı ise Z biti 0 olacaktır. Kullandığınız komutların hangilerinin STATUS bitlerini etkilediğini görmek için datasheet'in instruction set (komut kümesi) sayfasındaki komutların yan tarafındaki Status Effected sütununa bakabilir ve bu değerlere göre program kodlarınızı yazabilirisiniz. Tekrar belirtmekte fayda var, eğer kullandığınız komut STATUS yazmacının herhangi bir bitini etkiliyorsa o komuttan sonra STATUS yazmacının etkilenmeyen bitler değerlerini koruyacaktır. Bu özellik yazdığımız

HUNRobotX - PIC Assembly Dersleri programlarda kimi zamanlar işimize yarayabilmektedir bazen de farkında olmadan hatalar yapmamıza sebep olmaktadır. Örnek: Eğer CLRF komutu STATUS, Z bitini etkiliyorsa CLRF YAZMAC işleminin sonucunda STATUS yazmacının değeri ne olur? Cevap: STATUS yazmacının içeriği komuttan önce şöyle olsun (burada harfler herhangi bir değeri ifade etmektedir): IRP RP1 RP0 TO PD Z DC C a b c d e f g h CLRF YAZMAC komutu STATUS, Z bitini etkiliyorsa bu demektir ki işlemin sonucu 0 ise STATUS, Z biti 1 olacaktır. Haliyle sıfırlama komutunun sonucu kesinlikle sıfır olacağı için CLRF (SIFIRLA) komutunun ardından STATUS, Z da 1 olacaktır. Peki aritmetiksel işlemlerle ilgili olan DC ve C bitleri bu işlemden nasıl etkilenecektir? CLRF komutu sadece Z bitinin değerini etkilediği için DC ve C bitleri CLRF komutundan önceki içeriklerini koruyacaklardır. Yani CLRF YAZMAC komutundan sonra STATUS yazmacı şu değere sahip olacaktır. IRP RP1 RP0 TO PD Z DC C a b c d e 1 g h Şimdi sorumuzu biraz daha zorlaştırarak soralım: CLRF STATUS komutunun ardından STATUS'un içeriği ne olacaktır? Bu komut sıfırlama komutu olmasından dolayı bu işlemden sonra STATUS'un değeri 0 mı olacaktır? Yine başlangıçta STATUS yazmacının herhangi bir içeriği olsun IRP RP1 RP0 TO PD Z DC C a b c d e f g h CLRF komutu bu yazmacı sıfırlayacaktır. Dolayısıyla sonucu 0 olarak elde edeceğiz ama bitmedi. Sonuç sıfır olduğu için ve yapılan işlem STATUS, Z bitini etkilediği için STATUS, Z biti 1 olacaktır. CLRF komutu TO, PD, DC ve C bitlerini etkilemediğinden ötürü bu bitler de CLRF komutundan önceki içeriklerini koruyacaklardır. Dolayısıyla CLRF STATUS komutundan sonraki STATUS yazmacının değeri şu şekilde olacaktır: IRP RP1 RP0 TO PD Z DC C 0 0 0 d e 1 g h

3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı Dikkat: Hangi yazmaçla işlem yaptığınıza bakılmaksızın eğer yaptığınız işlem status'un herhangi bir bitini etkiliyorsa yapılan işlemin sonucuna göre bu etkilenen bit yeni bir değer alacak ve işlemden etkilenmeyen bitler işlem öncesi sahip oldukları değerleri koruyacaklardır. TRIS Yazmaçları PIC (Peripheral Interface Controller) 16F84A'nın donanımında giriş ve çıkış olarak kullanabileceğimiz iki port yer almaktaydı. Bir tanesi 8 pin'den oluşan PORTB yazmacı ile kontrol edilen B portu, diğeri de 5 pin'den oluşan PORTA yazmacı ile kontrol edilen A portu. Peki bu portların pin'lerini nasıl giriş ya da çıkış olarak tanımlayacağız? Mikrodenetleyici bu portların pin'lerini giriş veya çıkış yapmak için TRIS yazmaçlarını kontrol eder. Bu yazmaçların bitlerindeki değerler, ilgili portun pin'lerinin giriş ya da çıkış olarak ayarlanmasını sağlayacaktır. Her port için bir adet TRIS yazmacı vardır. Örneğin, A portunun pin'lerinin giriş/çıkış olmasını ayarlayan TRISA yazmacı ve B portunun pin'lerinin giriş/çıkış olmasını ayarlayan TRISB yazmacı bulunur. TRISB = B'10101010' olsun, yani TRISB yazmacının 7., 5., 3. ve 1. bitleri 1 ve de 6., 4., 2. ve 0. bitleri 0 olsun. Bu durumda PORTB'nin 7., 5., 3. ve 1. pin'leri giriş olarak; 6., 4., 2. ve 0. pin'leri ise çıkış olarak tanımlanacaktır. Başka bir ifadeyle TRIS yazmaçlarındaki kaçıncı bitler 0 ise ilgili portta aynı bit çıkış, TRIS yazmacındaki hangi bitler 1 ise ilgili porttaki pinler giriş olacaktır. Aklınızda kalması açısından 0 = Output, 1 = Input; 0 O ve 1 I benzerliği size yardımcı olabilir. Uyarı: PORTA 5 pin içerdiği için TRISA'nın üst 3 bitinin değeri PORTA yazmacında da olduğu gibi bir anlam ifade etmemektedir. Sadece alt 5 biti önem taşımaktadır. TRIS yazmaçlarıyla ilgili bir diğer ufak nokta ise bu yazmaçların 1. ram bank'ında bulunmalarıdır. Demek oluyor ki bu yazmaçların içeriğini değiştirmeden önce STATUS yazmacından 1. bank'a geçmek için STATUS, RP0 bitini 1 yapmalıyız. Böylece 1. ram bank'ına geçmiş olacağız. Tekrar 0. ram bank'ına geçmek için STATUS, RP0 'ı 0 yapmalıyız. Altprogramlar Özel Fonksiyon Yazmaçlarına burada ufak bir ara verip bizim için gerekli olan başka bir konuyla ilgileneceğiz. Bir anne ve de kızını düşünelim, annesi oğlu acıktığı için kızından pilav yapmasını istemiş olsun. Annesi kızına her pilav yapışında yemek tarifi anlatmak yerine pilav tarifini içeren

HUNRobotX - PIC Assembly Dersleri bir yazı versin. Sonraları annesi kızından pilav yapmasını istediğinde kızına pilavın nasıl yapıldığını anlatmayacak sadece kızından pilav yapmasını isteyecektir. Bu durumun benzer haline biz programlamada altprogram diyoruz. Defalarca kullanacağımız bazı program kodlarını bir yere yazıyoruz (pilav tarifi) sonra bu kodları kullanacağımız zaman PIC'ten pilav yapmasını ( :D yani o kodları uygulamasını) istiyoruz. Böylece her seferinde o kodları tekrardan programımıza eklemek zorunda kalmayıp daha anlaşılır bir program yazmış olmanın yanında, program hafızasından da kazanç sağlıyoruz. Basit bir örnekle konuyu daha güzel ifade edebiliriz. 1 saniye yanıp bir saniye sönen bir LED'imiz olsun. DONGU BSF LED 1 saniye gecikme BCF LED 1 saniye gecikme GOTO DONGU Gördüğünüz gibi burada 2 defa 1 saniyelik gecikme sağlayacak programa ihtiyacımız olacak. 1 saniyelik gecikme yaratan kodları 2 defa yazmak yerine: DONGU BSF LED CALL GECIKME BCF LED CALL GECIKME GOTO DONGU ; Şimdi programın akışı dışında bir yere aşağıdaki altprogramı yazmalıyız GECIKME 1 saniye gecikme RETURN Fark edileceği gibi altprogram kullanarak yazdığımız ana program ilkine oranla daha anlaşılır ve daha düzenli oldu. Gecikme kodlarını sadece bir kere yazmış olmamız da altprogramın başka bir güzelliği. Şimdi nasıl altprograma girdiğimizi inceleyelim CALL (ÇAĞIR) komutu programın nerde kaldığını STACK'e kaydedip GECIKME etiketinin bulunduğu satıra gidecektir. Oradaki komutları işleyip RETURN (GERİ DÖN) komutuna gelince STACK'te kayıtlı olan konuma geri dönüp program akışına devam edecektir. Şimdi STACK nerden çıktı diyenlerin sorusuna gelelim.

3. Ders: Bazı Özel İşlev Yazmaçları ve Altprogram Kavramı STACK hakkında pek bir şey bilmemiz gerekmiyor. Sadece bu birimin programın nerden altprograma girdiğini kaydettiğini ve altprogramdan dönerken kaydedilen bu veriye göre kalınan yeri bulunduğunu bilmemiz yeterli olacaktır. Ayrıca bu birimin sınırlarına bağlı olarak 16F84 için en fazla 8 kere içiçe (nested) altprograma girebileceğimizi de söyleyelim. Bir kez daha yineleyelim. CALL - RETURN ikilisinden biri ile ana programdan alt programa geçerken diğeriyle altprogramdan ana programa dönüş yapıyoruz. Alıştırmalar 1) 2 farklı yazmaçta bulunan değerleri karşılaştırarak küçük olan değeri KUCUKSAYI büyük olan değeri de BUYUKSAYI değişkenine kaydeden bir program yazınız. 2) PORTA'nın 1. bitine bağlı düğmeye basıldığında PORTB'den bir sayı okuyup, bu sayı AYAR yazmacı içindeki sayıdan büyükse AYAR yazmacının yeni değerini PORTB'deki sayı yapan bir program yazınız. 3) Kaydırma komutlarını kullanarak PORTB'nin hangi bacağının 1 olduğunu bulan bir program yazınız (Not: PORTB'nin sadece 1 bacağının 1 olduğunu kabul ediniz.). 4) STATUS yazmacının aşağıdaki komutlardan önce içeriği 00100000 iken MOVLW XORWF D'1' STATUS komutlarından sonra alacağı yeni değerini bulunuz. İpucu: XORWF komutu STATUS'un sadece Z bitini etkilemektedir, MOVLW komutu ise hiçbir STATUS bitini etkilememektedir. 5) TRIS yazmaçlarının hangi ram bank'ında yer aldığına da dikkat ederek PORTA'nın 0. ve 3. bitlerini çıkış olarak ayarlayan bir program yazınız. 6) 200 araç kapasiteli bir otopark firması sahipleri otoparklarındaki aracı sayabilen bir sayısal (dijital) sistem kurmaya karar verip HUNRobotX'e başvururlar. Firma sahipleri bir araç girdiğinde ya da çıktığında yeterli bir süre +5 V'luk sinyal verecek sensörlerin hazır olduğunu sadece bu işi yapacak yazılıma ihtiyaç duyduklarını söylerler. Ayrıca bazı isteklerde bulunurlar: - Otoparktaki mevcut araç sayısı ARACSAYISI yazmacında kayıtlı olsun ki gerektiğinde kaç araba olduğu kontrol edilebilsin (kayıtlı olması yeterlidir). - Eğer otoparkta boş yer yoksa, otopark dolu lambası yansın. Projeye Pic Assembly kursuna katılan HUNRobotX üyeleri gönüllü olur ve olaylar gelişir (Not: PIC'in hangi bacağını hangi iş için kullanacağınızı aşağıdaki şekle göre belirleyiniz.).

HUNRobotX - PIC Assembly Dersleri RA2 RA1 RA3 RA0 Otopark Dolu Lambası RA4 Giren Araç Düğmesi RB0 PIC 16F84 RB7 Çıkan Araç Düğmesi RB1 RB6 RB2 RB5 RB3 RB4 Bağlantılar http://robot.ee.hacettepe.edu.tr/ http://www.microchip.com/