21
1 CALL ALTP END STACK REG RETURN İlk Komut Ana Program Alt Program MİKRO DENETLEYİCİLER II DERS NOTLARI (Vize) Prof. Dr. Hakan Ündil 2016-2017 Bahar (MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. Sadece VİZE için olan kısımdır) 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 : Bu işlemleri sırayla yazarsak; 1. Ana program başlangıçtan itibaren çalışır. 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.

MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

1

CALL ALTP

END

STACK REG

RETURN

İlk Komut

Ana

Program

Alt

Program

MİKRO DENETLEYİCİLER II

DERS NOTLARI (Vize) Prof. Dr. Hakan Ündil

2016-2017 Bahar

(MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. Sadece VİZE için olan kısımdır)

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 :

Bu işlemleri sırayla yazarsak;

1. Ana program başlangıçtan itibaren çalışır.

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.

Page 2: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

2

16F84’ ü

tanıt, PORTB

çıkış

BAŞLA

PORTB’ yi sıfırla

PORTB h‘FF’

CALL GECİKME

CALL GECİKME

ş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’

SAYAC2 EQU h‘0D’

BSF STATUS,5

CLRF TRISB

BCF STATUS,5

DEVAM MOVLW h‘00’

MOVWF PORTB

CALL GECİKME

MOVLW h‘FF’

MOWF PORTB

CALL GECİKME

GOTO DEVAM

GECİKME MOVLW h‘FF’

MOWF SAYAC1

Page 3: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

3

TEKRAR1 MOWF SAYAC2

TEKRAR2 DECFSZ SAYAC2, F

GOTO TEKRAR2

DECFSZ SAYAC1, F

GOTO TEKRAR1

RETURN

END

BÖLÜM 7 - ARİTMETİK İŞLEMLER

PIC Mikrodenetleyicilerde aritmetik işlem komutları diğer komutlar kadar gerekli olmakta,

özellikle toplama, çıkartma ve (2n =2,4,8,16) ile çarpma ve (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.

7.1. 8 Bit Toplama:

PIC16F84’ de 8 bit toplama için 2 komut mevcuttur:

Page 4: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

4

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.

Ö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)

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

Page 5: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

5

1. sayı üst byte (XH) 2. sayı üst byte (YH)

1. sayı alt byte (XL)

2. sayı alt byte (YL)

Ö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

Ö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ı.

MOVWF YH ; X ve Y byte’ları ayrılan registerler yükle.

TOPLA MOVF XL, W

Page 6: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

6

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

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

Page 7: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

7

Borç

Hayır

Alt byteları çıkar

Üst byteları çıkar

Evet

(Borç

varmı?)

C = 0 mı?

1. sayının üst byte’ından

(1) çıkar

İş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

h’17’(C=0) Cevap: -17

7.4. 16 Bit (İki byte) Çıkartma:

16 bit toplamaya benzerdir. Eksilen ve çıkan sayıların üst ve

alt byte’ları için birer olmak üzere 4 byte kullanılması gerekir.

Örnek olarak h’53A8’ sayısından h’24F6’ sayısını çıkarmak için;

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.

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

Page 8: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

8

BASLA

16F84’ ü tanıt

PORTB çıkış

PORTB

01

CALL GECIKME

CALL GECIKME

RLF PORT

B

SON

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.

BÖLÜM 8 - LOJİK İŞLEM KOMUTLARI

8.1. RLF Komutu (Bir bit Sola Kaydırma)

Bir file register içinde bulunan bitlerin birer bit sola kaydırılması işlemidir. Bu durumda en solda

bulunan ( 7. bit ) C ( elde ) bayrağına geçmekte, daha önce C’ de bulunan bit ise en sağdaki ( 0.) bite

geçmektedir. Komutun formatı;

RFL FİLE REGISTER , d W yada F ( Sonucun Yeri )

Komutu şematik gösterirsek;

Program Örneği : Bir programla önce PORTB ye h’01’ yükleyin. Daha sonra 1 defa bu biti sola

kaydırın. Bu işlemin daha iyi görülebilmesi için üst üste 2 kere GECIKME alt programı kullanın.

; 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

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

Page 9: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

9

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

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

8.3. COMF ve SWAPF Komutları

