Transcript
Page 1: 2.HAFTA  Mikroişlemci  Laboratuvarı

2.HAFTA Mikroişlemci Laboratuvarı

PIC ASSEMBLY KOMUTLARI

Page 2: 2.HAFTA  Mikroişlemci  Laboratuvarı

PIC BELLEK YAPISI

• PIC mikrodenetleyicisinin belleği, program ve RAM belleği olmak üzere iki ayrı bellek bloğundan oluşur.

• Program Belleği=Her bir bellek hücresi içerisine 14 bit uzunluğundaki program komutları saklanır.

• RAM Bellek=Bu bellek içerisindeki file registerleri içerisine yerleştirilen veriler PIC CPU'sunun çalışmasını kontrol ederler. File registerlerin bellek uzunluğu 8 bit'tir.

Page 3: 2.HAFTA  Mikroişlemci  Laboratuvarı
Page 4: 2.HAFTA  Mikroişlemci  Laboratuvarı

W register

• Bir PIC'te gerçekleşen tüm aritmetik işlemler ve atama işlemleri için W register kullanma zorunluluğu vardır. Örneğin iki register içindeki veriler toplanmak istendiğinde, ilk olarak registerlerden birinin içeriği W registere aktarılır. Daha sonra da diğer registerin içerisindeki veri W registeri içerindekiyle toplanır.

Page 5: 2.HAFTA  Mikroişlemci  Laboratuvarı

PIC ASSEMBLY TALİMATLARIDaha önce ortalama bir PIC mikro denetleyici (PIC16F84, PIC16F877 gibi) komut setinde 35 adet komut bulunur. Program yazarken bu komutlar haricinde bazı assembler derleyici talimatlarını da kullanmamız gerekir. Bunlar;Assembler Komutu Açıklama

LIST PIC Mikro denetleyici seçme komutudur. Program, hangi PIC için yazıldı ise programın başında LIST P=16F877 komutuyla mutlaka belirtilmelidir

#INCLUDE Normalde program yazmaya başlamadan önce program içinde tüm kaydedicileri tek tek tanıtmamız gerekir. Bunu her seferinde yapmak yerine tüm bu tanımlamaların yapıldığı ve .inc uzantısı ile kaydedilmiş dosyaları programımız içinden çağırabiliriz. Böylece her program için bu zahmetten kurtulmuş oluruz. Bu dosyalarda ayrıca kaydedicilerin bitlerinin isimleri gibi bilgiler de yer almaktadır. Dolayısıyla dosyayı programımıza ekledikten sonra bitleri numaraları ile değil, isimleri ile belirtebiliriz. Kullanım şekli: INCLUDE "P16F877.INC”

ORG Hangi programın MCU belleğinde hangi adreste tutulacağını tanımlar. Origin kelimesinden türetilen ORG komutu iki amaç için kullanılır;

1.Program komutlarının hangi adresten itibaren başlayacağını belirtmek için kullanılır. Reset vektörünün 0000h adresinde olduğunu daha önce söylemiştik. { ORG 0x00; burada program başlangıcını belirledik }

2. Eğer donanım kesmesi (interrupt) kullanılacaksa, ORG komutu ile donanım kesmesi ile çalıştırılacak program parçacığının adresi de belirtilmelidir. Kesme vektörü de 0004h adresinde yer alıyordu. { ORG 0x04; burada ise kesme programcığı başlangıcını belirledik}.

EQU Atama komutudur. Bu komut İngilizce EQUAL kelimesinden türetilmiştir. Assembler sabitlerini veya RAM adreslerini tanımlar. Kullanım şekli:

SAYAC EQU 48h; SAYAC isimli GPR kaydedicisi 48 nolu adrese atar.

END Programın sonu. Programın nerede bittiği END komutu ile mutlaka belirtilmelidir. Derleyici END komutunu bulamadığı zaman programı derleyemez ve hata verir.

Page 6: 2.HAFTA  Mikroişlemci  Laboratuvarı

PIC16F84 / PIC16F877 KOMUT SETİ

Sembol Açıklama

b 8 bitlik kaydedicinin ilgili bitini gösteren tanımlayıcı

d Hedef seçici; d = 0 veya W ise Sonuç W kaydedicisinde tutulur

    d = 1 veya F ise Sonuç f kaydedicisinde tutulur

      Varsayılan değer d = 1 dir.

f Kaydedici (file register) {örneğin PORTB, STATUS gibi}

k Sabit bir sayı veya etiket

W W kaydedicisi (akümülatör)

PC Program Sayıcı (Program Counter)

__CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_OFF & _LVP_OFF & _CPD_OFF

__CONFIG h’3F31’ ;__CONFIG b’11111100110001’

