yrd. doç.dr. bülent ÇobanoĞlucontent.lms.sabis.sakarya.edu.tr/uploads/67539/30627...dt retlw...

38
Yrd. Doç.Dr. Bülent ÇOBANOĞLU B Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 1

Upload: hahanh

Post on 06-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Yrd. Doç.Dr. Bülent ÇOBANOĞLU

B

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 1

PIC Mikro denetleyici Programlama

Hazırlayan:Yrd.Doç.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 (MPASM) 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/XC8, 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:Yrd.Doç.Dr.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.

http://www.microchip.com/developmenttools/getting_started

/gs_mplab3.aspx

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 4

DOSYA UZANTILARI

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 5

.C den .hex uzantıya

dönüşüm

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 6

.C den .hex uzantıya

dönüşüm

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:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 7

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:Yrd.Doç.Dr.Bül

ent ÇOBANOĞLU8

GENEL ASSEMBLY KOMUT FORMATI

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

9

PIC Assembly komut yapısında yer alan

simgeler;

Komut/İşlem kodu (OpCode); Örnek:

ADDWF f,d

Kaydedici/Değişken (f); Örnek:

ADDWF f,d

Hedef (d); Örnek: ADDWF f,d

İşlenen (Operand); Sabit/Literal yada

etiket,Örnek: ADDLW k, GOTO Don

ve bit (b)

ASSEMBLY KOD YAZIM BİÇİMİ

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

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

ASSEMBLY KOD YAZIM BİÇİMİ

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

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

Direktifler

İşlenen

(Operand)

Açıklama

ASSEMBLER TALİMATLARI

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

12

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.

$ Program sayıcının o anki yerini döndürür. 5 komut aşağı gitmek için $ +5, yukarı gitmek için $ -5 şeklinde de kullanılabilir.

Kullanım şekli: GOTO $

dt RETLW komutu yerine kullanılır. RETLW komutu ile alt alta yazılan veriler, dt komutu ile yan yana yazılır.

BANKSEL,

BANKISEL

Bank değiştirme komutu. Örneğin BANK1’ e geçmek için BSF STATUS,5 komutu yerine Bank1 deki herhangi bir kaydedicinin

ismi yazılarak BANKSEL TRISB bank1 e geçilir. BANKISEL ise BANK2 ve BANK3 ü kullanmak için IRP bitini 1 yapar

ASSEMBLER TALİMATLARI

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

13

Assembler Komutu Açıklama

#DEFINE Sembolik sabitlerin tanımlanmasını sağlar. C dilinde de geçerlidir. Örnek:

#define LED PORTB,0 #define _XTAL_FREQ 10000000

, #define position(X,Y,Z) (Y-(2 * Z +X))

#UNDEFINE #DEFINE ile bildirilen sembolik sabitlerin değerini program içerisinde

değiştirmek için kullanılır. Örnek:

#undefine LED

#define LED PORTD,7

fill Fill komutu, program belleğinin kullanılmayan bellek alanlarını belli bir

sabit veya Assembly komutu ile doldurur. Örneğin;

fill (NOP), 10 gibi

constant,

variable

Sabit tanımlamak için kullanılır. Değişkenlere başlangııç değeri vermede

kullanılır. Program içerisinde değeri tekrar değişecekse variable tercih

edilir.

SET EQU komutunun işlevine sahiptir.

code [Etiket] code [ROM bellek adresi]

ORG komutuna benzer. Bellek adresini etiketler

__config __config _HS_OSC & _WDT_OFF & _LVP_OFF

Konfigürasyon bitlerini ayarlar

da/db/de/dw/ data Prgoram belleğinde string veya karakter saklarlar. db, de, dt,

dw, data benzer işlevlere sahiptir. Örnek; da "abcdef"

ASSEMBLER TALİMATLARI

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

14

Assembler Komutu Açıklama

If, else if, else, endif if sayi < 50

incf speed, F

else

decf speed, F

endif

while, endw Koşul doğru olduğu sürece döngü çalışır.

#Ifdef, #ifndef Ifdef, bir sembolik ismin bildirildiğini sorgulamaktayken, ifndef bir sembolik ismin

bildirilmediğini sorgulamaktadır. Örnek Kullanım;

define UsePORTB

#ifndef UsePORTB

MyPort equ PORTC ;Eğer UsePORTB tanımlı değilse Port C yi kullan

MyTris equ TRISC

#else

MyPort equ PORTB ; Eğer UsePORTB tanımlı ise Port B yi kullan

MyTris equ TRISB

#endif

macro Assembly diline özgü fonksiyon tanımlamak (makro yazmak) için kullanılır.

Kullanım şekli;

Etiket macro [arg1, arg2 ..., argn]

::

endm

Koşullu karar yapısıdır.

If bloğu endif ile sonlandırılır

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 15

add macro num1,num2 if num1>0xff ;Eğer num1>255 ise