COMF komutu ile istenen bir file register içinde (0) lar (1) ve (1) ler (0) yapılabilir [1’ e

göre tümleyen işlemi !.. ] . Komut formatı;

COMF FILE REGISTER , d Sonucun gideceği yer

( destination ) ( W yada F yazılır )

Page 10: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

10

0001 1111

HAFIZA1

1110 0000

HAFIZA2

şeklindedir.

Örnek: HAFIZA1 adlı registere ( 1F )16 yüklendikten sonra bunun tersini bularak

HAFIZA2’ ye saklayan Program Parçasını yazın.

MOVLW h‘0F’

MOVWF HAFIZA1

COMF HAFIZA1, W

MOVWF HAFIZA2

SWAPF komutu ise bir file register içindeki ilk dört bit (Yüksek anlamlı Nibble) ile son

dört bitlerin (Düşük anlamlı Nibble) yerlerini değiştirir. Komut formatı;

SWAPF FILE REGISTER , d şeklindedir.

Örnek: PORTB’ ye ( 3F ) yazdıktan sonra ilk ve son 4’lü bitlerin yerini değiştiren ve

sonucu W ye yazan Program parçası yazın.

MOVLW h‘3F’

MOVWF PORTB

BÖLÜM 7 - ARİTMETİK İŞLEMLER

PIC Mikrodenetleyicilerde aritmetik işlem komutları diğer komutlar kadar gerekli olmakta,

özellikle toplama, çıkartma ve (2n =2,4,8,16) ile çarpma ve (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.

Page 11: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

11

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.

7.1. 8 Bit Toplama:

PIC16F84’ de 8 bit toplama için 2 komut mevcuttur:

2) 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.

Ö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 :

Page 12: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

12

1. sayı üst byte (XH) 2. sayı üst byte (YH)

1. sayı alt byte (XL)

2. sayı alt byte (YL)

İş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)

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

Ö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

Page 13: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

13

Önce toplama işlemini yapalım:

Hex. Desimal Binary

32 A6 12966 0011 0010 1010 0110

+ 2E 9C + 11932 + 0010 1110 1001 1100

62 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ı.

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

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

Page 14: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

14

Ö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

İş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

Page 15: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

15

Borç

Hayır

Alt byteları çıkar

Üst byteları çıkar

Evet

(Borç

varmı?)

C = 0 mı?

1. sayının üst byte’ından

(1) çıkar

0001 0111

h’17’(C=0) Cevap: -17

7.4. 16 Bit (İki byte) Çıkartma:

16 bit toplamaya benzerdir. Eksilen ve çıkan sayıların üst ve

alt byte’ları için birer olmak üzere 4 byte kullanılması gerekir.

Örnek olarak h’53A8’ sayısından h’24F6’ sayısını çıkarmak için;

Genel bir ‘akış diyagramı parçası’ çizersek :

54 A8 yandaki gibi bir durum ortaya çıkacaktır.

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

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

BÖLÜM 8 - LOJİK İŞLEM KOMUTLARI

8.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ı;

Page 16: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

16

BASLA

16F84’ ü tanıt

PORTB çıkış

PORTB 01

CALL GECIKME

CALL GECIKME

RLF PORT B

SON

RFL FİLE REGISTER , d W yada F ( Sonucun Yeri )

Komutu şematik gösterirsek;

Program Örneği : Bir programla önce PORTB ye h’01’ yükleyin. Daha sonra 1 defa bu biti sola

kaydırın. Bu işlemin daha iyi görülebilmesi için üst üste 2 kere GECIKME alt programı kullanın.

; 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

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

8.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:

Page 17: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

17

0001 1111

HAFIZA1

1110 0000

HAFIZA2

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.

8.3. COMF ve SWAPF Komutları

COMF komutu ile istenen bir file register içinde (0) lar (1) ve (1) ler (0) yapılabilir [1’ e

göre tümleyen işlemi !.. ] . Komut formatı;

COMF FILE REGISTER , d Sonucun gideceği yer

( destination ) ( W yada F yazılır )

şeklindedir.

Örnek: HAFIZA1 adlı registere ( 1F )16 yüklendikten sonra bunun tersini bularak

HAFIZA2’ ye saklayan Program Parçasını yazın.

MOVLW h‘0F’

MOVWF HAFIZA1