Not: Program belleğinin 2007h adresinde olup 14 bittir. Bu bitlere sadece PIC programlama aşamasında erişilebilmektedir.

Page 7: 2.HAFTA  Mikroişlemci  Laboratuvarı

SAYILARIN GÖSTERİMİ

Yazım formatında bir önemli konu da sayıların gösterim şeklidir. Assembly içinde aksi belirtilmedikçe her sayı onaltılık tabanda kabul edilir. Aşağıdaki tabloda hangi tabandaki sayının nasıl gösterildiği yer almaktadır

Kullanım Sayı Tabanı

0x23 Onaltılık (hexadecimal) sayı sistemi

23h Onaltılık (hexadecimal) sayı sistemi

h'23' Onaltılık (hexadecimal) sayı sistemi

d'12' Onluk(Decimal) sayı sistemi

b'1011' İkili(Binary) sayı sistemi

O‘574’ Octal(Sekizli) sayı sistemi

Page 8: 2.HAFTA  Mikroişlemci  Laboratuvarı

Yer Değiştirme veya Yükleme KomutlarıKomut ve Örnek İngilizce tanımı Türkçe açıklaması

1-MOVLW k Move Literal to W K sabit değerini W registerine yükler.

MOVLW h ‘0F' WOF

2-MOVF f,d Move f f registerinin içeriğini W veya f’e yükler.

MOVF TEST,0 d=0 WTEST

d=1 TESTTEST

3-MOVWF f Move W to f W registerin içeriğini f registerine yükler.

MOVWF PORTA PORTAW

Page 9: 2.HAFTA  Mikroişlemci  Laboratuvarı

Register İçeriğini Değiştirme Komutları4-CLRF F Clear f f registerinin içeriğini siler (sıfırlar).

CLRF TRISA TRISA00000000

5-CLRW Clear W W registerin içeriğini siler (sıfırlar).

CLRW W00000000

6-COMF F,d Complement f F registerinin içindeki sayı terslenir. Yani tüm 1'ler 0, 0'lar 1 olur. Sonuç W veya f registerine yüklenir.

COMF SAY, 0 SAY= 0011011 ise,

d=0 W11001010

d=1 olsaydı SAY11001010

Page 10: 2.HAFTA  Mikroişlemci  Laboratuvarı

Register İçeriğini Değiştirme Komutları7-DECF f,d Decrement f F registerinin içerisindeki sayıyı "1"

eksiltir. Registerin içeriği h'00' ise, "1" eksiltildiğinde h'FF' olur. Sonuç W veya f registerine yazılır.

DECF GIT,1 GIT=h' 2C" ise 2C-1=2B

d=1 GIT2B

d=0 olsaydı W2B8-INCF f,d Increment f F registerinin içerisindeki sayıyı "1"

artırır. Registerin içeriği h' FF' ise, "1" arttırıldığında h' 00' olur. Sonuç W veya f registerine yazılır.

INCF GIT, 0 GIT=h' 2C' ise 2C+1=2D

d=0 W2D

d=1 olsaydı GIT2D

Page 11: 2.HAFTA  Mikroişlemci  Laboratuvarı

Register İçeriğini Değiştirme Komutları9-BCF f,b Bit Clear f f registerinin içerisindeki sayının

b.ninci bitini sıfırlar.BCF PORTB,5 PORTB = b'11111111' ise,

PORTBb' 11011111’10-BSF f,b Bit Set f F registerinin içerisinde sayının

b.ninci bitini 1 yapar.BSF PORTA,3 PORTA = b’ 00000000' ise,

PORTAb' 00001000’11-RLF f,d Rotate Left f f registeri içerisindeki sayıyı bir

pozisyon sola kaydırır. Registerden taşarak Carry bayrağına yazılan bit, LSB'ye yazılır. Sonuç W veya f registerine yüklenir.

RLF KAY,0 KAY=b'10110110' ise,

d=0 olduğundan W←01101101

d=1 olsaydı KAY←01101101

Page 12: 2.HAFTA  Mikroişlemci  Laboratuvarı

Register İçeriğini Değiştirme Komutları12-RRF F,d Rotate Right f F registeri içersindeki sayıyı bir

pozisyon sağa kaydırır. Registerden taşarak Carry bayrağına yazılan bit, MSB'ye yazılır. Sonuç W veya f registerine yüklenir.

RRF KAY,1 KAY=b'10110111' ise,

d=1 olduğundan KAY←11011011

d=0 olsaydı W←1101101113-SWAPF f,d Swap nibbles inf f registerinin içerisindeki ilk dört bit ile

son dört biti yer değiştirir. Sonuç W veya f registerine yüklenir.

SWAPF DEG,1 DEG = b' 00101111' ise,

d=1 olduğundan DEG11110010

d=0 olsaydı W11110010’

