2.HAFTA Mikroişlemci Laboratuvarı
PIC ASSEMBLY KOMUTLARI
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.
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.
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.
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.
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
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
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
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
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
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’
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.
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’
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"
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.
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’
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 '
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’
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'
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'
Ö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
Ö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
ÖRNEK 3. YURUYEN IŞIK UYGULAMASI