COMF HAFIZA1, W

MOVWF HAFIZA2

SWAPF komutu ise bir file register içindeki ilk dört bit (Yüksek anlamlı Nibble) ile son

dört bitlerin (Düşük anlamlı Nibble) yerlerini değiştirir. Komut formatı;

SWAPF FILE REGISTER , d şeklindedir.

Örnek: PORTB’ ye ( 3F ) yazdıktan sonra ilk ve son 4’lü bitlerin yerini değiştiren ve

sonucu W ye yazan Program parçası yazın.

MOVLW h‘3F’

Page 18: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

18

b

c e g

d

f

a

nokta

(Nokta dahil) toplam 8

tane segment

bulunmaktadır.

PB0 (a)

PB7 ( )

. g f e d c b a

0 0 1 1 1 1 1 1

RB7 .................................... RB0

a

b

g

d

e

MOVWF PORTB

SWAPF PORTB, W

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.

9.1. 7 Parçalı (Segment) Gösterge (Display) Uygulaması

Mesela; PORTB 'ye bağladığımız bir 7- segment (parçalı) display’in (göstergenin) üzerinde

heksadesimal (0,1,2.......E,F) sayıları göstermek istersek bu tür bir tablo kullanabiliriz.

7-segment(parçalı) gösterge (display) Ortak katod’lu ise bu uç GND' a (Besleme kaynağının (-)

ucuna bağlanmalıdır. Bu dijitte noktasız olarak ‘0’ yakmak için a,b, c, d, e, f segmentleri (parçaları)

yanmalı diğer parçalar (g ve nokta) sönük kalmalıdır.

O halde h’00’ sayısından (kodundan) h’3F’ = b’0011 1111’ (kodu) elde edilmelidir. Bir başka ifade ile

bu Dönüşüm Tablosuna biz h’00’ verdiğimizde o bize h’3F’ yollamalıdır. Zira bu durumda a segmenti

RB0 dan (PORTB’nin 0. biti) başlamak üzere,

Benzer şekilde (2) sayısını yakmak için aşağıda belirtilen segmentlerin yanması gereklidir.

Dönüşüm tablosu kullanımına ait örnek program yazmadan evvel Program Sayacı’nı (Program

Counter – PC ) ve RETLW komutunu inceleyelim.

olmalıdır.

O halde PORTB' ye h’3F’ yüklenmelidir.

Page 19: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

19

PCH PCL

Bu iki bit 2k' dan

fazla hafızaya sahip

PIC' ler içindir (PIC

16F877 gibi)

11 bit 2 kB hafızaya sahip PIC' ler

için yeterlidir . (PIC 16F84' de

1kB program hafızası vardır).

9.1.1. Program Sayacı (Program Counter – PC )

16F84' de 13 bitlik bir program sayacı (PC) vardır. GOTO ve CALL komutları gerçekte 11 bitlik

adres kullanılır ki bu sayı 16F84 ‘de 1K olan program hafızası için yeterlidir. Hatta 11 bit ile 2K

adreslemek de mümkündür. (Hatırlatma: 211

= 2048 = 2 K)

Genelde Program Sayacının alt (8) bitine PCL, üst (5) bitine PCH denir.

Program sayacının üst 5 bitini (PCH) doğrudan okumak veya buraya yazmak mümkün

değildir. Ancak PCH’a, veri hafızasında Özel Fonk. Registerlerinden Bank 0 ' da bulunan 5 bitlik

PCLATH adı verilen özel file registerinden faydalanarak veri yüklenebilir, böylece program

hafızasında daha uzun adres bölgelerini kullanmak mümkün olabilir.

Bu derste yazılacak programların uzunlukları normalde 256 satırı (komutu) geçmeyeceği için

sadece 8 bitlik kısım olan (PCL) ile ilgilenmek yeterli olacaktır (28 = 256).

9.1.2. RETLW Komutu:

Aslında RETLW komutu, RETURN komutu gibi bir alt programdan dönüş komutudur. Farklı

olarak RETLW ana programa dönerken Akümülatör (W) içinde bir sayı getirir. Şimdi örnek bir

program üzerinde bu komutun çalışmasını incelerken Dönüşüm tablosunu da anlamaya çalışalım.