Page 13: 2.HAFTA  Mikroişlemci  Laboratuvarı

Program Akışını Kontrol Etme Komutları14-GOTO k Go to address Program akışı k adresine dallanır.GOTO DONGU Program, DONGU etiketinin yazıldığı

yere dallanır ve buradan itibaren devam eder.

15-CALL k Call subroutine Program akışı k etiketinin bulunduğu yerdeki alt programa dallanır.

CALL TIMER Program TIMER etiketinin yazıldığı alt program satırlarının başlangıcına dallanır ve buradan itibaren devam eder.

16-RETURN Return from subrouitine

Alt program komutlarının en sonuna yazılan bu komut, program akışını ana programa geri döndürür.

17-RETLW Return with Literal in W

Program akışını alt programdan ana programa döndürür ve W registerine k sabitini yükler.

RETLW H'2F' Alt programdan ana programa döndürür ve W registerine 2F yüklenir.

Page 14: 2.HAFTA  Mikroişlemci  Laboratuvarı

Program Akışını Kontrol Etme Komutları18-RETFIE Return From

InterruptProgram akışını interrupt alt programından ana programa döndürür.

19-BTFSC f,b Bit Test F, Skip if Clear

F registerinin b.inci bit'ini test eder. Eğer bu bit "0"sa program akışı bir sonraki komuta geçer.

BTFSC PORTA,2 PORTA=b’00000100’ise,→1PORTA=b’00000000’ise,→2

BTFSC PORTA,2 1 2 GOTO START MOVLW h’FF’

20-BTFSS f,b Bit Test F, Skip if Set

F registerinin b.inci bit'ini test eder. Eğer bu bit "1"se program akışı bir sonraki komuta geçer.

BTFSS PORTA,0 PORTA=b’00000001’ise,→1PORTA=b’00000000’ise,→2

BTFSC PORTA,2 2 1 GOTO START MOVLW h’FF’

Page 15: 2.HAFTA  Mikroişlemci  Laboratuvarı

Program Akışını Kontrol Etme Komutları21-DECFSZ f,d Decrement f, Skip

if ZeroF registerinin içeriğini "1" azaltır. Register içeriği 0'sa bir sonraki komuta atlar. Sonuç W veya f registere yazılır.

DECFSZ SAYAC,1 SAYAC=h' 2F’ ise 2F-1=2E

d=0 olsaydı Wh' 2E’

d=1 olduğundan SAYACh'2E'22-INCFSZ F,d Increment f, Skip

if ZeroF registerinin içeriğini "1" arttırır. register içeriği "0"sa bir sonraki komuta atlar. Sonuç W veya f registere yazılır.

INCFSZ SAYAC, 1 SAYAC=h' 2F’ ise 2F+1=30

d=1 SAYACh' 30'

d=0 Wh'30"

Page 16: 2.HAFTA  Mikroişlemci  Laboratuvarı

Mikro denetleyici Kontrol Komutları23-CLRWDT Clear VVatchdog

Timer

Watchdog timer'ı sıfırlar. Aynca vvatchdog timer'ın prescalar değerini de sıfırlar. Status bitlerinden TO ve PD'yi "1"yapar.

24-SLEEP Go into standby mode

Mikro denetleyiciyi uyuma moduna geçirerek güç harcamasını azaltır. Mikrodenetleyici uyuma modundan reset, watchdog timer ve TOCKI girişi vasıtasıyla çıkar.

İşlem Yapmayan Komut25-NOP No Operation Bir komut saykılı süresince hiçbir işlem

yapmayan bir komuttur. Bir dahili komut süresinde çalışır. Bu nedenle zaman geciktirme işlemlerinde kullanılır.

Page 17: 2.HAFTA  Mikroişlemci  Laboratuvarı

Mantıksal Komutlar26-ANDLW K AND Literal with

WW registerin içeriği ile k sabitine AND işlemini uygular. Sonuç W registerine yazılır.

ANDLW b’ 0110001'

W = b' 10011101' ise, b' 00110001' sabitin değeri

b’ 00010001' AND işlemi sonucu

Wb’ 00010001'27-ANDWF f,d AND W with f W registeri ile file register içeriğine

AND işlemini uygular. Sonuç W veya f registerine yazılır.

ANDWF TEST,1 W=b' 11111111' ise, TEST=b’11011110” ise,

b' 11011110' AND işlemi sonucu

d=0 ise Wb' 11011110'

d=1 olduğundan TESTb' 11011110’

Page 18: 2.HAFTA  Mikroişlemci  Laboratuvarı

Mantıksal Komutlar28-IORLW k Inclusive OR

Literal with W

W registerin içeriği ile k sabitine OR işlemini uygular. Sonuç W registerine yazılır.

