You are on page 1of 99

PIC16F877’ IN DONANIMSAL YAPISI

Pic16F84’ün Mimari Yapısı


PIC Çeşitleri
Microchip PIC’leri 12/14/16 bitlik kelime boylarında üretilmektedir ve buna göre
aşağıdaki aile isimleri mevcuttur.

• PIC 16C5XX ailesi 12 bit kelime boyu


• PIC 16CXXX ailesi 14 bit kelime boyu
• PIC 17CXXX ailesi 16 bit kelime boyu
• PIC 12CXXX ailesi 12 bit/14 bit kelime boyu

 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

Clock Uçları ve Osilatör Çeşitleri:


 PIC belleğinde bulunan program komutlarının çalıştırılması için bir kare
dalga sinyale ihtiyaç vardır. Bu sinyale clock sinyali denir. PIC16F84’ün
clock sinyal girişi için kullanılan 2 ucu vardır. Bunlar OSC1 (16. pin) ve
OSC2 (15. pin) uçlarıdır. Bu uçlara farklı tipte osilatörlerden elde edilen clock
sinyalleri uygulanabilir. Seçilecek osilatör tipi Pic’in kontrol ettiği devrenin hız
gereksinimine bağlı olarak seçilir. Clock osilatör tipleri şunlardır:
○ RC: Direnç/Kondansatör
○ XT: Kristal veya seramik resonetör
○ HS: Yüksek hızlı kristal veya seramik resonetör
○ LP: Düşük frekanslı kristal
Clock Düzeni ve Komut Süresi

• PIC’in program hafızasında bulunan komutların


çalışması kare dalga (clock sinyali) ile olur.
Clock Düzeni ve Komut Süresi
• Dışarıdan buraya uygulanacak kare dalga OSC2/CLK OUT dan
dörde bölünmüş olarak (f/4) 15 numaralı bacaktan dışarı
alınabilir. Q1, Q2, Q3, Q4 olan bu bölümler de kare dalga
şeklindedir. Program sayıcı (PC), her Q bölümünde bir
arttırılmakta ve komutlar program belleğinde işleme sokularak
Q4’de sona ermektedir.
Pic16F84’ün YAPISI ve ÇALIŞMASI

Clock Uçları ve Osilatör Çeşitleri:


Pic’e bağlanan clock osilatörünün tipi programlama esnasında Pic içerisinde
bulunan konfigürasyon bitlerine yazılmalıdır.
Pic16F84’ün YAPISI ve ÇALIŞMASI

Kristal Kontrollü Clock Osilatörleri:


Pic16F84’ün YAPISI ve ÇALIŞMASI

Kristal Kontrollü Clock Osilatörleri:


Kristal ve kondansatör kullanılarak yapılan osilatörler zamanlamanın önemli
olduğu yerlerde kullanılır. Kristal osilatörün kullanıldığı devrelerde kristale
bağlanacak kondansatörün seçimine özen gösterilmelidir. Aşağıda tabloda
hangi frekansta kaç µf’lık kondansatör kullanılacağını göstermektedir.
Pic16F84’ün YAPISI ve ÇALIŞMASI

Kristal Kontrollü Clock Osilatörleri:


Seçilen kondansatör değerlerinin gerekli değerlerden yüksek olması, elde
edilen kare dalganın bozuk olmasına ve Pic’in çalışmamasına neden olur. C1
ve C2 kondansatörünün birbirine eşit olması gerekir.
Pic16F84’ün YAPISI ve ÇALIŞMASI
Reset Uçları ve Reset Devresi:
Pic16F84’ün YAPISI ve ÇALIŞMASI
Reset Uçları ve Reset Devresi:
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

2 tür belleği vardır: 1 Program belleği 2. RAM belleği


Pic16F84’ün RAM Belleği
PIC16F84A’nın 0X00 -
0X4F adres aralığında
ayrılmış olan RAM belleği
vardır. Bu bellek
içerisinde bulunan “file
register ” in içerisine
yerleştirilen veriler PIC
CPU’ sunun çalışmasını
kontrol ederler. File
Registerlerin bellek
uzunluğu 8 bittir. Sadece
PCLATH registeri 5 bittir.
File register adı verilen
özel veri alanlarının
dışında kalan bellek
alanları normal RAM
bellek olarak kullanılır.
Pic16F84’ün RAM Belleği
REGİSTER’LER:

