Upload
others
View
12
Download
0
Embed Size (px)
Citation preview
İçindekiler Laboratuar Çalışmalarında Dikkat Edilecek Hususlar .............................................................................. 3
LED UYGULAMALARI: .............................................................................................................................. 4
a) Deney 1: ....................................................................................................................................... 4
b) Deney 2: ....................................................................................................................................... 5
c) Deney 3: ....................................................................................................................................... 6
d) Deney 4: ....................................................................................................................................... 8
e) Deney 5: ....................................................................................................................................... 9
f) Deney 6: ..................................................................................................................................... 11
g) Deney 7: ..................................................................................................................................... 12
BUTON UYGULAMALARI: ....................................................................................................................... 14
a) Deney 1: ................................................................................................................................. 14
b) Deney 2 .................................................................................................................................. 16
c) Deney 3: ................................................................................................................................. 18
d) Deney 4: ................................................................................................................................. 20
e) Deney 5: ................................................................................................................................. 22
f) Deney 6: ................................................................................................................................. 24
LCD UYGULAMALARI: ............................................................................................................................ 26
g) Deney1:.................................................................................................................................. 27
h) Deney 2: ................................................................................................................................. 29
i) Deney 3: ................................................................................................................................. 30
j) Deney 4: ................................................................................................................................. 32
k) Deney 5: ................................................................................................................................. 34
l) Deney 6: ................................................................................................................................. 37
m) Deney 7: ............................................................................................................................. 39
TUŞ TAKIMI (KEYPAD) UYGULAMALARI: ............................................................................................... 43
n) Deney 1: ................................................................................................................................. 45
o) b) Deney 2:............................................................................................................................ 47
SAYICI UYGULAMALARI: ....................................................................................................................... 50
p) c)Deney 3: .............................................................................................................................. 55
SERİ HABERLEŞME UYGULAMALARI: ..................................................................................................... 62
a)Baud Rate ........................................................................................................................................... 67
1)ASENKRON SERİ İLETİŞİM (YAZILIMSAL) ......................................................................................... 68
a)SERIN .......................................................................................................................................... 68
Hyper Terminal Açılışı: Başlat/Tüm Programlar/Donatılar/İletişim/Hyper Terminal .................... 75
Laboratuar Çalışmalarında Dikkat Edilecek Hususlar
1)
LED UYGULAMALARI:
a) Deney 1:
Amaç: PIC16F877A’nın data portlarını çıkış olarak ayarlamak ve kontrol etmek.
Teori: Ledler 20-50 mA aralığında çalışan basit devre elemanlarıdır. Led, buzzer gibi düşük
akım çeken devre elemanları mikrodenetleyiciye direkt bağlanabilirken motor vb. yüksek
akım çeken elemanlar röle veya transistor aracılığıyla bağlanmalıdır
Problemin tanımı: Devreye enerji verildiğinde PIC16F877A’nın D portuna bağlı LED’lerin
tümünü yakan program.
TRISD=0
PORTD=0
PORTD=%11111111
END
Program komut satırlarının açıklanması:
PORTD’nin tüm bitlerini(pinlerini) çıkış olarak ayarlar.
PORTD içeriğini siler.
PORTD’nin tüm bitlerini 1 yaparak bu bitlere bağlı ledleri yakar.
Programı sonlandırır.(Ledler hala aktifliğini sürdürür. Sebebi sönmesi için bir komut
vermememiz) .
b) Deney 2:
Amaç: PIC16F877’nin data portlarını giriş ve çıkış olarak ayarlamak ve kontrol etmek.
Teori: Lojik-1 gönderilen led aktif olur.
Problemin tanımı: Devreye enerji verildiğinde PIC16F877A’nın D portuna bağlı LED’leri
birer aralıklarla yakan program.
TRISD=0
PORTD=0
PORTD=%10101010
END
Deney 1 üzerinde (3) numaralı komut satırı PORTD=%10101010 şeklinde değiştirilirse
PORTD’ye bağlı LED’ler birer aralıklı olarak yanar.
(3) numaralı komut satırındaki bitlere 0 ve 1 şeklinde farklı değerler verilerek PORTD’ye
bağlı LED’lerden istenilenlerin yakılıp söndürülmesi sağlanır. Örneğin PORTD’ye bağlı ilk
iki LED ile son iki LED’in yakılması için (3) numaralı komut satırı PORTD=%11000011
şeklinde değiştirilmelidir.
(3) PORTD=%11000011
c) Deney 3:
Amaç: PIC16F877A’nin data portlarını flip-flop(flaşör) olarak ayarlamak ve kontrol etmek.
Mikrodenetleyicilerde bekleme süresi(PAUSE) kavramını anlamak.
Teori: Program bekleme aşamasındayken PAUSE komutundan hemen önceki komut
microdenetliyici süresi kadar devam eder.
Problemin tanımı: Devreye enerji verildiğinde PIC16F877A’nın D portunun ilk bitine bağlı
LED’i 1 sn aralıklarla yakın söndüren program.
TRISD=0
PORTD=0
DONGU:
HIGH PORTD.0
PAUSE 1000
LOW PORTD.0
PAUSE 1000
GOTO DONGU
END
Program komut satırlarının açıklanması:
1. PORT D’nin tüm bitlerini çıkış olarak ayarlar.
2. PORTD içeriğini siler.
3. LED’in 1’er saniye aralıklarla sürekli yanıp sönmesi için (7) numaralı komut satırından (3)
numaralı komut satırına dönmeyi sağlayan DONGU etiketi bu satırda belirtilmiştir. DONGU
yerine farklı isimli herhangi bir etiket ismi de verilebilir.
Bu satırda dikkat edilmesi gereken husus; etiketin iki nokta üst üste (:) ile sonlandırılmasıdır.
4. PORTD’nin 0. Biti HIGH komutu ile 1 yapılarak bu bit’e bağlı LED yakılır.
5. PAUSE 1000 komutu ile LED’in 1 sn yanık kalması sağlanır.1000 sayısı mili saniye(msn)
cinsinden zaman gecikmesini simgeler.
6. PORTD’nin 0. Biti LOW komutu ile 0 yapılarak bu bit’e bağlı LED söndürülür.
7. PAUSE 1000 komutu ile LED’in 1 sn sönük kalması sağlanır.1000 sayısı msn cinsinden
zaman gecikmesini simgeler.
8. Bu komut satırında yer alan GOTO komutu ile DONGU etiketi (3) numaralı komut satırına
dallanma sağlanır. Böylece yanıp sönme işleminin 1’er saniye aralıklarla sürekli olması
gerçekleştirilir.
9. Program sonlandırılır.
d) Deney 4:
Amaç: PIC16F877A’nın data portlarını TOGGLE komutu ile flip-flop(flaşör) olarak
ayarlamak.
Teori: TOGGLE komutu sayesinde flip-flop programlarında satır sayılarını en aza
indirebiliriz.
Problemin tanımı: Devreye enerji verildiğinde PIC16F877A’nın D portunun ilk bitine bağlı
LED’i 1 sn aralıklarla yakıp söndüren program(Flaşör).
TRISD=0
PORTD=0
DONGU:
PAUSE 1000
TOGGLE PORTB.0
GOTO DONGU
END
Deney 4, tıpkı Deney 3’de olduğu gibi flaşör olarak çalışmaktadır. Programda LED’in bağlı
olduğu PORTD.0 bitinin alacağı lojik-1 ve lojik-0 değerleri HIGH ve LOW komutları ile
sağlanmıştır.
TOOGLE komutu tanımlanan bitin lojik seviyesini tersler.Diğer bir ifadeyle ilgili bit 1 ise 0,
0 ise 1 yapılır.
1. PORTD’nin tüm biletlerini çıkış olarak ayarlar.
2. PORTD içeriğini siler PORTD çıkışlarını lojik-0 yapar.
3. LED’in 1’er sn aralıklarla yanıp sönmesi için (6) numaralı komut satırından (3) numaralı
komut satırına dönmeyi sağlar.
4. PAUSE 1000 komutu ile LED’in 1sn sönük kalması sağlanır.
5. TOGGLE komutu ile lojik-0 olan PORTD’nin 0. Biti 1 yapılır. Program (6) numaralı
komut satırından (3) numaralı komut satırına tekrar döndüğünde (4) numaralı komut satırı
sayesinde LED’in 1 sn yanık kalması sağlanır. (5) numaralı komut satırı işletildiğinde
TOGGLE komutu bu kez PORTD’nin 0. Bitinin lojik-1 olan seviyesini lojik-0 yapar.
6. Bu komut satırında yer alan GOTO komutu ile DONGU etiketli (3) numaralı komut satırına
dallanma sağlanır.
7. Programı sonlandırır.
e) Deney 5:
Amaç: PIC16F877A’nın data portlarını 0,5 saniye aralıklarla yakmasını sağlamak.(sağa).
FOR döngüsü mantığını kavramak
Problemin tanımı: PIC16F877A’nın D portu üzerinde bir LED’i bit7’den bit0 yönüne (sağ)
yakarak kaydıran program.
TRISD=0
PORTD=0
BASLA:
PAUSE 500
PORTD=%10000000
SAG:
PAUSE 500
PORTD=PORTD>>1
IF PORTD=%00000001 THEN BASLA
GOTO SAG
END
1.PORTD’nin tüm bitlerini çıkış olarak ayarlar.
2.PORTD içeriğini siler. PORTD çıkışlarını lojik-0 yapar.
3. Programın başlangıç noktasına dallanacağı BASLA etiketi.
4.RB0 LED’inin yanık kalma süresini 0,5 sn olarak ayarlar. Bu komut satırı
kullanılmadığında RB0 LED’inin yandığı görülmez.
5.PORTD’nin 7. Bitini (en sol bit) 1 yaparak bu bite bağlı LED’i yakar.
6.Sağa kaydırma işlemini devamı için SAG dallanma etiketi.
7.Sağa kaydırma zaman süresini veya LED’in yanık kalma süresini 0,5 sn olara
ayarlar.
8.(>>) komutu sağa ilerlemeyi sağlar. >>1 komutu ise sağa 1 bit ilerlemeyi ifade eder.
PORTD’ye ait bitlere 7. Bitten başlamak üzere 0. Bite kadar sırasıyla lojik-1
yapar.(>>2 şeklinde kullanıldığında ise 2 bit sağa ilerleme işlemi gerçekleşir.)
9.IF … THEN komutları ile karşılaştırma işleminin doğru veya yanlış olup olmadığı
test edilir. Karşılaştırma sonucu doğru ise THEN komutundan sonraki komut işletilir.
Karşılaştırma sonucu yanlış ise THEN komutu işletilmeden bir alt satırdaki komut
işletilir. IF komutu ile PORTD içeriğinin ‘’000000001’’ olup olmadığı
sorgulanır.PORTD’nin 0. Biti lojik-1 ise program, THEN komutunu işleterek BASLA
etiketli (3) numaralı komut satırına dallanır.PORTD’nin 0. Biti lojik-1 değil ise
sıradaki komut satırı (10) işletilir.Bu komut satrında, ‘eğer (IF) PORTD’nin 0. Biti 1
ise o zaman (THEN) BASLA etiketli komut satırına git, değilse (10) numaralı komut
satırını işleterek (6) numaralı komut satırına dallan ve sağa kaydırma işlemine devam
et’ denir.
10.Bu komut satırı ile program SAG etiketli (6) numaralı komut satırına dallanır.
11. Program sonlandırılır.
f) Deney 6:
Amaç: PIC16F877A’nın data portlarını 0,5 saniye aralıklarla yakmasını sağlamak.(sola)
Teori: IF komutu herhangi bir koşul sonucunda komut vermemizi sağlar. Programlama
dünyasının en çok kullanılan komutudur.
Problemin tanımı: PIC16F877A’nın D portu üzerinde bir LED’İ bit0’dan bit7 yönünde
(sola) yakarak kaydıran program.
1. TRISD=0
2. PORTD=0
3. BASLA
4. PAUSE 200
5. PORTD=%00000001
6. SOL:
7. PAUSE 200
8. PORTD=PORTD<<1
9. IF PORTD =%10000000 THEN BASLA
10. GOTO SOL
11. END
1.PORTD’nin tüm bitleri çıkış olarak ayarlanır.
2.PORTD içeriğini siler PORTD çıkışları lojik-0 yapar.
3.Programın başlangıç noktasına dallanacağı BASLA etiketi.
4.LED’in yanık kalma süresini 200 msn olarak ayarlar.
5.PORTD’nin 0. Bitini (en sağ bit) 1 yaparak bu bite bağlı LED’i yakar.
6.Sola kaydırma işleminin devamı için SOL dallanma etiketi.
7.Sola kaydırma zaman süresini veya LED’in yanık kalma süresini 200 msn olarak ayarlar.
8.PORTD’ye ait bitleri 0. Bitten başlamak üzere 7. Bite kadar sırasıyla lojik-1
yapar.(<<)komutu sola ilerlemeyi sağlar. <<1 komutu ise sola 1 bit ilerlemeyi ifade eder.
PORTD’ye ait bitleri 0. Bitten başlamak üzere 7. Bite kadar sırasıyla lojik-1 yapar.(>>2
şeklinde kullanıldığında ise 2 bit sola ilerleme işlemi gerçekleşir.)
9.IF komutu ile PORTD içeriğinin 10000000 olup olmadığı sorgulanılır. PORTD’nin 7. Biti
lojik-1 ise program THEN komutunun işleterek BASLA etiketli (3) numaralı komut satırına
dallanır. PORTD’nin 7. Biti lojik-1 değil ise sıradaki komut satırı (10) işletilir.
10.Bu komut satırı ile program SOL etiketli (7) numaralı komut satırına dallanır.
11.Program sonlandırılır.
g) Deney 7:
Amaç: FOR döngüsünü pekiştirmek.
Teori: FOR döngüsü tanıtılan bir değişkenin hangi sayıdan başlayıp hangi sayıya kadar kaçar
kaçar artacağını veya azalacağını belirleyebildiğimiz oldukça sık kullanılan bir komuttur.
Problemin tanımı: PIC16F877A’nın D portu üzerinde bir LED’i yakarak sağa-sola kaydıran
program.
TRISD=0
PORTD=0
SAG:
PORTB=%10000000
SAGA_DEVAM:
PAUSE 500
PORTD=PORTD>>1
IF PORTD=%00000001 THEN SOL
GOTO SAGA_DEVAM
SOL:
PORTB=%00000001
SOLA_DEVAM:
PAUSE 500
PORTD=PORTD<<1
IF PORTD=%10000000 THEN SAG
GOTO SOLA_DEVAM
END
Deney 7’de (3)-(9) numaralı komut satırları sağa kaydırma, (10)-(16) numaralı komut satırları
ise sola kaydırma işlemi yapmaktadır. Sağa ve sola kaydırma işlemleri Deney 5 ve Deney
6’da anlatıldığı gibidir.
(4) numaralı komut satırı sağa kaydırma işlem başlangıcı için PORTD’nin 7. Bitini 1 yaparak
soldaki ilk LED’i yakar. Her LED’in yanık kalma veya sağa kayma süresi (6) ve (13)
numaralı komut satırında belirtildiği gibi 0,5 sn’dir.
(7) numaralı komut satırı bir bit sağa kaydırır. (8) numaralı komut satırında PORTD’nin 0.
Bitinin 1 olup olmadığı yani en sağdaki LED’in yanıp yanmadığı sorgulanır. Bu LED
yanmadığı sürece program (5) numaralı komut satırında belirtilen SAGA_DEVAM etiketli
komut satırına geçer. PORTD’nin 0. Bitine bağlı LED yandığında ise (8) numaralı komut
satırındaki IF…THEN sorgulama komutu sayesinde program SOL etiketli (10) numaralı
komut satırına dallanır ve aynı işlemler sola kaydırma esnasında da gerçekleşir.
BUTON UYGULAMALARI:
a) Pull-Up ve Pull-Down Dirençleri:
Pull-Up: Bu devrede butona basılmadığında çıkıştan 5V (VCC) alınırken, butona
basıldığında çıkışı 0 (GND) yapmaktadır.
b) Pull-Down: Bu devrede ise tam tersi olarak basılmadığında 0 (GND)
basıldığında ise 5V (VCC) çıkışını vermektedir.
Projenizde, butonu hangi görevde kullanacaksanız o görevi daha kolay
gerçekleştirebilecek devreyi seçmeniz avantaj sağlayacaktır.
a) Deney 1:
Amaç: Şimdiye kadar çıkış olarak kullandığımız mikrodenetleyici pinlerini giriş olarak
kullanmayı öğrenmek.
Teori: Kullandığımız TRIS komutu ile mikrodenetleyicinin pinlerini giriş veya çıkış olarak
ayarlayabiliyoruz. TRISD=0 dersek D portundaki bütün pinleri çıkış olarak ayarlamış oluruz.
TRISD=1 dersek D portundaki bütün pinleri giriş olarak ayarlamış oluruz.
Problemin Tanımı: PIC16F877A’nın B portunun 2. Bitine (RB2) bağlı butona basıldığında,
D portuna bağlı LED’leri birer aralıklı olarak yakan program.
TRISD=0
TRISB=%11111
PORTB=0
SYMBOL BUTON=PORTB.2
DONGU:
IF BUTON=0 THEN LED_YAK
GOTO DONGU
LED_YAK:
PORTB=%10101010
END
Deney 1’de butona basılıp basılmadığına dair buton kontrolü (6) numaralı komut satırında
yapılmaktadır.
Sekil 5.2’de görüldüğü gibi buton PORTB’nin 2. bitine pull-up direnci ile bağlanmıştır.
Butona basıldığında PORTB’nin 2. Biti şase potansiyeli almaktadır. Diğer bir ifadeyle butona
basıldığında PORTB’nin 2. Bit girişi 0 olmaktadır. Bu nedenle program içerisinde BUTON=0
kontrolü yapılır.
(4) numaralı komut satırında yer alan SYMBOL ile B portunun 2. Bitine (PORTB.2) BUTON
ismi verilmiştir. Semboller, bir sabit veya değişkene programın daha kolay anlaşılmasını
sağlamak veya program içerisinde karmaşayı gidermek amacıyla farklı bir isim vermek
amacıyla kullanılırlar.
IF komutu ile BUTON değerinin 0 olup olmadığı sorgulanır. THEN komutu ile buton değeri
0 ise LED_YAK etiketli (8) numaralı komut satırı işletilerek LED yakılır.
Pogram Komut Satırının Açıklanması:
8 bitlik TRISD registerine ait tüm bitler 0 yapılarak PORTB registerleri çıkış olarak
ayarlanır ve böylece bu portun ilk bitine bağlı LED yakılabilir.
5 bitlik TRISB registerine ait tüm bitler 1 yapılarak PORTB bitleri giriş olarak
ayarlanır ve böylece bu portun ilk bitine bağlı buton kontrolü sağlanabilir.
PIC üzerine önceden yazılmış bir program var ise bu komut satırı ile silinir.
SYMBOL komutu ile PORTB’nin 2. Biti BUTON olarak isimlendirilmiştir. Böylece
program içerisinde B portuna 2. Bitini tanımlayan PORTB.2 ibaresi yerine BUTON
yazmak yeterli olur.
Programın (7) numaralı komut satırından (5) numaralı komut satırına dönebilmesi için
DONGU etiketi kullanılır. Bu etiket ile (5)-(7) numaralı komut satırları arasında buton
kontrolünü sağlayan döngü elde edilir.
Eğer (IF) BUTON değeri 0 ise o zaman (THEN) LED_YAK etiketli (8) numaralı
komut satırına dallan.
Buton kontrolü için (5) numaralı komut satırına dallan.
IF…THEN komutları ile yapılan kıyaslama sonucu butonun basılması durumunda
program LED_YAK etiketli bu program satırına dallanır.
PORTD’nin 7, 5, 3 ve 1 nolu bitlerini 1 yap (bu bitlere bağlı LED leri yak) .
Program sonu.
b) Deney 2
Amaç: Çift buton kullanarak gelen aynı değerdeki verileri farklı işlemeyi öğrenmek.
Teori: IF komutu 1 satırdan fazla ise ENDIF kullanılmalıdır. Yani bu deney
IF…THEN…ENDIF komut dizilimine örnek oluşturmaktadır.
Problemin Tanımı: PIC16F877A’nın B portunun ilk bitine (RB0) bağlı butona basıldığında
D portuna bağlı tüm LED leri yakan, B portunun ikinci bitine (RB1) bağlı butona
basıldığında ise LED leri söndüren program.
TRISD=0
TRISB=%11111
PORTD=0
SYMBOL BUTON0=PORTB.0
SYMBOL BUTON1=PORTB.1
DONGU:
IF BUTON0=0 THEN
PORTD=%11111111
ENDIF
IF BUTON1=0 THEN
PORTD=%00000000
ENDIF
GOTO DONGU
END
Programın (1) ve (2) numaralı komut satırlarında PORTD çıkış ve PORTB giriş olarak
tanıtılmıştır.
3. numaralı komut satırında PORTD içeriği silinmiştir.
4. ve 5. Numaralı komut satırında SYMBOL komutu ile B portunun 0. Biti (PORTB.0)
BUTON0 ve 1. Biti (PORTB.1) BUTON1 olarak tanımlanmıştır.
6. numaralı komut satırı ile buton kontrollerine ait sürekli döngü işlemi sağlanmıştır.
7. numaralı komut satırında BUTON0’a basılıp basılmadığı kontrol edilmektedir. Eğer
PORTB’nin 0. Bitine bağlı butona basılmış ise program (8) numaralı komut satırını işleterek
PORTD’ye bağlı bütün LED’leri yakar.
8. numaralı komut satırında PORTB bitleri lojik-1 yapılarak tüm LED’lerin yakılması
sağlanmıştır.
9. numaralı komut satırında BUTON0’a ait IF…THRN komut sorgulaması ENDIF komutu ile
sonlandırılmıştır.
ENDIF veya ELSE komutları THEN komutundan sonra bir grup komut çalıştırılması
durumunda kullanılır veya bu komut satırında da görüldüğü gibi THEN komutundan sonra
gelecek olan komut aynı satırda değilse IF…THEN komutu ENDIF ile sonlandırılmalıdır.
Aynı komut satırları bu program için ENDIF komutu kulanılmadan aşağıdaki gibi
yazıldığında da programın aynı şekilde çalışmasında bir değişiklik olmaz.
(6) DONGU
(7) IF BUTON0=0 THEN PORTD=%11111111
(8) IF BUTON1=0 THEN PORTD=%00000000
(9) GOTO DONGU
10. numaralı komut satırında BUTON1’e basılıp basılmadığı kontrol edilmektedir. Eğer
PORTB’nin 1. Bitine bağlı butona basılmış ise program (11) numaralı komut satırını işleterek
PORTD’ye bağlı bütün LED’leri söndürür.
11. numaralı komut satırında PORTB bitleri lojik-0 yapılarak tüm LED’lerin söndürülmesi
sağlanmıştır.
12. numaralı komut satırında BUTON1’e ait IF…THRN komut sorgulaması ENDIF komutu
ile sonlandırılmıştır.
13. numaralı komut satırı ile sürekli buton kontrolü için (6) numaralı komut satırına
yönlendirme yapılır.
14. numaralı komut satırı programı sonlandırır.
c) Deney 3:
Amaç: Tek buton kullanarak start stop yapmak.
Teori: SYMBOL komutu ile değişken tanımlaması yapabiliriz. Mikrodenetleyicinin herhangi
bir pinine herhangi bir isim verebiliriz (Türkçe karakter kullanılamaz).
Problemin Tanımı: PIC16F877A’nın B portunun ilk Bitine (RB0) bağlı butona basıldığında
D portunun ilk bitine (RD0) bağlı LED’i yakan, aynı butona tekrar basıldığında ise LED’i
söndüren program.
TRISD=0
TRISB=%11111111
PORTD=0
SYMBOL BUTON=PORTB.0
SYMBOL LED=PORTD.0
DONGU:
PAUSE 200
IF BUTON=0 THEN
TOGGLE LED
ENDIF
GOTO DONGU
END
Programın (1) ve (2) numaralı komut satırında PORTD çıkış ve PORTB giriş olarak
tanımlanmıştır.
(3) numaralı komut satırında PORTD içeriği silinmiştir.
(4) numaralı komut satırı ile PORTB nin 0. Biti BUTON ve (5) numaralı komut satırı ile
PORTD nin 0. Biti LED olarak tanımlanmıştır.
(6) nolu komut satırı ile buton kontrolü için sürekli döngü işlemi yapılmıştır.
(7) numaralı komut satırı buton arkını söndürmek amacıyla 200 msn lik bi,r gecikme yapar.
Butonlar basılıyor ve bırakılıyorken, fizik yapıları nedeniyle anahtar zıplaması adı verilen bir
durum gerçekleşir.İstenilmeyen bir durum, butonun basılması veya bırakılması esnasında
yaylanmanın oluşturduğu salınım nedeniyle lojik 1 ve lojik 0 seviyeleri oluşturur. Çok kısa
zaman diliminde gerçekleşen ve istenilmeyen bu durumun programın işleyişini olumsuz
etkilememesi amacıyla (7) nolu komut satırında zaman gecikmesi kullanılmıştır.
(8) numaralı komut satırında butona basılıp basılmadığı kontrol edilmektedir. Bu komut
satırında ‘Eğer(IF) butona basılmış (BUTON=0) ise o zaman (THEN)sıradaki komut işlet’
denmektedir.
(9) numaralı komut satırında TOGGLE komutu ile PORTD nin 0. Bitine ait lojik seviye
terslenir. TOGGLE komutu tanımlanan bitin lojik seviyesini tersler.Diğer bir ifadeyle ilgili
bit1 ise 0, 0 ise 1 yapılır.
TOGGLE komutu ile lojik-0olan PORTD nin 0. Biti 1 yapılır.Program (11) nolu komutun
satırında tekrar (6) nolu komut satırına döndüğünde TOGGLE komutu bu kez PORTD nin 0.
Bitinin lojik-1 olan seviyesini lojik-0 yapar.
(10) numaralı komut satırında BUTON a ait IF…THEN komut sorgulaması ENDIF komutu
ile sonlandırılımıştır.Program içerisinde ENDIF komutu kullanılmayacak ise; (9) ve (10)
numaralı komut satırları silinerek, (8) numaralı komut satırı IF BUTON=0 THEN TOGGLE
LED şeklinde düzenlenmelidir.
(11) numaralı komut satırı ile sürekli buton kontrolü için (6) numaralı komut satırına
yönlendirme yapılmıştır.
(12) numaralı komut satırı programı sonlandırır.
d) Deney 4:
Amaç: SERİ VE mantığını kavramak.
Teori: Seri ve mantığı ile yola çıkarak program yazıldığında ilk koşul sağlanmadan ikinci
koşulu okumaz.
Problemin Tanımı: PIC16F877A’nın B portunun ilk Bitine (RB0) ve ikinci bitine (RB1)
bağlı butonlara sırasıyla basıldığında D portuna bağlı bütün LED’leri yakan program.
TRISD=0
TRISB=%1111
PORTD=0
BUTON1:
IF PORTD.0=0 THEN BUTON2
GOTO BUTON1
BUTON2:
IF PORTA.1=0 THEN PORTD=%11111111
GOTO BUTON2
END
Programın (1) ve (2) numaralı komut satırlarında PORTD çıkış ve PORTB giriş olarak
tanmlanmıştır.
(3) numaralı komut satırında PORTD içeriği silinmiştir.
(4) numaralı komut satırı ile BUTON1 kontrolü için sürekli döngü işleminde kullanılmak
üzere etiket tanımlanması yapılmıştır.
(5) numaralı komut satırı ile PORTB nın 0. Bitine bağlı butona basılıp basılmadığı kontrol
edilmektedir. PORTB nin 0. Bitine bağlı butona basılmış ise program PORTB nin 1. Bitine
bağlı diğer butona basılıp basılmadığını kontrol etmek için BUTON2 etiketli(7) numaralı
komut satırına dallanır.
Eğer ilk butona basılmamış ise (5) numaralı komut satırından sonra (6) numaralı komut satırı
işletilerek, bu butona basılana kadar (4)-(6) arasında sürekli döngü işlemi oluşturulur.
İlk butona basılmasının ardından (8) numaralı komut satırı ile ikinci butona basılıp
basılmadığı kontrol edilir.Eğer PORTB nin 1. Bitine bağlı butona basılmış ise PORTD nin
tüm bitleri lojik-1 yapılarak bu bitlere bağlı LED ler yakılır.Butona basılmamış ise THEN
komutundan sonra gelen PORTD=%11111111 komutu atlanarak (9) numaralı komut satırı
işletirlir ve ikinci butona basılana kadar (7)-(9) arasında sürekli döngü işlemi yapılır.
(10) numaralı komut satırı ile program sonlandırılır.
PORTB nin farklı bitlerine bağlı butonlara sırasıyla basıldığında D portunun farklı bitlerine
bağlı LED leri yakmak için programın (5) ve (8) numaralı komut satırlarında belirtilen
PORTD nin 0. Biti ile 1. Bit değerleri ile PORTD içeriğinin değiştirilmesi gerekir. Örneğin B
portunun önce 2. Daha sonra 3. Butonuna sırasıyla basıldığında D portunun ilk 4 bitine bağlı
LED leri yakmak için, (5) numaralı komut satırı IF PORTB.2=0 THEN BUTON 2 yapılmalı,
(8) numaralı komut satırı ise IF PORTB.3 THEN PORTD=%00001111 yapılmalıdır.
e) Deney 5:
Amaç: SERİ VE mantığını pekiştirmek.
Teori: Şimdiki programda da iki koşulun da aynı anda sağlanıyor olması gerekmektedir.
Problemin Tanımı: PIC16F877A’nın B portunun ilk Bitine (RB0) ve ikinci bitine (RB1)
bağlı butonlara aynı anda basıldığında D portuna bağlı bütün LED’leri yakan program.
TRISD=0
TRISB=%11111
PORTD=0
SYMBOL BUTON0=PORTB.0
SYMBOL BUTON1=PORTB.1
DONGU:
IF BUTON0=0 AND BUTON1=0 THEN
PORTD=%11111111
ENDIF
GOTO DONGU
END
AND işlemi sonucunun olumlu olabilmesi için her iki şartın da mantıksal 1 olması gerekir.
Programın (1) ve (2) numaralı komut satırında PORTD çıkış ve PORTB giriş olarak
tanımlanmıştır.
(3) numaralı komut satırında PORT D içeriği silinmiştir.
(4) ve (5) numaralı komut satırında SYMBOL komutu B portunun 0. Biti (PORTB.0)
BUTON0 ve 1. Biti (PORTB.1) BUTON1 olarak tanımlanmıştır.
(6) numaralı komut satırına buton kontrolleri için döngü etiketi yerleştirilmiştir.
(7) numaralı komut satırında BUTON1 ve BUTON2 ye aynı anda basılıp basılmadığı AND
komutu ile sorgulanmaktadır. AND tablosunda da görüldüğü gibi AND işleminde çıkışın
mantıksal 1 olabilmesi için her iki girişin de aynı anda mantıksal 1 seviyesinde olması gerkir.
(7) numaralı komut satırı işletilerek butonların her ikisine de basılmış ise PORTD nin tüm
bitleri lojik-1 yapılarak bu bitlere bağlı LED ler yakılır. Aksi taktirde program (7) numaralı
komut satırından (9) numaralı komut satırına dallanır ve (10) numaralı komut satırı işletilerek,
buton kontrolleri için (6) numaralı komut satırına dönülür.
Programda (9) numaralı satır silinerek ENDIF komutu kullanılmaz ise, (7) numaralı komut
satırı IF BUTON0=0 AND BUTON1=0 THEN PORTD=%11111111 şeklinde
değiştirildiğinde program yine istenildiği gibi çalışır.
Programın (7) numaralı komut satırındaki AND komutu OR olarak değiştirildiğinde bu kez
butonlardan herhangi birine basıldığında D portuna bağlı LED ler yanacaktır.Çünkü OR
tablosunda da görüldüğü gibi OR işleminde çıkışın mantıksal 1 olabilmesi için girişlerden
herhangi birinin mantıksal 1 seviyesinde olması yeterlidir.
f) Deney 6:
Amaç: Giriş portundaki değeri çıkış portuna aktarmayı öğrenmek.
Teori: Mikrodenetleyicilerde giriş olarak ayarladığımız portdan okunan değeri direkt olarak
çıkış olarak ayarladığımız porta aktarabiliriz.
Problemin Tanımı: PIC16F877A’nın B portunun lojik seviyesini D portuna bağlı LED’ler
üzerinde gösteren program.
TRISD=0
TRISB=%11111
PORTD=0
DONGU:
IF PORTB.0=1 THEN
IF PORTD.0=1 THEN PORTD.0=0
IF PORTD.0=0 THEN PORTD.0=1
ENDIF
IF PORTB.1=1 THEN
IF PORTD.1=1 THEN PORTD.1=0
IF PORTD.1=0 THEN PORTD.1=1
ENDIF
IF PORTB.2=1 THEN
IF PORTD.2=1 THEN PORTD.2=0
IF PORTD.2=0 THEN PORTD.2=1
ENDIF
IF PORTB.3=1 THEN
IF PORTD.3=1 THEN PORTD.3=0
IF PORTD.3=0 THEN PORTD.3=1
ENDIF
GOTO DONGU
END
Programın (1) ve (2) numaralı komut satırında PORTD çıkış PORTB giriş olarak
tanımlanmıştır.
(3) Numaralı komut satırında PORTD içeriği silinmiştir.
(4) numaralı komut satırına buton kontrolleri için döngü etiketi yerleştirilmiştir.
c) Alıştırma Soruları:
Program içerisinde SYMBOL komutunun kullanım amacı nedir?
IF…THEN…ELSE…ENDIF komut grubu ile bir örnek kod yazınız.
PEEK ve POKE komutları ile bir örnek kod yazınız.
PORTB=0 komutu neyi ifade eder.
IF PORTA.1=0 THEN PORTB=%11111111 komut satırını açıklayınız.
PIC16F877A’nın B portunun 0. Bitine bağlı butona basıldığında D portuna bağlı ilk
LED yakılmak isteniyor. Bu veriler dikkate alınarak aşağıdaki programda yapılan
hatayı bularak düzeltiniz.
TRISB=0
TRISD=0
PORTB=0
DONGU:
IF PORTB.0=0 THEN HIGH PORTD.0
GOTO DONGU
END
Deney 6’ boş bırakılan komut satırlarını doldurup daha kısa nasıl kodlanabileceğini
bulunuz.
LCD UYGULAMALARI:
LCD (Liquid Crystal Display)’ler bilginin uygulanış yöntemine göre paralel ve seri girişli
olmak üzere iki kısımda incelenebilmektedir. LCD’nin kullanım amacı elektronik sistemlerde
bilgilendirme için çeşitli karakterleri ve karakter topluluklarını göstermektir.
LCD içerisindeki hazır karakterler kullanılarak veya özel karakterler hazırlanarak üzerinde
anlamlı görüntüler oluşturulabilir.
LCD dijital bilgi üreten herhangi bir sistem ile kontrol edilebilir. Yapılması gereken tek şey
uygun komutları katalogda gösterilen zamanlama dilimleri ile göndermektir. LCD bilgisayarla
veya mikrodenetleyici ile kontrol edilebilir.
LCD’nin yapısı iki kısımdan meydana gelir. Bunlar yazı ya da grafikleri gösteren sıvı kristal
display ve bu displayde karakterleri meydana getiren sürücü işlemcidir. LCD incelendiğinde
bir yüzünde LCD diğer yüzünde de sürücü işlemci görülür.
g) Deney1:
Amaç: LCD nin data pinlerini tanımak.
Teori: LCD’ler 1. Satırına yazdırırken herhangi bir komut vermemize gerek olmazken ikinci
satırına yazdırırken $C0 komutunu kullanırız.
Problemin Tanımı: PIC16F877A ile LCD’nin ilk satırına CUMYO ikinci satırına
MEKATRONIK yazdıran program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
LOW PORTB.6
PAUSE 500
LCDOUT $FE,1
LCDOUT $FE,2,”CUMYO”
LCDOUT $FE,$C0,”MEKATRONIK”
END
Deney 1 içerisindeki tanımlamalar Şekil 1’deki uygulama devresine göre düzenlenmiştir
Belirtilen uygulama devresi, PicBasicPro'da tanımlı devre olmadığından her bir bağlantı
şeklinin DEFINE komutu ile tanımlanması gerekir Bu program uygulama devresine
yüklendiğinde LCD ekranın ilk satırında CUMYO, ikinci satırında ise MEKATRONIK yazar.
Programın Açıklanması:
Programın (1)-(10) numaralı komut satırları arasında Şekil 1'deki uygulama devresine göre,
LCD'nin PIC16F877A’nın hangi portlarına ve portlar üzerinde hangi pinlere bağlı olduğuna
dair tanımlamalar yapılmaktadır.
(1)DEFINE LCD DREG PORTD 'LCD data pinleri PORTD ye bağlı.
(2) DEFINE LCD DBIT 4 'LCD data pinleri 4. bitten başlıyor
(3) DEFINE LCD EREG PORTD ‘LCD enable pini PORTD ye bağlı.
(4) DEFINE LCD EBIT 3 ‘LCD enable pini 3. bite bağlı.
(5) DEFINE LCD RWREG PORTD ‘LCD R/W pini PORTD'ye bağlı.
(6) DEFINE LGCD RWBIT 2 'LCD R/W pini 2. bit'e bağlı.
(7) DEFINE LCD RSREG PORTD ‘LCD RS pini PORTD'ye bağlı.
(8) DEFINE LOCD RSBIT 1 ‘LCD RS pini 1. bit'e bağlt.
(9) DEFINE LCD BITS 4 ‘LCD 4 bit bağlı.
(10)DEFINE LCD LINES 2 'LCD 2 satır çalışıyor.
(11)PORTB çıkış olarak tanımlanmaktadır.
(12)PORTB.2, 0 yapılarak LCD ye yazmaya imkân vermek için R/W girişi Low yapılarak
Yazma (W) moduna alınır. LCD'nin R/W girişi devre üzerinde şaseye baglanirsa program
içerisine (5), (6) ve (12) numaralı komut satırlarını yazmaya gerek kalmaz
(13)numaralı komut satırı ile LCD'nin kullanıma hazır hale gelmesi için gerekli gecikme
suresi ayarlanır.
(14)numaralı komut satırı ile LCD ekranı silinir.
(15) numaralı komut satırında LCDOUT $FE.2 komutu ile kursör satır başına
getirilir ve tirnak içerisinde belirtilen "CUMYO” ekrana yazdırılır. Ekrana
yazdırılacak tüm karakterler program içerisinde tırnak ("...") arasındagösterilir
Bu komut satırında CUMYO yazısının ilk satira yazılacağı belirtilmemiştir. Eğer komut satırı
içerisinde yazının kaçıncı satıra yazılacağı belirtilmez ise Pic Basic Pro ilgili yazıyı LCD’nin
ilk satırına satır başından itibaren yazar. Aynı komut satırında LCDOUT $FE,2 komutunda 2
rakamı yazılmasa dahi LCD ekran üzerinde yazma işlemi satir başından başlar
(16)numaralı komut satırında LCDOUT, $FE,SC0 komutu ile kursör ikinci satırın
başına getirilerek, "MEKATRONIK” ekrana yazdırılır. Bu komut satırında yazının ikinci
satıra yazılacağı belirtilmesine rağmen, yazma işleminin ikinci satırın hangi bölgesine
yazılacağı belirtilmemiştir.Eğer komut satırı içerisinde yazının satır içerisinde kaçıncı
bölgeye yazılacağı belirtilmez ise PicBasic Pro ilgili yazıyi LCD'de satir başından itibaren
yazar.
(17)numaralı komut satırındaki END komutu ile program sonlandırılır.
h) Deney 2:
Amaç: LCD’de Türkçe karakter kullanımını öğrenmek.
Teori: LCD Türkçe karakterleri barındırmaz bu sebepten dolayı LCD’ye kendimiz
tanıtabiliriz.
Problemin Tanımı: LCD üzerinde Türkçe karakterlerin görüntülenmesi.LCD’nin ilk
satırında Ü,Ç,ı,Ö,Ğ,Ş harfleri, ikinci satırında ise TÜRKÇE HARFLER yazısı görüntülenir.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
LOW PORTB.6
PAUSE 500
LCDOUT $FE,$40,$0A,$00,$11,$11,$11,$11,$1E,$00
LCDOUT $FE,$48,$0E,$11,$10,$10,$11,$0E,$04,$00
LCDOUT $FE,$50,$00,$0E,$04,$04,$04,$04,$0E,$00
LCDOUT $FE,$58,$0A,$00,$0E,$11,$11,$11,$0E,$00
LCDOUT $FE,$60,$0E,$00,$1F,$10,$13,$11,$1F,$00
LCDOUT $FE,$68,$0E,$11,$10,$0E,$01,$15,$0E,$04
LCDOUT $FE,1
LCDOUT $FE,2,0,1,2,34,5
LCDOUT $FE,$CO,T",0,"RK",1, "E HARFLER"
END
Yukarıdaki uygulama devresinde LCD ile PIC port bağlantılarının PicBasic Pro'da otomatik
tanımlı olmasından dolayı DEFINE komutunun kullanımına gerek kalmamıştır.
PicBasic Pro, bu bağlantı türü için program yapısında PORTB ve PORTD yi otomatik olarak
çıkış yaptığından programın içerisinde bu portların ayrıca çıkış olarak tanımlanmasına gerek
kalmamıştır.
Programın (13) numaralı komut satırında LCD'nin kullanıma hazır hale gelmesi için gerekli
gecikme süresi 0,5sn olarak ayarlanmaktadır.
(14)-(19) numaralı komut satırları arasında ise üstte görüldüğü gibi sırasıyla $40 adresine Ü,
$48 adresine Ç. $50 adresine ı, $58 adresine Ö. $60 adresine Ğ ve $68 adresine Ş harfleri
yerleştirilmektedir.
(20) numaralı komut satırı ile LCD ekran silinir.
(21) numaralı komut satırı ile program içerisinde tanımlanan Türkçe karakterler LCD ekranın
ilk satırında satır başından itibaren Ü,Ç,ı,Ö,Ğ,Ş sıralamasıyla görüntülenir.
Bu komut satırında her bir harf belirtildiği gibi 0.1,2.3.4 ve 5 rakamları ile kodlanmaktadır.
Örneğin; LCD’ye 0 rakamı ile Ü harfi yazdırılırken, 5 rakamı ile Ş harfi yazdırılmaktadır.
(22) numaralı komut satırında LCD'nin ikinci satırına $CO komutu ile satır başından itibaren
TÜRKÇE HARFLER kelimeleri yazdırılmaktadır. Bu komut satırındaki 0 rakamı Ü harfine,
1 rakamı ise Ç harfine karşılık gelmektedir.
Bu komut satırına dikkat edilirse Türkçe karakter içermeyen sıralı harfler ile rakam ile
kodlanan Türkçe karakterler birbirlerinden bağımsız olarak ifade edilmektedir.
(23) numaralı komut satırı ile program sonlandırılır.
i) Deney 3:
Amaç: LCD ile sayı sistemlerini(desimal,heksedesimal,binary,vb.) kavramak.
Teori: Desimal sayı değeri DEC komutu ile görüntülenir. Binary sayı değeri BIN komutu ile
görüntülenir.
Problemin Tanımı: LCD ekranın ilk satırında desimal, ikinci satırında ise binary ileri sayan
program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
LOW PORTB.6
SAYI VAR BYTE
PAUSE 500
BASLA:
LCDOUT $FE,1
SAYI =0
DONGU:
LCDOUT $FE,$80,"SAYI = ",DEC SAYI
LCDOUT $FE,$CO,"BINARY=",BIN SAYI
SAYI =SAYI+ 1
PAUSE 1000
IF SAYI<255 THEN DONGU
GOTO BASLA
END
(13) numaralı komut satırında SAYI değişken içeriği byte büyüklüğü olan 8 bit olarak
tanımlanmıştır. Bu durumda tanımlanabilecek en büyük sayı 255 olur deney 32 teki sayma
işlemi ise 0 -254 aralığında gerçekleşir.
(14) numaralı komut satırı ile LCD'nin kullanıma hazır hale gelmesi için gerekli gecikme
süresi 0,5sn olarak ayarlanmaktadır
(15) numaralı komut satırına, sayma işleminin 254 sayısına ulaştığında tekrar başa
dönebilmesi için BASLA etiketi atanmıştır.
(16) numaralı komut satırı ile LCD ekran temizlenir.
(17) numaralı komut satırında SAYI değişken içeriğine 0 sayısı atanarak sayma işleminin
0'dan başlanması sağlanır.
(18) numaralı komut satırı ile sayı değeri 255'e ulaşmadığı sürece program bu komut satırında
belirtilen DONGU etiketine dallanır.
(19) numaralı komut satırında LCD'nin ilk satırında ve satır başından itibaren desimal sayı
değerinin görüntülenmesi sağlanır. Bu komut satırında belirtilen "SAYI = " ifadesi ekrana
SAYI = yazdırılmasını sağlar. Desimal sayı değeri DEC komutu ile görüntülenir.
(20) numaralı komut satırında LCD'nin ikinci satırında ve satır başından itibaren binary sayı
değerinin görüntülenmesi sağlanır. Bu komut satırında belirtilen "BINARY =" ifadesi
ekrana BINARY = yazdırılmasını sağlar. Binary sayı değeri BIN komutu ile görüntülenir.
İkinci satırda binary yerine heksadesimal sayma işlemini gerçekleştirmek için, bu komut
satırına BIN komutu yerine HEX komutu kullanılmalıdır.
(21) numaralı komut satırı ile sayı değeri 1 arttırılarak içerisine yüklenir.
(22) numaralı komut satırı ile her sayının LCD üzerinde 1'er saniye aralıklarla görüntülenmesi
sağlanmıştır.
(23) numaralı komut satırında sayı değerinin 255 e ulaşıp ulaşmadığı sorgulanmaktadır. Sayı
değeri 255'e ulaşmamış ise sayma işleminin devamı için program, DONGU etiketli (18)
numaralı komut satırına dallanır. Sayı değeri 255'e ulaşmış ise sıradaki komut satırı işletilir.
(24) numaralı komut satırı ile 255'e ulaşan sayı değerini sıfırlamak ve sayma işlemini baştan
başlatmak için programın, BASLA etiketli (15) numaralı komut satırına dallanması sağlanır.
j) Deney 4:
Amaç: Butona bastıkça saydırmayı öğrenmek.
Teori: Aynı buton uygulamalarında saydırdığımız gibi bu uygulamada da LCD üzerinden
sayılanları gösterebiliriz.
Problemin Tanımı: PORTD’nin 7. Bitine bağlı butona her basışta LCD üzerinde desimal,
binary ve heksedesimal ileri sayan program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
LOW PORTB.6
TRISD=%10000000
SAYI VAR BYTE
SYMBOL BUTON=PORTD.7
PAUSE 500
BASLA:
LCDOUT $FE,1
SAYI=0
DONGU:
PAUSE 150
LCDOUT $FE,$80,"DEC=",DEC SAYI
LCDOUT $FE,$89, "HEX=",HEX SAYI
LCDOUT $FE,$BIN=",BIN SAYI
IF BUTON=1 THEN SAY
GOTO DONGU
SAY:
SAYI=SAYI+1
IF SAYI<255 THEN DONGU
GOTO BASLA
END
Programın (13) numaralı komut satırında TRISD=% 10000000 yapılarak PORTD'nin 7. biti
giriş diğer bitleri ise çıkış olarak tanımlanmaktadır.
(14) numaralı komut satırı ile sayma işleminin 8 bit, diğer bir ifadeyle maksimum 255
sayısına kadar sayabileceği tanımlanmaktadır.
(15) numaralı komut satırında SYMBOL komutu ile PORTD'nin 7. biti BUTON olarak
isimlendirilmiştir. Bu komut satırı kullanılmaz ise programın (25) numaralı komut satırındaki
BUTON kelimesi yerine PORTD.7 yazılmalıdır.
(16) numaralı komut satırında LCD'nin kullanıma hazır hale gelmesi için gerekli gecikme
süresi 0,5sn olarak ayarlanmaktadır.
(17) numaralı komut satırında sayı değerinin 255'e ulaşması durumunda sayma işleminin 0
sayısından yeniden başlaması için BASLA etiketi kullanılmıştır.
(18) numaralı komut satırında LCD ekran temizlenir.
(19) numaralı komut satırında SAYI değişkeni içeriğine sayma işleminin başlangıç değeri
olan 0 sayısı atanır.
(20) numaralı komut satırında butona her basışta sayı değerinin 1artılmasını sağlayan buton
kontrol döngüsü DONGU etiketi ile sağlanmaktadır.
(21) numaralı komut satırında 150 msn’lik gecikme ile buton arkının sönümü beklenerek
butona her basışta sayı değerinin yalnızca 1 artması sağlanır.
(22) numaralı komut satırında LCDOUT $FE $80 komutu ile LCD'ye PIC çıkış bilgisinin
satır başından itibaren yazdırılacağı belirtilir. Tırnak içerisinde belirtilen "DEC = " sabiti ile
LCD'ye DEC= ifadesi yazdırılır. Komut satırının sonunda yer alan DEC komutu, sayma
işleminin desimal formda yapılmasını sağlar.
Bu komut satırı işletildiğinde sayma değerinin 26 olduğu kabul edilirse, LCD üzerinde DEC
26 ifadesi görüntülenir.
(23) numaralı komut satırında heksadesimal yazdırma işlemi, komut satırının sonunda yer
alan HEX komutu ile yapılmaktadır. Heksadesimal değer, sayma esnasında görüntülenen
desimal değerin heksadesimal karşılığına eşittir. Bu komut satırındaki $89 eklentisi ile sayı
değeri ilk satırın başından itibaren 9 karakter ötelenmiş olarak LCD üzerinde görüntülenir.
Sayma işlemi esnasında örneğin desimal 26 ya ulaşan sayı değeri bu komut satırı ile LCD
ekran üzerinde HEX =1A olarak görüntülenir. Böylece desimal ve heksadesimal sayma işlemi
LCD ekranın 1. satırı üzerinde gerçekleşir.
Programın (24) numaralı komut satırında; sayma işleminin binary kısmı, bu komut satırının
sonunda yer alan BIN komutu ile yazdırılmaktadır.
Aynı komut satırındaki $C0 eklentisi, sayı değerinin LCD ekrana 2. satırdan ve satır başından
itibaren yazdırılmasını sağlar.
(25) numaralı komut satırında buton kontrolü yapılmaktadır. Butona basılmış ise
(BUTON=1) program SAY etiketli (27) numaralı komut satırına, basılmamış ise tekrar buton
kontrolü için (20) numaralı komut satırına dallanır.
Programın (28) numaralı komut satırı ile sayı değeri 1 artırılır ve yeni değer yine SAYI
değişkeni içeriğine yüklenir.
(29) numaralı komut satırında sayı değerinin 255'e ulaşıp ulaşmadığı sorgulanır. Sayı değeri
255'e ulaşmamış ise program, buton kontrolünün sağlandığı DONGU etiketli (20) numaralı
komut satırına döner.
SAYI değişkeni içeriği 255. olduğunda, 255 ekranda görüntülenmeden program, BASLA
etiketli (17) numaralı komut satırına dallanarak SAYI değişkeni içeriği sıfırlanır. Sayma
işlemi 0-254 aralığında gerçekleşir.
(31) numaralı komut satırı ile program sonlandırılır.
k) Deney 5:
Amaç: Buton ve LCD satırlarını kontrol etmeyi pekiştirmek.
Teori: LCD’de farklı butonlarla farklı satırları kontrol edebiliriz.
Problemin Tanımı: LCD’nin ilk ve ikinci satırında birbirinden bağımsız 0-255 aralığında
ileri sayan program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
LOW PORTB.6
TRISD=%11000000
SAYI0 VAR WORD
SAYI1 VAR WORD
SYMBOL BUTON0=PORTD.6
SYMBOL BUTON1-PORTD.7
PAUSE 500
BASLA0:
LCDOUT $FE,1
SAYI0=0
BTN0:
PAUSE 100
LCDOUT $FE,$80,"SAYI0 =",DEC SAYI0
IF BUTON0=0 THEN SAY0
GOTO BTN1
SAY0:
SAYI0=SAYI0+1
IF SAYI0<256 THEN BTN0
GOTO BASLA0
BASLA1:
LCDOUT $FE,1
SAYI1=0
BTN1:
PAUSE 100
LCDOUT $FE,$C0,"SAYI1 = ",DEC SAYI1
IF BUTON1=0 THEN SAY1
GOTO BTN0
SAY1:
SAYI1=SAYI1+1
IF SAYI1<256 THEN BTN1
GOTO BASLA1
END
PORTD'nin 6. ve 7. bitlerine buton bağlı olduğundan (13) numaralı komut satırında
PORTD'nin bu bitleri 1 yapılarak giriş, diğer bitleri ise 0 yapılarak çıkış olarak
tanımlanmıştır.
Sayıcının 0-255 aralığında sayabilmesi için programın yapısını değiştirmeden örneğin (29)
numaralı komut satırında olduğu gibi IF SAYI0<256 ifadesindeki sayıcıyı sınırlandıran
sayının 255 yerine 256 yapılması gerekir.255 sayısı 8 bitten, 256 sayısı ise 9 bitten oluşur. Bu
durumda değişken içeriği 255'i aştığından BYTE tanımlaması uygun olmaz. BYTE yerine
daha büyük değere sahip olan WORD kullanılır.
(14) ve (15) numaralı komut satırlarında LCD üzerindeki sayı değerleri maksimum 16 bit
değer alacak şekilde tanımlanmaktadır.
(16) ve (17) numaralı komut satırlarında SYMBOL komutu ile PORTD'nin 6. bitine bağlı
buton BUTON0, 7. bitine bağlı buton BUTON1 olarak tanımlanmaktadır.
(18) numaralı komut satırında LCD'nin kullanıma hazır hale gelebilmesi için gerekli gecikme
süresi 0,5sn olarak ayarlanmaktadır.
Programın (19)-(21) numaralı komut satırlarında sayı değerinin 0'dan başlaması sağlanır. (21)
numaralı komut satırı kullanılmaz ise LCD ekranda 0 değeri görüntülenmez ve butona ilk
basışta sayma işlemi 1 değerinden başlar.
(22)-(26) arası komut satırları ile displayin ilk satırında butona her basışta artan SAYI0
değerinin görüntülenmesi sağlanır.
(23) numaralı komut satırındaki PAUSE 100 komutu ile butona basışta oluşan buton arkının
sönmesi için gerekli zaman gecikmesi sağlanmıştır. Böylece butona bir defa basışta sayı
değeri 1 artar. Bu komut satırı kullanılmaz ise sayı değeri butona her basışta birden fazla
değerde artabilir.
(24) numaralı komut satırı ile sayı değerinin, LCD'nin ilk satırında, satır başından itibaren ve
desimal olarak görüntülenmesi sağlanır.
(25) numaralı komut satırında BUTON0'a basılıp basılmadığı kontrol edilmektedir. Butona
basılmış ise program SAY0 etiketli (15) numaralı komut satırına dallanır. Butona basılmamış
ise programın (26) numaralı komut satırı işletilir ve BTN1 etiketli (34) numaralı komut
satırına dallanma olur.
Programın (27)-(30) numaralı komut satırları arasında sayma işleminin ileri yönde yapılması
sağlanır. (28) numaralı komut satırı SAYI0 değerini 1 arttırarak yine SAYI0 değişkeni
içeriğine yükler.
(29) numaralı komut satırı SAYI0 değerinin 256'ya ulaşıp ulaşmadığını sorgular. Ulaşmamış
ise sayı değerini butona basılma durumunda 1 arttırmak için (22) numaralı komut satırına
yönlendirir. Ulaşmış ise (30) numaralı komut satını işletilerek sayı değerini sıfırlamak
amacıyla (19) numaralı komut satırına dallanır.
Programın (31)-(42) numaralı komut satırlarının çalışma prensibi, (22)-(30) numaralı komut
satırlarında anlatıldığı gibidir.
l) Deney 6:
Amaç: Sayma işlemi için 2 adet buton bulunup ilk butona bastığımızda 2’şer ileri, ikinci
butonla bastığımızda 4’er geri sayma işlemi yapmak.
Teori: Sayma işlemi yaparken, değişkeni istediğimiz miktarda arttırabiliriz.
Problemin Tanımı: Butona her basıldığında LCD’nin ilk satırında 0-255 2’şer ileri sayan, 7.
Bitine bağlı butona basıldığında ise ikinci satırında 0-255 4’er geri sayan program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISD=0
TRISD=%11000000
SAYI VAR WORD
SYMBOL BUTON0=PORTD.6
SYMBOL BUTON1=PORTD.7
PAUSE 500
BASLA:
LCDOUT $FE,1
SAYI=0
YAZ:
PAUSE 100
LCDOUT $80, “SAYI =”, DEC SAYI0 SAYI,” “
IF BUTON0=1 THEN ILERI
IF BUTON1=1 THEN GERI
GOTO YAZ
ILERI:
IF SAYI>254 THEN YAZ
SAYI=SAYI+2
WHILE BUTON0=1
WEND
GOTO YAZ
GERI:
IF SAYI<4 THEN YAZ
SAYI=SAYI-4
WHILE BUTON1=1
WEND
GOTO YAZ
END
m) Deney 7:
Amaç: LCD satır ve sütunlarında yazı yazdırarak satırlar ve sütunlar arası geçişi öğrenmek.
Teori: LCD üzerinde 1. Satır 1. Sütun 128 ile ifade edilir, 2. Satır 1. Sütun ise 192 ile ifade
edilir.
Problemin Tanımı: LCD satırlarında yazı kaydıran program.
DEFINE LCD_DREG PORTB BAGLI
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISB=0
PAUSE 500 '500 ms BEKLEME YAP
I VAR WORD
BASLA:
PAUSE 100
LCDOUT $FE,128,"K"
PAUSE 100
LCDOUT $FE,128,"IK"
PAUSE 100
LCDOUT $FE,128,"NIK"
PAUSE 100
LCDOUT $FE,128,"ONIK"
PAUSE 100
LCDOUT $FE,128,"RONIK"
PAUSE 100
LCDOUT $FE,128,"TRONIK"
PAUSE 100
LCDOUT $FE,128,"ATRONIK"
PAUSE 100
LCDOUT $FE,128,"KATRONIK"
PAUSE 100
LCDOUT $FE,128,"EKATRONIK"
PAUSE 100
LCDOUT $FE,128,"MEKATRONIK"
PAUSE 100
LCDOUT $FE,128," MEKATRONIK"
PAUSE 100
LCDOUT $FE,128,"O MEKATRONIK"
PAUSE 100
LCDOUT $FE,128,"YO MEKATRONIK"
PAUSE 100
LCDOUT $FE,128,"MYO MEKATRONIK"
PAUSE 100
LCDOUT $FE,128,"UMYO MEKATRONIK"
PAUSE 100
LCDOUT $FE,128,"CUMYO MEKATRONIK"
PAUSE 100
FOR I=128 TO 144
LCDOUT $FE,I," CUMYO MEKATRONIK"
PAUSE 100
NEXT I
FOR I=176 TO 208
LCDOUT $FE,I," CUMYO MEKATRONIK"
PAUSE 100
NEXT I
GOTO BASLA
END
d) ALIŞTIRMA SORULARI
LCD'de RS, RW ve E pinleri ne işe yarar?
LCD'de RW girişinin uygulama devreleri üzerinde şaseye bağlanmasının
nedeni nedir?
LCD'nin besleme pinleri hangileridir?
DEFINE komutunun kullanım amacı nedir?
LCDOUT komutunun kullanım amacı nedir?
LCD'nin ikinci satırına 6. karakterden itibaren BASIC yazdırmak için
program içerisine yazılması gereken komut satırı nasıl olmalıdır?
Program içerisine yazılan #, $ ve % sembolleri ne anlama gelmektedir?
Program 7.1, LCD'nin ilk satırına PIC BASIC, ikinci satırına ise
MAVI KITAPLAR yazdırmaktadır. LCD'nin ilk satırına TURKIYE, ikinci
satırına ise CUMHURIYETI yazdırmak için programda nasıl bir değişiklik
yapılmalıdır?
TUŞ TAKIMI (KEYPAD) UYGULAMALARI:
Tuş takımı (keypad), bir satır ile bir sütun arasında bağlantı sağlaması esasına göre
çalışan matrix dizilmiş butonlar sistemidir.
Tuş takımları isimlendirilirken 3x4 ve 4x4 şeklinde kodlanılırlar. Bu kodlamada ilk
sayı sütun, ikinci sayı ise satır sayısını belirtir. 3x4 tuş takımlarında 12 buton bulunurken, 4x4
tuş takımlarında 16 buton bulunur. Şekilde 3x4; 3 sütunlu 4satırlı tuş takımının yapısı
görülmektedir.
Tuş takımında basılı olan tuşu tespit etmek amacıyla genellikle tarama yöntemi
kullanılır. Bu tuşlar mikrodenetleyiciye seri ön direnç ve pull down veya pull up dirençleri
ile birlikte bağlanırlar. Şekilde satırlara 220 ohmluk seri dirençler, sütunlara ise 10K’lık pull
down dirençleri bağlanmıştır.
Şekildeki tuş takimi bağlantısında, 1,4,7,* tuşlarından herhangi birine basılması
LED’in, 2.5,8,0 tuşlarından herhangi birine basılması LED2'nin ve 3,6,9,# tuşlarından
herhangi birine basılması LED3'ün yanmasına sebep olur.
Tuşlara basmadığında 5V lojik-1 seviyesi 10K’lık pull down dirençleri üzerinden
şaseye bağlanır. Örneğin, 1 numaralı tuşa basıldığında 5V lojik-1 seviyesi LED1 üzerinden
şaseye bağlanır ve LED1 yanar.
Basılan tuşu tespit etmek amacıyla tarama yöntemi kullanılır. Şekilde görüldüğü gibi
sütunlara 10K dirençler üzerinden lojik-0 (GND) uygulanmıştır. Tarama yönteminde
satırlardan herhangi biri lojik-1 (+5V) diğerleri ise lojik-0 yapılır. Bu durumda sütun bilgisi
yeniden kontrol edilir ve hangi giriş lojik-1 ise o satıra ait sütundaki tuşa basılmış demektir.
Çünkü ilgili sütuna bağlı butona basılması sonucu sütun seviyesi lojik-0 durumundan lojik-1
durumuna geçer. Diğer sütunlar ise lojik-0 konumunu korur
Tüm satırlara ayrı ayrı ve sırasıyla lojik-1 seviyesi seviyelerinin kontrolünün yapıldığı
bu yöntem tarama yöntemi adlandırılır. Tarama yönteminde yukarıda anlatıldığı gibi
program geliştiricinin tercihine bağlı olarak satırlara lojik-1 uygulanıp sütun seviyeleri kontrol
edilebileceği gibi, sütunlara lojik-1 uygulayıp satır seviyeleri de kontrol edilebilir.
n) Deney 1:
Amaç: Keypad’den girilen değerleri LCD ye yazdırmayı öğrenmek.
Teori: Keypad üzerinden girilen değer önce mikrodenetleyiciye tanıtılıp daha sonra LCD’ye
aktarılabilir.
Problemin Tanımı: Keypad üzerinden basılan tuş değerini LCD ekranda gösteren program.
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 6
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
TRISB=%00000000
TRISD=%00000111
TUS VAR BYTE
SYMBOL SATIR1=PORTD.4
SYMBOL SATIR2=PORTD.5
SYMBOL SATIR3=PORTD.6
SYMBOL SATIR4=PORTD.7
SYMBOL SUTUN1=PORTD.0
SYMBOL SUTUN2=PORTD.1
SYMBOL SUTUN3=PORTD.2
PORTB=0
PORTD=0
TUS_TARAMA:
HIGH SATIR1
IF SUTUN1=1 THEN : TUS=1 : GOSUB LCD
IF SUTUN2=1 THEN : TUS=2 : GOSUB LCD
IF SUTUN3=1 THEN : TUS=3 : GOSUB LCD
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN : TUS=4: GOSUB LCD
IF SUTUN2=1 THEN : TUS=5 : GOSUB LCD
IF SUTUN3=1 THEN : TUS=6 : GOSUB LCD
LOW SATIR2
HIGH SATIR3
IF SUTUN1=1 THEN : TUS=7 : GOSUB LCD
IF SUTUN2=1 THEN : TUS=8: GOSUB LCD
IF SUTUN3=1 THEN : TUS=9: GOSUB LCD
LOW SATIR3
HIGH SATIR4
IF SUTUN1=1 THEN : TUS=10 : GOSUB LCD
IF SUTUN1=1 THEN : TUS=0 : GOSUB LCD
IF SUTUN1=1 THEN : TUS=12: GOSUB LCD
LOW SATIR4
GOTO TUS_TARAMA
LCD:
LCDOUT $FE,1,”TUS= “,#TUS
IF TUS=10 THEN LCDOUT $FE,1,"TUS= ","*"
IF TUS=12 THEN LCDOUT $FE,1,"TUS= ","#"
PAUSE 50
RETURN
END
Programın (11) numaralı komut satırında PORTB çıkış, (12) numaralı komut satırında ise
PORTD'nin ilk üç biti giriş diğerleri çıkış olarak tanımlanmıştır.
Programın (13) Numaralı komut satırında tuş değeri byte büyüklüğünde
tanımlanmaktadır. Tuşun alabileceği değer maksimum 12 sayısı olduğundan ve bu desimal
sayının binary karşılığı 1100 olduğundan 4 bitlik bu sayı değerinin maksimum 8 bit olan byte
büyüklüğünde tanımlanması yeterlidir.
(14)-(20) numaralı komut satırları arasında tuş takımına ait satır ve sütunların bağlı olduğu
PORTD pinleri tanımlanmıştır. Şekil'de de görüldüğü gibi D portunun 4,5,6,7 numaralı
pinlerine tuş takımına ait satırlar, 0,1,2 numaralı pinlerine ise sütunlar bağlanmıştır.
(21)-(22) numaralı komut satırlarında PORTB ve PORTD içeriği silinmiştir.
(23)-(44) numaralı komut satırları arasında tuş taraması yapılmaktadır. Tuş tarama işlemi
öncelikle ilk satır 1 yapılarak sütun seviyelerinin tespiti şeklinde gerçekleşmektedir. Daha
sonra diğer satırlar sırasıyla 1 yapılarak her bir tuş için sütun seviye kontrolü
sorgulanmaktadır.
(24) numaralı komut satırında SATIR1, lojik-1 (HIGH) yapılmaktadır.
(25) numaralı komut satırında 1 numaralı tuşa basılıp basılmadığı kontrol edilmektedir.
IF SUTUN1=1 THEN : TUS- 1: GOSUB LCD komut diziliminde "Eğer sütun seviyesi 1 ise
o zaman TUS register içeriğine 1 yaz ve LCD alt programını çağır" denmektedir. Bu komut
satırında her bir komut iki nokta üst üste (:) ile ayrılmıştır. Programın uzun oluşundan dolayı
satırları alt alta yazmak yerine yan yana yazabilmek amacıyla bu yöntem tercih edilmiştir.
(26) ve (27) numaralı komut satırları ile 2 ve 3 numaralı tuşlara basılıp basılmadığı
kontrol edilmektedir.
Programın (28) numaralı komut satırında SATIR1 seviyesi LOW komutu ile şase
potansiyeline çekilmektedir. Böylece ilk satır için 1,2 ve 3 numaralı tuşlara ait tarama işlemi
sonlandırılmış olur. Aynı işlem (29)-(33), (34)-(38) ve (39)-(43) komut satırları arasında diğer
tuş kontrolleri için tekrarlanır.
(47) ve (48) numaralı komut satırları “*” ve “#” yazmamızı sağlar.
o) b) Deney 2:
Amaç: Girilen 4 farklı sayıyı tek bir sayı olarak algılayıp şifre uygulaması yapımını
öğrenmek..
Teori: Matematikten de hatırlayacağımız gibi örneğin 4736 sayısını 4x1000+7x100+3x10+6
diye yazabiliriz. Programda da bu şekilde tek olarak girdiğimiz rakamları bir bütün halinde
hafızaya alabiliriz.
Problemin Tanımı: Tuş takımından 1234 rakamları girildiğinde PIC16F877A’nın B
portunun 0. Bitine (RB0) bağlı olan LED’i yakan program.(Şifreli kilit uygulaması)
TRISB=%00000000
TRISD=%00000111
TUS VAR BYTE
BIRLER VAR BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
SAYI VAR WORD
SIFRE VAR WORD
SYMBOL SATIR1=PORTD.4
SYMBOL SATIR2=PORTD.5
SYMBOL SATIR3=PORTD.6
SYMBOL SATIR4=PORTD.7
SYMBOL SUTUN1=PORTD.0
SYMBOL SUTUN2=PORTD.1
SYMBOL SUTUN3=PORTD.2
PORTB=0 : PORTD=0 : TUS=0
BIRLER=0 : ONLAR=0 : YUZLER=0 : BINLER=0
SIFRE=1234
TUS_TARAMA:
HIGH SATIR1
IF SUTUN1=1 THEN : TUS=1 : GOSUB LED
IF SUTUN2=1 THEN : TUS=2 : GOSUB LED
IF SUTUN3=1 THEN : TUS=3 : GOSUB LED
LOW SATIR1
HIGH SATIR2
IF SUTUN1=1 THEN : TUS=4: GOSUB LED
IF SUTUN2=1 THEN : TUS=5 : GOSUB LED
IF SUTUN3=1 THEN : TUS=6 : GOSUB LED
LOW SATIR2
HIGH SATIR3
IF SUTUN1=1 THEN : TUS=7 : GOSUB LED
IF SUTUN2=1 THEN : TUS=8: GOSUB LED
IF SUTUN3=1 THEN : TUS=9: GOSUB LED
LOW SATIR3
HIGH SATIR4
IF SUTUN1=1 THEN : TUS=10 : GOSUB LED
IF SUTUN1=1 THEN : TUS=0 : GOSUB LED
IF SUTUN1=1 THEN : TUS=12: GOSUB LED
LOW SATIR4
GOTO TUS_TARAMA
LED:
BINLER=YUZLER : YUZLER=ONLAR
ONLAR=BIRLER : BIRLER=TUS
SAYI=1000*BINLER+100*YUZLER+10*ONLAR+BIRLER
IF SIFRE=SAYI THEN PORTB.0=1
PAUSE 200
RETURN
END
Programın tuş takımı üzerinde 1234 rakamlarıyla sırasıyla tuşlandığında PORTB’NİN 0.
Bitine bağlı LED’i yakar. Yukarıdaki devrede LED’in bağlı olduğu yere kapı kilidi veya
alarm gibi farklı elemanlar bağlandığında uygulamada şifreli kilit olarak da kullanılabilir.
Şifreli kilit uygulamasında şifre sayısı 4 rakamdan oluştuğundan belirtilen birler ve onlar
hanesine ilave olarak programın (6) ve (7) numaralı komut satırlarında yüzler ve binler
haneleri de byte büyüklüğü olarak tanımlanmıştır. Tuş takımından girebilecek herhangi bir 4
haneli sayı içeriği SAYI registeri içerinde word büyüklüğü olarak (8) numaralı komut
satırında tanımlanmıştır.
Şifre tanımlaması programın (19) numaralı komut satırında 1234 olarak yapılmaktadır.
Dolayısıyla bu şifre sayısının saklanacağı SIFRE registeri içeriğide word büyüklüğü
olarak(9) numaralı komut satırında tanımlanmaktadır.
(10)-(16) numaralı komut satırları arasında tuş takımın PIC16F877A’ya port bağlantı uçları
tanımlanmaktadır. (17) ve (18) numaralı komut satırlarında ise tüm register içerikleri
başlangıç konumu için sıfırlanmaktadır. Bu komut satırı ve devamında yer alan komut
satırlarında her biir komut iki nokta üst üste (:) ile ayrılmıştır. Programın uzun oluşundan
dolayı satırları alt alta yazmak yerine yan yana yazabilmek amacıyla bu yöntem tercih
edilmiştir.
(!9) numaralı komut satırında şifre olarak 1234 rakamları seçilmiştir.Tuş takımından önce 1,
sonra 2,3 ve 4 rakamları sırasıyla girildiğinde PORTB’nin 0. Bitine bağlı LED yanacaktır. Bu
komut satırında belirtilen rakamların değerlerini veya yerlerini değiştirerek şifre kodu
değiştirilebilir.
(20)-(41) numaralı komut satırları arasında tuş tarama işlemi yapılmaktadır.
(42)-(48) nmaralı satırlardaki LED ait programı tuş takımından girilen SAYI değerinin elde
edildiği ve başlangıçta belirlenen SIFRE değeri ile kıyaslandığı bölümdür. (43) numaralı
komut satırında sayının yüzler hanesi binler hanesine, onlar hanesi ise yüzler hanesine
yerleştirilirken , (44) numaralı komut satırında tuş değeri binler hanesine, birler hanesine,
birler hanesi ise onlar hanesine yerleştirilmektedir.Bu şekilde 4 haneli sayı değeri elde
edilerek (45) numaralı komut satırına SAYI registeri içerisine yüklenir.
(45) numaralı komut satırında 4 haneli sayı değeri elde edilir.
SAYI=1000XBINLER+100Xyuzler+10xonlar+BIRLER formülü ile tuş takımından ilk
tuşlanan ve BINLER registerine kaydedilen rakam değeri 1000, ikinci tuşlananYUZLER
registerine kaydedilen rakam değeri 100,üçüncü tuşlanan ONLAR registerine kaydedilen
rakam değeri 10 ve BIRLER registerine kaydedilen sonuncu tuş değeri 1 ile çarpılarak 4
haneli sayı değeri bu komut satırında elde edilir. Elde edilen bu sayı değeri SAYI registeri
içerisinde saklanır.
SAYI registeri içerisinde saklanan ve tuş takımından girilen 4 haneli sayı değeri ile
başlangıçta belirlenen 4 haneli şifre değerinin birbirine eşitliği(46) numaralı komut satırında
IF SIFRE=SAYI komut sıralaması kullanılarak kontrol edilmektedir.Tuş takımından girilen
sayı değerinin şifre içeriğine eşit olması durumunda problem THEN komutundan sonraki
komutu işleterek PORTA’nın 0. Bitine bağlı LED’i yakar. Eğer tuş takımından girilen sayı
şifre içeriğine eşit değil ise THEN komutundan sonra yer alan PORTB.0=1 komutunu
atlayarak yeniden tuş tarama işlem için GOSUB komutu ile dallandığı komut satırına geri
döner.
Alıştırma Soruları:
1- Tuş takımının çalışma mantığını açıklayınız?
2- Tuş takımına pull-up dirençlerinin bağlanma sebebi nedir?
3- GOTO komutunun kullanım amacı nedir?
4- Tuş takımı üzerinde 1 rakamına basıldığında bu rakamı LCD’de görüntüleyen programı
yazınız.
5- Tuş takımında 9876 numaralı tuşlara sırasıyla basıldığında PIC16F877A'nın
B portunun 1. bitine bağlı LED'i 3sn yakan programı yazınız
SAYICI UYGULAMALARI:
e) Deney 1
Amacı: Tanıttığımız değişkeni direk porta aktararak LED’lerin sıralı şekilde yanmasını
sağlamak.
Teori:Değişkeni direk porta aktarırsak değişken hangi değerdeyse portu da o değere
dönüştürür. Ör. SAYI=10101010 ise PORTD=SAYI dersek PORTB’yi 1’er arlıklı olarak
Lojik 1 seviyesine çekmiş oluruz.
Programın Tanımı: PIC16F877A’nın B portuna bağlı LED’ler üzerinde 8 bit binary ileri
sayan program.
TRISD=0
SAYI VAR BYTE
PORTD=0
SAYI=0
ILERI:
SAYI=SAYI+1
PAUSE 1000
PORTD=SAYI
GOTO ILERI
END
(1) numaralı komut satırında TRISD içeriği 0 yapılarak PORTD registeri çıkış olarak
tanımlanmıştır.
(2) numaralı komut satırında SAYI değişken içeriği 8 bitlik binary sayma işlemi için byte
büyüklüğünde tanımlanmıştır.
(3) numaralı komut satırında PORTD içeriği silinmiştir.
(4) numaralı komut satırında 8 bitlik binary sayma işleminin 0 başlangıç değeri SAYI
değişkeni içerisine atanmıştır.
(5) numaralı komut satırına sürekli döngü için ILERI etiketi atanmıştır
(6) numaralı komut satırı binary sayma işlemini gerçekleştirir. Bu komut satırı her
işletildiğinde SAYI içeriği bir artırılarak tekrar SAYI değişkeni içerisine kaydedilir.
(7) numaralı komut satırı sayma aralığı gecikme zamanını sağlar. Bu komut satırı ile binary
sayı değeri LED'ler üzerinde 1sn'lik süre boyunca görüntülenir.
(8) numaralı komut satırı ile SAYI içeriğinin PORTB registerine kaydedilmesi
Sağlanır. Böylece SAYI değişkeni içeriği PORTB'ye bağlı LED'ler üzerinde görüntülenir
(9) numaralı komut satırında GOTO komutu ile (5) numaralı komut satırına dönülerek sayma
işleminin devamlılığı sağlanır
(10) numaralı komut satiri ile program sonlandırılır.
Ortak Anot Segment Display:
Tabloda ortak anotlu 7 sagment displayde 0-F arası rakamların görüntülenebilmesi için
gerekli segment giriş değerleri verilmiştir.
Ortak Katot Segment Display:
Tabloda ortak katot 7 sagment displayde 0-F arası rakamların görüntülenebilmesi için gerekli
segment giriş değerleri verilmiştir.
b)Deney 2:
Amaç: Mikrodenetleyicide belirlenen binary değişkenlerin heksedesimal karşılıklarını
öğrenip pekiştirmek.
Teori: Deneylerimizde genellikle ortak katotlu segment display kullanacağımız için aktif
olması geren kısımlara Lojik-1 göndermemiz gerekmektedir.
Programın Tanımı: PIC16F877A2nın D portuna bağlı segment displayde 0-F arasında
belirlenen rakamı yazan program.
Şekilde PIC16F877A'ya 7 segment display bağlantısı görülmektedir. 7 segment
displayin segmentleri, yapı itibari ile 7 adet LED'in desimal sayıları gösterebileceği şekilde
konumlandırılmasından oluşmuştur.
Displayde 4 rakamını yakmak için PIC16F877A'nın D portunun RD6, RD5, RD2 ve
RD1 bitleri 1, diğer bitleri (RD0, RD3, RD4, RD7) 0 olmalıdır. Bu durum program içerisinde
binary olarak 01100110 şeklinde ifade edilebileceği gibi heksadesimal 66 olarak da
belirtilebilir.
Displayde 4 rakamını yakan program:
1. TRISD=0
2. PORTD=$66
3. END
Yukarıdaki program Şekildeki devrede denendiğinde üzerinde PIC16F877A'nın D portuna
bağlı display aşağıda görüldüğü gibi yanacaktır.
p) c)Deney 3:
Amaç: Tanıttığımız değişkeni direk porta aktararak LED’lerin sıralı şekilde yanmasını
sağlamak.
Teori:Değişkeni direk porta aktarırsak değişken hangi değerdeyse portu da o değere
dönüştürür. Ör. SAYI=10101010 ise PORTD=SAYI dersek PORTB’yi 1’er arlıklı olarak
Lojik 1 seviyesine çekmiş oluruz.
Programın Tanımı: PIC16F877A’nın B portuna bağlı LED’ler üzerinde 8 bit binary ileri
sayan program.
1.TRISD=0
2.TRISB=%1111
3.SAYI VAR BYTE
4.N VAR BYTE
5.PORTD=0
6.SAYI=0
7.BASLA:
8.GOSUB DISPLAY
9.IF PORTB.0=1 THEN ILERI
10.GOTO BASLA
11.ILERI:
12.SAYI=SAYI+1
13.PAUSE 150
14.IF SAYI=10 THEN SAYI=0
15.GOTO BASLA
16.DISPLAY:
17.N=SAYI
18.LOOKUP N,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F], PORTD
19. RETURN
20. END
(1) TRISD içeriği 0 yapılarak PORTD registeri çıkış olarak tanımlanmıştır.
(2) TRISB içeriği 11111 yapılarak PORTB giriş olarak tanımlanmıştır.
(3) SAYI değişken içeriği 8 bitlik byte büyüklüğünde tanımlanmıştır. Çünkü sayma
değerinin üst limiti 9 olduğundan ve bu değer binary olarak 4 bitlik 1001 sayısına eşittir.
(4) N değişken içeriği 8 bitlik byte büyüklüğünde tanımlanmıştır. Çünkü (17) numaralı
komut satırında parantez içerisinde 10 adet sabit sayı vardır. Bu değerleri seçebilmek için
1010 değerlikli 4 bitik büyüklüğe ihtiyaç vardır.
(5) PORTD içeriği silinmiştir.
(6) SAYI değişkenine sayma başlangıç değeri olan 0 sayısı atanmıştır.
(7) Sürekli döngü için BASLA etiketi atanmıştır.
(8) Bu komut satırında GOSUB komutu ile DISPLAY etiketli alt programa dallanma
işlemi yapılır. DISPLAY etiketli alt program sonunda yer alan RETURN komutu ile
programın GOSUB komut satirinin devamındaki (9) numaralı komut satırına geri dönülür.
(9) RBO butonuna basılıp basılmadığı kontrol edilmektedir. Şekildeki devrede RBO
PORTB'nin 0. biti 1 potansiyeli almaktadır. Dolayısıyla (9) numaralı komut satırında IF
komutu ile PORTB'nin 0. bitinin 1 olup olmadığı sorgulanmaktadır.
PORTB.0 girişi 1 ise program ILERI etiketli (11) numaralı komut satırına dallanır. Butona
basılmamış ise PORTB.0 girişi 0 olacağından program sıradaki (10) numaralı komut satırını
işletir.
(10) Butona basılı değilse buton durumunu yeniden kontrol etmek amacıyla program
akışı BASLA etiketine döndürülür.
(11) Sürekli döngü için ILERI etiketi atanmıştır.
(12) SAYI değeri 1 artırılır. Başlangıçta 0 olan sayı değeri bu komut satırında 0+1-1
olur. Böylece program BASLA etiketine dönüp butona yeniden basıldığında SAYI değişkeni
içeriği 1 olacağından (18) numaralı komut satırında LOOKUP komutu ile indeks içerisinden
birinci sıradaki $06 sayısı seçilerek PORTD'ye yüklenebilir ve displayde 1 rakamı
görüntülenebilir.
(13) Buton arkını söndürmek için 150msn'iik zaman gecikmesi sağlar.
(14) SAYI değeri içeriğinin 10 olup olmadığı sorgulanır. Eğer SAYI değişkeni içeriği
10'a ulaşmış ise THEN komutu işletilerek SAY içeriği 0 yapılır. SAY içeriği 10 olmamış ise
program (15) numaralı komut satırından devam eder.
(15) Program, sayma işleminin devamı amacıyla BASLA etiketli (7) numaralı komut
satırına dallanır.
(16) Bu komut satırına DISPLAY etiketi atanmıştır. Böylece (8) numaralı komut
satırında yer alan GOSUB komutu ile DISPLAY etiketli alt programın çağırılabilmesi
mümkün olur.
(17) Bu komut satırında SAYI değişkeni içeriği N değişkeni içeriğine atanır.
Böylece (18) numaralı komut satırında yer alan indeks içerisinden sıradaki sabit sayıyı
seçmek mümkün olur.
(18) N değişkeni içeriğindeki sayı değerine bağlı olarak LOOKUP komutu yardımıyla
parantez içerisinden sabit sayı değeri seçilir ve PORTD'ye yüklenir. Seçilen sayı değeri yine
bu komut satırı ile PORTD'deki displayde görüntülenir.
(19) RETURN komutu; GOSUB komutuyla (8 numaralı satır) çağrılan
DISPLAY etiketli alt programı sonlandırarak (9) numaralı komut satırına döndürür.
(20) Program sonlandırılır.
d)Deney 4:
Amaç: 4511 entegresini kullanarak mikrodenetleyiciden 4 adet çıkış yaparak display
kontrolünü öğrenmek.
Teori: 4511 entegresi binari sayıyı heksedesimal sayıya çeviren bir entegredir. Entegre
üzerindeki LE pini sayesinde entegreyi durdurur veya devam ettirebiliriz. LE pinine Lojik-0
gönderildiğinde aktif olur Lojik-1 de ise durur bu şekilde displayde son yazan rakam kalır.
Programın Tanımı: PIC16F877A’nın D portuna bağlı 45 11 entegresine binary olarak ileri
sayıp veri göndererek entegreden displaye veri aktaran program.
TRISD=0
SAYI VAR BYTE
PORTD=0
BASLA:
SAYI=0
PORTD=SAYI
ILERI:
SAYI=SAYI+1
PAUSE 1000
PORTD=SAYI
IF SAYI=10 THEN PORTD.4=1
GOTO ILERI
END
Programda binary 9 sayısına (1001) kadar 1'er saniye aralıklarla sayma işlemi yapılmaktadır.
Sayma işlemi 9'a kadar yapıldığından bu tür sayıcıya BCD sayıcı da denir. BCD sayma işlemi
için 4 bit yeterlidir.
Program, devre üzerinde denediğinde LED'ler üzerinde binary, 7 segment display üzerinde ise
desimal ileri sayma işlemi gerçekleşir.
(4) ve (11) numaralı komut satırları ilave edilirse bu kez program binary olarak
istenilen sayıya kadar sayar.
(11) numaralı komut satırında SAYI değeri 10 ile sınırlandırılmaktadır. Bu durumda
sayıcı 9'a kadar sayacak, 10 olduğunda PAUSE komutu işletilmeden BASLA etiketine
dallanacaktır. Bu komut satırında "Eğer (IF) SAYI içeriği 10 sayısına eşitse, o zaman (THEN)
BASLA etiketine git" denmektedir.
BASLA etiketine dönen programın devamındaki (5) numaralı komut satırı ile SAYI
değişkeni içeriği sıfırlanarak sayma işlemi sıfırdan itibaren yeniden başlatılır. Bu sayı değeri
(6) numaralı komut satırı ile PORTB üzerinden 4511 girişlerine uygulanarak displayde 0
değeri görüntülenir. Bu komut satırı kullanılmaz ise displayde 0 rakamı okunmaz ve sayma
işlemi 0-9 aralığında olmasına rağmen displayde 1-9 aralığındaki rakamlar görüntülenir.
(11) numaralı komut satırındaki SAYI=10 değerinde olduğu gibi, sayma işleminin
hangi sayıda sonlandırılması isteniyorsa o değerin bir fazla değeri bu komut satırına
yazılmalıdır. Örneğin binary sayma işlemini 0-63 aralığında yapmak için (11) numaralı komut
satırı IF SAYI=64 THEN BASLA şeklinde değiştirilmelidir.
Programda sayma işleminin ikişerli artması için (8) numaralı komut satırı SAYI
SAY+2 yapılmalıdır.
Sayma zaman aralığını uzatmak veya kısaltmak için (9) numaralı komut satırındaki
PAUSE içeriği değiştirilmelidir. Örneğin, (9) numaralı komut satırı PAUSE 500 yapıldığında
sayma işlemi 0,5sn aralıklarla gerçekleşir.
Program şekildeki devre ile çalıştırıldığında display üzerinde 0-9 ileri sayma işlemi
gerçekleşir.
Devrede kullanılan 4511 entegresi ortak katotlu displayler sürülebilir.Display sayıcı
desimal (onlu ) düzende sayma işlemi yaparlar.Sayma işlemini 7 segment display üzerinde
desimal olarak görüntülenebilmesi için kod çözücü devreler kullanılır.Şekildeki uygulama
devresinde 4511 entegresi 7 segment kod çzöücü olarak kullanılmaktadır.
Bu entegre devre üzerinde PIC16F877A’nın D portuna ait ilk dört bit tarafından
sürülmektedir. Bu bağlantı dikkate alınarak displayde uygun karekterlerin görüntülenebilecei
şekilde hazırlanmıştır.
e)Deney 5:
Amaç: 4511entegresinin LE pinini kullanmayı pekiştirmek.
Teori: 4511entegresinin LE pinini kullanarak aynı çıkışlardan elde ettiğimiz
değerlerle birden fazla sayaç kontrol edebiliriz.
Programın Tanımı: PIC16F877A’nın D portuna bağlı 7 sagment displaylerde 0-99
ileri sayan program.
Devre ortak katotlu 7 segment displayler ile 0-99 ileri sayıcı olarak çalışmaktadır.
Devrede kullanılan 4511entegresi BCD / 7 segment kilitleyici decoder(kod çözücü) olarak
çalışmaktadır.
Ortak katodlu 7 segment displayler aynı zamanda 7448(7 segment kod çözücü)
entegresi ile de kullanılabilirler. Ancak devrede 4511 entegresinin kullanılma nedeni, 7
segment kod çözücü özelliğinin yanında kilitleme özelliğinin de bulunmasıdır.
4511entegresinin LE girişi (5 numaralı pin) pozitif değerlikli(yaklaşık +3V ve üzeri)
yapıldığında display üzerinde en son görüntülenen rakam, A,B,C,D giriş değerlerine
bakılmaksızın sabit kalır. A,B,C,D giriş değerlerine göre display üzerinde değişik rakamlar
elde etmek için diğer bir ifadeyle 4511 entegresini 7 segment kod çözücü olarak aktif etmek
için, LE girişine şase potansiyel yapılmalıdır. LT ile BI girişleri ise pozitif değerlikli
olmalıdır.
Program, PIC16F877A’ya yüklenip devre çalıştırıldığında displayler üzerinde 0-99 sayıları
sayma işlemlerinin gerçekleştiği görülür.
Devrede 4511 entegrelerine ait A,B,C,D data girişleri birbirlerine paralel bağlıdır. Dolayısıyla
PIC16F877A uygulanan datalar iki 4511girişinede uygulanır. Ancak buna rağmen
displaylerde farklı rakam değerleri görüntülenir. Bunun sebebi program aracılığıyla 4511
entegreleri çok kısa zaman aralığında tarama yöntemi şeklinde ayrı ayrı seçilir ve 8 bitlik sayı
değeri 4’er bit haline 4511 entegrelerine ayrı ayrı gönderilir.
Program komutları:
TRISD=0
SAYI VAR BYTE
DISPLAY1 VAR BYTE
DISPLAY2 VAR BYTE
PORTD=0
SAYI=0
ILERI:
SAYI=SAYI+1
PAUSE 500
IF SAYI=100 THEN SAYI=0
DISPLAY1=SAYI DIG 0
DISPLAY2=SAYI DIG 1
PORTD=DISPLAY1 | %11110000
LOW PORTB.5
PAUSE 1
HIGH PORTB.5
PAUSE 1
PORTB=DISPLAY2 | %11110000
LOW PORTB.4
PAUSE 1
HIGH PORTB.4
PAUSE 1
GOTO ILERI
END
Programın (1) numaralı komut satırında TRISD register içeriği 0 yapılarak PORTD'nin
çıkış olarak tanımlanması sağlanmıştır.
Sayma işlemi 0-99 aralığında yapılacağından ve desimal 99 değeri binary olarak
(1100011)2 değerine eşit olduğundan, 7 bitlik bu sayı için (2) numaralı komut satırında SAYI
değişken içeriği byte büyüklüğünde tanımlanmıştır. Byte olarak tanımlanan bir değişken
içeriği maksimum 8 bit olabilir.
(3)ve (4) numaralı komut satırlarında DISPLAY1 ve DISPLAY2 değişken içerikleri
byte büyüklüğünde tanımlanmıştır. Bunun nedeni (11) ve (12) numaralı komut satırlarında
görüldüğü gibi her iki display kontrolü için 4511 girişleri A,B,C ve D olmak üzere 4'er
bitliktir ve bu büyüklükler byte ile tanımlanabilmektedir.
(5) numaralı komut satırında ana program çalıştırılmadan önce PORTDiçeriği
sıfırlanarak bu register içeriğinde istenilmeyen bilgi kalıntılarının silinmesi sağlanır.
(6) numaralı komut satırı ile 0-99 sayıcısına ait sayma işleminin başlangıç değeri olan
0 sayısı SAYI değişkeni içerisine yüklenmektedir.
(7) numaralı komut satırında ILERI etiketi ile programın (23) numaralı komut
satırından bu komut satırına dönebilmesi sağlanmaktadır.
Sayma işlemi (8) numaralı komut satırında gerçekleştirilir. Bu komut satırı ile sayı değeri 1
artırılır. Program (23) numaralı komut satırından (7) numaralı komut satırına dönüp, (8)
numaralı komut satırına her gelişinde bu SAYI değişken içeriği 1 artırılarak sayma işleminin
99'a kadar artması sağlanır.
(9) numaralı komut satırı sayma zaman aralığını belirler. PAUSE 500 komutu ile
sayma işlemi 0,5'er saniye aralıklarla gerçekleşir.
(10) numaralı komut satırında SAYI değişkeni içeriğinin 100'e ulaşıp ulaşmadığı
sorgulanır. Sayı değeri 100'e ulaşmış ise displayler üzerinde en son 99 görüntülenir ve aynı
komut satırında SAYI değişkeni içeriği 0 yapılarak, sayma işlemi O'dan itibaren yeniden
başlatılır. SAYI değerinin içeriğine 99 verilmesi durumunda displayde en son 98 rakamı
görüntülenir ve sayma işlemi yeniden 0'dan başlar.
Sayma işlemi 8 bitlik yapılmaktadır. Programın (11) ve (12) numaralı komut satırları
ile 8 bitlik sayı değeri 4'er bit halinde iki ayrı parçaya bölünür. İlk 4 bit DISPLAY1'in bağlı
olduğu 4511 girişlerine DISPLAY2'nin bağlı olduğu diğer 4511 girişlerine uygulanır.
(11) ve (12) numaralı komut satırlarında yer alan DIG komutu, aritmetik operatör
olarak görev yapar. DIG komutu, desimal sayının istenilen bitini herhangi bir değişken
içerisine atamak amacıyla kullanılır.
Aşağıdaki örnek programın ilk satırında SAYI1 içeriğine desimal 45 sayısı
yüklenmektedir. İkinci satırda ise DIG 1 komutu ile, SAY12 içeriğine SAYI1'e yüklenen 45
desimal sayısındaki 4 sayısı atanır. DIG komutunun değeri 1olduğundan, 45 sayısının sağdan
sola doğru sayıldığında 1. biti 4 rakamına karşılık gelmektedir. Bu komut satırı DIG0 olarak
değiştirilirse, bu kez SAYI2 içeriğine 5 rakamı atanır.
SAYI1 45 'SAYI1'e 45 sayısını atar.
SAY12 SAY1 DIG 1 'SAY12'ye 4 rakamını (45'in 1. rakamı) atar.
Sayıcının 00-99 sayma işlemi sırasında DIG komutu ile her bir displayin 0-9
rakamlarını uygun zamanlarda ayrı ayrı göstermesi sağlanır. Örneğin sayma rakamı 00’dan
başlayıp 17gibi bir sayıya geldiğinde DIG 0 komutu ile 1 rakamını görüntüler.
(13) numaralı komut satırında DISPLAY1 içeriği(11110000) binary sayısı ile bit
OR’lama (|) işlemine tabi tutularak sonuç PORTD’ye yüklenmektedir.
Uygulama devresine dikkat edildiğinde PORTD’nin 4 ve 5. bitleri 4511 seçmek
amacıyla kullanılmaktadır. DISPLAY1 ve DISPLAY2’yi süren 4511'in data bilgileri yine
PORTD’nin ilk 4 biti tarafından sağlanmaktadır.
Ancak sayma işlemi sırasında SAYI içeriğine yüklenen sayı değeri daima 8 bitliktir ve
bu durum 4511 ile DISPLAY seçmeyi sağlayan üst 4 bit değerinin sürekli değişmesine neden
olur. Oysaki PORTD’nin 4 ve 5. bitleri sayma sırasında her sayı değeri için sürekli 1
yapılarak displayler üzerinde görüntülenmek istenen rakamların kilitlenmesi sağlanmalıdır.
(13) numaralı komut satırında yer alan "|" bit OR’lama komutu, PORTD’nin üst 4
bitini daima 1 yaparken, alt 4 bitini DISPLAY1 içeriğine bağlı olarak değiştirir.
Program yazımı esnasında “|” bit OR’lama komut simgesi metin düzenleyiciye klavye
üzerinde Alt Gr tuşu ile birlikte alt çizgi veya düz çizgi tuşuna basılarak aktarılır.
Deney 5’de "|" bit OR'lama komutunu zorunlu kılan neden 8 bitlik sayma işlemi ile
display seçme işleminin aynı port (PORTD) üzerinden yapılmasıdır. Eğer devrede
PORTD’nin 4 ve 6, bitterine bağlı display seçme uçları PORTB'ye alınırsa bu komutun
kullanımına gerek kalmaz.
Deney 5'de (13) numaralı komut satırı PORTD=DISPLAY1 | %00110000 seklinde de
yapılabilir. Çünkü devreye dikkat edildiğinde PORTD’nin 6 ve 7. bitleri boştadır; ancak devre
üzerinde 4 adet display kullanıldığında PORTD'nin üst 4 bitinin display seçme amacıyla
daima 1 yapılması gerekir.
Programın (14) ve (17) numaralı komut satırları arasında DISPLAY1’in bağlı olduğu
PORTD'nin 5. biti 1msn'lik kısa süre içerisinde önce 0 yapılır ve 4511 entegresi
yetkilendirilerek sayının 1 artmasına izin verilir. Daha sonra bu bit tekrar 1 yapılarak 4511
çıkışındaki sayı değeri kilitlenir ve display üzerinde görüntülenmesi sağlanır.
(18) ile (22) numaralı komut satırlarının çalışma prensibi, (13) ile (17)numaralı komut
satırlarında anlatıldığı gibidir.
Program her sayı değeri için (23) numaralı komut satırından (7) numaralı komut
satırına döner.
SERİ HABERLEŞME UYGULAMALARI:
Seri Haberleşme: Dijital bilgi bilindiği üzere bitlerden oluşmaktadır. Her bir bit ya 0
(sıfır) yada 1 (bir) olabilmektedir. Bunlar yan yana gelince daha büyük dijital bilgiyi
oluşturmaktadır. Örnegin 8 adet bit 1 adet BAYT bilgisini oluşturmakta 16 adet bit ise 1 adet
WORD bilgisini oluşturmaktadır.
Simdi gelelim bu bilgilerin başka yerlere aktarılması isine. 8 bitlik bir bilginin tek bir
seferde başka bir üniteye aktarılması için 8 adet bağlantı ucu kullanırsak yani her bir bit için
bir uç kullanır isek bu bir paralel aktarma işlemidir. Yine 8 bitlik bir bilgiyi başka bir üniteye
tek bir uç kullanılarak aktarmak istersek bu bir seri aktarma işlemidir. Her iki sistemde ilave
uçlarda olacaktır. Ancak biz sadece bilginin aktarılması için gereken uçlardan bahsediyoruz.
İste üzerinde duracağımız konu bu seri bilgi aktarma sistemidir.
Bu sistemde verici ve alıcı ünite bir birlerine tek bir data hattı ile bağlanırlar. Verici
gönderdiği bitleri belirli bir formatta yani belirli zaman içinde belirli sayıda bit gönderir. Bu
şekilde oluşturulan senkronizasyon ile 8 adet bitin gönderilmesi yapılır ve alıcıda bu bitleri
teker teker alır. Alıcı ile vericinin bireysel çalışma hızlarının farklılığından dolayı seri
iletişimde bir kural vardır.
Kural birim zaman içinde gönderilen veya alınan bit sayısı ile ifade edilen BAUD
RATE yani haberleşme hızıdır. Alıcı ve vericinin aynı senkron içinde alış verişlerinin
yapılabilmesi için bu hızın her iki taraf için aynı değere ayarlanması gerekir. Sistemin başka
parametreleri de bulunmaktadır. Gönderilen bilginin invert edilmesi her baytın sonunda bir
stop biti gönderilmesi, parite kontrolü vs. gibi. İsin teferruatına fazla girmeden konuyla ilgili
komutların kullanımına geçeceğiz. BASIC de seri iletişim komutları birkaç tanedir. Bunları
sırası ile açıklayacağız. İlk komutumuz;
SERINPin,Mode,{Timeout,Label,}{[Qual…],}{Item…} Standart Asenkron Seri data giriş komutudur. Yani başka bir seri data gönderebilen bir
üniteden gelen bilgiyi almak için kullanacağımız komutlardan birisidir. Parametrelerine
bakacak olur isek; SERIN komutundan hemen sonra seri datanın alındığı pin yer almaktadır.
Burada PortA.0 veya PortB.2 gibi port pinleri kullanılır. İkinci parametre Mode dir.
Komut yukarıdaki hali ile Mod numaralarının kullanımına imkan tanımaktadır. Şayet
komutu Mode isimleri ile kullanmak isterseniz programınızın bas tarafına ; Include
“modedefs.bas” Komutunu ilave etmeniz gerekir. Her bir mod da bilginin düz mü yoksa inver
edilmiş hali işlemi alındığı bellidir. Sistemin default olarak ayarlanmış diğer parametreleri
şöyledir.
8 data biti, no parity ve 1 stop biti seklindedir. Genel gösterim 8N1 seklindedir. diğer
parametre olan ve gerektiğinde kullanılmayan Timeout parametresi dir ve 1 ms (milisaniye)
cinsinden belirlenir. Anlamı ise burada verilen süre içerisinde herhangi bir data alınmaz ise
program Label parametresi ile belirlenen konuma atlar. Dolayısıyla Label’i de açıklamış
oluyoruz. Burada bir program bölümünün ismi (etiketi) verilir.
Bir sonraki parametre qualifier olup belirleyici anlamında kullanılır ve birden fazla
olabilir. Genellikle doğru haberleşme yapılabilmesi için gönderilen bilgilerin basına belirli
ifadeler yerleştirilir. Bu yerleştirilen bilgilere qualifier denir. Bu bilgiler rakam olabileceği
gibi bir karakter dizisi de olabilir. En son parametre ise gelen bilginin depolanacağı değişken
simidir ve ITEM olarak gösterilmiştir.
Buraya kullanacağınız değişken adı yazılacaktır. Örnek vermek gerekir ise; SERIN
PortA.0, 0 , [“ERO”] , ISI Bu komutta qualifier olarak kullanılan bilgi “ERO” bilgisidir.
Program gelen bilgilere sürekli bakacak ve önceden “ERO” bilgisini alır ise arkasından gelen
ilk bilgiyi ISI değişkenine koyacaktır. Aksi taktirde ISI değişkeni olduğu gibi kalacaktır. Bu
sistem, haberleşmede yanlış data alımını önleyen güzel bir sistemdir.
Diğer Bir komut SERIN2 komutudur. Serin komutuna benzer bir komuttur. SERIN2 ,
GIRIS , 396 , [WAIT (“W”), DEC AL] Bu komutta da önce data alış pini belirlenir ve pin
otomatik olarak giriş olarak ayarlanır. Daha sonra haberlesme hızı belirlenir.
Bu hız için değişik bir hesaplama mantığı kullanılmaktadır. Formül şöyledir.
Haberleşme Hızı= (1.000.000/Baud Rate)-20 Örnek verecek olur isek , 2400 baud için hız
hesaplayalım Hız= (1.000.000/2400)-20 = 396 olacaktır. (yukarıdaki komutta yazıldıgı gibi)
Daha sonra belirli bir karakter veya karakter dizisinin alınması beklenir. Bu karekterlerden
sonrada esas data Bin, hex veya dec formatlı olarak alınır.
Diğer bir komut HSERIN komutu olup yalnızca Hardware Serial Port’u (USART)
olan Pic’ler için kullanılabilir. Bu portPIC16F628 , PIC16F876, PIC16F877 gibi pic lerde
bulunmakta 16F84/A da bulunmamaktadır. Dolayısıyla bu komutu kullanabilmemiz için
öncelikle kullandığımız Pic’in bu porta sahip olup olmadığını öğrenmemiz gerekecektir.
Komutun kullanım sekli şöyledir. HSERIN {ParityLabel,}{Timeout,Label,}[Item{,…}] Bu
komutun parametreleri Define komutu ile belirlenir. Bunlar; DEFINE HSER_RCSTA
90h (alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 20h (gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 2400 (Haberleşme hızının belirlenmesi)
Komutun kullanım sekli genelde aşağıdaki şekildedir HSERIN [BILGI, DEC
ZX] Bu komutta tüm parametreler DEFINE komutu ile verilmiştir. Dolayısıyla parametre
olarak yalnızca Bilgi isimli bir değişken ve arkasından Desimal olarak alınacak
olan ZX değişkeni görülmektedir.
Full Duplex (Tam Çift Yönlü)
Veri almayı ve göndermeyi eş zamanlı olarak gerçekleştirebilen iletişim türüdür. Bir
istasyon aynı anda veri yollayıp alabilir. Noktadan noktaya iletişimlerde (point-to-point), 2.
Katman olan Data-Link katmanı iletişimin half duplex (yarı çift yönlü) veya full duplex (tam
çift yünlü) olup olmadığını belirler. Tam çift yönlü iletişimde de 2. katman medyanın iki
ucundaki cihazların veri iletimi için uygunluğunu tanımlar. Tam çift yönlü haberleşmede
collision (çakışma) olmaz. Kablolu veya kablosuz telefonlar tam çift yönlü cihazlara iyi birer
örnek teşkil ederler. Tam çift yönlü cihazlar arayanın ses sinyallerini dijital hale getirir ve
sonra bu veriyi tıpkı kişisel bilgisayarlardaki gibi bir gömülü sayısal işlemci sayesinde
düzenler. Bu işlem sanal olarak ve eş zamanlı gerçekleştirilir, böylece aramaların doğal
akışında olması sağlanır.
Half Duplex (Yarı Çift Yönlü)
Bir istasyon veri yollarken diğer istasyonun sadece veri almasına izin veren iletişim
türüdür. Yarı çift yönlü iletişimde cihazlar çift yönlü veri gönderip alabilirler; fakat bunu eş
zamanlı olarak yapamazlar. Birden fazla istasyon aynı anda veri göndermeye çalıştığı zaman
Ethernet protokolü devreye girerek çakışmayı önler. Walkie-talkie (Bas-konuş) cihazlar yarı
çift yönlü iletişime iyi birer örnektir.
Asenkron seri iletişim:
Herhangi bir zamanda veri gönderilebilir. Veri gönderilmediği zaman hat boşta kalır.
Senkron seri iletişimden daha yavaştır. Her veri grubu ayrı olarak gönderilir. Gönderilen veri
bir anda bir karakter olacak şekilde hatta bırakılır. Karakterin başına başlangıç ve sonunda
hata sezmek için başka bir bit eklenir. Başlangıç için başla biti (0), veri iletişimini
sonlandırmak için ise dur biti (1) kullanılır.
Senkron seri iletişim: Senkron iletişim alıcı ve vericinin eş zamanlı çalışması anlamına gelir. Önce gönderici
taraf belirli bir karakter gönderir. Bu her iki tarafça bilinen iletişime başlama karakteridir.
Alıcı taraf bu karakteri okursa iletişim kurulur. Verici bilgileri gönderir. Transfer işlemi veri
bloku tamamlanana ya da alıcı verici arasındaki eşleme kayboluncaya kadar devam eder.
Asenkron seri iletişimde bir byte'lık veri 10 bit'lik bir veri dizisiyle gönderilir. Bu
bit'ler; 1 start bit'i, 8 veri bit'i ve 1 stop bit'inden ibarettir. Start ve stop bit'leri vericiden gelen
veri bit'leri ile alIcının aldığı bit'ler arasında senkronizasyonu sağlamakta yardımcı olur. Veri
sinyali taşıyan hatlarda meydana gelen bazı olumsuz koşullar nedeniyle bazen stop bit'inin
uzunluğu (süresi) normal data bit'inden 1.5 veya 2 kat daha uzun tutulabilir. Sinyal
hatlarındaki verinin doğru olarak gönderilmesini engelleyen koşullara noise (gürültü) denilir.
Asenkron, eş zamanlı olmayan anlamına gelmektedir. Senkron iletişimde olduğu
gibi verici ve alıcı arasındaki bit alış verişi arasında eş zamanlılık yoktur. Verici bir
byte'lık verinin gönderilmeye başladığını start biti ile alıcıya bildirir. Bundan sonra
veriyi oluşturan 8 bit'lik (Genellikle 8'dir ancak bazı durumlarda 7 olabilir.) veri arka arkaya
gönderilir, Son olarak stop bit'i gönderilir.
Şekilde1 byte'lik seri datanın gönderilişi grafik olarak, verilmiştir. Gönderilen veri Z harfinin
ASCII kodu olan 01011010 verisidir.
Veri hattının baş olduğu duruma MARK durumu denilir. Hat boş olduğunda MARK binary
"1" durumundadır. İletişimi başlatmak için verici bir start bit'inden sonra 8 bit gönderir.
Dikkat edilirse ilk gönderilen LSB bit'i, son gönderilen ise MSB bit'idir. Standart 8 bit data
gönderimi (8N1 adı verilen formattır) 1 stop ve 1 start bit'i ile beraber toplam 10 bit'tir.
Asenkron seri iletişimde clock hattı olmadığindan veri hattında ardı ardına gelen bit'leri
belirleyebilmek için verici ve alıcı arasında iyi bir zamanlama protokolü olması gerekir, buna
baud rate denilir.
a)Baud Rate
Seri iletişimde hız baud veya bps (bit per second- saniyedeki bit sayısı) ile ifade edilir.
Bir byte'lik verinin gönderimi 10 bit ile yapıldığından, byte per second (saniyedeki byte
sayısı) baud rate'in (1/10 i) onda biridir. Örneğin 1200 baud'luk bir sinyal, saniyede 120
byte'lik bir verinin gönderildiğini ifade eder. Bir bit'in veri hattında kalma süresini bulmak
için ise 1 saniyeyi baud rate'e bölmek gerekir. Örneğin, 1200 baud'luk sinyal gönderiminde
bir bit'in veri hattinda kalma süresi 1/1200-833 ( S) mikrosaniyedir. 9600 baud'luk veri
gönderiminde ise verinin hatta kalma süresi 1/9600=104 S ‘dir.
b)Asenkron İletişimde Hız Uyuşmazlığı ve Önemi
Seri iletişimin doğru olarak yapılabilmesi için alıcı ve verici arasında belirlenen veri
gönderim hizı %5 ten daha fazla sapma göstermemelidir. Eğer 10 bit'lik bir bloğun gönderimi
esnasında karşılıklı frekanslardaki sapmanın toplamı 104 S yi (9600 baud hızında)
karışıklıklara neden olacaktır. Geçerse bu zamanlama hatası nedeniyle veri alış verişinde
karışıklıklara neden olacaktır.
%5 lik bir frekans uyuşmazlığının meydana getireceği hatayı matematiksel olarak
açıklayalım: Diyelim ki 2400 baud luk iletişim hızında alıcı ve vericinin her ikisinde birden
%5 lik sapma göstersin. 2400 baud'luk ideal frekansta bir bit'in hatta kalma süresi 416.6 S dir.
Verici %5 hata ile 2520 baud (2400 +%5) ile bir veri bit'ini 396.8 S de gönderiyor. Alıcı ise
%5 hata ile 2280 (2400-%5 ) ile bir bit'i 438.5 S de aliyor. Bu durumda her bir bit arasındaki
farkı 438.5-396.8= 41.7 S olarak buluruz. Farkı 10 bit ile çarparsak 417 S lik eder. Bu değer
bizim örnek olarak seçtiğimiz 2400 baud luk hızdaki bit uzunluğu olan 416.6 S yi biraz
geçmektedir. Görülüyor ki 10 bit'lik verinin gönderimi süresinde alıcı ve verici frekansında
olabilecek %5 lik sapma, gönderilen ve alınan verilerin zamanlamalarında da bozulmalar
yapacağından seri iletişimde kesinlikle dikkat edilmesi gereken en önemli noktalardan
birisidir.
Asenkron veri iletişimde alıcı ve vericinin karşılıklı dikkat edileceği en önemli
protokolden birisi de hızdır. Göndericinin saat frekansı ile alıcının saat frekansı arasındaki
farklılık verilerin doğru alınamamasına neden olur. Şekilde bu durumu gösteren örnek
verilmiştir.
Parity:
Asenkron seri iletişimde gönderilen/alınan byte'ların eşitliğine parity (eşlik) denilir. Bu
eşitliğin olup olmadığını kontrol etme işleminde kullanılan bit'e de parity bit'i (Eşlik bit'i)
denilir. Stop bit'i her bir byte gönderiminden sonra byte alımının bittiğini göstermekte
kullanıldığı gibi, alınan byte’ın eşitliğini, yani aynı olup olmadığını kontrol etmede de
kullanılabilir. Parity işlemi için iki tip kodlama kullanılır. Bunlar tek parity ve çift parity'dir.
Seri iletişimde ardışık olarak 1'ler ve 0'ların gönderildiğini biliyoruz. Eğer çift parity
seçtiysek ve gönderilen 1'lerin sayısı çift ise stop bit'inin seviyesi "0" olarak gönderilir. Bunun
tersi, gönderilen 1'lerin sayısı tek ise bu defa stop bit'inin seviyesi "1" olarak gönderilir.
Alıcı bir byte'lık veriyi alırken sayar, stop bit'iyle (parity bit'i) bildirilen tek veya çift
olma durumu ile uyuşma varsa veri doğru olarak gönderilmiştir. Örneğin, çift parity seçildiyse
ve alınan 1'lerin sayısı tek ise bu durum parity error (eşlik hatası) diye adlandırılır. Hatalı
alınan byte'ın tamamı yeniden alınması gerekir. İletişim hızının yavaşlamasına neden olan
parity hatalarına gerilim dalgalanmaları, kötü iletişim hatları ve kötü bağlantılar sebep olur.
Genellikle parity hataları yüksek baud hızlarında daha belirgin problemlere yol açar.
1)ASENKRON SERİ İLETİŞİM (YAZILIMSAL)
İçerisinde donanımsal olarak USART (Universal Synchronous Asynhronous Receiver
Transmitter) modülü bulunmayan bazı PIC’lerde (PIC16F84A gibi) asenkrom seri iletişim
yapabilmek için hazırlanmış PicBasicPro komutları bulunmaktadır. SERIN veri almakta,
SEROUT ise veri göndermekte kullanılır. SERIN2 VE SEROUT2 komutları ise biraz daha
fazla gelişitirilmiş fonksiyonları olanlarıdır. Bu komutları kullanırken PIC’in istenilen pinleri
RX ve TX olarak tanımlanır. Böylece asenkron seri iletişimle haberleşebilen bir cihaza sadece
2 ile bağlanan PIC bu komutlar sayesinde asenkron iletişim kurulabilir. Elbette donanımsal
olarak USART modülü bulunan PIC’ler için hazırlanmış komutlar bulunmasına rağmen
istenirse SERIN ve SEROUT ile yazılımsal asenkron iletişim yapılabilir. Şimdi bu komutları
inceledikten sonra uygulamalar yapalım.
a)SERIN
Dizilimi: SERIN Pin,Mod,(Zamanaşımı, Etiket,)(Beleirleyici…)(Veri…)
8 bit standart asenkron data formatı (parity bit’siz ve 1 stop bit’i “8n1” formatı)
kullanarak belirlenen pin’den bir veya daha fazla veriyi seri olarak alır. Pin otomatik olarak
giriş olur. Pin 0-15 arasında bir sayı, 0-15 sayılarını içeren değişken (örn. B0)ya da pin adı
(örn. PORTA.0) olabilir.
Modlar (örn. T2400) MODEDEFS.BAS dosyasına tanımlanmıştır. Bu dosyayı kullanmak için
aşağıdaki satır programın başına yazılmalıdır.
Include “modedefs . bas”
BS1DEFS.BAS veya BS2DEFS.BAS dosyasının içerdiği bilgiler mevcut olduğundan bu
dosyalardan birisi program içerisine include komutuyla dahil edildiyse MODEDEFS.BAS’ı
tekrar tanımlamaya gerek yoktur. Eğer mod numarası kulanıldıysa bu dosyayı da tanımlamaya
gerek kalmaz.
İsteğe bağlı olarak zamanaşımı ve etiket kullanarak, belirlenen zaman içerisinde bir
karakter alınmazsa programın etiketle belirlenen yerden itibaren devam etmesi sağlanabilir.
Zaman aşımı 1ms ‘dir.
Köşeli parantez içine yazılan bir veya birden fazla belirleyici alındıktan sonra listedeki
veriler alınmaya devam eder. SERIN verileri almaya başlaması için muhakkak bu belirleyici
byte’ları alması gerekir.
Eğer alınan byte’lar belirleyici sırasındaki bir sonraki byte ile aynı olmazsa, belirleme
işlemi başa döner, başka bir değişle bir sonraki alınan byte belirleyici listesindeki ilk terim ile
karşılaşır. Belirleyici bir sabit, değişken veya karakter dizisi olabilir. Bir karakter dizisindeki
her bir karakter ayrı bir belirleyici olarak ele alınır.
Belirleyici eşleşmesi bir defa yapıldıktan sonra SERIN her bir veri için belirlenen
değişken içerisine kayıt yapmaya başlar. Eğer sadece değişken ismi kullanıldıysa, alınan
ASCII karakterin değeri değişken içerisine kaydedilir. Değişken önüne "#" işareti yazıldıysa,
ASCII değeri desimale çevrilir ve değişkenin içerisine kaydedilir. Desimal sayının ilk
rakamından önce alınan sayısal olmayan veriler göz ardı edilerek değişken içerisinde
saklanmaz. Aynı şekilde desimal sayılardan sonraki sayısal olmayan veriler de göz ardı edilir.
SERIN bit zamanlamasını üretirken 4MHZ’lik osilatör kullanıldığını varsayar. Farklı
bir osilatör kullanıldığında uygun baud rate zamanlamasını elde etmek için DEFINE OSC
tanımlaması ile osilatör frekansı belirlenmelidir.
Bir PICmikro'nun PC ile seri haberleşmesi için kullanılan RS-232 portunun lojik
seviye giriş/çıkışı ile PICmikro'nun pin giriş/çıkışının voltaj seviyesi arasında bir uyum vardır.
RS-232 voltaj ayarlama chipleri çok ucuz olmalarına rağmen, çoğu uygulamalarda herhangi
bir voltaj seviyesi ayarlama devresine ihtiyaç duyulmaz. Hatta, inverted (terslenmiş) giriş
(N300..N9600) bile kullanilabilir. PC'nin RS-232 portu ile bağlantısında sadece bir akim
sınırlayıcı direnç kullanmak yeterlidir.
b)SERIN2
Dizilimi: SERIN2 DataPin {\FlowPin}, Mod, {EşlikEtiketi,} {Zamanaşımı, Etiket} [Veri...]
Belirlenen bir pin üzerinden standart asenkron formatında bir veya daha fazla veri alır.
DataPiní otomatik olarak giriş olur. İsteğe bağlı olarak yazılan flowpin'i otomatik olarak çıkış
olur. DataPini ve flowpini 0-15 arasında bir sabit veya değişken ya da 0-15 arasındaki sayıları
içeren bir değişken (B0 gibi) veya bir pin ad (PORTA.0 gibi) olabilir.
İsteğe bağlı olarak akış kontrol pin'i (FlowPin) data alışının kontrol altına alınması için
kullanılabilir. FlowPin kullanıldığında her bir karakterin iletişimi otomatik olarak geçerli
(Enabled) duruma kurulur. Enable durumu mod ile tanımlanan verinin polaritesiyle belirlenir.
Mod seri iletişimin çalışma parametrelerini ve baud rate'i belirlemek için kullanılır. ilk
13 bit baud rate'i seçer. 13. bit parity bit'inin var olup olmadığını belirler. 14. Bit terslenmiş
veya terslenmemiş voltaj seviyesini belirler. 15. bit kullanılmaz.
İstenilen bir baud rate'i belirlemek için kullanılan 0-12. bit'lerle verilecek olan değeri
bulmak için aşağıdaki formül kullanılır:
(1000000/baud)-20
Örneğin 300 baud rate'de 0-12 bit'lere verilmesi gereken değer şöyle bulunur:
(1000000/300)-20=3313
Bazı standart baud rate değerleri tabloda verilmiştir:
13. bit 1'se çift parity bit'i, 0'sa parity bit'inin olmadığı belirlenir. Normal olarak seri
iletişim formatı 8N1(8 data bit'i, parity bit'i yok ve 1 stop bit'i)’dir. Eğer parity seçildiyse data
7E1 formatında alınır. (7 data bit'i çift parity bit'i ve 1 stop bit'i).
14. bit kontrol pin'i ve verinin seviyesini seçer. Eğer 14. bit 0'sa RS-232 ile
kullanılan sürücüden alınan veri terslenmemiş durumda alınır. 14. bit 1'se veri terslenmiş
durumda alınır. Terslenmiş mod RS-232 sürücüsünü kullanmaya gerek duyulmadığında
kullanılır.
Bazı mod örnekleri:
Mod=84 (9600 baud, parity yok ve terslenmemiş).
Mod 16780 (2400 baud, parity'siz ve terslenmiş),
Mod-27889 (300 baud, çift parity ve terslenmiş)
Eğer eşlik etiketi kullanılırsa, bir karakterin alışında hata parity bit'i ile karşılaşılırsa
program bu etikete dallanır. Bu etiket sadece çift parity (13.bit-1) seçildiğinde
kullanılmalıdır.
Bir karakter belirlenen zaman içerisinde alınmazsa programın istenilen bir etikete
dallanması istenirse zamanaşımı ve etiket parametreleri kullanılmalıdır. Zamanaşımı birimi
1mS’dir.
SERIN2 birçok farklı veri tipini destekler. Veri tipleri karışık olarak tek bir SERIN2
komutu içerisinde değişik giriş formatında olabilir.
1)Bir değişken önüne BIN yazıldığında, alınan binary değerin ASCII karşılığı
değişken içerisine atanır. Örneğin BIN B0 yazıldıysa ve "1000" alındıysa B0 içerisindeki sayı
8 olacaktır.
2) Bir değişken önüne DEC yazıldıysa ASCII kod karşılığının desimal değeri değişken
içerisine atanır. Örneğin, DEC B0 yazıldıysa ve "123" alındıysa, B0 içerisindeki sayı "123"
olacaktır.
3)Bir değişken önüne HEX yazıldıysa ASCII kod karşılığının heksadesimal karşılığı
değişken içerisine atanır. Örneğin, HEX B0 yazıldıysa ve "FE" alındıysa, B0 içerisindeki sayı
254 olacaktır.
4) SKIP’ten sonra yazılan sayı kadar karakter atlanacaktır. Örneğin SKIP 4, alınan
karakterlerden 4 tanesini atlayacaktır.
5) STR'den sonra yazılan byte tipinde bir dizi değişkeni içerisine n sayısı kadar bir
karakter dizisinin karakterleri alınır. Karakter dizisinin uzunluğu n ile belirlenir. Ya da isteğe
bağlı olarak yazılan c karakteri alındığında alma işlemi sona erer.
6) WAIT'den sonra parantez içine yazılan bir veya daha fazla belirleyici seri olarak
veri listesinden alınır. SERIN2 bu belirleyicileri verileri almadan önce tam olarak sırayla
almalıdır. Eğer herhangi veri belirleyici verisindekilerle aynı sırada olmazsa bir sonraki
belirleyiciye bakmak üzere işlem yeni baştan başlar(Yani, bir sonraki veri belirleyici
listesindeki ilk veri ile karşılaştırılır.) Bir belirleyici, değişken veya karakter sabit olabilir. Bir
karakter dizisinin her bir karakteri ayrı bir belirleyici olarak ele alınır.
7)WAITSTR ayni WAIT gibi kullanılır. SERIN2 komutu devam etmeden önce isteğe
bağlı uzunluktaki karakter dizisi alınıncaya kadar bekler.
Bir defa WAIT veya WAITSTR belirleyicileri alındıktan sonra SERIN2 ilgili değişkenlerin
içerisine veri saklamaya başlar. Eğer değişken tek başına kullanıldıysa alınan verilerin ASCII
karakteri değişken içerisine kaydedilir. Değişken önüne BIN, DEC veya HEX yazılırsa,
SERIN2 binary, ondalık veya heksadesimal olarak alınan veriyi ASCII koduna çevirerek
sonucu değişkene atar. Desimal sayının ilk rakamından önce alınan sayısal olmayan veriler
göz ardı edilerek değişken içerisinde saklanmaz. Aynı şekilde desimal sayılardan sonraki
sayısal olmayan veriler de göz ardı edilir.
SERIN2 bit zamanlamasını üretirken 4MHZ’lik osilatör kullanıldığını varsayar. Farklı
bir osilatör kullanıldığında uygun baud rate zamanlamasını elde etmek için DEFINE OSC
tanımlaması ile osilatör frekansı belirlenmelidir.
Bir PICmikro'nun PC ile seri haberleşmesi için kullanılan RS-232 portunun lojik
seviye giriş/çıkışı ile PICmikro'nun pin giriş/çıkışının voltaj seviyesi arasında bir uyum vardır.
RS-232 voltaj ayarlama chipleri çok ucuz olmalarına rağmen, çoğu uygulamalarda herhangi
bir voltaj seviyesi ayarlama devresine ihtiyaç duyulmaz. Hatta, inverted (terslenmiş) giriş (
mod bit 14 =1) bile kullanılabilir. PC'nin RS-232 portu ile bağlantısında sadece bir akım
sınırlayıcı direnç kullanmak yeterlidir.
c)SEROUT
Dizilimi: SEROUT PİN, MOD,(Veri(,Veri…))
Belirlenen bir pin üzerinden standart asenkron formatında (8N1) bir veya daha fazla veri
gönderilir. Pin otomatik olarak çıkış olur. Pin 0-15 arasında bir sabit veya değişken ya da 0-15
arasındaki sayıları içeren bir değişken (B0 gibi) veya bir pin adı (POTA.0 gibi) olabilir.
Modlar (örn. T2400) MODEDEFS.BAS dosyasına tanımlanmıştır. Bu dosyayı kullanmak için
aşağıdaki satır programın başına yazılmalıdır.
Include “modedefs . bas”
BS1DEFS.BAS veya BS2DEFS.BAS dosyalarına MODEDEFS.BAS dosyasının içerdiği
bilgiler mevcut olduğundan bu dosyalardan birisi program içerisine include komutuyla dahil
edildiyse MODEDEFS.BAS’ı tekrar tanımlamaya gerek yoktur. Eğer mod numarası
kullanılırsa bu dosyayı tanımlamaya gerek kalmaz.
SEROUT üç farklı veri tipini destekler. Bu veri tipleri karışık veya tek olarak
SEROUT komutu içerisinde kullanılabilir.
1) Bir karakter dizisinin her bir karakteri bir string sabit olarak gönderilir.
2) Sayısal bir değer (değişken veya sabit) o sayının ASCII karşılığı olarak gönderilir.
En sık kullanılan ASCII kodlarından 13 (return) ve 10 (Satır besleme) dir.
3) Bir sayının önüne "# " işareti konulduğunda bunun ASCII karşılığının desimal
değeri gönderilir. Örneğin W0=123 ise, #W0 (veya # 123), "1", "2", "3" sayıları gönderilir.
SEROUT bit zamanlamasını üretirken 4MHZ lik osilatör kullanıldığını varsayar.
Farklı bir osilatör kullanıldığında uygun baud rate zamanlamasını elde etmek için DEFINE
OSC tanımlaması ile osilatör frekansı belirlenmelidir.
Bazen SEROUT'un iletişim hızı, alıcı cihaz için çok hızlı gelebilir. DEFINE komutu
kullanarak bu sorun giderilebilir. Bu durumda karakterler arasında ilave zaman aralıkları
bırakılarak gönderilir. Karakter gönderme zaman aralığı DEFINE komutlarıyla 1-65535 S
arasında bir gecikme yaptırılabilir.
Örneğin her bir karakterin gönderme aralıkları arasında 1 mS olması isteniyorsa:
DEFINE CHAR_PACING 1000
Bir PICmikro'nun PC ile seri haberleşmesi için kullanılan RS-232 portunun lojik
seviye giriş(çıkışı ile PICmikro'nun pin giriş/çıkışının voltaj seviyesi arasına bir uyum vardır.
RS-232 voltaj ayarlama chipleri (MAX232 gibi) çok ucuz olmalarına rağmen, çoğu
uygulamalarda herhangi bir voltaj seviyesi ayarlama devresine ihtiyaç duyulmaz. Hatta,
inverted (terslenmiş) giriş (N300..N9600)bile kullanılabilir. Pc’nin RS-232 portu ile
bağlantısında sadece bir akım sınırlayıcı direnç kullanmak yeterlidir.
d)SEROUT2:
Dizilimi: SERIN2 DataPin {\FlowPin}, Mod, {Gecikme,}{Zamanaşımı,Etiket}[Veri.]
Belirlenen bir pin üzerinden standart asenkron formatında (8N1) bir veya daha
fazla veri gönderir. DataPin otomatik olarak çıkış olur. İsteğe bağlı olarak yazılan
Flowpih otomatik olarak giriş olur. DataPin (ve Flowpin) 0-15 arasında bir sabit
veya değişken ya da 0-15 arasındaki sayıları içeren bir değişken (B0 gibi) veya bir pin adi
(PORTA.0 gibi) olabilir.
İsteğe bağlı olarak akış kontrol pini (FlowPin) data gönderiminin kontrol altına
alınması için kullanılabilir. FlowPin kullanıldığında seri data gönderimi FlowPirfin
uygun polariteyi almasına kadar gönderilmez. Flowpin’in polaritesinin ne olacağı
Mod ile belirlenir.
Bazen SEROUT2un iletişim hızı, alıcı cihaz için çok hızlı gelebilir. Veri akış
kontrolünü sağlamak için extra bir pin (FlowPin) kullanmak istenmeyebilir. Bu
durumda isteğe bağlı olarak Gecikme parametresi kullanarak karakter gönderme
aralıkları ayarlanabilir. Bu durumda karakterler arasında ilave zaman aralıkları
bırakılarak gönderilir, Karakter gönderme zaman aralığı 1-65535 mS arasında bir
gecikme yaptırabilir.
Mod seri iletişimin çalışma parametrelerini ve baud rate'i belirlemek için kullanılır.
İlk 13 bit baud rate'i seçer. 13. bit parity bit'inin var olup olmadığını belirler. 14. bit
terslenmiş veya terslenmemiş voltaj seviyesini belirler. 15. bit driven (source) veya
sink olma durumunu seçmek için kullanılır. istenilen bir baud ratei belirlenmek için
kullanılan 0-12.bit’lerle verilecek olan değeri bulmak için aşağıdaki formül kullanılır.
(1000000/baud)-20
Örneğin, 300 baud rate'de 0-12 bit'lere verilmesi gereken değer şöyle bulunur:
(1000000/300)-20=3313
Bazı standart baud rate değerleri aşağıda verilmiştir.
13. bir 1’se çift parity bit’i, 0’sa parity bit’inin olmadığı belirlenir. Normal olarak seri
iletişim formatı 8N1 (8 data bit’i,parity bit’i yok ve 1 stop bit’i)dir. Eğer pariy seçildiyse data
7e1 formatında gönderilir. (7 data bit’ive 1 stop bit’i)
14. bit konrol pin’inin ve verinin polaritesini seçer.eğer 14. Bit 0’sa RS-232 ile
kullanılan sürücüden gönderilen veri terslenmemiş durumda gönderilir. Terslenmiş mod RS-
232 sürücüsünü kullanmaya gerek duyulmadığında kullanılır.
Bazı mod örnekleri:
Mod=84(9600 baud, parity yok ve terslenmemiş)
Mod=16780 (2400 baud, parity’siz ve terslenmiş)
Mod=27889 (300 baud, çift parity ve terslenmiş)
SEROUT2 birçok farklı veri tipini destekler. Veri tipleri karışık olarak tek bir
SEROUT2 komutu içerisinde farklı çıkış formatında olabilir.
1)Bir karakter dizisinin her bir karakteri bir string sabit olarak gönderilir.
2)Sayısal bir değer (değişken veya sabit) o sayısının ASCII karşılığı olarak gönderilir.
En sık kullanılan ASCII kodlarından 13 (return) ve 10 (Satır besleme) dir.
3) Bir değişken önüne BIN yazıldığında, binary değerin ASCII karşılığı gönderilir.
Örneğin B0-8 ise, BIN BO (veya BIN 8) yazıldıysa "1000" gönderilir.
4) Bir değişken önüne DEC yazıldıysa ASCII kod karşılığının desimal değeri
gönderilir. Örneğin, B0=123 ise DEC BO (veya DEC 123) yazıldıysa "123" gönderilir.
5) Bir değişken önüne HEX yazıldıysa ASCII kod karşılığının heksadesimal karşılığı
gönderilir. Örneğin, B0=254 ise ve HEX B0 (veya HEX 254) yazıldıysa gönderilen “FE”
olacaktır.
6) REP'den sonra yazılan karakteri n sayısı kadar tekrar ederek gönderir. Örneğin
REP "0"\4 ifadesiyle “0000” gönderilir.
7) STR'den sonra yazılan byte tipinde bir dizi değişkeni içerisindeki n sayısı kadarlık
karakter dizisinin karakterleri gönderilir. Karakter dizisinin uzunluğu n ile belirlenir.
BIN, DEC, ve HEX tip belirleyicilerin önüne ve arkasına birçok parametre yazılabilir.
Öne yazılan "I" parametresi, çıkışa gönderilecek sayıların önüne "%", "#", veya "$" konularak
gönderilmesini sağlar. Yani gönderilecek olan sayının sırasıyla binary,desimal veya
heksadesimal olduğunu belirler.
Eğer öne "S" parametresi yazılırsa çıkışa gönderilecek olan sayının önüne "-" işareti
konulur. Bu gönderilen sayının negatif sayı olacağını belirler. PBP'de tüm aritmetik ve
karşılaştırma işlemlerinin sonucunun işaretsiz olduğunu unutmayınız. Ancak, işaretsiz
matematik işlemler işaretli sonuçlar üretir. Örneğin, B0=9-10 işlemini ele alırsak DEC B0in
sonucu "255" olacaktır. Bu durumu düzeltmek için veriyi SDEC BO yazarak gönderirsek "-1"
olarak gidecektir.
BIN, DEC ve HEX'den sonra bir sayı da yazılabilir. Bu sayılar gönderilecek olan
sayının kaç hane olacağını belirler. Örnegin BIN6 8 veri belirleyici yazıldıysa SETOUT2
toplam 6 hane içerisinde 8 sayısını binary formatında "001000" olarak gönderecektir. BIN2 8
ise öndeki sayıları keserek 2 hane içerisinde sadece en sağdaki iki dijiti "00" gösterecektir.
Belirleyicinin tüm parametreleri istenirse birlikte kullanılabilir. Örneğin, ISDEC4 B0 gibi.
Bir PICmikro'nun PC ile seri haberleşmesi için kullanılan RS-232 portunun lojik
seviye giriş/çıkışı ile PICmikro'nun pin giriş/çıkışının voltaj seviyesi arasına bir uyum vardır.
RS-232 voltaj ayarlama chipleri ok ucuz olmalarına rağmen, çoğu uygulamalarda herhangi bir
voltaj seviyesi ayarlama devresine ihtiyaç duyulmaz. Hatta, inverted (terslenmiş) giriş ( mod
bit'i 14=1) bile kullanılabilir. PC'nin RS-232 portu ile bağlantisında sadece bir akım sınırlayıcı
direnç kullanmak yeterlidir.
Hyper Terminal Açılışı: Başlat/Tüm Programlar/Donatılar/İletişim/Hyper Terminal
a)Deney 1:
Amaç: Bir mikrodenetleyiciyinin bilgisayar ile haberleşmesini sağlamak. SERIN komutu ile
klavyeden girilen bilgi ile led kontrol etmek.
Teori: Mikrodenetleyicileri seri port üzerinden bilgisayarla haberleştirebiliriz.
Programın Tanımı: PIC16F877A ile bilgisayarla haberleşip klavyeden LED kontrolü.
Yukarıdaki devre genel bakış kazanmak amacıyla çizilmiştir.
1. INCLUDE "MODEDEFS.BAS"
2. TRISC.7=1
3. TRISD.0=0
4. LED VAR PORTD.0
5. AL VAR WORD
6. LED=0
7. ANA:
8. GOSUB ALMA
9. GOTO ANA
10. ALMA:
11. SERIN2 PORTC.7,84,[AL]
12. IF AL=65 THEN
13. LED=1
14. ELSE
15. LED=0
16. GOTO ALMA
17. ENDIF
18. RETURN
1) Numaralı komut satırında seri haberleşme kütüphanesi eklenmiştir.
2) Numaralı komut satırında TRISC.7 giriş olarak tanımlanmıştır.
3) D0 çıkış olarak ayarlanmıştır.
4) Numaralı komut satırında PORTD.0 içeriği LED olarak tanımlanmıştır.
5) Numaralı komut satırında AL değişkeni word büyüklüğünde tanımlanmıştır.
6) LED’İN içeriği silinmiştir.
7) ANA etiketi tanımlanmıştır.
8) (10). satıra dallanır.
9) (7) numaralı komut satırına gider.
10) ALMA etiketi tanıtılmıştır.
11) SERIN2 haberleşme dizilimi sağlanmıştır.
12) -(17). komut satırlarında gelen veri 65 ise LED’i yak değil ise söndür. Programda
büyük “A” kullanılmıştır ASCI kodlarında A=65 siz dilerseniz herhangi bir harfin
veya karakterin ASCI kod karşılığına bakarak kendi programınızı oluşturabilirsiniz.
18) Program dallandığı yere geri gönderilir.
b)Deney 2:
Amaç: Bir mikrodenetleyiciyinin bilgisayar ile haberleşmesini sağlamak. SEROUT komutu
ile deney setindeki butonlardan girilen bilgi ile Hyper Terminalde bastığımız butonun sayısını
gösterme.
Teori: SERIN komutu ile bilgisayardan mikrodenetleyiciye veri aktarabildiğimiz gibi
SEROUT komutu ile de mikrodenetleyiciden bilgisayara bilgi aktarabiliriz.
Programın Tanımı: Deney seti üzerindeki butonlara bastığımızda butonun kaçıncı sırada
olduğunu Hyper Terminal den gösteren program.
1. INCLUDE "MODEDEFS.BAS"
2. TRISC.6=0
3. TRISD=1
4. GONDERME:
5. IF D.0=1 THEN
6. SEROUT PORTC.6,T9600, [10,13,"1"]
7. ENDIF
8. IF D.1=1 THEN
9. SEROUT PORTC.6,T9600, [10,13,"2"]
10. ENDIF
11. IF D.2=1 THEN
12. SEROUT PORTC.6,T9600, [10,13,"3"]
13. ENDIF
14. IF D.3=1 THEN
15. SEROUT PORTC.6,T9600, [10,13,"4"]
16. ENDIF
17. IF D.4=1 THEN
18. SEROUT PORTC.6,T9600, [10,13,"5"]
19. ENDIF
20. IF D.5=1 THEN
21. SEROUT PORTC.6,T9600, [10,13,"6"]
22. ENDIF
23. IF D.6=1 THEN
24. SEROUT PORTC.6,T9600, [10,13,"7"]
25. ENDIF
26. IF D.7=1 THEN
27. SEROUT PORTC.6,T9600, [10,13,"8"]
28. ENDIF
29. GOTO GONDERME
1) Numaralı komut satırında seri haberleşme kütüphanesi eklenmiştir.
2) Numaralı komut satırında TRISC.6 çıkış olarak tanımlanmıştır.
3) D portu çıkış olarak ayarlanmıştır.
4) GONDERME etiketi tanımlanmıştır.
5) -(7). Satırlarda D portuna bağlı butonlar sorgulanarak “1” mesajı gönderilir.
8) -(28) numaralı komut satırlarında 2,3,4,5,6,7 ve 8 mesajları gitmesi için (5)-(7) komut
satırlarında olduğu gibi D portuna bağlı butonlar sorgulanır.
(29) numaralı komut satırında programın sürekliliği için (4) numaralı komut satırına
gidilir.
c)Deney 3:
Amaç: SERIN ve SEROUT komutlarını kullanmayı pekiştirerek seri haberleşmenin
temelini oluşturmak.
Teori: SERIN ve SEROUT komutları aynı anda kullanılarak hem veri alınıp hem veri
gönderilebilir.
Programın Tanımı: Klavyeden “A” tuşuna basıldığında D.0’a bağlı ledi yakan ve
“VERI GELDI” mesajını gönderen, “A” tuşundan başka bir tuşa basıldığında ise ledi
söndürüp “DOGRU VERI GELMEDI” mesajını ileten program.
1. INCLUDE "MODEDEFS.BAS"
2. TRISC.6=0
3. TRISC.7=1
4. TRISD.0=0
5. LED VAR PORTD.0
6. AL VAR WORD
7. LED=0
8. ANA:
9. GOSUB ALMA
10. GOSUB GONDERME
11. GOTO ANA
12. ALMA:
13. SERIN2 PORTC.7,84,[AL]
14. IF AL=65 THEN
15. LED=1
16. ELSE
17. LED=0
18. SEROUT PORTC.6,T9600, [10,13,"DOGRU VERI GELMEDI"]
19. GOTO ALMA
20. ENDIF
21. RETURN
22. GONDERME:
23. SEROUT PORTC.6,T9600, [10,13,"VERI GELDI"]
24. RETURN
13) Numaralı komut satırında seri haberleşme kütüphanesi eklenmiştir.
14) Numaralı komut satırında TRISC.6 çıkış olarak tanımlanmıştır.
15) Numaralı komut satırında TRISC.7 giriş olarak tanımlanmıştır.
16) D0 çıkış olarak ayarlanmıştır.
17) Numaralı komut satırında PORTD.0 içeriği LED olarak tanımlanmıştır.
18) Numaralı komut satırında word büyüklüğünde tanımlanmıştır.
19) LED’İN içeriği silinmiştir.
20) ANA etiketi tanımlanmıştır.
21) (12)’nci satıra dallanır.
22) (22) numaralı etikete dallanır.
23) (8) numaralı komut satırına gider.
24) Alma etiketi tanıtılmıştır.
25) SERIN2 haberleşme dizilimi sağlanmıştır.
26) -(18) ‘nci komut satırlarında gelen veri 65 ise LED’i yak değil ise söndür ve
bilgisayara doğru veri gelmedi bilgisini SEROUT bilgisi ile göndermektedir.
19) Programı (12)’nci satıra gönderir.
20) (14)’ncü satırda başlayan IF komutu ENDIF ile bitirilir.
21) Program dallandığı yere gider.
22)gönderme etiketi tanıtılmıştır.
23) Doğru veri gittiğinde SEROUT komuyla bilgi gönderilir.
24) Dallandığı yere geri gelir.
d)Deney 4:
Diyelim ki bir televizyona uzaktan kumanda devresi yapmak istiyoruz. Bu devre ile
televizyonu açıp kapatmak, volum kontrolu yapmak ve hem Kanal+ ve Kanal- tuslarını
kullanarak kanallar arasında gezinmek hemde sabit kanal (1-5) tuslarını kullanarak kanal
seçmek istiyoruz.
İki adet pic kullanacağız. Bu sefer 16F84A kullanalım. Çünki devrenin aslı 16F84 ile
yapılmış idi. Devre semasını vermeden önce bazı konulara açıklık getirmek gerekiyor. Volüm
kontrolü ve program gezinmesi yapacağız. Volum kontrolü için digital pot kullanabilirdik.
Ancak program kontrolü açısından bu iside kendimiz yapalım istiyoruz. Hem Volüm kontrolü
hem de program gezinmesi için 4051 (Analog swich) kullanacağız. 4051’in ABC adres
bacakları 1 adet giriş-çıkış bacağı ve bu bacağın seçilen adrese göre Analog olarak
baglanabildigi 8 adet giriş-çıkış bacağı bulunmaktadır. Volum kontrolü için 16 kademe volum
elde etmek üzere 2 adet (2x8=16) 4051 kullanacağız ve toplamda 16 adet volum seviyemiz
olacak. Program gezinme için toplam 8 adet kanal çıkışımız olacak.
İsin mantığını izah edecek olur isek, verici olarak çalışan pic üzerinde bulunan ;
- açma / kapama tuşuna basıldığında karsı taraftaki pic de bir pin high / low olacak. (toggle
çalımsa)
- Volüm+ tuşuna basıldığında volum artacak yani 2 adet 4051 çıkışları sırası ile konum
değiştirecek.
- Aynı şekilde Volüm- tuşuna basıldığında yapılan isin tersi yapılacak.
- Program+ tuşuna basıldığında program kademesi bir artacak. Basılı tuttukça artam devam
edecek.
- Program- tuşuna basıldığında bu sefer seçim isi terse dönecek.
- Sabit program seçme tuşlarından birine basıldığında ise ilgili tuşa karşılık gelen pin karsı
tarafta toggle olarak çalışacak. Ancak bu pin açık olan diğer pinleri iptal edip yanlıca kendisi
çıkış verecek.
Bir ayrıntıyı daha izah etmekte fayda görüyorum. _ki pic arasındaki bağlantıda bir
inverter (NOT) kullanılmıştır. Aslında gerekli olmayan bu elemanı Seri haberleşme
komutlarında alıcı veya vericiden birini invert edilerek kullanılmasını göstermek amacı ile
yaptım.
İşte şemamız. Biraz karışık gibi gelebilir ama iyice takip edilirse kimin nereye bağlı
olduğu kolaylıkla görülecektir.
Önce Verici Kısmına ait programı verelim;
INCLUDE "MODEDEFS.BAS"
TRISA=%11110
TRISB=255
OPTION_REG.7=1 'pull-up lar iptal
CIKIS VAR PORTA.0
VER VAR BYTE
TUS VAR BYTE
POZ VAR BIT
poz=0
START: VER=0
TUS=PORTB
IF TUS =1 THEN BIR 'basılan veya basılı tutulan tusun degeri
IF TUS =2 THEN IKI 'burada okunuyor
IF TUS =4 THEN UC
IF TUS =8 THEN DORT
IF TUS =16 THEN BES
IF TUS =32 THENALTI
IF TUS =64 THEN YEDI
IF TUS =128 THEN SEKIZ
POZ=0:GOTO START
BIR: IF POZ=1 THEN START 'on/off tuşu basılı tutuluyor ise işlem yapma
POZ=1
VER=11
GOTO EXIT 'On/off tuşuna ilk basıldı tuş değeri=11 gönder.
IKI: VER=22
GOTO EXIT 'Volum+ tuşuna basıldı tuş değeri=22 , gönder
UC: VER=33
GOTO EXIT 'Volum- tuşuna basıldı tuş değeri=33, gönder
DORT: VER=44
GOTO EXIT 'Program+ tuşuna basıldı Tuş değerini gönder
BES: VER=55
GOTO EXIT 'Program- tuşuna basıldı tuş değerini gönder
ALTI: IF POZ=1 THEN START 'Sabit Program tuşları toggle yapacak
POZ=1
VER=66
GOTO EXIT
YEDI: IF POZ=1 THEN START 'Sabit program tuşları toggle yapacak.
POZ=1
VER=77
GOTO EXIT
SEKIZ: IF POZ=1 THEN START 'sabit program tuşları toggle yapacak
POZ=1
VER=88
EXIT: SEROUT CIKIS,T2400,[("A"),VER,13,10] 'tuş değerini gönder, değer ters
GOTO START çevrilmemiştir
END
Şimdi Alıcı Kısmını verelim;
TRISA=%00001
TRISB=0
GIRIS VAR PORTA.0
VOLUM VAR BYTE
ARA VAR BYTE
PROG VAR BYTE
ERO VAR BYTE
KON VAR BYTE
NE VAR BIT
SES VAR BYTE
POZ VAR BYTE
AL VAR BYTE
INCLUDE "MODEDEFS.BAS"
PORTB=0
PORTA=0
READ 0,VOLUM 'volum degeri Pic'in eepromundan sıfır nolu adresten
okunuyor
IF VOLUM=255 THEN 'sayet herhangi bir deger önceden kayıt edilmemis ise
VOLUM=3 'default volum seviyesini 3 kabul ediyoruz.
ENDIF
READ 1,PROG 'hangi programın seçili bırakıldıgını yine eeprom 1
adresten
IF PROG=255 THEN 'okuyoruz ve herhangi bir program kayıtlı degil ise
PROG=0 'default program=0 kabul ediyoruz.
ENDIF
KON=VOLUM>>3 'Volum konumu ara deger
SES=VOLUM-(KON*8): 'volum esas degeri
ARA=(SES+PROG*8)+128-(KON*64) 'hem program hemde ses degeri 8 bit olarak
PORTB=ARA 'toparlanıp PortB ye yazılıyor.
'-------------------------------------------------------------------------------
START: AL=0
SERIN GIRIS,N2400,[ "A" ],AL 'Basılan tus bilgisini al
IF AL=11 THEN BIR 'basılan tus degeri 11 ise Bir'e git
IF AL=22 THEN IKI '22 ise IKI ye git
IF AL=33 THEN UC '33 ise UC e git
IF AL=44 THEN DORT '44 ise DORT' e git
IF AL=55 THEN BES
IF AL=66 THEN ALTI
IF AL=77 THEN YEDI
IF AL=88 THEN SEKIZ
POZ=0
GOTO START
BIR: TOGGLE PORTA.1 'ON / OFF ‘On/off çıkısı toggle yapıldı
CIK: GOTO START
IKI: VOLUM=VOLUM+1 ' volum tusuna basılmıs volum bir artırıldı
IF VOLUM>15 THEN 'sayet 15 den büyük ise 15 de kal
VOLUM=15
ENDIF
'Volum<8 ise 1.4051 >8 ise 2.ci 4051 devrede olacak
VOLKAY: KON=VOLUM>>3 'Kon=%00001101 ise Kon=%00000001 oluyor
SES=VOLUM-(KON*8) 'Ses=13-(8x1)=5 bulunuyor.
ARA=PORTB & 56 'ARA degeri program seçimi için 4051'in adresi
ARA=ARA+SES+128-(KON*64) 'Volum ABC degeri + Prog ABC degeri +
PORTB=ARA 'Volum 4051 seçim degeri tamamı PortB ye yazılıyor
WRITE 0,VOLUM 'yeni Volum degeri EEPROM'a yazılıyor
PAUSE 44
GOTO START
UC: VOLUM=VOLUM-1 'Volum- tusuna basılmıs deger bir azaltılıyor
IF VOLUM=255 THEN 'deger sıfırı geçerse tekrar sıfırda kalıyor.
VOLUM=0
ENDIF
GOTO VOLKAY 'degisen volum degerini kayıt et
DORT: PROG=PROG+1 'program tusuna basılmıs bir artır.
IF PROG>7 THEN
PROG=0
ENDIF
PORKAY: ARA=PORTB & 199 '199=%11000111 olup 4051 select ve adres degerini al
ERO=PROG<<3 'yeni program degerini hesapla ve kayıt et
ARA=ARA+ERO 'PROG=6 olsun ERO=%00011000 oldu
PORTB=ARA 'ARA=Volum ABC + Prog ABC ve Selec degerleri
toplamı
WRITE 1,PROG 'Önce porta yazılıyor Prog degeri Eeproma kayıt ediliyor
PAUSE 74
GOTO START
BES: PROG=PROG-1
IF PROG=255 THEN 'PROGRAM ASAGI
PROG=7
ENDIF
GOTO PORKAY
ALTI: TOGGLE PORTA.2 'sabit program tuslarından birine basılmıs
GOTO START
YEDI: TOGGLE PORTA.3
GOTO START
SEKIZ: TOGGLE PORTA.4
GOTO START
END
Programlarda özellikle Alıcı programında bazı hesap satırları var bunların
açıklanmasında fayda görüyorum.
Şemadan görüleceği üzere, B portu B0-B1-B2 pinleri ile Volum için çalışan 2 adet
4051 entegresini adreslemektedir. Adres degeri 0-15 arasında değişmekte olup 0-7 arasındaki
değerler ilk 4051’i adreslemekte 8-15 arasındaki değerlerde ise otomatik olarak ikinci 4051
seçilerek adres değeri bu entegrenin kullanacağı (0-7) değerine indirgenerek kullanılmaktadır.
B portunun B3-B4- ve B5 nolu pinleri ise program seçimi için kullanılan 4051
entegresini adreslemektedir. Kalan B6 ve B7 pinleri ise Volum entegrelerinden hangisi
seçilecek ise onu aktif hale getirmek için kullanılmaktadır (chip Select).
Şimdi hesap sistemini inceleyelim. Önce Volum kayıt bölümüne bakalım;
KON=VOLUM>>3 ilk satırda bu komut bulunmaktadır. Volüm değerini 3 bit sağa
kaydırıp yeni değeri KON adlı değişkene yerleştir anlamındadır. Neden bu isi yaptığımızı bir
sonraki satırda açıklayacağız. Sonra gelen satırda;
SES=VOLUM-(KON*8) seklinde bir işlem var. 2 adet 4051 entegremiz var ama her
ikisi de aynı adreslemeyi kullanıyor. Dolayısıyla adres olarak vereceğimiz değer 0-7 arasında
olacaktır. Halbuki bizim Volüm değerimiz 0-15 arasında değişiyor. Bu hesap ile Ses seviye
adreslemesini volüm değerine bağlı olarak 0-7 seviyesine düşürmekteyiz. Diyelim ki Volüm
seviyemiz 14 olsun. Bu durumda
KON= 14 >> 3 = %00001110 degeri %0000001 olacaktır. Yani KON=1 olacaktır.
SES=14 – (1*8) = 6 yani volüm için 4051 adres değeri 6 (%00000110 ) olacaktır.
ARA=PORTB & 56 (56=% 00111000 dir ve bu program seçme adres değeridir)
ARA=ARA+SES+128-(KON*64) Volüm için hangi 4051 seçili olacak buna 128-
(Kon*64) hesabı karar vermektedir. Örneğimizde Kon=1 idi 64*1=64 olup 128-64=64
olacaktır. Dolayısıyla B6 veya B7 den hangisi Low ise ona bağlı entegre seçilmiş olmaktadır.
Bu hesap sonucunda B7’ye bağlı olan entegre seçilmiş olacak çünkü volüm değeri de 14 idi
yani 7 den büyük idi. Volüm değeri 8 den küçük olur ise yukarıdaki hesap 128 olarak çıkacak
olup böylece ilk 4051 seçilmiş olur otomatikman. Böylece PortB deki tüm bitlerin durumunu
hesap etmiş oluyoruz. Bunları toplar isek; ARA= ARA + 6 + 64 = ARA+70 olarak bulunan
değer direkt Port B ye yazılarak işlem tamamlanır.
Benzer bir hesap Program tuşuna basılınca da yapılmaktadır. Bu hesabın çözümünüze
size bırakıyorum.
Bu program içinde geçen ara komutlara bir göz atmakta fayda var. Bunların basında
READ ve WRITE komutları geliyor.
Pic lerin pek çoğunda eeprom hafızası olduğunu hepimiz biliyoruz. Bazı durumlarda
bu hafızaları kullanmak gerekir. Elektrik ile yazılıp silinen bir hafıza oldugundan yazılan bir
değer özellikle silinmedikten sonra Pic’in voltajını da kesseniz silinmez. Bu yüzden
saklanması gereken bilgiler burada saklanabilir. Bu programda da Volüm ve Program
değerleri bu hafıza da saklanmıştır. Bu sayede televizyonu kapattığınız anda hangi programda
kaldınız ise ve volüm seviyeniz ne ise tekrar açtığınızda aynı seviyelere ulaşmış oluyorsunuz.
Simdi gelelim komutlar nasıl kullanılıyor. Pic hafızaları 8 bitlik yani 1 baytlık hafızadır. Her
hafızanın 0 (sıfır) dan başlayan bir adres numarası vardır. Bu adres numarası kullanılarak
istenilen bir adresteki hafızaya ulaşılabilir.Hafıza ya yazma için kullandığımız komut WRITE
dır. Parametreleri Adres ve yazılacak değerdir. Yani komut;
WRITE 0 (adres), BILGI (yazılacak değer) olarak çalışmaktadır.
Hafıza’dan okuma yapmak için kullandığımız komut ise READ komutudur. Aynı
şekilde adres ve değer parametresi vardır. Kullanılış sekli;
READ 0(adres), BILGI (okunacak değer) olarak dır.
Yazma ve okuma işlemi yaklaşık 10 ms kadar bir sürede yapılır. Şayet program içinde
kesme kullanılıyor ise hatalar ortaya çıkabilir. Bunu önlemek için bu komutlardan önce kesme
iptal edilmelidir (disable ile değil direkt iptal) . İşlemden sonra kesme tekrar açılmalıdır.
ADC UYGULAMALARI
Günlük hayatta kullandığımız cihazlar genelde Analog ve Dijital olarak ikiye
ayrılmaktadırlar. Sayısal sistemle çalışan tüm cihazlar Dijital olarak nitelendirilmekte bunun
dışındakiler ise Analog cihazlar olarak nitelendirilmektedirler. Mikroişlemcilerin tamamı
dijital cihazlardır.
Zaman zaman mikroişlemci bazlı bazı cihazların Analog cihazları kontrol etmesi
istenir. Zaman zamanda Analog sinyallerin işlenip değerlendirilmesi için bu sinyallerin dijital
sinyaller haline getirilmesi gerekir.
İşte bu gibi durumlarda Analog – Digital çeviriciler kullanılır. Yalnızca A/D çevirici
olarak üretilmiş entegreler olduğu gibi bazı Pic’ler de bu çeviriciler seçimli olarak hazır
bulunurlar. Burada A/Dçeviricisi bulunan Pic’ler incelenecek ve kullanımları konusunda
örnekler verilecektir.
Bu konuda en çok kullanılan Pic’lerden birisi PIC16F877 entegresidir. 40 bacaklı olan
bu entegrede 8 kanal ve 10 bit hassasiyette A/D çeviricisi bulunmaktadır.
A/D çevirim prensibi genelde bir kondansatörün belirli bir referans voltajı ile şarj
edilip deşarj için geçen sürenin sayılması esasına dayanır. Elde edilen süre bilgisi ise Analog
değere karşılık elde edilmiş olan dijital değer olarak verilir.
Üzerinde A/D çevirici bulunan bir Pic kullanılırken yapılacak işlerin başında hangi
bacakların ANALOG hangilerinin DIGITAL olarak kullanılacağına karar vermektir. Sonra
A/D çevirici için referans voltajı kaynağının seçimi yapılmalıdır. İki türlü referans voltajı
vardır. Birincisi Pic’in kendi VDD beslemesi (+5V) diğeri ise harici bir voltaj kaynağıdır.
Tabiiki harici kaynaklar referans voltajının 5 Volt’tan farklı olması durumunda seçilmelidir.
Şimdi gelelim bu seçimleri yaptıktan sonra bunları Pic’e nasıl vereceğimize. A/D çeviricisi
olan Pic’lerde ADCON register’i denilen 8 bitlik bir yazmaç bulunmaktadır. Genellikle bu
yazmaç ADCON1adı ile isimlendirilir.
2: ADCON1 REGISTER (ADDRESS 9Fh)
Bit-7: A/D Sonuç Format Seçme biti dir. 1 olur ise sonuç sağa
hizalanmış, ADRESH nin 6. uç bitleri 0 olarak okunur. 0 olur ise sonuç sola
hizalanmış, ADRESL nin alt bitleri 0 olarak okunur.
Bit 6-4 arası kullanılmaz ve 0 olarak okunur.
Bit -3-0 arası PCFG3 – PCFG0 A/D portu ayarlama kontrol bitleridir. İşte bu bitleri
ayarlayarak portların seçimleri yapılır. Aşağıdaki tabloya bakınız.
Şimdi tablo üzerinde biraz kafa yoralım.
Şayet PCFG3:PCFG0 bitlerini 0000 olarak verir isek bu durumda RA0-RA3 , RA5,
RE0-RE2bacaklarının tamamı ANALOG olarak ayarlanmış olacak ve artı referans Voltajı
VDD den eksi referans voltajı ise VSS yani GND den alınacaktır.
Şimdi diyelim ki bize 3 adet Analog giriş lazım diğerleri Digital olabilir. +5V
ve GND de referans voltajları olarak kullanılacak. Bu durumda tabloya bakar isek 0100
değeri tam istediğimiz ayarlamayı yapabiliyor. Tablonun en son hanesinde ilk değer kaç
Analog giriş olduğunu / işaretinden sonraki değer ise harici referans voltaj girişi adedini
gösteriyor. Seçtiğimiz değerde burası 3/0 olarak görülmektedir. Anlamı 3 adet Analog giriş ve
sıfır referans voltajı var demek. Zaten biz Pic’in kendi voltaj girişlerini kullanmak
istediğimizden gerçektende bize sıfır referans girişi lazımdır.
Pic’in voltaj girişleri referans voltajı olarak seçildiğinde Pic’e giren Analog voltaj
değerinin 5 Volt’u aşmamasına dikkat edilmelidir.
Bu şekilde tablonun kullanılmasını anlattıktan sonra bu aşamada tüm girişlerin Digital
seçilmesi konusunda değinmek isterim. Analog girişlerin Digital olarak kullanılması istenir
ise tablodan sağ tarafta 0/0 değerinin bulunduğu satırda PCFG3:PCFG0 değeri 0111
(Desimal 7) olarak görülür. Demek ki ADCON1=7 veya ADCON1=%0111 dediğimiz
zaman Pic 17F877 nin Analog girişleri iptal edilerek normal Digital giriş çıkışa
dönüştürülmektedir. A/D çeviricisi bulunan Piclerde aksine bir komut bulunmaz ise ilk
açılışta A/D pin’ler Analog olarak açılırlar. Dolayısıyla bu pinleri Digital kullanmak isterseniz
mutlaka Adcon1=7 komutunu vermeniz gerekir.
Deney 1:
Amaç: PIC16F877 ile potansiyometreden analog veri okuyarak LCD’ye yazdırmak.
Teori: 10 bit üzerinden değer okuduğumuzu varsayarsak potansiyometreye bağlı olan gerilim
değeri (biz 5V kullandık) 0-1024 arasında değer almaktadır. Yani her bir kademe
5/1024=0,00488 olacaktır.
Programın Tanımı: PIC16F877 ile 5V’luk gerilim alan potansiyometre üzerinden analog
veri okuyup hem okuduğumuz değeri hem de voltaj değerini LCD üzerinde gösteren program.
Analog/dijital dönüştürücüsü (ADC) bulunan PIC'lerde bir kanaldan okunan analog
verinin 10 bit'lik dijital veriye dönüştürülmüş biçiminin ADRESH ve ADRESL adlı
kaydedicilere yazıldığını biliyoruz. Assembly veya PicBasic'te, bu kaydedicilere doğrudan
ulaşmak çok kolay olduğundan ADCIN komutu kullanmadan da analog verileri okumamız
mümkündür.
Bu uygulama programında PortE.O (AN5) pin'inden bir potansiyometre ile girilen 0-
5V arasındaki gerilimin 8-bit dijital veriye dönüştürülmüş biçimini PortB'ye bağlı LED'lerde
ADCIN komutu kullanmadan nasıl okutulacağı görülecektir. Bu uygulama ADCON0,
ADCON1 kaydedicilerinin bit'lerinin kontrol edilmesinin öğrenilmesi bakımından oldukça
önem taşımaktadır.
1. DEFINE LCD_DREG PORTB
2. DEFINE LCD_DBIT 0
3. DEFINE LCD_RSREG PORTB
4. DEFINE LCD_RSBIT 4
5. DEFINE LCD_EREG PORTB
6. DEFINE LCD_EBIT 5
7. DEFINE LCD_BITS 4
8. DEFINE LCD_LINES 2
9. ADSONUC VAR BYTE
10. TRISE=%11111111
11. ADCON1=%00000000
12. ADCON0=%11101001
13. PAUSE 500
14. DONGU:
15. ADCON0.2=1
16. BITMEDI:
17. PAUSE 5
18. IF ADCON0.2 = 1 THEN BITMEDI
19. ADSONUC=ADRESH
20. LCDOUT $FE, 1
21. LCDOUT $FE,128, "DES:" , DEC ADSONUC
22. LCDOUT $FE,192, BIN ADSONUC
23. PAUSE 100
24. GOTO DONGU
25. END
Deney 2:
Amaç: PIC16F877 ile potansiyometreden analog veri okuyarak LCD’ye yazdırmak.
Teori: 10 bit üzerinden değer okuduğumuzu varsayarsak potansiyometreye bağlı olan gerilim
değeri (biz 5V kullandık) 0-1024 arasında değer almaktadır. Yani her bir kademe
5/1024=0,00488 olacaktır.
Programın Tanımı: PIC16F877 ile 5V’luk gerilim alan potansiyometre üzerinden analog
veri okuyup hem okuduğumuz değeri hem de voltaj değerini LCD üzerinde gösteren program.
1. TRISA=%00000001
2. TRISB=0
3. DEFINE LCD_DREG PORTB
4. DEFINE LCD_DBIT 4
5. DEFINE LCD_EREG PORTB
6. DEFINE LCD_EBIT 3
7. DEFINE LCD RWREG PORTB
8. DEFINE LCD_RWBIT 2
9. DEFINE LCD_RSREG PORTB
10. DEFINE LCD_RSBIT 1
11. DEFINE LCD_BITS 4
12. DEFINE LCD_LINES 2
13. DEFINE ADC_BITS 10
14. DEFINE ADC_CLOCK 3
15. DEFINE ADC_SAMPLEUS 100
16. ADCON1=%10001110
17. HAM var word
18. TAM VAR BYTE
19. VS VAR WORD
20. VS1 VAR BYTE
21. VS2 VAR BYTE
22. VS3 VAR BYTE
23. ARA VAR WORD
24. Low PORTB.2
25. LCDOut $FE,1
26. pause 200
27. BASLA:
28. ADCIN 0,HAM
29. BAK: IF ADCON0.2=1 THEN BAK
30. ARA=HAM*49
31. TAM= DIV32 10000
32. IF TAM=0 THEN
33. ARA=HAM*49
34. VS=DIV32 100
35. LCDOUT $FE,128, "HAM=", DEC HAM," "
36. LCDOUT $FE,192, "VOLT=", DEC TAM, ",", DEC VS," "
37. ENDIF
38. IF TAM>0 THEN
39. ARA=HAM*49
40. VS= DIV32 100
41. VS1= VS DIG 1
42. VS2= VS DIG 2
43. VS3= VS DIG 3
44. LCDOUT $FE,128, "HAM=", DEC HAM," "
45. LCDOUT $FE,192, "VOLT=", DEC TAM, ",", DEC VS1, DEC VS2, DEC
VS3," "
46. ENDIF
47. GOTO BASLA
ADC çevirme işlemlerinde en önemli husus elde edilen Ham değerin istenen değere
çevrilmesi için oluşturulacak formülün bulunmasıdır. Örneğin bir sıcaklık ölçümü
yapıyorsunuz ve bir ısı sensörü değerini ölçüyorsunuz. 8 bitlik bir işlemde 0-255 arası
değerler, 10 bitlik bir işlemde 0-1023 arası değerler bulacaksınız. Peki bu değerleri nasıl
sıcaklık değeri olarak göstereceksiniz. İşin önemli noktası burası.
Hemen şu hesaplamayı yapmalısınız. 8 bit hesaplama için, Sensör den okunabilecek en
yüksek değer 255 olacaktır. Peki bu değer kaç derece sıcaklığa eşdeğerdir? Yani Sensör ün
gösterebileceği maksimum sıcaklık ne olacaktır. Bunu sensör bilgilerinden (bilgi formu veya
üretici bilgilerinden) alacaksınız. Diyelim ki 120 dereceye eş değerdir. O halde birim okuma
başına düşen sıcaklık değeri 120/255 =0,470 derece olacaktır.
Bunu Pic de kullanabilmek için 0,470 x100 = 47 olarak bir değer elde edilecektir. Demek
ki ben okuduğum değeri 47 ile çarpıp sonucu 100 e bölersem sıcaklığı bulabilirim.
O halde sensör den okunan 134 dijital değerinin sıcaklık karşılığı ne olacaktır diye
sorduğumuzda formülümüz bize;
Sıcaklık =(134 x 47)/100=62,98 derece olarak bulunacaktır.
ADC konusunda söylenecek son söz olarak üzerinde ADC çevirici bulunan her Pic farklı
özellikler taşıyabilir. En azından Analog pinlerinin ayarlanması işlemi farklı olabilir. Bu
nedenle farklı Pic ler ile çalışırken mutlaka bilgi formlarında belirtilen ADC özelliklerine göz
atmanızı tavsiye ediyorum.
Diğer bir husus da program başında verilen ADC DEFINE parametrelerinin
ayarlanmasıdır. Bunlar;
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100 Sırası ile tekrar gözden geçirirsek;
DEFINE ADC_BITS 10 ADC çevirim sonucunun kaç bitlik olacağını
ayarlamaktadır. Sonuç 8 bit ise buraya 8 , 10 bit ise buraya 10 yazılmalıdır. Tabiiki
kullanılacak değişken tespit edilen Bit değerine uygun olmalıdır.
DEFINE ADC_CLOCK 3 ‘Clock kaynağı (3=rc) Adc çevrim işlemlerinde her bit karşılığı
bir Clock palsı ile belirlenir. Clock kaynağı olarak Pic in osilatörü veya dahili RC osilatör
kullanılır. ADC işlemlerinde Bit başına çevirim süresi yaklaşık 1,6 mikro saniye olmalıdır.
Pic in kendi osilatörü kullanılacak ise bu süreyi tutturmak için sistemi çalıştıran kristal
frekansına göre bir hesap yapılıp gerekli parametre bulunmalı ve buraya yazılmalıdır. Şimdi
örnek bir hesap yapalım. Bu hesapta kullanabileceğimiz formül şöyledir;
Tçevirim= X/Fosc.
Burada X değeri 2 veya 8 veya 32 olabilmektedir. Fosc ise kristal frekansı olup MHZ
cinsindendir.Tçevirim=1,6 us. Olduğuna göre şimdi diyelim ki kristal frekansımız 4 Mhz ve
Pic’in osilatörü nü kullanacağız. Hesaba göre ;
(00) Tcevirim=2/4 = 0,5 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(01) Tcevirim=8/4 = 2 us çıkar 1,6 dan büyük ve yakın olduğu için kullanılabilir.
(10) Tcevirim=32/4 = 8 us çıkar 1,6 dan çok büyük olduğu için uygun değildir. Kullanılabilir olan 8 değerinin Define komutundaki karşılığı (%01=1) 1 dir.O halde komut
DEFINE ADC_CLOCK 1 ‘olacaktır.
Aynı hesabı 20 MHz için yapar isek;
(00) Tcevirim=2/20 = 0,1 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(01) Tcevirim=8/20 = 0,4 us çıkar 1,6 dan çok küçük olduğu için uygun değildir.
(10) Tcevirim=32/20 = 1,6 us çıkar 1,6 ile aynı olduğundan çok uygundur. O halde komut; (%10=2)
DEFINE ADC_CLOCK 2 ‘olacaktır.
Kristal osilatör ün uygun olmadığı durumlarda (%11=3) bu komut 3 olarak verilerek
dahili RC osilatör kullanılır. En çok kullanılan seçenek budur.
Son olarak;
DEFINE ADC_SAMPLEUS 100 komutunu inceleyelim.
ADC çevirim işleminin dahili bir kondansatörün önce şarj edilip sonra deşarj olma
süresinin ölçüldüğünü söylemiş idik. BelirtilenADC_SAMPLEUS süresi ADC işleminin
başlatılmasını müteakip yani ADON bit inin set edilmesini müteakip uygulanan bir gecikme
süresidir ve bir yerde kondansatörün şarj süresi olarak açıklanır. Genelde 50-100
us dolayındaki süreler çevirim için uygun gelmektedir.
Deney 3:
Amaç: PIC16F877 ile potansiyometreden analog veri okuyarak LCD’ye yazdırmak.
Teori: 10 bit üzerinden değer okuduğumuzu varsayarsak potansiyometreye bağlı olan gerilim
değeri (biz 5V kullandık) 0-1024 arasında değer almaktadır. Yani her bir kademe
5/1024=0,00488 olacaktır.
Programın Tanımı: PIC16F877 ile 5V’luk gerilim alan potansiyometre üzerinden analog
veri okuyup hem okuduğumuz değeri hem de voltaj değerini LCD üzerinde gösteren program.
1. TRISA=%00000001
2. TRISB=0
3. TRISC=0
4. TRISD=0
5. DEFINE LCD_DREG PORTB
6. DEFINE LCD_DBIT 4
7. DEFINE LCD_EREG PORTB
8. DEFINE LCD_EBIT 3
9. DEFINE LCD RWREG PORTB
10. DEFINE LCD_RWBIT 2
11. DEFINE LCD_RSREG PORTB
12. DEFINE LCD_RSBIT 1
13. DEFINE LCD_BITS 4
14. DEFINE LCD_LINES 2
15. DEFINE ADC_BITS 10
16. DEFINE ADC_CLOCK 3
17. DEFINE ADC_SAMPLEUS 100
18. ADCON1=%10001110
19. ISI VAR word
20. HAM VAR WORD
21. ONDA VAR BYTE
22. LOW PORTB.2
23. LCDOUT $FE,1
24. PAUSE 200
25. BASLA:
26. ADCIN 0,HAM
27. BAK: IF ADCON0.2=1 THEN BAK
28. LCDOUT $FE,1,”HAM =”,# HAM
29. ISI=((HAM-146)*100)/22
30. ONDA=ISI//10
31. ISI=ISI/10
32. LCDOUT $FE,$C0,” ISI=”,#ISI,”,”,#ONDA,”`C”
33. PAUSE 500
34. GOTO BASLA
50 derecede okunan ADC değeri 256 ve 0 derecede okunan 146 olduğundan 0-50 derece
arası okunan değer farkı 110 dur (256-146) . O halde her bir derece için okunması gereken
değer 110/50=2,2 olacaktır. Pic e uyarlamak için okunan değeri 10 ile çarpıp 22 ye bölersek
direkt sıcaklığı bulmuş olacağız. ondalık değeri de hesaplamak için 10 yerine 100 ile
çarpıyoruz.
Örneğimiz 5K değerinde bir termistör ün ısı sensörü olarak kullanımına ait bir örnek
olacaktır. Termistör değerini ölçerek ekranda buna karşılık gelen sıcaklık değerini göstermeye
çalışacağız. Kullanacağımız termistör NTC (Negative Temperature Coefficient) tipi bir
termistör olacak yani sıcaklık arttıkça direnç değeri azalacak. Birde PTC tipleri mevcut olup
bunlarda sıcaklık arttıkça direnç değeri de artmaktadır.
Programa geçmeden önce bazı varsayımlarımız olacak. 5 K lık termistör ’ün değeri 25 oC
de ölçülen değeridir. Varsayalım ki 0 oC de ki değeri 6 K olsun. 50 oC de ise 3 K olsun. Bu
kriterleri kullanarak programımızı yazalım. Amacımız bu termistör ü kullanarak bir
termometre yapmak olacaktır.
5 K lık termistör 0 derecede 6 K olacağı ve 50 derecede 3K ya düşeceği için yaklaşık 3K
lık bir direnç sabit kalmakta yalnızca 3 K lık bölüm değişmektedir. O nedenle şemada 5 K lık
termistör 3K (Pot) + 3K sabit Direnç olarak gösterilmiştir.
KESME (INTERRUPT)
KESME (INTERRUPT) KULLANIMI:
Tüm bilgisayarlar ve mikroislemci sistemlerinde kullanılan bir özelliktir. Basitçe
açıklamak gerekirse, bir mikroislemciye kesme anında neler yapması gerektiği bir program
bölümü seklinde verilir. Açıkçası mikro işlemci kesme oluştuğu anda yaptığı isi tamamen
bırakarak kesme bölümüne gider ve orada gösterilen isleri yapar. Kesme bölümünün sonunda
tekrar geriye dön komutunu alır ve önceden yaptığı ise kaldığı yerden devam etmek üzere
döner.
Bu olayı günlük hayatımızda yasadığımız bir örnekle açıklayalım isterseniz.
Diyelim ki bir evde yasıyorsunuz ve bir gün tüm aileyi topladınız. Amacınız aileye bir
yangın olması durumunda ne yapılması gerektiğini öğreteceksiniz. Burada yangının meydana
gelmesi bir kesme olayı olacaktır. Normal yasama düzeninde hiç yangın olmaz ise kesme
oluşmayacak demektir. Ama oluşma ihtimali her zaman olacaktır. Simdi bir aksam yemeği
esnasında yangın çıktığını varsayalım. Kesme oluşacak ve herkes önceden öğretildiği gibi
görevinin basına koşacak. Yangın söndürülecek ve her kes yemeğe geri dönecektir. İşte tipik
bir kesme olayına örnek.
RB0/INT KESMESİ:
En çok kullanılanlardan birisi PortB.0 pininde meydana gelen lojik seviye
değişikliğinin oluşturacağı kesmedir. OPTION Yazmacının 6. biti önceden ayarlanarak
kesmenin sıfırdan – bir konumuna geçişte mi yoksa bir konumundan – sıfır konumuna geçitse
mi oluşturulacağı belirlenir.
OPTION_REG.6=0 olur ise RB0 da düsen kenarda kesme oluşur.
OPTION_REG.6=1 olur ise RB0 da yükselen kenarda kesme oluşur.
Düsen veya yükselen kenar terimi bir clock palsının kenar sekli olarak anlaşılmalıdır.
Kesme işleminin aktif edilebilmesi için INTCON (interrupt control registeri) yazmacı
kullanılır.
Örnegin RB0 kesmesinin aktif hale getirilebilmesi için;
INTCON.4=1 yapılmalı ve daha sonra ;
INTCON.7=1 degeri 7 nolu bite verilerek tüm kesmeler açılmalıdır.
Bu iki deger tek bir komutla da verilebilir. Şöyle,
INTCON=%10010000
Bu kesme aktif hale getirildikten sonra sayet bir kesme olusur ise INTCON yazmaçı
nın 1 nolu biti 0 konumundan 1 konumuna geçer. Bu bit sayet tekrar 0 konumuna program
içinde getirilmez ise yeniden bir kesme olusmaz. Bu nedenle programın KESME bölümünde
bu bit sıfırlanmalıdır.
RB0/INT Kesme kullanımını toparlamak gerekir ise;
RB0/INT kesmesini kullanmak için yapılması gerekenler sırası ile
-Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme
oluştuğunda programın gideceği yer (KESME) belirlenir.
-RB0 pini giriş olarak ayarlanacak
-Gerekir ise OPTION Yazmacının 7. biti 1 veya 0 yapılarak pull-up dirençleri isteğe
göre ayarlanacak.
-OPTION Yazmacının 6 biti 1 veya 0 olarak ayarlanarak kesmenin düsen kenar veya
yükselen kenarda mı olacağına karar verilecek.
-INTCON yazmacına INTCON=%10010000 degeri verilerek kesme aktif hale
getirilecek.
-Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden
kesme oluşumuna imkân verilmeyecek.
-Kesme bölümünde INTCON.1=0 komutu verilerek kesmeden dolayı 1 olan bayrak
tekrar sıfırlanır ve sonradan yeni kesme olusmasına imkan tanınır.
-Kesme bölümünün sonunda RESUME komutu verilerek programın kesme
oluşmasından önceki yerine dönmesi sağlanır.
-En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif
hale getirilir.
Deney 1:
Amaç: Kesme işlemini kavramak.
Teori: Kesme işlemi, herhangi bir program işletilirken kesme şartı gerçekleştiğinde
programın neresinde olduğu fark etmeksizin kesme yapılan etikete dallanmamızı sağlar.
Programın Tanımı: PIC16F877A’nın D portuna bağlı LED’i kesme olmadığında 1 sn(1000
ms) aralıklarla yakıp söndüren, kesme durumunda ise 0,1 sn(100 ms) aralıklarla yakıp
söndüren program.
1. ON INTERRUPT GOTO KESME
2. OPTION_REG=%0000000
3. INTCON=%10010000
4. TRISB=%00000001
5. TRISD=%00000000
6. CMCON=7
7. SYMBOL TUS=PORTB.0
8. SYMBOL LED=PORTD.0
9. BASLA:
10. TOGGLE LED
11. PAUSE 1000
12. GOTO BASLA
13. DISABLE
14. KESME:
15. TOGGLE LED
16. PAUSE 100
17. TOGGLE LED
18. PAUSE 100
19. TOGGLE LED
20. PAUSE 100
21. TOGGLE LED
22. PAUSE 100
23. TOGGLE LED
24. PAUSE 100
25. TOGGLE LED
26. PAUSE 100
27. INTCON.1=0
28. RESUME
29. ENABLE
30. END
PORTB (RB4-RB7) DEGİÇİKLİK KESMESİ:
Bu kesme tipinde RB4-RB7 bacaklarının mevcut konumlarında oluşacak bir değişiklik
sonucunda da kesme oluşturulmaktadır. Bu kesme PORTB nin RB4-RB7 arası bacaklarının
tamamının giriş yapılması halinde geçerlidir. Bacaklardan birisi çıkış yapılır ise kesme iptal
olur.
Kesme bir kere aktif hale getirilir ise bu 4 adet bacak değeri sürekli pic tarafından okunur.
Okunan değer bir önceki ile karsılaştırılır. Şayet fark var ise kesme olusur. Kesme de olusan
RBIF bayrağının silinmesi için PortB’nin bir kere programcı tarafından mutlaka okutulması
gerekir. Aksi taktirde bayrak silinemez ve sürekli kesme olusur. Tabiiki yalnızca PortB’nin
okunması bayrağı silmeye yetmeyecektir. Ayrıca RBIF bayrağının kesme bölümünde
silinmesi de gerekir.
RB PORT (Rb4-Rb7) Değişiklik Kesmesinin Oluşması için Gerekenler :
Programın baş kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme
oluştuğunda programın gideceği yer (KESME) belirlenir.
- RB4-RB7 pinleri mutlaka giriş olarak ayarlanacak
- INTCON yazmacının 3 biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme aktif
edilir. INTCON=%10001000 değeri verilerek kesme aktif hale getirilecek.
- Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden kesme
oluşumuna imkân verilmeyecek.
- Kesme Bölümünde DURUM=PORTB seklinde port değeri okunacak
- Kesme bölümünde INTCON.0=0 komutu verilerek kesmeden dolayı 1 olan bayrak
tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkân tanınır.
- Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından
önceki yerine dönmesi sağlanır.
En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale
getirilir.
Bu defa yine PortD.0 pinine bir LED bağlı olsun. PortB.7 pinine bir Tuş bağlayalım ve bu
sefer tuş, pulldown yani GND ye çekili olsun. Tuşa basılınca PortB.7 pinine High
uygulayalım.
1. TRISB=%11110000
2. TRISD=%00000000
3. ON INTERRUPT GOTO KESME
4. OPTION_REG=%10000000
5. INTCON=%10001000
6. DURUM VAR BYTE
7. SYMBOL TUS=PORTB.0
8. SYMBOL LED=PORTD.0
9. SYMBOL RBIF=INTCON.0
10. BASLA:
11. DURUM=PORTB
12. PAUSEUS 100
13. GOTO BASLA
14. DISABLE
15. KESME:
16. TOGGLE LED
17. PAUSE 300
18. DURUM=PORTB
19. RBIF=0
20. RESUME
21. ENABLE
22. END
TMR0 KESMESİ : Ram belleğin 01 adresinde bulunan özel bir yazmaçtır. Genellikle adı üstünde
zamanlayıcı olarak kullanılır. 8 bitlik bir sayıcıdır. Yazılabilir okunabilir. Programlanabilen
bir özel bölücüsü (prescaler) vardır. Harici veya dahili clock palsları ile sayım yapabilir.
Sayma yönü daima artan yöndedir.
Bu sayıcı veya zamanlayıcı 255 değerini aştığı zaman değeri tekrar sıfır olur ve bu
anda bir kesme oluşturulabilir. Bu sayıcının diğer önemli bir özelliği ise arka planda yani ana
programdan bağımsız çalışmasıdır. Ana program çalışırken veya kesme oluştuğu andan
itibaren saymasına devam eder.
OPTION Yazmacının ilk üç biti frekans bölme (prescaler) ayarlaması için kullanılır.
Bu üç bitin aldığı değerlere göre bölücünün aldığı değerler aşağıda gösterilmiştir. Bu bölücü
aynı zamanda WDT içinde kullanıldığından tabloda WDT için bölücü değerleri de
gösterilmiştir.
Tablodan da anlaşılacağı üzere sinyal kaynağından gelen palsların TM0 sayıcısını 1/1
yani direkt saydıracağı bir konum mevcut değildir. Özellikle dışarıdan bir sinyal kaynağından
gelen palsların sayılmasında lazım olacak olan bu husus için OPTION yazmacının 3. biti 1
(bir) yapılarak frekans bölme işlemi WDT için yapılır. Bu bir nevi aldatmadır. Bölme WDT
için yapılınca Frekans bölücü TM0 için Bay-Pass edilmiş yani atlanmış olur. Dolayısıyla
gelen sinyaller 1/1 olarak Timer0 tarafından sayılır. Bunu yapacağımız örnekte göreceğiz.
TM0 sayısının kullanılması için bazı parametrelerin önceden ayarlanması gerekiyor.
Bunlar sırası ile;
1. Sayıcının sayabilmesi için gerekli olan clock sinyalinin kaynağı ne olacaktır? Bu
kaynak dahili osilatör olabileceği gibi standart olarak PortA.4 /TOCKI bacagı kullanılarak
dışarıdan bir sinyal kaynağı ile beslenebilir. Bu seçim OPTION yazmacının
5. biti olan TOCS biti ile yapılır.
TOCS biti = 0 ise sinyal kaynagı dahili osilatör dür.
TOCS biti = 1 ise sinyal kaynağı PortA.4 pinin den giren harici sinyal kaynağıdır.
2. Harici sinyal kaynagı seçilir ise, sayacın düsen kenarda mı yoksa yükselen kenarda
mı sayma isini yapacağı OPTION yazmacının 4. biti olan TOSE biti ile ayarlanır.
TOSE Biti = 0 ise düsen kenarda sayma
TOSE Biti = 1 ise Yükselen kenarda sayma yapılır.
3. Frekans bölme işlemi TMR0 için mi yoksa WDT için mi geçerli olacaktır? Bunu
seçmek için OPTION yazmacının 3. biti olan PSA biti kullanılır.
PSA Biti = 0 ise Frekans Bölme TMR0 için geçerli,
PSA Biti = 1 ise Frekans Bölme WDT için geçerli olur.
4. Son olarak da Frekans bölme kullanılacak ise değeri ayarlanır. Bunun içinde
OPTION yazmacının ilk 3 bitinin kullanıldığını söylemiştik. Tabloda verdiğimiz değerlerden
biri seçilerek OPTION yazmacına yazılır.
5. Programın bas kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme
oluştuğunda programın gideceği yer (KESME) belirlenir.
6. INTCON yazmacının 5. biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme
aktif edilir.
7. Kesme bölümüne baslarken DISABLE komutu verilerek kesme anında yeniden
kesme oluşumuna imkân verilmeyecek.
8. Kesme bölümünde INTCON.2=0 komutu verilerek kesmeden dolayı 1 olan bayrak
tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkân tanınır.
9. Kesme bölümünün sonunda RESUME komutu verilerek programın kesme
oluşmasından önceki yerine dönmesi sağlanır.
10. En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler
aktif hale getirilir.
Burada bir konuyu açıklamakta fayda görüyorum. Dahili veya harici osilatör
kullanılması durumunda, frekans değerinin Pic’e bağlı kristal değerinin dörtte biri olacağını
bilmeniz gerekiyor. Diyelim ki Pic 4 MHz lik bir kristal ile çalışıyor. O halde TMR0 için
kullanılacak sinyal kaynağı 1 MHz frekansa sahip olacaktır.
Dahili osilatör ve Frekans bölücü pek çok uygulamalarda kullanılır. Özellikle hassas
zamanlama islerinde önemli bir kullanım alanı vardır. Bunların basında Pic’in bir saat olarak
kullanılması gelir. Dahili veya harici ösilatör ve frekans bölücü kullanılarak pic’in her bir
saniyede bir kesme oluşturmasını sağlayabiliriz. Şayet bu zamanı hassas bir sakilde
ayarlayabilir isek doğru çalışan bir saat yapabiliriz.
Simdi bunu bir örnek ile açıklayalım. Yapacağımız örnek de 4 MHz de çalışan bir
16F877A kullanacağız. Dahili sinyal kaynağını kullanarak gelen sinyali 64’e böleceğiz. Bu
durumda pic, TMR0’ ile 0 dan başlayıp 255’e kadar sayıp kesme oluşturabilmesi için ; 1 us x
64 x 256 = 16384 us süre kullanacaktır. 1 sn = 1000 ms ve oda 1000.000 us ye esit
olduğundan şayet 1.000.000 us değerini 16384’e bölersek 61 değerini buluruz.
O halde her kesme oluştuğunda bir başka değişkeni saydırır ve bunun değeri 61 den 62
ye geçtiği anda değerini sıfırlayıp saniye değerini bir artırırsak bir saniyelik saat palslarını
yakalamış oluruz. Bunu bir programda kullanarak da saat yapabiliriz.
Bu örnek için bir şemamız aşağıdadır.
Programa geçmeden önce gerekli parametrelerimizi tespit edelim;
Tespitlerimizin etki alanı OPTION Yazmacı olacağından tüm tespitleri Binary olarak
bu yazmaca isleyeceğiz.
1. Sinyal kaynağımız dahili osilatör olacaktır. O halde TOCS (5.bit) 0 olacaktır.
OPTION_REG=%00000000
2. Frekans Bölme islemi TMR0 için olacak olup 3. bit 0 olacaktır.
OPTION_REG=%00000000
3. Frekans bölme (prescaler) değeri 64 olacak olup bunun TMR0 için bit karşılığı 101
dir.
OPTION_REG=%00000101
4. TMR0 kesmesini kullanacağımızdan INCON yazmacının 5. biti high olacaktır.
Tüm Kesmeleri açmak için INTCON 7. biti high olacağından bu iki durumu tek
komutta toparlarsak, INTCON=%10100000 seklinde bir komut yazmamız gerekir.
Bu asamadan sonra programımızı verelim.
1. TRISB=%00000000
2. DEFINE LCD_DREG PORTB
3. DEFINE LCD_DBIT 4
4. DEFINE LCD_EREG PORTB
5. DEFINE LCD_EBIT 3
6. define LCD RWREG PORTB
7. define LCD_RWBIT 2
8. DEFINE LCD_RSREG PORTB
9. DEFINE LCD_RSBIT 1
10. DEFINE LCD_BITS 4
11. DEFINE LCD_LINES 2
12. ON INTERRUPT GoTo KESME
13. OPTION_REG=%10000101
14. INTCON=%10100000
15. TMR0=0
16. SAYAC VAR BYTE
17. SN VAR BYTE
18. DAK VAR BYTE
19. SAAT VAR BYTE
20. GUN VAR BYTE
21. CLEAR
22. PAUSE 200
23. LCDOUT $FE,1
24. LOW PORTB.2
25. BASLA:
26. LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
27. GOTO BASLA
28. DISABLE
29. KESME:
30. SAYAC=SAYAC+1
31. IF SAYAC=61 then
32. SAYAC=0
33. SN=SN+1
34. IF SN=60 THEN
35. SN=0
36. DAK=DAK+1
37. IF DAK=60 THEN
38. DAK=0
39. SAAT=SAAT+1
40. IF SAAT=24 THEN
41. SAAT=0
42. GUN=GUN+1
43. IF GUN=365 THEN GUN=0
44. ENDIF
45. ENDIF
46. ENDIF
47. ENDIF
48. INTCON.2=0
49. RESUME
50. ENABLE
51. END
Her ne kadar hesap sonucunda kesmenin oluşturacağı gecikme yaklaşık 1 sn hesaplanmış
ise de pratikte program komutlarının da bir gecikmeye sebep olacağı unutulmamalıdır.
Yukarıdaki programda KESME bölümünde bir çok komut bulunmaktadır. Makine dilinde
her bir komut yaklaşık (4MHz de) 1 us süre almaktadır. Bu nedenle hesaplama doğru olsa da
saat ileri gidebilir veya geri kalabilir. Bunun için SAYAC değeri her 61 kesme yerine 60-59-
58 kesmede bir saniye artırımı yaptırılabilir. En iyisi programın yazılması tamamlanınca
doğru çalışan bir saat yardımı ile süre karsılaştırması yapılmalı ve gerekirse SAYAC değeri
ile oynanarak hassas bir ayarlama yapılmalıdır.