Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile...
Transcript of Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile...
Öğr.Gör. Dr. Bülent ÇOBANOĞLU
B
PIC Mikro denetleyici Programlama
Hazırlayan:Öğr.Gör.Dr.Bülent ÇOBANOĞLU
2
Assembly programlama dili, çoğu zaman özel alanlarda geliştirilen yazılımlarda
kullanılan alt seviyeli bir yazılım dili olarak tanımlanır. Bu dilin komutları,
bilgisayarın doğrudan işlettiği makine dili komutlarının birebir karşılığıdır. Bu
nedenle bu dil için makine dili de denilebilir. Her ne kadar uzman programcıların
özel alanlarda kullandığı bir dil olarak tanımlansa da, programcılar istedikleri
takdirde her türlü uygulamayı bu dil ile geliştirebilirler ya da kullandıkları üst
düzey dilaltından çağırabilecekleri procedurler/altprogramlar yazabilirler.
Assembly diliyle yazılmış bir program( .asm) assembler derleyicisi ile makine
diline (.hex) çevrilir.
PIC’lerin belki de yaygın olarak kullanılmasının sebeplerinden biride Assembly
haricinde C, Basic, Pascal ve Fortran dilleri ile de programlanabilmesidir. En
yaygın kullanılan C derleyicileri arasında ; Hitech PIC C, CCS C, MicroC, FED
C, C30 C derleyicileri sayılabilir.
C Dili ile MCU programlama aşamaları
MPLAB Programı içinde tanımlanan Derleyiciler ve Farkları
Hazırlayan:Öğr.Gör.Bülent ÇOBANOĞLU 3
Örnek bir programda derleyici bellek kullanım oranları
Genellikle Assembly kod satırları
C den daha fazladır. Fakat daha
az bellek kullanımı sağlar.
PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL
gibi yüksek seviyeli bir programlama dili ile de programlamayabilirsiniz. Assembly dilinin
kendine özgü komutları ve bu komutların yazılış şekilleri vardır.
Ortalama bir PIC mikro denetleyicisi (PIC16F84, PIC16F877 gibi) komut setinde 35 adet
komut bulunmaktadır. Azaltılmış komut seti (RISC) kullanılması, komutlarının öğrenilmesinin
ve program yazılmasının kolay olması yanında programın kısa sürede yazılabilmesini sağlar.
Bu 35 komutun ne işe yaradığını ve PIC-Assembly yazım kurallarını bilerek PIC'ler için her
çeşit programı yazabilirsiniz.
Komutların büyük bir kısmı 1 saat çevrimi (tetikleme sinyali - clock/4) sırasında
gerçekleştirilirken, test ve dallanma komutları 2 saat çevrimi/saykılı sırasında gerçekleştirilir.
Komutların kullanımı sırasında, komutların içerisine farklı anlamlara sahip semboller / harfler
yerleştirilir. Şekil 1'de, PIC MCU’da kullanılan komutların içerisinde bulunan sembollerin /
harflerin anlamları tablo şeklinde sunulmaktadır.
Hazırlayan: Dr.Bülent ÇOBANOĞLU 4
Kodları yazmak için herhangi bir programa ihtiyacımız yoktur. Kod yazma işlemini
her türlü metin editöründe yapabiliriz. Örneğin Windows içindeki not defteri
(notpad) programı bunun için uygundur. Fakat MPLAB
(http://www.microchip.com adresinden indirilebilir) programı içindeki editörün
kullanılması görsel açıdan kolaylık sağlayacaktır. Çünkü MPLAB içindeki assembly
editörü komutları özelliklerine göre farklı renklerde, sabitleri farklı renklerde,
açıklamaları farklı renklerde vs. yazmakta ve program içerisindeki MPASM isimli
assembler derleyicisi ile yazılan programın anında simülasyonu yapılabilmekte ve
test edilebilmektedir. Aşağıda aynı programın (BTP202.ASM) hem not defteri hem
de MPLAB ile yazılmış halini görüyorsunuz:
Hazırlayan: Dr.Bülent
ÇOBANOĞLU 5
ASSEMBLY KOD YAZIM BİÇİMİ
Hazırlayan: Dr.Bülent ÇOBANOĞLU 6
Assembly dili yazım formatı/biçimi 4 alandan oluşmaktadır, bunlar; Etiket(Label),
Komut kodu (OpCode), İşlenen (Operand) ve Açıklama (Comment) alanlarıdır.
Etiket ve açıklama alanları seçimliktir yani isteğe bağlıdır.
Etiket Alanı Komut Kodu (OpCode) İşlenen (Operand) Açıklama
DON: MOVLW h’0F’ ; W kaydedicisine heksadesimal 0F sayısını
aktarılmıştır
ASSEMBLER TALİMATLARI
Hazırlayan: Dr.Bülent ÇOBANOĞLU
7
Daha önce ortalama bir PIC mikro denetleyici (PIC16F84, PIC16F877 gibi) komut setinde
35 adet komut bulunduğunu söylemiştik. 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.
CBLOCK-ENDC Kullanıcının tanımladığı kaydedicilere adres atarken, eğer kaydedici sayısı fazla ise tek tek EQU komutu kullamak yerine
CBLOCK-ENDC komutları kullanılabilir. Aşağıdaki komut satırı ile sırası ile 05,05 ve 07. adreslere SAYAC1, SAYAC2 ve
SAYAC3 değişkenleri atanmıştır.
CBLOCK H’05’
SAYAC1, SAYAC2, SAYAC3
ENDC
END Programın sonu. Programın nerede bittiği END komutu ile mutlaka belirtilmelidir. Derleyici END komutunu bulamadığı
zaman programı derleyemez ve hata verir.
SAYILARIN GÖSTERİMİ
Hazırlayan: Dr.Bülent ÇOBANOĞLU 8
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ı
23 Onaltılık (hexadecimal) sayı sistemi
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
.12 Onluk(Decimal) sayı sistemi
b'1011' İkili(Binary) sayı sistemi
‘G’ veya A ‘G’ ASCII
O‘574’ Octal(Sekizli) sayı sistemi
Ortalama bir PIC mikro denetleyicisi (PIC16F84/PIC16F877 gibi) komut setinde 35
adet komut bulunmaktadır. PIC komutlarını 3 ayrı başlık altında inceleyebiliriz;
•Byte yönlendirmeli komutlar
•Bit yönlendirmeli komutlar
•Sabit (direkt veri) işleyen komutlar ve kontrol komutları
Komutların yazılış biçimlerini açıklarken bazı tanımlama harfleri kullanacağız,
bunların anlamı;
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)
PIC16F84 / PIC16F877 KOMUT SETİ
Hazırlayan: Dr.Bülent ÇOBANOĞLU 9
Sabit (direkt veri) işleyen komutlar ve kontrol komutları:
Hazırlayan: Dr.Bülent ÇOBANOĞLU 10
Bit yönlendirmeli komutlar:
Byte yönlendirmeli komutlar:
Hazırlayan: Dr.Bülent ÇOBANOĞLU 11
Aritmetiksel-Mantıksal İşlem Örnekleri
S1: W kaydedicisi içerisindeki h’0A’ sayısı ile h’13’ sayısını toplayıp, sonucu B portunda
gösteren program parçasını yazınız?
Çözüm:
MOVLW h’0A’
ADDLW h’13’
MOVWF PORTB
S2. W kaydedicisinin ilk 4 bitini (LSB tarafını) sıfırlayan fakat son 4 bitini (MSB tarafın
ı) olduğu gibi bırakan komut satırını yazınız.
Çözüm:
MOVLW h’37’
ANDLW h’F0’
S3: W=W*3 işlemini PIC Assembly komutları ile gerçekleştiriniz?
Çözüm:
MOVLW d’03’ ; W kaydedicisine bir değer aktardık. W=03
MOVWF PORTB ; W içeriği PORTB’ ye aktarıldı. PORTB=03
BCF STATUS, C ; Öncesinde elde bayrağı(C biti) sıfırlandı
RLF PORTB, F ; PORTB içeriği C ile birlikte bir bit sola kaydırıldı. PORTB=03*2
ADDWF PORTB,W ; PORTB ile W kaydedicisinin içeriğini topla sonucu W kaydedicisine
; aktar. W= 03*2 + 03 Hazırlayan: Dr.Bülent ÇOBANOĞLU
12
Örnek 1: PORB nin 7. bitine
bağlı ledi yakıp söndüren
program
Hazırlayan: Dr.Bülent ÇOBANOĞLU 13
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
R330
;==LED.ASM === // Assebly dilinde gerçekleştirimi
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üklendi
DON:
BSF PORTB,7 ; PORTB nin 7.bitini yak
BCF PORTB,7 ; PORTB nin 7. bitini söndür
GOTO DON
END
// C dilinde gerçekleştirimi
#include <pic.h>
#include <delay.c>
main(void)
TRISB = 0; // PORTB bitleri çıkış yap
for(;;) //sonsuz döngü
RB7 = 0; // LED OFF
DelayMs(250); //250ms bekle
RB7 = 1; //LED ON
DelayMs(250); //250ms bekle
Örnekler: LED ve Buton
Uygulamaları
Örnek2: Tek bir buton ile led yakıp söndüren program parçası
BASLA
BTFSC PORTA,0 ;Butona basıldı mı
GOTO BASLA
BSF PORTB,0 ; LED i yak.
BUTON_OFF
BTFSS PORTA,0 ;Butonu serbest bırak.
GOTO BUTON_OFF
BCF PORTB,0 ; LED i söndür
GOTO BASLA
END
Hazırlayan: Dr.Bülent ÇOBANOĞLU 14
OSC1/CLKIN16
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
RA017
RA118
RA21
RA32
RA4/T0CKI3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
D1
R14k7
Örnek 3: PORTB ‘ye bağlı 8 ledi dörtlü olarak (ilk önce LSB tarafı daha sonra MSB tarafı olacak şekilde)
yakıp, söndüren bir flaşör devresi ve programı:
Hazırlayan: Dr.Bülent ÇOBANOĞLU 15
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
ÖRNEK 4. Yürüyen Işık Uygulaması
Hazırlayan: Dr.Bülent ÇOBANOĞLU 16
Örnek 5: PORTB ye bağlı ledler üzerinde binary
(ikili) saydırma işlemi yapan PORTA nın RA0 ucuna
bağlı butona basıldığında azaltacak, RA1 ucuna
bağlı butona basıldığında artıracak program:
Hazırlayan: Dr.Bülent ÇOBANOĞLU 17
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
R8330
R9330
+5V +5V
Azalt
Artır
LIST P=16F84
#INCLUDE<P16F84.INC>
CLRF PORTB ;PORTB temizlenir
BSF STATUS,5 ;BANK1’e geçilir
MOVLW h'FF'
MOVWF TRISA ;PORTA nın tüm uçları giriş
CLRF TRISB ;PORTB nin tüm uçları çıkış
BCF STATUS,5 ;BANK0’a geçilir
don:
BTFSS PORTA,0 ;PORTA 0. bitini test et
INCF PORTB,F ;Artır butonu basılı ise bir artır
BTFSS PORTA,1 ;PORTA 1. bitini test et
DECF PORTB,F ;Azalt butonu basılı ise bir azalt
GOTO don ;Başa dön
END
Örnek 6: RA0’a bağlı butona basınca PORTBye
bağlı ledlerin ilk dördü, RA1’e bağlı butona
basınca son dördünü yakan program
Hazırlayan: Dr.Bülent ÇOBANOĞLU 18
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
R8330
R9330
+5V +5V
Azalt
Artır
LIST P=16F84
#INCLUDE<P16F84.INC>
CLRF PORTB ;PORTB temizlenir
BSF STATUS,5 ;BANK1’e geçilir
MOVLW h'FF'
MOVWF TRISA ;PORTA nın tüm uçları giriş
CLRF TRISB ;PORTB nin tüm uçları çıkış
BCF STATUS,5 ;BANK0’a geçilir
BUTON1
BTFSS PORTA,0 ;RA0 kontrolü
GOTO BUTON1
MOVLW H'0F'
MOVWF PORTB
BUTON2
BTFSS PORTA,1 ;RA1 kontrolü
GOTO BUTON2
MOVLW H'F0'
MOVWF PORTB
END
Örnek 6: PORTA ‘nın 0.bitine bağlı butona basınca (PORTB nin 0 bitine bağlı)
ledi yakan/söndüren program
Hazırlayan: Dr.Bülent ÇOBANOĞLU
19