IORLW B ‘00101000’ W =b' 10000100' ise

b' 00101000' sabitin değeri

b' 10101100' OR sonucu ,

W b' 10101100’29-IORWF f,d W registeri içeriği ile file registerin

içeriğine OR işlemini uygular. Sonuç W veya f registerine yazılır.

IORWF TEST,1 W = b' 10000100" ise,

TEST = b' 00101000’ ise,

b' 10101100 ‘ OR sonucu

d=0 ise Wb' 10101100"

d=1 olursa TESTb‘ 0101100 '

Page 19: 2.HAFTA  Mikroişlemci  Laboratuvarı

Mantıksal Komutlar30-XORLW k Exclusive OR

Literal withWW registerin içeriği ile k sabitine XOR işlemini uygular. Sonuç W registerine yazılır.

XORLW b'00101000’

W = b ‘ 00000000 ‘ ise

b' 00101000’ sabitin değeri

b' 11010111" XOR sonucu

Wb' 11010111'31-XORWF f,d Exclusive OR

W with fW register ile file register içeriğine XOR işlemini uygular. Sonuç W veya f registerine yazılır.

XORWF TEST,1 W = b' 00000000' ise, TEST = b' 00101000' ise,

b' 11010111" XOR sonucu

d=0 ise Wb' 11010111’

d=1 olursa TESTb'11010111’

Page 20: 2.HAFTA  Mikroişlemci  Laboratuvarı

Aritmetik İşlem Komutları32-ADDWF f,d Add W with f W registerinin içeriğini f registeri ile

toplar. Sonuç W veya f registerine yazılır.

ADDWF TOPLA,0

W=h' 2A' ise,

TOPLA=h ' 31' ise,

h' 2A'+h' 31'=b' 5B'

d=1 ise TOPLAh' 5B'

d=0 olduğundan Wh' 5B'33-ADDLW k Add Literal

andWW registerinin içeriğini k sabit değeri ile toplar. Sonuç W registerine yazılır.

ADDLW H' 2F' W=h' B0’ ise,

h' B0'+h' 2F'=h' DF'

Wh' DF'

Page 21: 2.HAFTA  Mikroişlemci  Laboratuvarı

Aritmetik İşlem Komutları34-SUBLN k Subtract W from

LiteralK sabit değerinden W registeri içeriğini çıkarır. Sonuç W registerine yazılır.

SUBLW H' 90' W=h' 83’ ise

h' 90'-h' 83' = h' 07’

Wh' 07’

35-SUBWF f,d Subtract W from file register

f registerinin içeriğinden W registerinin içeriğini çıkarır. Sonuç W veya f registerine yazılır.

SUBWF CIK,1 W=h' 83' ise,

CIK=h' 90' ise,

h' 90'-h' 83'=h' 07’

d=0 ise Wh' 07’

d=1 olduğundan CIKh’07'

Page 22: 2.HAFTA  Mikroişlemci  Laboratuvarı

Örnek 1: PORB nin 7. bitine bağlı ledi yakıp söndüren program

OSC1/CLKIN16

RB0/INT 6

RB1 7

RB2 8

RB3 9

RB4 10

RB5 11

RB6 12

RB7 13

RA0 17

RA1 18

RA2 1

RA3 2

RA4/T0CKI 3

OSC2/CLKOUT15

MCLR4

U1

PIC16F84A

X11Mhz

C1

1nF

C2

1nF

+5V

R330

;==LED.ASM === LIST P=16F84#INCLUDE<P16F84.INC>BSF STATUS,5 CLRF TRISB ; PORTB nin tüm uçları çıkış yapıldı

BCF STATUS,5 CLRF PORTB ; PORTB’ ye b’0000 0000’ değeri yüklendiDON:

BSF PORTB,7 ; PORTB nin 7.bitini yakBCF PORTB,7 ; PORTB nin 7. bitini söndürGOTO DONEND

Page 23: 2.HAFTA  Mikroişlemci  Laboratuvarı

Örnek 2: PORTB ‘ye bağlı 8 ledi dörtlü olarak (ilk önce LSB tarafı daha sonra MSB tarafı olacak şekilde) yakıp, söndüren söndüren bir flashör devresi ve programı:

OSC1/CLKIN16

RB0/INT6

RB17

RB28

RB39

RB410

RB511

RB612

RB713

RA017

RA118

RA21

RA32

RA4/T0CKI3

OSC2/CLKOUT15

MCLR4

U1

PIC16F84A

X11Mhz

C1

1nF

C2

1nF

+5V

R7330

R6330

R5330

R4330

R3330

R2330

R1330

R0330

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

Page 24: 2.HAFTA  Mikroişlemci  Laboratuvarı

ÖRNEK 3. YURUYEN IŞIK UYGULAMASI


Recommended