Veri belleği - DATA MEMORY (RAM)


Veri belleği iki tip alandan oluşur. Birincisi özel fonksiyon ( Special Function
Register ) ( SFR ) yazmaç alanı, ikincisi ise genel amaçlı ( General Purpose
Register ) ( GPR ) yazmaçtır. SFR yazmacı işletim kontrolü yapar.
Veri belleği banklar halinde bölümlenmiştir. Bank 0 ve Bank 1 olarak iki bank
vardır. Her iki bankta da SFR ve GPR alanları bulunur. SFR çevresel
fonksiyonları kontrol eden registerlar için kullanılır. Bank bölümlemesinden
dolayı, bank seçimi için kontrol bitlerinin kullanımını gerektirir. Bu kontrol
bitleri STATUS registerinde bulunur.
Bank0’ı seçmek için RP0 bitini ( ki bu STATUS’un 5. biti oluyor ) temizlemek
gerekir. Aynı bitin kurulması ( set ) ile de BANK1 seçilmiş olur. Her iki bankın
ilk on ikisinin yerleşimi özel fonksiyon kaydı için ayrılmıştır. Kalanı ise statik
RAM olarak genel amaçlı kayıtları yürütmektedir.
Flash Program Belleği
Pic16F84’ün Register

İşlemci Durum Kaydedici (Processor Status Register):

 PS ya da Status adıyla anılan bu register bayrak işaretlerini tutan registerdir.


Diğer registerlerden farklı olarak bu register, blok olarak değil tek tek bit olarak ele
alınır. Bu registerin bitlerine bakılarak işlemin ve işlemcinin durumu hakkında bilgi
elde etmek mümkündür. Status Registerin Bitleri:
Pic16F84’ün Register
Pic16F84’ün Register
PORTA and TRISA Registers:
W Yazmacı (Register)
Assembly Dili Nedir?

•Makinanın anlayabildiği tek dil 0 1 dir.

•Üst düzey programlama dillerinde yazdığımız programlar platform’a bağlı


(Windows, Linux, Unix vs.) çalışırlar. Biz eğer hızlı yazılım geliştirip hedefimiz bu işten
para kazanmaksa üst düzey diller bu iş için idealdir.

•Ne zaman ki biz bu platformlardan uzaklaşalım kendimize özgü birşeylerimiz olsun


dersek o zaman bu üst düzey diller bizim bu ihtiyacımıza cevap veremiyecektir

• İşlemcinizin gücünü en iyi şekilde ortaya koyabilecek tek programlama dilidir

•Cok az yer kaplar

•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.

• MOV A, #55 ;Akümülatöre 55 değerini yükle

• Assembly dilini kullanarak uygulama geliştirmek makine diline (ikili sayı


sistemine) göre daha kolaydır.

• C, Basic, Pascal vb. gibi yüksek seviyeli dillerde program yazmaya


nazaran daha zordur.
Asembly Dilinin Avantajları
• Donanım hakkında daha fazla detay bilmeyi gerektirir.
Bu dezavantaj gibi görülse de aslında kullanıcıya önemli
bilgi birikimi sağlamaktadır.
• Özel donanım ihtiyaçları üzerinde daha fazla kontrol
sağlar.
• Yüksek seviyeli dillere göre daha küçük, daha az yer
kaplayan ve daha hızlı icra edilebilir kodlar üretilebilir
Dezavantajları
• Dilin öğrenilmesi uzun zaman ve emek ister.
• Yazılan programlar diğer diller göre daha çok satırdan oluşur.
• İşlemciye birebir bağımlıdır.
Örnek
Program Formatı
İşlem Kodu
Etiket (Komut–Opkod) İşlenen (Operand) Açıklama
Basla: MOV A, #77h ;Aküye 7716 değerini yükle

Etiket alanı
• Komut satırının ilk bilgisidir ve sembolik isimlerden oluşur.

• Program içerisindeki belirli işlevlerin gerçekleştiği bölümlerin


başlangıcını göstermek amacı ile kullanılır.