exitm ;makrodan çık

else

if num2>0xff ;Eğer num2>255 ise

exitm ;makrodan çık

else

movlw num1 ; W=num1

movwf Sonuc ;Sonuc=W

movlw num2 ; W=num2

addwf Sonuc,F ;Sonuc=Sonuc+W

endif

endif

endm ;'add' isimli MACRO yu sonlandır

ASSEMBLER TALİMATLARI: macro örneği

SAYILARIN GÖSTERİMİ

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

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 tabandakisayı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:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 17

Assembly

Komutları

Hazırlayan:

Y.Doç.Dr.Bülent

ÇOBANOĞLU18

19

Sembol Tanımlamaları :

f - Register File Adress: kayıtçı adı veya adresi (0x00 ile 0x7F)

w - Akümülatör, çalışma kayıtçısı

b - Bit tanımlayıcısı; 8 bitlik kayıtçının 0~7 arasındaki bir biti veya etiket. (EQU komutu ile adresi tanımlanmış olması gerekir)

d - Destination : Gönderilecek yer; komutun çalıştırılmasından sonra sonucun nereye yazılacağını belirler.

d = 0 - W kayıtçısına, d = 1 - dosya kayıtçısına

k - Sabit bir sayı (0x0C veya 0CH, 00001100B, 10D) veya adres etiketi

x - “0” yada “1” önemli değil

TO - Zaman aşımı biti (Time-out bit)

PD - Güç kesimi biti (Power-down)

Byte yönlendirmeli komutlar:

20

Sembol Tanımlamaları :

f - Register File Adress: kayıtçı adı veya adresi (0x00 ile 0x7F)

w - Akümülatör, çalışma kayıtçısı

b - Bit tanımlayıcısı; 8 bitlik kayıtçının 0~7 arasındaki bir biti veya etiket. (EQU komutu ile adresi tanımlanmış olması gerekir)

d - Destination : Gönderilecek yer; komutun çalıştırılmasından sonra sonucun nereye yazılacağını belirler.

d = 0 - W kayıtçısına, d = 1 - dosya kayıtçısına

k - Sabit bir sayı (0x0C veya 0CH, 00001100B, 10D) veya adres etiketi

x - “0” yada “1” önemli değil

TO - Zaman aşımı biti (Time-out bit)

PD - Güç kesimi biti (Power-down)

BİT İŞLEM KOMUTLARI –

Sabit (Direkt Veri) İşleyen Komutlar Ve Kontrol Komutları:

Mantıksal Komutlar

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

21

RLF, sayıyı 2 ile çarpmada

RRF, sayıyı 2 ye bölmede

Kullanılabilir.

Elde bitinin işleme katıldığını

unutmayalım.

Aritmetiksel-Mantıksal İşlem Örnekleri (3/3)

S7. k=i+j+20 işlemini Assembly dili ile gerçekleştiriniz.

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

22

C Dili Assembly Karşılığı Açıklama

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 23

1’e Tümleyen – 2’ye Tümleyen Aritmetiği (1s Complement & 2s Complement)

Çalışma Sorusu: Dereceyi- Fahrenayta çeviren programı yazınız. Formül:

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 24

XC8 derleyici için MicroC için

asm

//birden fazla Assembly komutu

asm tek bir asm komutu

Aritmetiksel-Mantıksal İşlem Örnekleri (1/3)

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:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

25

Aritmetiksel-Mantıksal İşlem Örnekleri (2/3)

S4: PORTB ye bağlı ledleri sürekli yakıp- söndüren program parçasını yazınız.

Çözüm:

S5. Sürekli bir şekilde PORTB deki verileri PORTC ye gönderen programı yazınız.

Çözüm:

S6. Farzedelim ki odanın içerisindeki lambayı RB5 ile odanın dışındaki lambayı ise RB2 ile

kontrol ediyoruz. Odanın dışındaki lamba açıkken odanın içerisindeki lambayı söndüren

programı yazınız.

Çözüm:

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

26

Assembly Kod Şablonu

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 27

LIST P=16F877

#INCLUDE "P16F877.INC"

ORG 0X00

GOTO BASLA

BASLA

BANKSEL TRISB

CLRF TRISB

BANKSEL PORTB

MOVLW 0X0A

ADDLW 0X13

MOVWF PORTB

GOTO $

END

Tanımlamalar,

Başlık/Kütüphane

dosya tanımlamaları

Ana program

Program Sonu

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 28

• Önce Proje dosyası oluşturulur. Bunun için Project Project Wizard seçilir

• Gelen «Welcome» penceresi «Next-İleri» butonuna basılarak geçilir.

• Bir sonraki pencereden «Select Device» kullanacağımız PIC seçilir.

• Kullanacağımız C veya Assembly derleyicisini seçiyoruz. Assembly için MPASM

seçilir.