Örnek : PORTB' de bulunan bir 7 segment göstergede (3) sayısını gösteren bir program parçasını

DONUSUM alt programı ile RETLW komutu kullanarak yazın.

;(Program Parçası)

MOVLW h’03’

CALL DONUSUM ; DONUSUM Alt programına git

MOVWF PORTB

………………………

;(DONUSUM Alt Programı)

DONUSUM ADDWF PCL, F ; PCL + W işlemini yap,neticeyi PCL’ ye yaz.(W=03 idi)

RETLW h’3F’ ; W= 0 olsaydı bu satıra atlayacaktı.

RETLW h’06’ ; W= 1 olsaydı bu satıra atlayacaktı

RETLW h’5B’ ; W= 2 olsaydı bu satıra atlayacaktı

RETLW h’4F’ ; W= 3 olduğu için bu satıra atlayacak

RETLW h’66’ ; W= 4 olsaydı bu satıra atlayacaktı

…………………..

Program çalışmasını adım adım takip edersek ;

Page 20: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

20

Önce MOVLW h’03’ ile W ‘ye h’03’ yüklendi.

CALL DONUSUM ile program DONUSUM alt programına atladı.

ADDWF PCL, F komutu ile PCL' ye (03) sayısı eklenerek PCL (03) kadar arttırılmış oldu ve artık

program 3 satır atlayarak RETLW h’4F’ komutunun bulunduğu satıra gelerek W'ye (4F) yükler ve

geriye CALL komutunun bir alt satırına döner.

Bundan sonra da program parçasında, W deki bu sayı (4F) PORTB' ye yüklenmektedir. Dolayısıyla

(3) sayısının göstergede yakılması için b’01001111’ = 4F sayısının PORTB ‘ye yüklenmesi yeterli

olmaktadır.

Örnek : PORTB' nin uçlarına bağlı 7 segment (parça) göstergede 0,1,2,3 ... E,F şeklinde sürekli

olarak ileri saydıran ve sayılar arasında GECIKME alt programına giden bir program

parçası yazınız (Not: GECIKME alt programı yazılmayacaktır).

;(Program Parçası)

TEKRAR MOVLW h’00’

MOVWF SAYAC ; SAYAC sıfırlandı

GIT MOVF SAYAC, W

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’10’ ; Son olarak SAYAC=15 dir,INCF ile (16)10 =(10)16 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 Saymaya yeniden 0 dan başla

;(DONUSUM Alt Programı)

DONUSUM ADDWF PCL, F ; PCL + W işlemini yap,neticeyi PCL’ ye yaz

RETLW h’3F’ ; 0 yazdırmak için dönüşüm kodu

RETLW h’06’ ; 1 yazdırmak için dönüşüm kodu

RETLW h’5B’ ; 2 yazdırmak için dönüşüm kodu

RETLW h’4F’ ; 3 yazdırmak için dönüşüm kodu

RETLW h’66’ ; 4 yazdırmak için dönüşüm kodu

RETLW h’6D’ ; 5 yazdırmak için dönüşüm kodu

RETLW h’7D’ ; 6 yazdırmak için dönüşüm kodu

RETLW h’07’ ; 7 yazdırmak için dönüşüm kodu

RETLW h’7F’ ; 8 yazdırmak için dönüşüm kodu

RETLW h’6F’ ; 9 yazdırmak için dönüşüm kodu

RETLW h’77’ ; A yazdırmak için dönüşüm kodu

RETLW h’7C’ ; b yazdırmak için dönüşüm kodu

RETLW h’39’ ; C yazdırmak için dönüşüm kodu

RETLW h’5E’ ; d yazdırmak için dönüşüm kodu

RETLW h’79’ ; E yazdırmak için dönüşüm kodu

RETLW h’71’ ; F yazdırmak için dönüşüm kodu

END

Faydalanılan Kaynaklar :

1- Mikroişlemciler Ders Notları 1 - 2 (6502) , Doç. Dr. Hakan ÜNDİL

Page 21: MİKRODENETLEYİCİLER I DERS NOTLARI ‘nın devamıdır. …(Bkz. Mikroişlemciler ve Mikrodenetleyiciler 1 Ders Notları) kullanılan bu komutlar SUBLW ve SUBWF şeklindedir. Kısaca

21

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.