• Program içersinde istenilen kısma kolaylıkla dallanılmasını sağlar.

• Etiket ismi olarak mikroişlemci komut setinde tanımlı olan bir komut
ismi verilemez.

• Etiket bir harf ile başlamak zorundadır.


Program Formatı
Komut
• Kısaltma(mnemonik) olarak da adlandırılan, komut seti içerisinde mikroişlemcinin belirli bir işi
yapmasını sağlayan tanımlanmış sembollerdir.

• Komut alanına etiketten sonra 1 boşluk ya da sekme (tab) ile girilir.

Operand

• Bu alan, işlemciye işlenecek veriyi ya da verinin nerede olduğunu gösterir.

• Tek başına bir anlam ifade etmez.

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

Ön Takı Son Takı Anlamı Örnek

(Boşluk) D Onlu sayı (decimal)* 55 – 55D


% B İkili sayı (binary) %01010101 – 01010101B
@ O Sekizli sayı (octal) @33 – 33O
$ H Onaltılık sayı (hexadecimal) $FB – FBH

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.

• ORG ‘Adres’ şeklinde kullanılır.

• Bir program içerisinde birden fazla ORG komutu kullanılabilir.

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.

İsim DB ifadeler Açıklama


Max_sayi DB 255 ;tek bir değişken
tanımlanması
Tablo DB 0, 5, 4, 3, -10 ;dizi olarak tanımlama
Yaz DB ‘8051 ogreniyorum’ ;string olarak tanımlama
Yönergeler
EQU
• EQU (Equal = eşittir) bir sayısal değerin istenilen sembol adına
atanması işlemini gerçekleştirir

• Bu tanımlama program içerisinde bir ifadenin ya da değerin çok


fazla tekrar edildiğinde programın anlaşılırlığını arttırmak için
kullanılır.

İsim Talimat Değer Açıklama


Pi EQU 3.14 ;sabit değer tanımlama
Bilgi EQU 55h ;55h adresindeki veriyi bilgi değişkenine
ata
PIC ASSEMBLY

PIC ASSEMBLY PROGRAMI 4 Bölümden oluşmaktadır.


PIC ASSEMBLY

1.Başlık Bloğu: Programının başındaki bilgilere başlık bölümü denilir.


Başlık bölümünde program dosyasının adı ve hazırlandığı tarih,
istenirse hazırlayanın adı ya da farklı bir ad yazılabilir. İlk satır,
bir açıklama satırıdır ve assembler tarafından derlenmez.

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

Sabitler : PIC assembly dilinde heksadesimal sayılar birer sabittir.


Sabitler MOVLW ve bazı mantıksal ve aritmetik işlem komutlarında
kullanılırlar

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

ORG 0 x 004 ; h’004 adresi, PIC16F84 denetleyicisinin kesme alt programının


başlangıç adresi
PIC ASSEMBLY

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

Komutların kullanılışında yer alacak olan ifadelerde geçen bazı harflerin


anlamları :

f file register
d destination (gönderilen yer)
d=0 ise  W register
d=1 ise  File register

k sabit veya adres etiketi


b bit tanımlayıcısı
b binary sayıları belirleyen harf (Örnb’00001111’)
ddesimal sayıları belirleyen harf (Örnd’20’)
Sayı Decimal Binary Hexadecimal
24 d’24’ b’00011000 0x18 yada H’18’
65 d’65’ b’01000001’ 0x41 yada H’41’
255 d’255’ b’11111111’ 0xFF yada H’FF’
PIC ASSEMBLY

BYTE Yönlendirme Komutları:


PIC ASSEMBLY

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

Sabit İşleyen Komutları: Sabit yönlendirmeli komutlarda dikkat edilirse


hedef (d) belirtilmemiştir. Sonuç her zaman W kayıtçısının içersindedir.
PIC ASSEMBLY

Kontrol Komutları: Kontrol komutları program akışını belirleyen komutlardır.


Altprogram çağırma, şartsız dallanma ve uyku moduna geçme gibi olaylar bu
komutlarla gerçekleşir. Bu komutlarda hedef genelde bir adres değeridir
PIC ASSEMBLY

Örnek:PORTB nin 0.bitine bağlı LED’i yakan programı yazınız?


