Professional Documents
Culture Documents
Ders Notu 2
Ders Notu 2
PIC programcıları program kodlarını yazarken bir komutun kaç bitlik kelime
boyundan oluştuğu ile pek fazla ilgilenmezler. Seçilen bir çipi programlarken uyulması
gereken kuralları ve o çiple ilgili özelliklerin bilinmesi yeterlidir. Bu özellikler PIC’in
bellek miktarı, G/Ç portu sayısı, A/D dönüştürücüye sahip olup olmadığı, kesme
(interrupt) fonksiyonlarının bulunup bulunmadığı, bellek tipinin ne olduğu (Flash,
EPROM, EEPROM vb) gibi bilgilerdir.
Pic16F84’ün Genel Özellikleri
Pic16F84’ün YAPISI ve ÇALIŞMASI
Besleme Gerilimi:
Pic16F84’ün YAPISI ve ÇALIŞMASI
I/O Portları:
Pic16F84’ün YAPISI ve ÇALIŞMASI
I/O Portları:
Pic16F84’ün YAPISI ve ÇALIŞMASI
I/O Portları:
Portun ilgili pininin çıkış olması için, çıkıştaki tristate bufferın aktif edilmesi, yani tris
latch üzerine önceden 0 bilgisinin verilmiş olması gerekir. Eğer tris latch üzerine
önceden 1 yüklenmiş ise, çıkıştaki buffer açık devre olacağı için bilgi çıkışı mümkün
değildir. Bu durumda ancak oku komutu verilerek (Read Port) pin üzerindeki bilginin
data busa aktarılması, yani okunması (giriş yapılması) sağlanmış olacaktır. Write port
ya da write tris ise adres hattına bağlı olan seçme hatları gibi çalışırlar.
Tris ve Port registerinin adreslerinden biri bank0 diğeri bank 1’dedir. Bu sebeple port
ayarı programı yazmak için öncelikle bank1’e geçip (bu işlem için fsr registeri
kullanılacaktır) tris üzerine istenilen bilgi yazılır. Burada portun
pinleri birbirinden bağımsız olduğu için istenilen port ucu giriş, istenilen port ucu çıkış
olarak ayarlanabilir. Bunun için tris registerinin ilgili ucuna 1 ya da 0 verilmesi (giriş
için 1, çıkış için 0) yeterli olacaktır.
Yığın Hafıza ( Stack Memory)
• PIC16F84 8 derinliğinde ve 13 bit genişliğinde yığına (stack) sahiptir. Bu yığın alanı program veya
bilgi (data) yeri değildir ve direk olarak okunamaz veya yazılamazlar. CALL komutu veya kesme ile
13 bitlik (PC) program sayıcı yığının üzerine konur bu işleme “pushed “ denir. Yığındaki bu adres alt
programlar çalışıp bittikten sonra en sonunda bulunan ‘RETLW, RETFIE’ komutları ile yığından atılır
bu işlemede “popped” denir. Burada dikkat edilecek iç içe en fazla 8 altprogram veya kesme
kullanabiliriz. Fazla kullandığımız takdirde yığın taşması dediğimiz (stack overflow) hatası belirir.
Program Sayıcı ( Program Counter )
Pic16F84’ün Belleği
•Yazdığınız programın kaynak kodlarını tüm dünya ile paylaşsanız dahi kodlar o kadar
karmaşıktır ki insanlar assembly bilse dahi ne işe yaradığını çözmeleri çok uzun
zamanlarını alır. (Açıklayıcı bilgiler koymadı iseniz) Assembly bilmeyen bir insanın
kaynak kodu anlaması imkansızdır.
Assembly Dili ve Özellikleri
• Her bir komut, gerçekleştirdiği işleve karşılık gelen İngilizce kelimenin
kısaltması (mnemonik) ile ifade edilir.
• Her bir kısaltma, makine dilindeki farklı bit dizisine karşılık gelmektedir.
Etiket alanı
• Komut satırının ilk bilgisidir ve sembolik isimlerden oluşur.
• Etiket ismi olarak mikroişlemci komut setinde tanımlı olan bir komut
ismi verilemez.
Operand
• Genelde komutun etki edeceği hedef ve kaynak bilgisini içerir. Hedef ve kaynak bilgisi birbirinden virgül
(,) ile ayrılır.
Program Formatı
Assembly dilinde sayı sistemlerinin kullanımı
Açıklama Satırı
Assembly dili (;) ile başlayan satırları açıklama satırı olarak
kabul eder.
Bu satırları yorumlamaz ve makine kodu üretmez.
Yazılan uygulamanın anlaşılırlığını arttırır
Yönergeler
ORG
• Kod bellek içerisinde programın başlangıç adresini belirtmek için
kullanılan adres konumlandırma talimatıdır.
Talimat Açıklama
ORG 0000h ;program 0000h adresinden başlasın
PC=0000
ORG 0030h ;program 0030h adresinden başlasın
PC=0030
Yönergeler
END
• Programın bitiğini gösteren talimattır.
DB (Define Bayt)
• Kod bellek içerisinde sayı ve kelime (string) dizilerinin
tanımlanmasını sağlar.
LIST P=16F84 satırı, programın hangi PIC için yazıldığını belirtir. LIST
bir derleyici bildirisidir. Yani derleyiciyi yönlendiren bir komuttur
ve yegane kullanış amacı ve yeri burasıdır.
PIC ASSEMBLY
2.Atama Bloğu
EQU deyimi PIC’in belleğindeki bir heksadesimal adresi belirlenen bir
etikete atamak için kullanılır. Aşağıda atama deyimine bir örnek gösterilmiştir.
RAM bellekte bulunan adresler program yazarken hatırlanamayabilir. Örneğin
PORTB üzerinde bir işlem yapacaksınız yada PORTB ye veri yollayacaksınız. Bu
işlemi yapabilmeniz için PORTB nin RAM bellekteki register adresini bilmemiz
gerekmektedir. Bu sadece PORTB için geçerli bir durum değildir
PIC ASSEMBLY
3. Program Bloğu
Programcının asembly komutları kullanarak işi yaptıracak programı yazdığı,
içinde altprogramlarında bulunabileceği ana bölümdür. Modül içindeki
pogramları incelerek program bloğunu bulmaya çalışınız.
4.Sonlandırma Bloğu
PIC 16F84’ün duraklama (halt) komutu yoktur. Programı belirli bir yerde
duraklatmak için bazen sonsuz döngü kullanılır.
DONGU
GOTO DONGU
END
Yukarıdaki sonsuz döngüde DONGU etiketine assembler otomatik olarak bir adres
verir. GOTO DONGU komutu ise program akışını devamlı olarak aynı adrese gönderir. Bu
durumda program belirlenen adreste duraklatılmış olur.
END deyimi ise program komutlarının sona erdiğini assemblere bildirir. Her program
sonunda END deyimi muhakkak kullanılmalıdır. Aksi hâlde program devam ederken dosya
sonunun belirtilmediğini gösteren bir hata mesajı verecektir.
PIC ASSEMBLY
Org Deyimi:
ORG İngilizce’deki “origin’’ kelimesinden gelmektedir. ORG deyimi iki amaç için
kullanılır; program komutlarının hangi adresten itibaren başladığını ve PIC’in kesme
alt programının başlangıç adresini.
ORG 0 x 000 ; ilk program komutunun bellek adresi
Mikrodenetleyici Komutları
PIC16F84 denetleyicisinin toplam 35 tane komutu vardır. Diğer PIC serisinin başka
komutlarıda olmasına rağmen bu 35 komut temel teşkil ettiği için biz de bu
komutları göreceğiz. Bu komutların yazılış biçimini dört grupta toplayabiliriz .
• Byte-yönlendirmeli komutlar.
• Bit-yönlendirmeli komutlar.
• Sabit işleyen komutlar.
• Kontrol komutları.
PIC ASSEMBLY
f file register
d destination (gönderilen yer)
d=0 ise W register
d=1 ise File register
BİT Yönlendirme Komutu: Bit Yönlendirmeli komutlarda dikkat edilirse hedef (d)
belirtilmemiştir. Sonuç her zaman f kayıtçısının içersindedir.
PIC ASSEMBLY
BANK DEĞİŞTİRME: Bir banktan diğer bir banka geçmek için STATUS registerının 5.ve
6. bitlerinin durumunu değiştirmek gerekir. Yani 5. ve 6. bitleri 0 yada 1 yapmak
gerekmektedir.
RP1 RP0
Seçilen Bank
(6.bit) (5. bit)
0 0 Bank 0
0 1 Bank 1
1 0 Bank 2
1 1 Bank 3
PIC ASSEMBLY
STATUS registerının 5.bitini 1 yapmak için BSF (Bit Set FileRegister) komutu, 0
yapmak için BCF(Bit Clear FileRegister) komutu kullanılır.
PORTA / PORTB nin hangi biti giriş yapmak isteniyorsa TRISA / TRISB
içerisinde o bit’e karşılık gelen bit 1 yapılır. Çıkış olarak yönlendirmek istenen bitler
içinde TRISA / TRISB içerisine 0 yazılır
PIC ASSEMBLY
LIST P=16F84
STATUS EQU h’03’
PORTB EQU h’06’
TRISB EQU h’86’
CLRF PORTB ;PORTB temizlenir
BSF STATUS, 5 ;BANK1’e geçilir
CLRF TRISB ;PORTB ç ı k ış olacakt ı r
BCF STATUS, 5 ;BANK0’a geçilir
BSF PORTB, 0 ;PORTB 0. nolu ç ı k ışı set ederiz ve LED yanar
END ;Program sonu.
PORTLARA VERİ GÖNDERMEK
PIC ASSEMBLY
Örneğin PORTB’ye bağlı olan 8 LED’in ilk 4 tanesini yakacak olan veriyi göndermek için ilgili
komutu yazalım.
NOT: Eğer bir register içeriği sıfırlanacaksa yada 0x00 verisi gönderilecekse bu
işlemi W register’ı kullanmadan CLRF komutuyla da yapabiliriz.
Örneğin
MOVLW 0x00
MOVWF PORTB
CLRF PORTB
PIC’e enerji verildiğinde PORTA’nın uçlarına bağlı butonlardan hangisi basılı tutulursa
PORTB’de o butona karşılık gelen LED’i söndüren program.
PIC ASSEMBLY
DEVRE
PIC ASSEMBLY
Assembler Kodu:
LIST P=16F84A
PORTA EQU H’05’
PORTB EQU H’06’
STATUS EQU H’03’
TRISA EQU H’85’
TRISB EQU H’86’
CLRF PORTB ;PORTB reg. nı sıfırla
BSF STATUS,5 ;Bank1’e geç
CLRF TRISB ;PORTB’yi çıkışyap
MOVLW H’FF’ ,W rega FFverisini gönder
MOVWF TRISA ,PORTA’yı giriş yap
BCF STATUS,5 ;Bank0’a geç
BASLA
MOVF PORTA,W ;PORTA’nın içini W reg’a taşı
MOVWF PORTB ;W yu PORTB ye taşı
DONGU
GOTO DONGU
END
BİT TEST EDEREK KARAR VERMEK (BTFSC ,BTFSS)
PIC ASSEMBLY
BİT TEST EDEREK KARAR VERMEK (BTFSC ,BTFSS)
Register içerisindeki herhangi bir bit test edilebilir. Bu test sonucuna göre program
akışı istenilen komuta dallandırılabilir.
BTFSC(Bit Test File Skip İf Clear) Registerdeki biti test et, eğer 0 ise bir sonraki
konuma atla.
BTFSS (Bit Test File Skip İf Set) Registerdeki biti test et eğer 1 ise bir sonraki
konuma atla.
Örnek:
BİT TEST EDEREK KARAR VERMEK (BTFSC ,BTFSS)
PIC ASSEMBLY
Örnek: PORT B‘ nin 0. bitine bağlı LED’ i A port unun 1.bitine bağlı butona
basınca yakan program?
PIC ASSEMBLY
DEVRE
PIC ASSEMBLY
ASSEMBLY KODU
LIST P=16F84A
PORTA EQU H’05’
PORTB EQU H’06’
STATUS EQU H’03’
TRISA EQU H’85’
TRISB EQU H’86’
CLRF PORTB ;PORTB reg. nı sıfırla
BSF STATUS,5 ;Bank1’e geç
CLRF TRISB ;PORTB’yi çıkışyap
MOVLW H’FF’ ,W rega FF verisini gönder
MOVWF TRISA ,PORTA’yı giriş yap
BCF STATUS,5 ;Bank0’a geç
TEST_PORTA
BTFSC PORTA,1 ;PORTA nın 1. biti 0 mı ? (yani butona
basıldı mı?)
GOTO TEST_PORTA ;Hayırsa TEST_PORTA etiketine git
BSF PORTB,0 Evetse PORTB’nin 0. bitini 1 yap (yani
Ledi yak)
DONGU
GOTO DONGU
END
PIC ASSEMBLY
Örnek: A port unun 2.bitindeki butona basılınca B portuna bağlı tüm LED’ler ini
yakan programı yazınız
PIC ASSEMBLY
DEVRE
PIC ASSEMBLY
ASSEMBLY KODU:
LIST P=16F84
INCLUDE “P16F84.INC”
BSF STATUS,5
CLRF TRISB
MOVLW H’04’
MOVWF TRISA
BCF STATUS,5
TEST_PORT A
BTFSC PORTA , 2 ;PORTA’nın 2. biti 0 mı? (Butona basıldı mı?)
Örnek: A port unun 4.bitine bağlı olan buton basılı tutularak PIC ‘e enerji
verildiğinde, B port’un da ki LED’leri sönük tutan, butondan elimizi çektiğimiz
de ilk 4 LED’i yakan programı yazınız.
PIC ASSEMBLY
PIC ASSEMBLY
LIST P=16F84
INCLUDE “P16F84.INC”
BSF STATUS,5
CLRF TRISB
MOVLW H’10’
MOVWF TRISA
BCF STATUS,5
TEST_PORT A
BTFSS PORTA , 4 ;PORTA’nın 4. biti 1 mı? (Butondan el
çekildimi ?)
GOTO TEST_PORTA ;Hayır ise TEST_PORTA ya git Evetse
bir sonraki satırdan devam et
MOVLW H’0F’ ;W’ya FF verisini aktar
MOVWF PORTB ;PORTB ye W nun içini aktar (yani ilk 4
LED i de yak)
DONGU
GOTO DONGU
END
PIC ASSEMBLY
DÖNGÜ DÜZENLEMEK:
1. SAYAÇ KULLANARAK DÖNGÜ DÜZENLEMEK (DECFSZ(Decrement File Register
Skip if Zero) KOMUTU)
Bazı işlemlerin önceden belirlenen sayıda tekrarlanması gerekir. Belirlenen sayaç değeri
(yani tekrar sayısı) bir register’a aktarılır ve her döngüde registerin (yani sayacın) içi 1
azaltılır (DECFSZ komutu ile). Sayaç=0 olunca döngü biter.
PIC ASSEMBLY
Bazı işlemlerin önceden belirlenen sayıda tekrarlanması gerekir. Bir register sayaç
olarak belirlenir. Her dönüşte sayaç bir arttırılır. Arttırma işlemi INCF komutuyla
yapılır. Sayaç değerine ulaşınca döngüden çıkılır. Döngünün tekrar sayısı register
içerisine yüklenen sayı ile belirlenir. Sayaç değişkeni içerisindeki sayı döngünün
her tekrarında bir arttırılır ve SUBLW komutuyla sayaçtan W’ nin içeriği çıkarılır.
Çıkarma işlemi neticesinde STATUS registerinin 0. ve 2. bitleri etkilenir. Bu bitler
BTFSC komutu ile test edilir. Test sonucunda istenilen değere ulaşınca döngüye
son verilir.
PIC ASSEMBLY
Örnek:A port unun 1. bitine bağlı butona 10 defa bastıktan sonra B port unun 0.
bitine bağlı LED’i yakan programı yazınız.
PIC ASSEMBLY
LIST P=16F84A
INCLUDE “PIC16F84.INC”
SAYAC EQU h’0C’
CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW H’FF’
MOVWF TRISA
BCF STATUS,5
BASLA
MOVLW d’10’ ;W’ya 10 değeri yüklenir
MOVWF SAYAC SAYAC reg. Na W nun içeriği yüklenir
TEST
BTFSC PORTA,1 ;PORTA’nın 1.biti o mı?(yani butona basıldımı)
GOTO TEST Hayır ise TEST etiketine git.Evetse bir sonraki komuttan devam et
NOP
NOP
NOP ;15 adet NOP komutu koymamızın sebebi PIC’e kısa bir süre gecikme
. sağlayarak butona basılma işleminin algılatılmasıdır. Sizin bir kere butona
. basmanız PIC için birden fazla basmanız anlamına gelebilir. Bu yüzden 1
. defa basılması için kısa bir gecikme sağladık
.
NOP
DECFSZ SAYAC, F ;Sayac’ın değerini 1 azalt sonucu sayaca yaz
GOTO TEST ;Eğer sayac=0 değilse TEST etiketine git. Eğer sayac=0 ise bir sonraki
komuttan devam et.
BSF PORTB, 0 PORTB’nin 0. bitini 1 yap (yani LED’i yak)
END ;Son
PIC ASSEMBLY
ZAMAN GEÇİKTİRME
Bazı işlemlerin yapılması esnasında belirli bir zaman hiçbir şey yapılmadan
beklenmesi gerekir.
Bir geciktirme döngüsü hazırlanırken sayaç olarak kullanılacak bir file register
tanımlanır. Bu registerin içerisine döngünün tekrar sayısı yüklendikten sonra
DECFSZ komutu ile tekrar sayısından her defasında 1 çıkartılır. Çıkarma sonucu 0
olunca döngü sona erdirilir.
Sayaç içerisine yüklediğiniz sayıyı H’FF’ (desimal 255) yaparsanız yukarıda verilen
gecikme döngüsünden maksimum gecikmeyi elde ederiz.
KOMUT KOMUT SAYKIL
MOVLW H’FF’ 1
MOVWF SAYAC 1
DONGU
Döngüdeki saykıl sayısı programın başında sayaç adlı registere atanan sayıya (N) bağlı
olduğu görülmektedir. Öyleyse bir döngünün kaç saykıllık gecikme oluşturacağını
bulan bir formül oluşturacak olursak
KOMUT KOMUT SAYKIL
MOVLW H’N’ 1
MOVWF SAYAC 1
DONGU
TOPLAM 1+1+N-1+2+2N-2=3N+1
KSS =3N+1
N çok büyükse KSS=3N diyebiliriz.
PIC ASSEMBLY
KOMUT SAYKIL SAYISININ BULUNMASI
PIC ASSEMBLY
Tek döngülü gecikme programıyla oluşan maksimum gecikme (766 çevrimlik süre)
bazı uygulamalar için az gelebilir. Bu durumda iç içe iki veya daha fazla döngü
kullanılabilir.
PIC ASSEMBLY
TSS=3x255x255+5x255+4=196.354
ÖRNEK: Çift döngülü bir zaman geciktirme programında 12 ms lik bir gecikme
isteniyorsa M ve N sayıları ne olmalıdır. (PIC’e 4MHz lik bir frekans
uygulanmaktadır).
12ms=12000µsn eder. Dahili clock frekansı 1MHz olduğundan 12000 komut saykılı
gerekir.
12000=3*M*N dir.
M=N olarak düşünülürse
12000=30M2
M2=4000
M=63,2 dir. Yaklaşık 63 desimal dir. Yani H’3F’
M=H’3F’
N=H’3F’
PIC ASSEMBLY
ALT PROGRAMLAR
Program içerisinde defalarca tekrar edilmesi gereken komut dizilerini sürekli yazmak
yerine, bu komut dizilerini altprogramlar şeklinde yazarak hem bellek alanından
tasarruf edilmiş olur, hem de program sadelik kazanır. Altprogramlar ana
programdan CALL komutu ile çağrılır ve altprogramın çalışması bittikten sonra ana
programa RETURN komutu ile dönüş sağlanır.
PIC ASSEMBLY
PIC ASSEMBLY
PIC ASSEMBLY
Örnek: Port B ye bağlı olan tüm ledleri belirli zaman aralıklarında yakıp söndüren
program.
• LIST P=16F84
• INCLUDE "P16F84.INC"
• SAYAC1 EQU H'20'
• SYACA2 EQU H'21'
• CLRF PORTB
• BANKSEL TRISB
• CLRF TRISB
• BANKSEL PORTB
TEKRAR
• MOVLW h'00'
• MOVWF PORTB
• CALL GECIKME
• MOVLW h'FF'
• MOVWF PORTB
• CALL GECIKME
• GOTO TEKRAR
GECIKME
• MOVLW h'FF'
• MOVWF SAYAC1
DONGU1
• MOVLW h'FF'
• MOVWF SAYAC2
DONGU2
• DECFSZ SAYAC2,F