• Bir sonraki pencereden Proje klasörü seçilir ve projeye isim verilir. İsim vermede

değişken ismi tanımlama kurallarına dikkat edilir.

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 29

• Proje klasörünün oluştuğu solda gelen .mcp uzantılı dosya ile

Görülür.

• «.asm» uzantılı kaynak dosyasını yazmak için File New File

Seçilir.

• Artık programımızı yazıp File Save As menüsünden ‘.asm’ uzantılı olarak

kaydediyoruz.

• Bu ‘.asm’ uzantılı dosyayı Projemize eklemek için Source File üzerinde iken mouse

ile Sağ Click Add Files seçilir.

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 30

S4 de sorulan PORTB ye bağlı ledleri sürekli yakıp- söndüren programın tamamını yazıp

MPLAB SIM ile simülasyonunu yapalım.

• MPLAB SIM, Debugger menüsünden seçilir.

• ‘Step into’ simgesi ile adım adım çalıştırılır.

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 31

S4 de sorulan PORTB ye bağlı ledleri sürekli yakıp- söndüren programın tamamını yazıp

MPLAB SIM ile simülasyonunu yapalım. • Değişken ve kaydedici içeriklerini görmek

İçin ya MPLAB da View’den Watch seçilerek

yada Proteus ile simülasyon yapılır.

Örnek 2: PORD nin 0. bitine

bağlı ledi yakan/söndüren

program

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 32

LED ve Buton Uygulamaları

XC8

MicroC

Ass

em

bly

Örnek 3: PORTB ‘ye bağlı 8 ledi dörtlü olarak (ilk önce MSB tarafı daha sonra LSB tarafı

olacak şekilde) yakıp, söndüren bir flaşör devresi ve programı:

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

#include <xc.h>

#define _XTAL_FREQ 4000000

void main(void)

TRISB = 0;

PORTB = 0b11110000;

while(1)

__delay_ms(100); //çift alt tire

asm ("SWAPF _PORTB,F");

__delay_ms(100);

C kodu

Assembly kodu

33

Örnek4: Tek bir buton ile led yakıp söndüren program parçası

;Assembly Kodu

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

//C Kodu

while(1)

if (RA0==0)

RB0=0x01;

else

RB0=0;

Hazırlayan:Yrd.Doç.Dr.Bülent

ÇOBANOĞLU

OSC1/CLKIN16

RB0/INT6

RB17

RB28

RB39

RB410

RB511

RB612

RB713

RA017

RA118

RA21

RA32

RA4/T0CKI3

OSC2/CLKOUT15

MCLR4

U1

PIC16F84A

D1

R14k7

34

Örnek 4: PORD nin 0. bitine bağlı buton

basılı olduğu sürece RB0’a bağlı Ledi

yakan programın Assembly kodu

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

35

LED ve Buton Uygulamaları

C kodu;

Örnek 5: PORTA ‘nın 0.bitine (RA0) bağlı butona basınca PORTC ilk iki bitini yakan, 1.

bitine (RA1) bağlı butona basılınca ise bu iki ledi söndüren programı yazınız.

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU

36

LIST P=16F877AINCLUDE <P16F877A.INC>ORG 0X00GOTO BASLA

BASLABANKSEL TRISC ;BANK1'E GECMOVLW 0X07MOVWF TRISA ;PORTA GIRISMOVWF ADCON1 ;PORTA VE PORTE DIGITALCLRF TRISC ;PORTC CIKISBANKSEL PORTC ;BANK0'A GEÇCLRF PORTC

BUTON1BTFSC PORTA,0 ;RA0==0 mı?GOTO BUTON1

BUTON2 BTFSC PORTA,1 ;RA1==0 mi?GOTO LEDYAKCLRF PORTCGOTO BUTON1

LEDYAKMOVLW 0XFFMOVWF PORTCGOTO BUTON2END

Örnek 6. Yürüyen Işık (Kara Şimşek)Uygulaması

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 37

#include<xc.h>void main()PORTB=0;TRISB=0;PORTB=1;STATUS=0;#asmSOL

NOPRLF PORTB,F BTFSS PORTB,7 GOTO SOL

SAG NOPRRF PORTB,F BTFSS PORTB,0 GOTO SAG GOTO SOL

#endasm

Assembly Kodu C Kodu

Çalışma Soruları

Hazırlayan:Yrd.Doç.Dr.Bülent ÇOBANOĞLU 38

1. 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ı yazınız.

2. 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ı yazınız.

3. PORTB ye bağlı ledler üzerinde PORTA nın RA0 ucuna

bağlı butona basıldığında tek sayıları, RA1 ucuna bağlı

butona basıldığında çift sayıları saydıracak programı

yazınız.

4. Örnek 6’da verilen yürüyen ışık uygulamasını tamamen

C komutları ile (1 sn lik gecikme) yazınız.