PIC ASSEMBLY

1. PIC bank değiştirecek


2. Portlar giriş/çıkış olarak yönlendirilecek
3. Porta gönderilecek veri ne ise ilgili register’a gönderilecek veri
yüklenecek.

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.

BSF 0X03 , 5 Bu komut işlendiğinde PIC Bank 1’e geçer.


BCF 0X03 , 5 Bu komut işlendiğinde PIC Bank 0’e geçer.
Eğer atama bloğunda 0x03 nolu adres’e bir etiket ismi verildiyese ki genelde
STATUS ismi verilir. Çünkü bu adres STATUS registerıdır. Assembly kodu aşağıdaki
gibide yazılabilir.

BSF STATUS, 5 Bu komut işlendiğinde PIC Bank 1’e geçer.


BCF STATUS, 5 Bu komut işlendiğinde PIC Bank 0’e geçer.
PIC ASSEMBLY

PORTLARIN GİRİŞ YADA ÇIKIŞ OLARAK YÖNLENDİRİLMESİ:


PORTA ve PORTB nin uçlarına bağlı bulunan bir I/O elemanını kullanabilmek için portları
giriş veya çıkış olarak yönlendirmek gerekir.

PORT A yı  TRIS A reg yönlendirir.


PORT B yi  TRIS B reg.

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

PORTLARA VERİ GÖNDERMEK :


VERİ TRANSFERİ

W registerini registerler ararsında veri transferi yapmak için kullanırız.


Örneğin; PORTA daki veriyi PORTB ye transfer etmek için.
Komut Olarak;
MOVF PORTA , W
 PORTA nın içeriğini W reg.’a
taşır.
MOVWF PORTB ,  W
reg.ın içeriğini PORTB’ ye taşır.

Örneğin PORTB’ye bağlı olan 8


LED’in ilk 4 tanesini yakacak olan
veriyi göndermek için ilgili
komutu yazalım.
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.

MOVF PORTB,W -> PortB , nın içeriğini W registere taşır


MOVWF PORTBPORTB’ye W’nun içini yani 0F’i taşı.
MOVLW 0x0F  W reg’a 0F’i taşı

PORTB içerisindeki verinin hexadesimal karşılığı 0F olarak karşımıza çıkmaktadır.


Yani PORTB registerına aktarmam gereken veri 0F olacaktır. İşte MOVLW 0x0F
komutunda geçen 0F verisi buradan gelmektedir. Yani PORTA gönderilecek veri
hesaplanırken PORT bacaklarına gönderilecek işlemin bilinmesi gerekmektedir.
Hangi lambaların yanacağını biliyorsam işim kolaylaşacaktır. Örnekte ilk 4 led
değilde son dört led yanacak deseydi ozaman PORTB ye F0 verisini gönderecektim.
Yada tüm ledler yansın deseydi PORTB’ye FF verisini gönderecektim.
PIC ASSEMBLY

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

komutları yerine sadece

CLRF PORTB

komutunu kullanmak yeterli olacaktır. Bu işlem sadece register


içeriğinde sıfırlama yapılacaksa geçerlidir.
PIC ASSEMBLY

• W register kullanılmasına örnek:


• Port A dan okunan veriyi, PortB ye bağlı olan LED lerde
gösteren program
PIC ASSEMBLY
LIST P=16F84
INCLUDE “P16F84.INC”
CLRF PORTB ; PORT B,YE BAĞLI LEDLERİ SÖNDÜR
BSF STATUS,5 ; BANK 1 E GEÇ
CLRF TRISB ; PORT B NIN UÇLARINI ÇIKIS YAP
MOVLW H’FF’ ; W REGİSTERE H’FF’ YÜKLE
MOVWF TRİSA ; PORT A NIN TÜM UÇLARINI GİRİŞ YAP
BCF STATUS ,5 ; BANK0 A GEÇ
B
MOVF PORTA,W ; PORTA YI OKU SONUCU W YE YAZ
MOVWF PORTB ; PORTA NIN DURUMUNU PORTB DE GÖSTER
DONGU
GOTO DONGU
END
PIC ASSEMBLY

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ı?)

