dÜzce Ünİversİtesİ cumayerİ myo mekatronİk bÖlÜmÜ

101
DÜZCE ÜNİVERSİTESİ CUMAYERİ MYO MEKATRONİK BÖLÜMÜ MEKATRONİK LABORATUARI (MİKRODENETLEYİCİLER)

Upload: others

Post on 25-Feb-2022

14 views

Category:

Documents


0 download

TRANSCRIPT

DÜZCE ÜNİVERSİTESİ

CUMAYERİ MYO

MEKATRONİK BÖLÜMÜ

MEKATRONİK LABORATUARI

(MİKRODENETLEYİCİLER)

İç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.