yrd. doç.dr. bülent ÇobanoĞlucontent.lms.sabis.sakarya.edu.tr/uploads/67539/30627...dt retlw...
TRANSCRIPT
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
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
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.