19
Öğr.Gör. Dr. Bülent ÇOBANOĞLU B

Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Öğr.Gör. Dr. Bülent ÇOBANOĞLU

B

Page 2: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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ı

Page 3: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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.

Page 4: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 5: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 6: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 7: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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.

Page 8: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 9: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 10: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Sabit (direkt veri) işleyen komutlar ve kontrol komutları:

Hazırlayan: Dr.Bülent ÇOBANOĞLU 10

Bit yönlendirmeli komutlar:

Page 11: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Byte yönlendirmeli komutlar:

Hazırlayan: Dr.Bülent ÇOBANOĞLU 11

Page 12: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 13: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

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

Page 14: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Ö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

Page 15: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Ö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

Page 16: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

ÖRNEK 4. Yürüyen Işık Uygulaması

Hazırlayan: Dr.Bülent ÇOBANOĞLU 16

Page 17: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Ö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

Page 18: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Ö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

Page 19: Öğr.Gör. Dr. Bülent ÇOBANOĞLU · PIC mikro denetleyicileri assembly dili ile programlayabileceğimiz gibi C, BASIC, PASCAL gibi yüksek seviyeli bir programlama dili ile de

Ö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