GOTO TEST_PORTA ;Hayır ise TEST_PORTA ya git Evetse bir


sonraki satırdan devam et
MOVLW H’FF’ ;W’ya FF verisini aktar
MOVWF PORTB ;PORTB ye W nun içini aktar (yani 8 LED i de
yak)
DONGU
GOTO DONGU
END
PIC ASSEMBLY

Ö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ı gerekebilir. Bu


durumda programcı tarafından belirlenen bir kayıtçı sayaç olarak
kullanabilir. Sayaç şu şekilde hazırlanır:

Önce sayaç içerisine tekrar sayısını belirleyen sayı yüklenir.


 Her işlem tekrarında sayaç 1 azaltılır. (DECFSZ komutu kullanılır.)
 Sayaç 0 olduğunda program ya bitirilir ya da başka bir yere dallandırılır.
PIC ASSEMBLY

2. KARŞILAŞTIRMA YAPARAK DÖNGÜ DÜZENLEMEK (SUBLW , SUBWF , INCF , DECF KOMUTLARI)

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

SUBWF Komutu: Çıkarma yapan komuttur.


Çıkarma işlemi sonucunda etkilenen C ve Z bitleri içerisindeki değer, W
ve F registerlerinin büyüklüğüne bağlıdır.
F>W  Z= 0 ve C= 1 ; F=WZ= 1 ve C= 1 ; F<W Z= 0 ve C= 0
SUBLW Sbt durumunda ise
Sbt >W Z= 0 ve C= 1 ; Sbt =WZ= 1 ve C= 1 ; Sbt <WZ= 0 ve C= 0
PIC ASSEMBLY

SUBWF Komutu: Çıkarma yapan komuttur.


Çıkarma işlemi sonucunda etkilenen C ve Z bitleri içerisindeki değer, W
ve F registerlerinin büyüklüğüne bağlıdır.
F>W  Z= 0 ve C= 1 ;
F=W Z= 1 ve C= 1 ;
F<W Z= 0 ve C= 0

SUBLW Sbt durumunda ise


Sbt >W Z= 0 ve C= 1 ; Sbt =WZ= 1 ve C= 1 ; Sbt <WZ= 0 ve C= 0
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.

PIC16F84’e uygulanan 4 Mhz’lik osilatör sinyalinin 1 komutu icrası için 4 palsı


gerekir. Dolayısıyla PIC’in 1 komutu icra etmek için kullandığı frekans, dışarıdan
uygulanan sinyalin ¼ üne düşer ve 1 Mhz olur. İşte Fosc/4 değerindeki bu
değere dâhilî komut saykılı denir. 1Mhz’lik sinyalin dâhilî komut peryotu da 1μS
olacaktır. Bazı komutların icrası ise 2 komut saykıllık zaman alır.

1MHz ‘lik dahili frekans ın bir saykılı (peryodu);


PIC ASSEMBLY

CLRF PORTB 0,4 µsn


BSF STATUS,5 0,4 µsn olarak bulunur.
PIC ASSEMBLY
PIC ASSEMBLY

Tek Döngü ile Minimum Zaman Geciktirme

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.

KOMUT KOMUT SAYKILI


MOVLW H’01’ 1
MOVWF SAYAC 1
DONGU
DECFSZ SAYAC,F 1*0 +2
GOTO DONGU 2*0
TOPLAM 4 saykıl
PIC ASSEMBLY

Tek Döngü ile Maksimum Zaman Geciktirme

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

DECFSZ SAYAC,F 1*254 +2

GOTO DONGU 2*254

TOPLAM 766 saykıl


PIC ASSEMBLY

KOMUT SAYKIL SAYISININ BULUNMASI

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

DECFSZ SAYAC,F 1*(N-1) +2

GOTO DONGU 2*(N-1)

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

ÇİFT DÖNGÜLÜ ZAMAN GECİKTİRME

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

Yaklaşık olarak KSS KSS=3XMXN İle hesaplanabilir.


PIC ASSEMBLY

3 döngülü bir gecikme altprogramı yazalım. Fosc=4 Mhz için toplam


50.070.529 mikrosaniye ve yaklaşık 50 saniye eder
PIC ASSEMBLY

Ö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

You might also like