124
T.C MARMARA ÜNİVERSİTESİ TEKNİK EĞİTİM FAKÜLTESİ ELEKTRİK EĞİTİMİ BÖLÜMÜ 8 ANALOG BİLGİNİN ARABİRİM KARTI İLE BİLGİSAYARLA İZLENMESİ VE RAPORLAMA BİTİRME PROJESİ 9601025 M. Ozan AKI 9601029 Ercan UYGUN TEZ DANIŞMANI: Yrd. Doç. Dr. Koray TUNÇALP İSTANBUL, 2000

8 ANALOG BİLGİNİN ARABİRİM KARTI İLE BİLGİSAYARLA ... · Sonuçta ortaya çıkan ürünün piyasada kullanılan pahalı veri toplama sistemlerinin yanında maliyeti kıyaslanırsa,

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

T.C MARMARA ÜNİVERSİTESİ

TEKNİK EĞİTİM FAKÜLTESİ ELEKTRİK EĞİTİMİ BÖLÜMÜ

8 ANALOG BİLGİNİN ARABİRİM KARTI İLE

BİLGİSAYARLA İZLENMESİ VE RAPORLAMA

BİTİRME PROJESİ

9601025 M. Ozan AKI 9601029 Ercan UYGUN

TEZ DANIŞMANI:

Yrd. Doç. Dr. Koray TUNÇALP

İSTANBUL, 2000

T.C MARMARA ÜNİVERSİTESİ

TEKNİK EĞİTİM FAKÜLTESİ ELEKTRİK EĞİTİMİ BÖLÜMÜ

8 ANALOG BİLGİNİN ARABİRİM KARTI İLE

BİLGİSAYARLA İZLENMESİ VE RAPORLAMA

BİTİRME PROJESİ

9601025 M. Ozan AKI 9601029 Ercan UYGUN

TEZ DANIŞMANI : Yrd. Doç. Dr. Koray TUNÇALP

KOMİSYON ÜYELERİ : Öğr. Gör. Fuat BÜYÜKTÜMTÜRK

Öğr. Gör. Bülent ORAL

KONTROL İMZA : ...........................................................

...........................................................

...........................................................

İSTANBUL, 2000

I

TEŞEKKÜR

Bu projeyi bize vererek bizim farklı bir proje gerçekleştirmemizi sağlayan ve tez

aşamasında bize gereken yolu gösteren,bizden yardımlarını esirgemeyen proje danışmanımız

sayın Yrd. Doç. Dr. Koray TUNÇALP’e, proje süresince bize her türlü finansal desteği ve

malzeme teminini sağlayan, bu konuda bizden yardımlarını esirgemeyen PRESTİJ A.Ş. Genel

Müdürü Sayın Hakan UĞUR ’a, teknik destek ve enformasyon konusunda her türlü yardım ve

desteği gösteren sayın Haşim TEPELİOĞLU’na, bilgisayar programı için gereken

seslendirme aşamasında bizlere yardım eden arkadaşımız Esra BÜYÜR’e, yine program

içerisinde kullanılan animasyon konusunda yardım eden arkadaşımız Mert KALDIRIM’a ve

baskı devre işlerinde bizlere destek olan SANEM ELEKTRONİK çalışanlarına teşekkürü bir

borç biliriz.

II

ÖZET

Bir bilgisayarla analog verileri okumak,izlemek ve kaydetmek olasıdır. Analog

arabirim kartı ile ölçme sisteminden verilerin alınıp bilgisayarda gösterilmesi işlemi

farklı aşamalardan oluşur. Bu aşamaları, bir verinin sensörden bilgisayar ekranına

gelinceye kadar olan yolculuğuyla açıklamak daha uygundur. Analog arabirim kartına

bağlı transdüser, sensörden okuduğu analog bilgiyi 4-20mA standart akım döngüsüne

çevirir. Daha sonra bu akım dirençlerle gerilime dönüştürülerek, kanal seçici

demultiplexer üzerinden opamp girişine uygulanır. Opamp, girişine gelen gerilimi 12

bitlik analog-dijital dönüştürücünün girişine uygular. Kart üzerinde bulunan

mikrokontrolöre bir kanal okuma isteği geldiğinde ilgili kanal demultiplexer ile seçilir

ve analog-dijital dönüştürücüden bu kanala ait veriler 12 bitlik senkron seri iletişim hattı

üzerinden okunur. Okunan kanal verisine kart cevap kodları eklenerek veri paketlenir ve

asenkron seri haberleşme hattı üzerinden gönderilir. Mikrokontrolör çıkışında dijital

gerilim seviyelerinde olan haberleşme sinyallerinin seviyeleri, RS485 hat sürücüsü ile

yükseltilerek, veri paketleri şeklinde hatta yollanır. Bilgisayar tarafında bulunan

RS485/RS232 dönüştürücü ile bu sinyal bilgisayarların kabul edebileceği seviyelere

dönüştürülür. Monitör programı, seri porta ulaşan bu veri paketlerini alarak çözümler ve

kart cevabı ile kanal verilerini ayırır. İlgili gösterge, kart verisinin içerdiği kanal

verisine set edilir. Maksimum – minimum sınırlarının kontrolu yapılır, eğer taşma varsa

uyarı verilir.

Analog arabirim kartının birimleri kabaca şu şekilde gruplanabilir; opamp

devresi, adc, mikrokontrolör, mikrokontrolör programı, haberleşme hatları ve bilgisayar

programı. Bu çerçevede projede konuya bir giriş teşkil etmesi açısından bilgisayarlı

ölçme sistemleriyle ilgili genel bilgiler yazılmış, daha sonra bu arabirim kartının

bileşenleri tek tek açıklanmıştır. Son bölümde kart ile okunan analog değerlerin

bilgisayar üzerinden izleme ve raporlamasının yapılabileceği bilgisayar programı

açıklanmıştır.

III

ABSTRACT

Reading, following and recording for the analog datas are possible by a

Personaal Computer. The proces of taking the datas from the measurement system and

following in PC consist of very different steps. These steps could be explained by a

journey which a data arrives from the sensor to the PC monitor. The transducer

connected to the analog interface converts the analog data to 4-20 mA standart current

circle. Afterwards, this current is applied to the opamp input through the channel

selective demultiplexer being converted to voltage by the resistors. The opamp applies

this voltage to 12 bit ADC’s input. When a channel reading requiest happens for the

microcontroller on the electronic card, the interested channel is selected by the

multiplexer, and the datas for this channel is read through 12 bit synchronous series

communication line. Adding the answer codes to the read channel data, the data is

packed, and this data is sent via the asynchronous series communication line. Being

amplified by the RS485 line driver of the communication signals’ levels in the packs are

sent to the line. This signal is converted to the levels which will be accepted for the PC

by the RS485/RS232 converter located inside of the PC. The monitor software analyzes

the these data packs arriving the series port, and it seperates the channel datas by the

card response. The interested indicator is set the channel data which includes the card

data. Maximum and minimum borders are controlled, if there is overflow, the warning

is given.

The analog interface units are = the opamp circuit, ADC, µC, µC software,

communication lines and PC software. For this purpose, in order to get an input to the

project, the general information about PC instrumentation systemshave been written,

later than, these components of the interface has been explained one by one. In the last

chapter, the PC software which has been explained viewing of the analog values

through PC, reporting of them.

IV

İÇİNDEKİLER

Sayfa

TEŞEKKÜR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I

ÖZET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . II

ABSTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III

İÇİNDEKİLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV

TABLOLAR VE ŞEKİLLER LİSTESİ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VI

1. GİRİŞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. BİLGİSAYAR VE BİLGİSAYARLI ÖLÇME DÜZENLERİ . . . . . . . . . . 3

2.1. Bilgisayarlı Ölçme ve Kontrol Sistemlerinin Avantajları . . . . . . . . . . 4

3. ANALOG ARABİRİM KARTI DONANIM YAPISI . . . . . . . . . . . . . . . . 6

3.1. Seri Arabirim Sitemleri ve Seri Veri İletimi . . . . . . . . . . . . . . . . . . . . 7 3.1.1. RS232C Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.1.2. RS422 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.3. RS485 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.4. SN75176 Seviye Dönüştürücüsü . . . . . . . . . . . . . . . . . . . . . . 15 3.2. Analog ve Dijital Dönüştürücü (ADC ) . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.1. Analog ve Sayısal Sinyaller . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.1.1. Analog ve Dijital Sinyallerin Birbirine Dönüşümü. . 17 3.2.2. TLC2543 ADC’si . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.2.1. Yapısı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3. Mikrokontrolör . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.3.1. Mikrokontrolörler ve Mikroişlemciler . . . . . . . . . . . . . . . . . . 20 3.3.2. Microchip PIC Mikrokontrolörleri . . . . . . . . . . . . . . . . . . . . 21 3.3.2.1. PIC16C63’ün Yapısı . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3.2.1.1. Osilatör ve Rezonatör . . . . . . . . . . . . . . 22 3.3.2.1.2. Reset ve Besleme Devreleri . . . . . . . . . 23 3.3.2.1.3. Watchdog Timer . . . . . . . . . . . . . . . . . . 24 3.3.2.1.4. Input / Output ( I/O ) Portları . . . . . . . . 26 3.3.2.2. Bellek Organizasyonu . . . . . . . . . . . . . . . . . . . . . . . 28 3.3.2.3. PIC16C63 Komut Seti . . . . . . . . . . . . . . . . . . . . . . 30

V

4. PIC16C63’ÜN PROGRAMLANMASI . . . . . . . . . . . . . . . . . . . . . . . . . . . 47.

5. PC PROGRAMI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

5.1. Programın Kurulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.2. Monitör Programına Genel Bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.3. Monitör Programının Tanıtılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.3.1. Kartlar Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.3.1.1. Kartları Doğrula Seçeneği . . . . . . . . . . . . . . . . . . . . 50 5.3.1.2. Kayıt Defteri Seçeneği . . . . . . . . . . . . . . . . . . . . . . . 51 5.3.2. İletişim Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.1. Bağlan Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.2. Bağlantıyı Kes Seçeneği . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.3. Port Ayarları Seçeneği . . . . . . . . . . . . . . . . . . . . . . . 54 5.3.3. Pencere Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.1. Döşe Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.2. Basamakla Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.3. Tümünü Kapat Seçeneği . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.4. Proses Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.5. Alarm Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.6. Sistem Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4. Çıkış Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4.1. Çıkış Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4.2. Program Hakkında . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.5. Program Alt Pencerelerinin Tanıtılması . . . . . . . . . . . . . . . . . 57 5.3.5.1. Proses Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.5.2. Alarm Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.3.5.3. Sistem Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.4. Monitör Programının İlk Defa Çalıştırılması . . . . . . . . . . . . . . . . . . . 60

6. SONUÇ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

EKLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

EK1. PIC16C63 PROGRAMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

EK2. MONİTÖR PROGRAMI KAYNAK KODLARI . . . . . . . . . . . . . . . . . 80

EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . . . 80

EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . . . . . 89

EK2.3. FILEMAN.PAS ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . 92

EK2.4. AICPRO.PAS ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . 111

KAYNAKLAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

ÖZGEÇMİŞLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

VI

TABLOLAR VE ŞEKİLLER LİSTESİ

Tablolar Listesi Sayfa

1. Tablo 3.1. RS232C standardı gerilim seviyeleri 8

2. Tablo 3.2. 25 pin RS232C konnektörü için pin adlandırmaları 10

3. Tablo 3.3. 9 pin RS232C konnektörü için pin adlandırmaları 12

4. Tablo 3.4. RS485 gerilim seviyeleri 15

5. Tablo 3.5. SN75176 Fonksiyon tablosu 16

6 Tablo 3.6. SN75176’nın giriş gerilimlerine göre çıkış durumları 16

5. Tablo 3.7. TLC2543 ADC’sinin pin adlandırmaları 20

6. Tablo 3.8. Osilatör tipine göre C1 ve C2’nin belirlenmesi 22

7. Tablo 3.9. PIC16C63 reset devrelerinin elektriksel özellikleri 24

8. Tablo 3.10. PORTA fonksiyonları 26

9. Tablo 3.11. PORTB fonksiyonları 27

10. Tablo 3.12. PORTC fonksiyonları 27

11. Tablo 3.13. PIC16C63 mikrokontrolör için OPCODE tanımlamaları 31

VII

Şekiller Listesi Sayfa

1. Şekil 3.1. Analog arabirim kartı 6

2. Şekil 3.2. Asenkron veri iletim biçimi 7

3. Şekil 3.3. RS232C‘nin elektriksel özellikleri 8

4. Şekil 3.4. RS232C arabiriminin temel çalışması 13

5. Şekil 3.5. RS422 elektriksel özellikleri 14

6. Şekil 3.6. RS485 elektriksel özellikleri 14

7. Şekil 3.7. SN75176 Pin adlandırması 16

7. Şekil3.8. Rampa tipi ADC’nin temel çalışma prensibi 18

8. Şekil3.9. TLC2543 ADC’si 19

9. Şekil 3.10. PIC16C63’ün pin isimlendirmeleri 21

10. Şekil 3.11. PIC16CXX için kristal osilatör bağlantı şeması 22

11. Şekil 3.12. Watchdog Timer blok diyagramı 25

12. Şekil 3.13. PIC16C63 için bellek haritası ve yığın 28

13. Şekil 3.14. Register adresleri 30

14. Şekil 3.15. PIC komutlarının yazılış formatı 32

15. Şekil 4.1. Analog arabirim kartının akış diyagramı 47

1. GİRİŞ

1980’li yılların başında “Kişisel Bilgisayar” olarak nitelendirilen cihazlar,

kullanıma sunulduğunda büyük çoğunlukla veri depolama, hesap tablosu ve kelime işlem

uygulamaları çalıştıran gerçek makinalardı. Büyük bir hızla gelişen bilgisayar teknolojisi

ile artan depolama kapasitelerinin yanında yeterince hızlı işlem yapabilir duruma

geldiklerinde çok çeşitli ve farklı amaçlara hizmet eden grafik tabanlı uygulamalar ve bu

uygulamaları çalıştıracak olan grafik tabanlı işletim sistemleri geliştirilmiştir. Aynı

zamanda insanların bilgiyi paylaşmaya ihtiyaçları, bilgisayarları kişisel olmaktan çıkaran

haberleşme araçlarının da gelişmesine neden olmuştur. Network(ağ) sistemleri, network

tabanlı işletim sistemleri ve uygulama programları, BBS(Bulletin Board System) ve

sonucunda internet. bilgisayarlarla paralel olarak gelişen bu haberleşme sistemleri birçok

cihazı bu haberleşme ağına bağlanmak zorunda bırakmıştır. Otomasyon sistemleri de

bundan nasibini almış, kontrol elemanları ve arabirim cihazlarının haberleşmesi için birçok

network sistemleri ortaya çıkmış ve bunların bilgisayar ortamına adaptasyonu sağlanmıştır.

Bunun sonucunda SCADA, DCS gibi sistemler geliştirilmiştir. Günümüzde, özellikle

ülkemizde bu sistemlerin seçim kriterleri veya alternatif uygulamalarının pek bilinmemesi

nedeniyle yüksek maliyetli sistemlerle karşı karşıya kalınması, bu tip sistemlerin pek az

uygulama alanı bulmasına neden olmuştur. Sadece endüstriyel amaçlara hizmet ettiği

düşünülen bu sistemler, yeterince ucuz ve kolay uygulanabilir olduğunda evlerdeki

bilgisayarlarda bile uygulama alanı bulacaktır. Bu nedenle bitirme projesi olarak seçilen

analog arabirim kartları düşük maliyetli, kolay uygulanabilir ve çok yönlü yazılım desteği

ile tasarlanmaya çalışılmıştır. Her birinin üzerinde 8 adet 4-20mA analog girişe sahip olan

bu kartlarda, tek bir hat üzerinden 127 adet bağlanabilen, her kartın verileri bilgisayar

üzerinden izlenebilen ve kaydedilebilen bir sistem oluşturmaya çalışılmıştır. İleride daha

ayrıntılı bilgiler verilecek bu kart üzerinde Microchip firmasına ait PIC16C63

mikrokontrolörünü ve kartların uzun mesafede güvenle haberleşebilmesini sağlamak

2

amacıyla RS485 arabirimini kullanılmıştır. Bilgisayar yazılımında ise programın kolay

uygulanabilir, sade fakat ihtiyaçlara cevap verebilecek fonksiyonlarla desteklenmiş

olmasına çalışılmıştır. Sonuçta ortaya çıkan ürünün piyasada kullanılan pahalı veri toplama

sistemlerinin yanında maliyeti kıyaslanırsa, yaptığı işin hiçte az olmadığı ortaya çıkacaktır.

Düşüncemiz her sistemin, her cihazın, hatta bir tost makinesinin bile diğer cihaz ve

sistemlerle haberleşebilmesi ve denetimlerinin yapılmasına olanak veren bir bilgisayar

sistemine bağlanabilmesidir.

2. BİLGİSAYAR VE BİLGİSAYARLI ÖLÇME SİSTEMLERİ

Bilindiği gibi modern bilgisayar teknolojisinin tarihi 1946’da başlamaktadır. Üç

yıllık bir çalışmanın sonucunda Pensillvania Üniversitesinde ilk dijital bilgisayar

yapılmıştı. Cihazın ağırlığı 30 tondan fazla olmakla beraber enerji tüketimi çok fazlaydı.

1960’lı yıllarda bilgisayar üretiminde devrim olmuş ve bu ilk bilgisayarların yerini

transistör ve diyotlardan oluşan bilgisayarlar olmuştur. Ölçüm ve bilgisayar teknolojisi

ile yakından ilgilenme 1963’ten sonra başlamış ve aynı yıl ilk mini bilgisayar

üretilmiştir.

Mini bilgisayarların ortaya çıkması, ölçme konusunda bilgisayar kullanımında

büyük bir adım olmuştur. Çok kısa zaman öncesine kadar bir ölçme ve kontrol sistemi

yükselticiler, röleler, göstergeler gibi elemanlardan oluşmaktaydı. Bunların komple bir

kontrol sistemi haline getirilmesi için her sistemin kendine özgü tasarımının olması

gerekmekteydi. Günümüzde, yüksek hızlarda işlem yapabilme, veri depolayabilme ve

sorgulama, verileri işleme ve paylaşabilme yeteneklerinden dolayı her alanda olduğu

gibi ölçme alanında da bilgisayar tercih edilen bir araç durumuna gelmiştir. Bilgisayar

içeren ölçme sistemleri birden fazla ölçmeyi aynı anda yapan ve bu ölçmelerle ilgili

hesaplamaları yapabilen, çeşitli parametreler arasındaki ilişkileri sayısal veya grafiksel

olarak çıkışa verebilen ölçü sistemleridir. O halde bilgisayar, ölçme ve kontrol

işlemlerinin çoğunu en az çaba ile çok kısa sürede yazılabilecek duruma getirmektedir.

Aynı bilgisayar ile bir borunun içindeki sıvının debisini ölçüp sürekli kaydedebilir, bir

üretim makinasının kontrolü yapılabilir veya değişik yerlerden gelen aynı tipteki bilgiler

karşılaştırılarak analiz yapılabilir. Tüm bu sistemler arasında bir tek fark vardır, o da her

sistem için yazılan komutların farklı olmasıdır.

Bilgisayarlı ölçme sistemlerinde temel olarak üç eleman vardır. Bunlardan

birincisi; gerekli ölçmeyi yapan ve bilgisayarla uyumlu olarak çalışabilen cihaz,

ikincisi; ölçme ile ilgili yazılımı içeren bilgisayar ve üçüncüsü de bilgisayar ile ölçme

sistemi arasındaki veri iletimini sağlayan haberleşme sistemidir.

Enstrümantasyon ve kontrol için kullanılan bilgisayar sistemlerinin temelinde

mikro veya mini bilgisayarlar vardır ve yüksek seviyeli bir dilde programlanırlar. Bu

4

yüzden kullanıcı sistemin yaptığı işlerde yazılımla değişiklikler yapabilir. Bu tip

sistemler tarafından yapılan işlerden bazıları şöyle sıralanabilir:

1. Cihazlardan veya prosesten alarm sinyallerinin alınması ile birlikte veri

toplama, analog ve dijital sinyalleri kaydetme

2. Kaydedilmiş veriler üzerinde kullanıcının kontrolü altında istatistiksel ve

sayısal analiz veya birbiriyle ilişkili ölçümlerin elde edilmesi amacıyla

hesaplama

3. Proseslerin sıralı işletilmesi ve kontrolu

4. Birtakım analog kontrol cihazlarının ayar noktalarının bilgisayar

tarafından izlenip ayarlanması

5. Ölçme sistemindeki parametrelerin optimizasyonu

2.1. Bilgisayarlı Ölçme ve Kontrol Sistemlerinin Avantajları

Herhangi bir ölçme veya kontrol sistemi, tasarım aşamasından itibaren

tamamlanıncaya kadar çeşitli aşamalardan geçmektedir. Bu aşamalar belirli bir sıra

takip eder, birbiriyle çakışmaz ve bu nedenle, projenin süresi bu aşamaların aldığı

toplam süredir. Klasik ölçme ve kontrol sistemleriyle bilgisayarlı ölçme ve kontrol

sistemlerinin her bir aşama için ayrı ayrı karşılaştırmasını yapılırsa şu sonuçları

çıkarılabilir:

Tasarım aşamasında; klasik sistemlerle ilgili çalışma yaparken, yapım aşamasına

geçmeden önce kontrol elemanları için tek sipariş verilmesi gerektiği için dizayn

çalışmalarının tamamlanmaya yakın bir seviyeye gelmiş olması şarttır. Bilgisayarlı bir

sisteme ilişkin çalışma yapılırken yapım aşamasından önce belirlenmesi gereken tüm

özellikler, bilgisayarın tipi ve büyüklüğü ile I/O (giriş/çıkış) şartlarıdır. Sistemin

tasarımı aslında bilgisayar programının yazılmasından ibarettir. Bu çalışma sistemin

donanım yapısı ile paralel olarak yürütülebilir ve böylece projenin toplam süresini

kısaltır.

Konstrüksiyon (kurulum,yapı) aşamasında; klasik kontrol sistemlerinde her

elemanın ayrı bir yapısı ve bağlantı devresi vardır. Doğal olarak bu durum,

işçilik,zaman ve maliyet yönünden dezavantajlıdır. Bilgisayarlı sistemlerin kurulması

ise standart parçaların bir araya getirilmesinden ibarettir.Belirli bir amacı

gerçekleştirmek için yapılmış ışıklı panolar yerine görüntü birimlerinin kullanılmasında,

5

proses kontrolünün röleler ve kontrol elemanları yerine programlarla yapılmasında

şüphesiz maliyetten tasarruf sağlanmaktadır. Ayrıca, Bilgisayar sistemi, klasik

sistemlerden daha düzenlidir.

İşletmeye alma aşamasında; herhangi bir karmaşık sistemin ilk çalıştırıldığı

zaman iyi performans vermesi çok zordur. Muhtemelen bazı tasarım hataları olacaktır.

Bilgisayar kullanılmayan klasik sistemlerde hataların arındırılması ve düzeltilmesi çok

güçtür. İşletmeye alma sırasında, dizayn hataları kaydedilmediği için dökümantasyonda

eksiklikler olabilir. Bilgisayar programlarında ise, yapısal özelliklerinden dolayı

dökümantasyon daima güncel durumda tutulabilir.

Bakım aşamasında; bilgisayar sistemleri çok kolay bakım yapılabilir özelliktedir

ve arıza bulmakla görevli işinin bilgisayar konusunda çok fazla bilgi sahibi olmasına

gerek yoktur. Bilgisayarlı sistemlerde arızaların büyük çoğunluğu bilgisayarın

kendisinde değil, bir takım çevresel cihazlarda olmaktadır.

3. ANALOG ARABİRİM KARTI

Daha önce açıklandığı gibi, bilgisayarlı ölçme sistemlerinde üç temel eleman vardır.

Bunlardan biri gerekli ölçmeyi yapan ve bilgisayarla haberleşebilen cihaz, ikincisi

bilgisayar programı ve üçüncüsü de bilgisayar ile cihaz arasındaki iletişimi sağlayacak olan

haberleşme sistemidir. Bu projede yapılan arabirim kartı da ölçmeyi yapan ve bilgisayara

bağlanabilen cihazdır.

Bir arabirim kartında bulunması gereken temel elemanlar kısaca bir analog dijital

konvertör (ADC), veri iletimi için bir arayüz (RS485 veya RS232 gibi) ve ana eleman olan

mikrokontrolör olarak sıralanabilir. Bu bölümde analog arabirim kartının donanım kısmını

oluşturan bu elemanların yapıları, bağlantıları ve çalışma şekillerine değinilmiştir. Analog

arabirim kartının temel bileşenleri ve baskı devresi şekil 3.1’de görülmektedir.

a) Temel bileşenler

b) Baskı devresi Şekil 3.1. Analog arabirim kartı

7

3.1. Seri Arabirim Sistemleri ve Seri Veri İletimi

Bilgisayarlı ölçme ve kontrol sistemlerinde herhangi iki modülün veya modüllerle

bilgisayarın birlikte çalışabilmesi için bunların birbirleriyle ve bilgisayarla haberleşmeleri

gereklidir. Cihazlar birbirleriyle haberleşirken birbirlerini sistemli bir şekilde

etkileyebilmeleri için ortak bir haberleşme tekniği kullanmak zorundadır. Bu teknikler

genelde iki ana başlık altında toplanırlar. Bunlar seri ve paralel arabirimler olarak

adlandırılır.

Paralel arabirimde verileri içeren bitler arabirim üzerinde paralel hatlardan aynı

anda iletilirler. Her bit için ayrı hat kullanılır. Seri arabirime oranla daha hızlı çalışır. Yalnız

burada her bir hat için alıcı-verici gereklidir.

Seri arabirimlerde veriler tek hat üzerinden iletilirler. Seri arabirimler senkron veya

asenkron olabilirler. Senkron veri iletiminde veri bit hızı verici ve alıcıdaki saatler

tarafından belirlenir, bu yüzden de sabit hızdadır.

Asenkron sistemler genellikle düşük hızlı terminallerde (1200 bit/saniyeden düşük

hızlarda) kullanılır. Sadece veri iletileceği zaman çalışırlar. Önce başlama biti, arkasından

veri bitleri ve ondan sonra da bitiş (durdurma) biti gelir. Başlatma biti her zaman lojik 0

düzeyindedir. Durdurma biti ise her zaman için lojik 1 düzeyinde olur. Aşağıdaki şekilde

asenkron veri iletim biçimi görülmektedir.

Şekil 3.2. Asenkron veri iletim biçimi

Donanım ara bağlantılarının neden olduğu çeşitli sorunları ortadan kaldırmak

amacıyla seri veri iletiminde de bir takım standartlar uygulanmaktadır. Bu standartlardan en

çok kullanılanlarına RS232C, RS422, RS485, IEEE488 örnek olarak verilebilir. Bu

standartlar çok kullanılan standartlar oldukları için burada bunlardan bahsetmek faydalı

olacaktır.

8

3.1.1. RS232C Standardı

RS232C standardı bir donanımın iki parçası arasında elektriksel topraklama, veri

değişimi, kontrol ve zamanlama sinyalleri elde etmek amacıyla kullanılan 9 pinli veya 25

pinli bir fiş ve soketin uçlarını isimlendirmek suretiyle bir elektromekanik arabirim

tanımlar.

Şekil 3.2.’de RS232C’nin elektriksel özellikleri görülmektedir.Kablonun terminal

yük kapasitansı kablo kapasitansı ile birlikte 2500 pF olarak belirlenmiştir. Sonlandırma

ucundaki empedans 3000 Ω ile 7000 Ω arasında, çıkış empedansı da 300Ω olarak

belirlenmiştir. Bu elektriksel özelliklerle ve maksimum 20000bps’lik (bit per second) veri

iletim hızı için, RS232C arabiriminin maksimum uzunluğunun anma değeri 15 m

civarındadır.

Şekil 3.3. RS232C’nin elektriksel özellikleri

Tablo 3.1. RS232C standardı gerilim seviyeleri (volt DC)

Veri Pinleri

Lojik 1 Düzeyi (Volt) Jojik 0 Düzeyi (Volt)

Sürücü -5 ile –15 arası +5 ile +15 arası

Alıcı -3 ile –25 arası +3 ile +25 arası

Denetim Pinleri

Yetkilendirme “Açık”(Volt) Yetkisizlik “Kapalı” (Volt)

Sürücü +5 ile +15 arası -5 ile –15 arası

Alıcı +3 ile +25 arası -3 ile –25 arası

9

Tablo 3.1.’de RS232C arabiriminde sürücülerin ve alıcıların gerilim sınırları

görülmektedir. Tabloya dikkat edilirse alıcının sınırlarının sürücünün sınırlarından daha

fazla olduğu görülecektir. Sürücü +5 ile +15 ya da –5 ile –15 V dc arasındaki herhangi bir

gerilimde çıkış yapabilirken, alıcı +3 ile +25 veya –3 ile –25 V dc arasındaki herhangi bir

gerilimi kabul edebilmektedir. Alıcı ile sürücü arasındaki bu gerilim düzeyi farkına gürültü

aralığı denir.

RS232C arabirim kablosu üzerindeki pinler gördükleri işlevlere göre çeşitli sınıflara

ayrılmışlardır: Toprak pinleri, veri pinleri, denetim (onay) pinleri ve zamanlama pinleri.

Bütün pinler tek yönlü olarak çalışırlar. Sinyaller ya veri terminalinden (Data Terminal,

DTE) Veri haberleşme cihazlarına (Data Communication Equipment, DCE), ya da tersi

şekilde iletilirler.

25 pinli RS232’deki 25 pinden yirmi tanesi belirli amaçlar için ayrılmıştır. 9, 10, 11,

18 ve 25 nolu pinler herhangi bir işleve sahip değildir. 1 ve 7 nolu pinler toprak pinleri, 2,

3, 14 ve 16 nolu pinler veri pinleri, 15, 17 ve 24 nolu pinler ise zamanlama pinleri olarak

belirlenmiş, geriye kalan tüm pinler denetim (onay) sinyallerine ayrılmıştır. Toprak A, veri

B, denetim C ve zamanlama bacağı da D harfi ile belirtilir.

RS232C’de kullanılabilir iki veri kanalı mevcuttur. Birinci kanal birincil (gerçek)

veriler için, ikinci kanal ise ikincil veri (tanı bilgisi ve onay sinyalleri) içindir.

1 nolu pin (koruyucu toprak): Elektriksel şoka karşı koruma amacıyla kullanılır.1

nolu pin alıcının bir ucunda (ya DTE, ya da DCE, ikisinde birden değil) AC elektriksel

sistemin üçüncü tel toprağına bağlanmalıdır.

2 nolu pin (iletilen veri, TX): Veri terminalinden (DTE) veri haberleşme cihazına

(DCE) seri veri bu pinden gönderilir. Bu pin göndermeye açık (CTS) bacağının etkin

olması durumunda yetkilendirilir.

3 nolu pin (alınan veri, RX): Birincil kanaldaki seri veri, veri haberleşme cihazından

(DCE) veri terminaline (DTE) bu pinden gönderilir. Bu bacağın yetkilendirilebilmesi için

alınan hat sinyali algılama (RLSD) bacağının etkin olması gerekir.

10

Tablo 3.2. 25 pin RS232C konnektörü için pin adlandırmaları

Pin

No

Sinyalin

Kısaltması Sinyalin Tanımı Sinyalin Yönü Kategori

1 GND Koruyucu toprak Yok Toprak 2 TX İletilen veri DTE’den DCE’ye Veri 3 RX Alınan veri DCE’den DTE’ye Veri 4 RTS Gönderme isteği DTE’den DCE’ye 5 CTS Göndermeye açık DCE’den DTE’ye Kontrol 6 DSR Veri devresi hazır DCE’den DTE’ye Kontrol 7 GND Sinyal toprağı Yok Toprak 8 RLSD Alınan hat sinyali algılama DCE’den DTE’ye Kontrol 9 - - - - 10 - - - - 11 - - - - 12 SRLSD İkincil alınan hat sinyali

algılama DCE’den DTE’ye Kontrol

13 SCTS İkincil göndermeye açık DCE’den DTE’ye Kontrol 14 STX İkincil iletilen veri DTE’den DCE’ye Veri 15 - İletim sinyal öğesi

zamanlaması DCE’den DTE’ye Zamanlama

16 SRX İkincil alınan veri DCE’den DTE’ye Veri 17 SCR Alıcı sinyal öğesi

zamanlaması DCE’den DTE’ye Zamanlama

18 - - - - 19 SRTS İkincil gönderme isteği DTE’den DCE’ye Kontrol 20 TDR Veri terminali hazır DTE’den DCE’ye Kontrol 21 SQD Sinyal kalite dedektörü DCE’den DTE’ye Kontrol 22 RI Çağrı göstergesi DCE’den DTE’ye Kontrol 23 DSRS Veri sinyal hızı seçici DTE’den DCE’ye Kontrol 24 SCTE Gönderme sinyal öğesi

zamanlaması DTE’den DCE’ye Zamanlama

25 - - - -

4 nolu pin (gönderme isteği, RTS): DTE, DCE’ye birincil kanaldan veri gönderme

isteğini bu pinden iletir. Etkin olması halinde modemin analog taşıyıcısını açık duruma

getirir. Etkin olması için 6 nolu bacağın (DSR) etkin olması gerekir.

5 nolu pin (göndermeye açık, CTS): Gönderme isteğine yanıt olarak veri

haberleşme cihazından veri terminaline bir onaydır. Etkin olması durumunda gönderme

verisi (TX) bacağını yetkilendirir.

6 nolu pin (veri devresi hazır, DSR): Veri haberleşme cihazı (DCE) iletişim

kanalının kullanılabilir olup olmadığını gösterir. DCE iletişim kanalına bağlı olduğu sürece

DSR etkindir.

7 nolu pin (sinyal toprak, GND): Bu pin tüm veri, haberleşme ve zamanlama pinleri

11

için sinyal referansıdır. Genelde 1 nolu bacağa bağlanır.

8 nolu pin (alınan hat sinyali algılama, RLSD): Veri haberleşme aygıtı veri

terminaline birincil kanaldan analog bir taşıyıcı almakta olduğunu bu pini kullanarak

belirtir. Alınan veri (RD) bacağını yetkilendirir.

12 nolu pin (ikincil alınan hat sinyali algılama, SRLSD): DCE ikincil kanalda

analog bir taşıyıcı almakta olduğunda bu pin etkindir. İkincil alınan veri bacağını (16 nolu

pin) yetkilendirir.

13 nolu pin (ikincil göndermeye açık, SCTS): Veri haberleşme aygıtı (DCE) bu

bacağı, ikincil gönderme isteğinde etkin duruma yanıt olarak, veri terminaline (DTE) onay

göndermede kullanır. 14 nolu bacağı yetkilendirir.

14 nolu pin (ikincil iletilen veri, STD): Tanı verileri, DTE’den DCE’ye bu pinden

aktarılır. 13 nolu pin etkin durumda olduğunda bu pin ta etkin olur.

15 nolu pin (iletim sinyal öğesi zamanlaması, SCT): Gönderme saat sinyallerinin

iletilmesi bu pinden yapılır.

16 nolu pin (ikincil alınan veri): Tanı verileri DCE’den DTE’ye buradan aktarılır.

Yetkilenebilmesi için 13 nolu bacağın etkin durumda olması gereklidir.

17 nolu pin (alıcı sinyal öğesi zamanlaması, SCR): Alma saat sinyalleri bu pinden

gönderilir. Saat frekansı birincil veri kanalının bit iletim hızına eşittir.

19 nolu pin (ikincil gönderme isteği, SRS): Veri terminali (DTE), veri haberleşme

cihazına (DCE) ikincil iletim kanalından veri gönderme isteğini bu pinden iletir.

20 nolu pin (veri terminali hazır, DTR): DTE DCE’ye bu pinden, veri terminal

donanımının kullanılabilirliği ile ilgili bilgi gönderir.

21 nolu pin (sinyal kalite dedektörü, SQD): Veri kontr0ol aygıtı (DCE) veri

terminaline (DTE) bu pin ile alma analog taşıyıcısının kalitesiyle ilgili bilgi verir.

22 nolu pin (halka göstergesi, RI): Bu pin, numara çevirme hatlarında DCE’nin

DTE’ye gelen bir arama olduğunu bildirmesi için kullanılır.

23 nolu pin (veri sinyal hızı seçici, DSRS): DTE bu bacağı DCE’nin bit iletim hızını

(saat frekansını) seçmesinde kullanır.

24 nolu pin (gönderme sinyal öğesi zamanlaması, SCTE): Ana saat osilatörü

DTE’de bulunduğunda, gönderme saat sinyalleri DTE’den DCE’yeburadan gönderilir.

12

Aşağıda ise 9 pinli RS232’nin pin adlandırmaları verilmiştir.

Tablo 3.3. 9 pin RS232C konnektörü için pin adlandırmaları

Pin

No

Sinyalin

Kısaltması Sinyalin Tanımı Sinyalin Yönü Kategori

1 2 RX Alınan veri DCE’den DTE’ye Veri 3 TX Gönderilen veri DTE’den DCE’ye Veri 4 DTR Veri terminali DTE’den DCE’ye Kontrol 5 GND Koruyucu toprak Yok Toprak 6 DSR Veri devresi hazır DCE’den DTE’ye Kontrol 7 RTS Gönderme isteği Yok Kontrol 8 CTS Göndermeye açık DCE’den DTE’ye Kontrol 9 RI Çağrı göstergesi DTE’den DCE’ye Kontrol

2 nolu pin (alınan veri, RX): seri veri, veri haberleşme cihazından (DCE) veri

terminaline (DTE) bu pinden gönderilir.

3 nolu pin (iletilen veri, TX): Veri terminalinden (DTE) veri haberleşme cihazına

(DCE) seri veri bu pinden gönderilir. Bu pin göndermeye açık (CTS) bacağının etkin

olması durumunda yetkilendirilir.

4 nolu pin (veri terminali hazır, DTR): DTE DCE’ye bu pinden, veri terminal

donanımının kullanılabilirliği ile ilgili bilgi gönderir.

5 nolu pin (koruyucu toprak): Elektriksel şoka karşı koruma amacıyla kullanılır.5

nolu pin alıcının bir ucunda (ya DTE, ya da DCE, ikisinde birden değil) ac elektriksel

sistemin üçüncü tel toprağına bağlanmalıdır.

6 nolu pin (veri devresi hazır, DSR): Veri haberleşme cihazı (DCE) iletişim

kanalının kullanılabilir olup olmadığını gösterir. DCE iletişim kanalına bağlı olduğu sürece

DSR etkindir.

7 nolu pin (gönderme isteği, RTS): DTE, DCE’ye veri gönderme isteğini bu pinden

iletir. Etkin olması halinde modemin analog taşıyıcısını açık duruma getirir. Etkin olması

için 6 nolu bacağın (DSR) etkin olması gerekir.

8 nolu pin (göndermeye açık, CTS): Gönderme isteğine yanıt olarak veri

haberleşme cihazından veri terminaline bir onaydır. Etkin olması durumunda gönderme

verisi (TX) bacağını yetkilendirir.

9 nolu pin (çağrı göstergesi, RI): Bu pin, numara çevirme hatlarında DCE’nin

13

DTE’ye gelen bir arama olduğunu bildirmesi için kullanılır.

Şekil 3.4.’te RS232C ‘nin temel çalışması görülmektedir. Buna göre; DTE (veri

terminali) birincil veri göndermek istediği zaman gönderme isteğini yetkilendirir (t=0 anı).

Belirli bir zaman gecikmesinden sonra (50 ms) 4 nolu pin (CS) etkin hale gelir. RS /CS

gecikmesi sırasında modemin çıkışı analog bir taşıyıcıdır (iletişim kurma sırası). İletişim

kurma sırası, iletişim hattını kullanıma hazırlamada ve alma modeminde taşıyıcı ile saat

darbesini tekrar elde etme devrelerini senkronize etmede kullanılır. RS /CS gecikmesinden

sonra, TD (2 nolu pin) yetkilendirilir ve DTE (veri terminali) veri göndermeye başlar. Alma

DTE’si bir analog taşıyıcı algıladığında RD (3 nolu pin) yetkilenir. İletim tamamlandıktan

sonra (t = 150 ms), RS (4 nolu pin) lojik 0 konumuna geçerek analog taşıyıcıyı keser ve

CS’yi (5 nolu pin) kapar. Böylece veri iletimi tamamlanmış olur.

Şekil 3.4. RS232C arabiriminin temel çalışması (zamanlama diyagramı)

14

3.1.2. RS422 Standardı

RS 422 standardı, RS232C standardını bir bakıma tamamlama görevi görmektedir.

RS232C standardından daha yüksek veri transfer hızına ve daha uzun mesafelerde

kullanılmak için tasarlanmıştır ( ≤ 2Mbit / saniye).

Şekil 3.5. RS422 Elektriksel özellikleri

D : Driver (Sürücü) R : Receiver (Alıcı) ZT: Terminal empedansı

Şekil 3.5.’te RS422 standardının elektriksel eşdeğer devresi görülmektedir. Burada

sürücü (driver) D, alıcı R ve alıcı empedansı da ZT ile gösterilmiştir. Terminal empedansı

kablonun karakteristik empedansına (Z0) eşit olarak alınmış ve sadece devrenin sonunda

bir kez kullanılmıştır. Kablo boyunca, A ve B noktalarıyla A’ ve B’ noktaları arasında

sırasıyla 9 adede kadar alıcı (receiver) bağlanabilir.

3.1.3. RS485 Standardı

5 voltluk bir sistemde, şayet birden fazla alıcı isteniyorsa, RS485 uyumlu cihazların

kullanılması tavsiye edilmektedir. 485 standardı bir anda sadece bir sürücüden data (veri)

gönderilmesine müsaade etmekle birlikte, tek bus (ağ) üzerinde çok miktarda alıcı (32

adede kadar) yerleştirilebilir. Şekil 3.6 RS485 standardının elektriksel özelliklerini

göstermektedir.

Şekil 3.6. RS485 elektriksel özellikleri

D1: Driver (sürücü) D3/R3: Transceiver R2: Receiver (alıcı) ZT: Terminal empedansı

15

Şekil 3.5. ile şekil 3.6 karşılaştırıldığında 422 ve 485 sistemlerinin topolojilerinin

farkı açıkça görülmektedir. 485 dengeli çok noktalı sistemlerde çalışabilmekte, buna karşın

422 bir bus (ağ) için yalnızca bir sürücüyü desteklemektedir. RS 485 için belirlenmiş

maksimum kablo uzunluğu 1200 metredir. Tablo 3.4.’te RS485 standardının gerilim

seviyeleri verilmiştir.

Tablo 3.4. RS485 gerilim seviyeleri

UYGULAMA GERİLİMİ

VIA’ VIB’

OLUŞAN GERİLİM

VID

OLUŞAN GERİLİM

VCM

ALICI OUTPUT DURUMU

ÖLÇÜM AMACI

-7 V -6,8 V -200 mV -6,9 V Q -VCM ‘deki minimum VI

+12 V

+11,8 V +200 mV +11,9 V Q +VCM ‘deki

minimum VI

-7 V -2 V -5 V -4,5 V Q -VCM ‘deki minimum VI

+12 V +7 V +5 V +9,5 V Q +VCM ‘deki

minimum VI

3.1.4. SN75176 Seviye Dönüştürücüsü

SN75176, 3 durumlu bir diferansiyel hat sürücüsü ve diferansiyel input hat alıcısı

birleşiminde, bunlardan hangisinin 5 voltluk kaynakta çalıştırılacağını belirler. Sürücü ve

alıcı sırasıyla lojik 1 ve lojik 0 seviyesine sahip olduklarında, doğrusal kontrol

fonksiyonunda olduğu gibi ikisini birlikte harici olarak birleştirir.Sürücünün pasif olduğu

herhangi bir zamanda ağ (bus) üzerinde minimum yüklenme olması için, sürücü çıkışlarının

ve alıcı girişleri ağ üzerinde farklı giriş çıkış portları üzerinde dahili olarak bağlanacak

şekilde tasarlanmıştır. Bu portların özelliği pozitif ile negatif arasında geniş bir gerilim

aralığı sağlar. Çalışma sıcaklığı 0oC ile 70oC arasındadır.

16

Şekil 3.7. SN75176 pin adlandırması

Şekil 3.7.’de SN75176’ya ait pin numaralandırmaları ve tablo 3.5. ve tablo 3.6.’da

da fonksiyon tabloları görülmektedir.

Tablo 3.5. SN75176 fonksiyon tablosu

Tablo 3.6. SN75176’nın giriş gerilimlerine göre çıkış durumları

17

3.2. Analog Dijital Dönüştürücü (ADC)

3.2.1. Analog ve Sayısal (Dijital) Sinyaller)

Elektronikte temel olarak iki işaret vardır: Analog ve sayısal (dijital) sinyaller.

Analog sinyal, herhangi iki uç sınır arasında sonsuz sayıda değer alabilen sinyaldir. 0 oC ile

100oC arasındaki sıcaklık değerleri buna örnek olarak verilebilir. Dijital sinyal ise sadece

belli değerler alabilen sinyaldir. Dijital sistemlere ise bilgisayarlar örnek olarak verilebilir.

Bilgisayarlarda tüm bilgiler 1 ve 0 ile temsil edilir. Örneğin; sinyal var ise 1 ile, sinyal

yoksa 0 ile belirtilir.

Dönüştürücülerin çoğu tarafından üretilen sinyaller analog sinyaller olmasına

rağmen, mikroişlemciler ve mikrobilgisayarlar ile daha ucuz hesaplama gücünün

gelişmesiyle birlikte, çoğu verilerin ve bilgilerin sayısal olarak iletimi ve işlenmesi sayısal

olarak gerçekleştirilmektedir. Sayısal sistemler analog sistemlere göre birtakım avantajlar

sağlamaktadırlar. Sayısal sistemler sinyalin iletilmesi sırasında çok az veri bozulması

problemi yaşarlar ve bu problemler, iletilen verilere basit hata kontrol kodları uygulamak

suretiyle kabul edilebilir seviyeye düşürülür. Analog sistemler yüksek frekans ve düşük

seviyeli sinyallerin işlenmesinde kullanılır.

3.2.1.1. Analog ve Sayısal Sinyallerin Birbirine Dönüşümü

Analog sinyallerin dijital sinyallere dönüştürülmesinde ADC (analog – digital

converter) olarak tanımlanan entegreler kullanılır. ADC’ler çok geniş bir konu olmakla

beraber, projemizin asıl konusu olmadığı için burada genel bir rampa tipi ADC’nin yapısını

anlatmakla yetineceğiz. Projede kullanılan TLC2543 ADC’si ile ilgili detaylı bilgiler ileriki

konuda anlatılacaktır. Ayrıca projede kullanılmadığından Dijital–Analog dönüştürücülere

(DAC) burada değinilmemiştir

Şekil 3.8.’deki devre analog giriş gerilimi ile doğru orantılı olan ve rampa şeklinde

sinyal üreten bir rampa üretecini kullandığı için rampa tipi ADC olarak adlandırılır. Rampa

gerilimi 0’dan başlayarak sabit bir değere kadar artar. Rampa üreteci ise gerilim

karşılaştırıcının beslemesi olan VCC ile çalışır. Devrede analog giriş gerilimi Vi,

karşılaştırıcının evirmeyen ucuna uygulanır. Rampa gerilimi Vr , Vi gerilim seviyesinin

altında iken karşılaştırıcı çıkışı lojik 1’dir. Bu durumda sinyallerin clock üretecinden AND

18

kapısı aracılığıyla sayma devrelerine (register veya kaydedici) geçmesine izin verilir. Vr

gerilimi Vi’ye tam olarak eşit olduğunda karşılaştırıcı çıkışı lojik 0 seviyesine gelir.

Böylece kaydediciye takla (toggle) işleminden sonra gelen clock sinyalleri AND kapısı

çıkışı 0 olduğundan durdurulmuş olur.

Şekil 3.8. Rampa tipi ADC’nin temel çalışma prensibi

Lojik 1 seviyesinin zaman periyodu doğrudan Vi giriş gerilimi ile doğru orantılıdır.

Sadece t1 süresince sayma devreleri takla (toggle) yaptığı için sayma, analog girişin dijital

eşdeğeri olur. Rampa sinyali ve sayma periyodu tekrar başlamadan önce negatife giden

gerilim adımı, kaydediciyi yeniden başlangıç şartlarına kurar (reset işlemi).

3.2.2. TLC2543 ADC’si

3.2.2.1. Yapısı

Projede kullanılan TLC2543C ADC’si kapasitör anahtarlamalı, ardışıl yakın değer

veren tipte, 12 bit çözünürlükte bir ADC’dir. Yapı itibariyle şu özellikleri içerir. 11nalog

giriş, çalışma ısısında 10 µs çevirme süresi, kendine özgü örnekleme ve tutma fonksiyonu,

on chip (çip üzerinde) olarak sistem saati, programlanabilir çıkış veri (data) uzunluğu

özelliklerinden bir kaçıdır.

Yüksek hızlı dönüştürmesi ve çok yönlü kontrol kabiliyetine ek olarak, 11 adet

inputtan veya üç dahili self-test (kendi kendini test etme) geriliminden herhangi birini

seçebilen “on chip” olarak 14 kanal multiplexer’a (çoğullayıcı) sahiptir. Çalışma

sıcaklıkları 0oC ile 70oC arasındadır. TLC2543C ADC’sinin genel görünüşü ve blok

19

diyagramı Şekil 3.9.’de görülmektedir.

a) TLC2543 görünüşü ve pin isimleri

b)

Şekil 3.9. TLC2543C ADC’si. a) görünüşü, b) blok diyagramı

TLC2543C’ye ait pin numaraları ve adlandırmaları tablo 3.7.’de verilmiştir.

20

Tablo 3.7. TLC2543 ADC’sinin pin adlandırmaları

PİN

ADI PİN NO I/O AÇIKLAMA

AIN0 -AIN10 1-9,11, 12 I

Analog giriş. Bu 11 analog sinyal dahili olarak çoklanmış. Sürücü kaynak empedansı 4,1 MHz I/O clock işleminde 50Ω’dan küçük veya eşit olmalı ve 60 pF kapasitanstaki analog input voltaj kabiliyeti daha fazla olmalı.

CS 15 I Chip select. Yüksekten düşüğe (lojik 1’den lojik 0’a) geçişte CS, iç (dahili) sayıcıları (counter), kontrolları, data out, data input ve I/O clock’larını resetler.

DATA INPUT 17 I Seri data (veri) girişi. Dönüştürdükten sonra istenilen analog giriş veya test gerilimi 4 bitlik bir seri adres seçer.

DATA OUT 16 O

EOC 19 O Dönüştürme sonu. EOC, en son I/O clock darbesinin düşen kenarı geldikten sonra lojik 1’den lojik 0’a geçerve dönüştürme tamamlanıp transfer için data okununcaya kadar lojik 0 olarak kalır.

GND 10 I/O CLOCK 18 I REF+ 14 I REF- 13 I Negatif referans gerilimi. VCC 20 Pozitif kaynak gerilimi

3.3. Mikrokontrolör

3.3.1. Mikrokontrolörler ve Mikroişlemciler

Mikroişlemci, kullanıldığı sistemdeki merkezi işlem birimidir. Mikroişlemci,

bulunduğu sistemdeki cihazların çalışmalarını kontrol eder ve sisteme aritmetik ve lojik

işlem yapabilme kapasitesini sağlar. Mikroişlemci, bellekten komut okur, o komuta ait kodu

çözer ve komutu icra eder. Kısaca mikroişlemci komut icra eden yarı iletken bir elektronik

devre elemanıdır. Günümüzde mikroişlemciler genelde bilgisayarlarda kullanılmaktadırlar.

Mikrokontrolör (mikro denetleyici) ise, kısaca bir tümdevre üzerinde üretilen

bilgisayar olarak adlandırılabilir. Bir mikrokontrolör tümdevresinde bulunan hafıza ve

Giriş/Çıkış (I/O) alt sistemleri, mikrokontrolörlerin bir çok uygulama içinde devre üzerinde

gömülü olarak, mikroişlemcilere göre çok daha basit ve ucuz arabirim teknikleriyle, kontrol

amaçlı olarak kullanılmalarını sağlar. Mikrokontrolör uygulamalarına kameralarda ışık ve

odaklama kontrolu, fotokopi ve faks cihazları, otomobillerde motor kontrolu, telefon ve

modem gibi çeşitli haberleşme cihazları ve özel amaçlı olarak tasarlanan bir çok elektronik

kart örnek olarak verilebilir. Bu kadar geniş uygulama alanına sahip olan mikrokontrolörler,

21

tümdevresi üzerinde yer alan çok çeşitli donanım özellikleri sunmaktadır. Bunlardan birkaç

tanesi paralel ve seri I/O portları, zamanlayıcı ve sayıcılar, ADC, RAM, ROM olarak

sıralanabilir.

3.3.2. Microchip PIC Mikrokontrolörleri

Proje, mikrokontrolör içeren bir arabirim kartı olduğu için kart üzerinde

kullanılacak olan mikrokontrolörün seçimi çok önemli bir yer tutmaktadır. Bu projede

Microchip firmasına ait PIC mikrokontrolörünü seçilmiştir. Endüstriyel uygulamalarda en

çok tercih edilen bu mikrokontrolörün en büyük özelliği RISC ( Reduced Instruction Set

Computer = Komut sayısı azaltılmış işlemci) temelli bir işlemci olmasıdır. Bu özelliği ile

toplam 35 adet komutu vardır ve her komut işlevini sadece bir saat çevriminde

tamamlamaktadır. Ayrıca bitsel düzeyde çok rahat işlem yapılabilmesini sağlayan komutları

endüstriyel kontrol uygulamalarında büyük kolaylık sağlamaktadır. Bunların yanında çok

geniş bir mikrokontrolör ürün yelpazesi ile kullanıcının farklı nitelikleri üzerinde taşıyan

kontrolör seçimine olanak tanır. Geliştirilecek olan program herhangi bir mikrokontrolöre

kolayca uyarlanabilir. Ayrıca gelişmiş güç kontrol sistemiyle meydana gelebilecek

parazitlerden en az etkilenen ve bir kilitlenme durumunda watchdog timer özelliği ile kendi

kendini resetleyebilme özelliği bu mikrokontrolörün seçilmesine neden olmuştur.

3.3.2.1. PIC16C63’ün Yapısı

Şekil 3.10. PIC16C63 pin isimlendirmeleri

22

3.3.2.1.1. Osilatör ve Rezonatör

PIC’i çalıştırabilmek için gereken asgari donanım bir osilatörden ibarettir. Osilatör,

bir direnç ve kapasitörden veya bir kristal/seramik rezonatörden oluşabilir. PIC16CXXX

serici mikrokontrolörler dört farklı osilatör modunda çalışabilirler; LP (low power crystal),

XT (crystal /resonator), HS (high speed crystal / resonator) ve RC (resistor / capasitor).

Kullanıcı, bu dört osilatör tipinden herhangi birisini kullanarak konfigürasyon bitlerini

(FOSC0 ve FOSC1) programlayabilir. Kristal osilatör için FOSC0 ve FOSC1 bitlerinin her

ikisinin de lojik 1 yapılması gerekir. Burada, projede kullanıldığından dolayı sadece kristal

osilatör devresi anlatılacaktır.

Şekil 3.11. PIC16CXX için kristal osilatör bağlantı şeması (rezonatör devresi)

Şekil 3.11.’de kristal osilatörün PIC mikrokontrolörüne bağlantısı görülmektedir.

Şekilde görülen C1 ve C2 kapasitörlerin değeri, kullanılan PIC’e ve osilatöre göre

değişmektedir. Tablo 3.8.’de PIC16C63 için C1 ve C2 kapasitörlerinin seçim tablosu

görülmektedir.

Tablo 3.8. Osilatör tipine göre C1 ve C2 ‘nin belirlenmesi

OSİLATÖR TİPİ

KRİSTAL FREKANSI C1 C2

32 kHz 33 pF 33 pF LP 200 kHz 15 pF 15 pF 200 kHz 47-68 pF 47-68 pF 1 MHz 15 pF 15 pF XT 4 MHz 15 pF 15 pF 4 MHz 15 pF 15 pF 8 MHz 15-33 pF 15-33 pF HS 20 MHz 15-33 pF 15-33 pF

23

Tablo 3.8.’e göre 200 kHz’lik bit kristal osilatör için C1 ve C2, 47 ile 68 pF arasında

seçilebilirken, 4 MHz’lik bir osilatör için 15 pF olarak seçilmelidir.

3.3.2.1.2. Reset ve Besleme Devreleri

Mikroişlemcili/mikrokontrolörlü sistemlerde reset devrelerinin kullanılmasının bir

çok avantajı vardır. Bunlardan bazıları şu şekilde sıralanabilir:

ü Program sayacı, I/O ve kontrol registerları gibi belirli registerler için bilinen

bir durumun varlığından emin olunmasını sağlar.

ü Saatin doğru frekansa yerleşmesi için yeterli zamanın verilmesine yardımcı

olur.

ü Şebeke geriliminde herhangi bir sorun olduğu zaman mikrokontrolörün

düzgün olarak yeniden başlayacağından emin olunmasını sağlar.

PIC16CXX mikrokontrolörleri birkaç çeşit reset devresinden birini seçme imkanı

vermektedir. Bunlar:

ð Power on Reset (POR)

ð MCLR Reset (normal çalışma esnasında)

ð MCLR Reset (uyku modunda)

ð WDT (normal çalışma esnasında)

ð Brown Out Reset (BOR)

Bazı registerler hiçbir reset durumundan etkilenmezler. Bunların Power on Reset

(POR) anındaki durumları belli değildir. Bunların dışındaki registerler , yukarıda berlirtilen

reset çeşitlerinden birisiyle karşılaştıklarında resetlenirler. Bir reset işlemi gerçekleştikten

sonra PIC, Program Sayacı’nı önceden belirlenmiş olan bir değere ayarlar. Bu, bilinen bir

program başlama noktasına sahip olduğundan emin olunması için gereklidir. Program

Sayacı reset adresi PIC16CXX serisi için 000H adresidir. PIC16C63 için reset devrelerinin

elektriksel özellikleri tablo 3.7.’de verilmiştir.

24

Tablo 3.9. PIC16C63 Reset devrelerinin elektriksel özellikleri

DC KARAKTERİSTİKLERİ

Karakteristik Sembol Min Tipik (5V 25o) Maks Birimi Açıklama

Kaynak gerilimi VDD 4 - 6 Volt XT, RC ve LP osilatör

modlarında RAM veri tutma gerilimi VDR - 1.5 - Volt

PORsinyalinin VDD’ye oranı. SVDD 0.05 - - Volt/ms

Brown Out Resetgerilimi BVDD 3.7 4 4.3 Volt

Kaynak akımı IDD - 2.7 5 MA XT osilatör frekansı FOSC=4 MHz,VDD= 5.5 V

Brown Out Reset akımı ΔIBOR - 350 425 ΜA BOR aktif, VDD = 5 V

Tablo 3.9.’daki ‘Tipik’ sütununda verilen değerler 5 volt, 25o’deki değerlerdir.

Power on Reset (POR): VDD geriliminin yükselen kenarı geldiği zaman, power on

reset bir darbe üretir. Power on reset devresinin üstün bir tarafı, MCLR/VPP pinine direk

olarak VDD geriliminin uygulanmasıdır.

Brown Out Reset (BOR): konfigürasyon biti BODEN, Brown Out Reset devresini

aktif veya pasif yapabilir. Analog arabirim devresinde PIC16C63 için Brown Out Reset

devresi seçilmiştir. Tablo 3.9.’da bu devrenin elektriksel özellikleri görülmektedir.

3.3.2.1.3. Watchdog Timer

Watchdog Timer’in (WDT) kullanılmasının nedeni, PIC’i veya herhangi bir

işlemciyi bir döngüde kilitlenmekten uzak tutmaktır.Böyle bir durum yazılımda bir hata

veya harici elektriksel kıvılcımlar nedeniyle ortaya çıkabilir. WDT, PIC’e bir çeşit kalp atışı

sağlar ve eğer WDT belirli aralıklarda temizlenmezse bu kalp atışları PIC’i reset olmaya

zorlar.

Watchdog Timer’in normal çalışma süresi, 25Co’de 5V’luk bir kaynakla beslendiği

zaman 18 ms’dir. Fakat, sıcaklık, kaynak gerilimi (VDD) devre elemanlarından kaynaklanan

25

işlem değişkenleri gibi sebeplerle bu değer değişebilir. Eğer Time out değeri istenenden

daha uzun olursa, prescaler değeri 1:28 oranında bölünerek OPTION registerine yazmak

suretiyle WDT yazılımla kontrol edilebilir. Böylece zaman aşımı (Time Out) periyodu 2.5

saniyede gerçekleştirilmiş olur. Watchdog Timer ayarlanmış, zaman aşımı devre dışı

bırakılmış ve cihaz reset durumu üretmiş ise, CLRWDT ve SLEEP komutları Watchdog

Timer’i temizler.

Şekil 3.12. Watch Dog Timer Blok Diyagramı

Herhangi bir zamanda bir reset işlemi gerçekleşirse, STATU registerindeki iki bit

resetin nedenini gösterir. Bu bitler TO ve PD (Time Out ve Power Down) bitleridir.

TO PD Reset Nedeni

0 0 WDT, SLEEP (uyku) modundan çıkmıştır.

0 1 WDT, SLEEP haricinde zaman aşımına uğramıştır.

1 0 SLEEP durumundayken harici reset (WDT kapalı)

1 1 Açılma durumu.

Reset gerçekleştikten hemen sonra bu bitlerin incelenmesiyle, program nasıl

davranacağını ve nereye dallanacağını belirler.

26

3.3.2.1.4. I/O (Giriş / Çıkış) Portları

PIC mikrokontrolörlerindeki bazı pinler, cihazın çevre birimlerinin özelliklerine

değişik fonksiyonlar yükleyebilmek için I/O portları olarak ayrılmıştır. Genellikle bir çevre

birim girilirse, bu pinler genel amaçlı I/O pini olarak kullanılamaz.

PORTA ve TRISA Registeri: Tüm PIC mikrokontrolörlerinde 6 bit genişliğinde

PORTA registeri bulunur. RA4/T0CK1 pini Schmitt Trigger girişi ve Open Drain çıkışıdır.

Diğer tüm pinler TTL giriş seviyesindedirler ve hepsi CMOS output sürücüleridir. Tablo

3.8.’de PORTA registerinin fonksiyonları görülmektedir.

Tablo 3.10. PORTA Fonksiyonları.

İsim Bit No Buffer Tipi Fonksiyon

RA0 Bit 0 TTL Giriş/Çıkış

RA1 Bit 1 TTL Giriş/Çıkış

RA2 Bit 2 TTL Giriş/Çıkış

RA3 Bit 3 TTL Giriş/Çıkış

RA4/T0CK1 Bit 4 ST Timer0 için giriş/çıkış veya harici saat girişi. Çıkış open drain tiptedir.

RA5/SS Bit 5 TTL Giriş/Çıkış veya senkron seri port için ikincil giriş seçimi.

PORTB ve TRISB Registeri: PORTB, 8bitlik çift yönlü bir porttur. Data yönleri

TRISB’ye kaydedilir. Herhangi bir bit giriş olarak set edildiğinde, TRISB, o bit için çıkış

sürücüsünü yüksek empedans moduna getirir.

PORTB pinlerinin hepsinde dahili olarak pull-up dirençleri vardır. Pull-up’lar tek bir

kontrol biti ile on konumuna getirilebilirler. Şayet pinler çıkış olarak ayarlanmışlarsa pull-

up’lar otomatik olarak off konumuna gelirler. Buradaki önemli bir nokta, pull-up

irençlerinin Power on Reset (POR) anında kullanılamadıklarıdır.

27

Tablo 3.11. PORTB Fonksiyonları

İsim Bit No Buffer Tipi Fonksiyon

RB0/INT Bit 0 TTL/ST Giriş/Çıkış veya harici interrupt girişi.

RB1 Bit 1 TTL Giriş/Çıkış RB2 Bit 2 TTL Giriş/Çıkış RB3 Bit 3 TTL Giriş/Çıkış RB4 Bit 4 TTL Giriş/Çıkış RB5 Bit 5 TTL Giriş/Çıkış RB6 Bit 6 TTL/ST Giriş/Çıkış RB7 Bit 7 TTL/ST Giriş/Çıkış

Eğer RB0 pini harici interrupt pini olarak kullanılırsa, bu pin için buffer olarak

Schmitt Trigger seçilir. Yine aynı şekilde RB6 ve RB7 pinleri seri programlama modunda

kullanılırsa, bu pinler için de buffer olarak Schmitt Trigger seçilir.

PORTC ve TRISC Registeri: PORTC de 8 bit çift yönlü porttur. Her bir pin

bağımsız olarak TRISC registeri içerisinde giriş veya çıkış olarak düzenlenebilir. PORTC

pinlerinde Schmitt Trigger giriş buffer’i kullanılır. PORTC, birkaç tane çevresel fonksiyon

ile çoklanmıştır. Tablo 3.12. PORTC Fonksiyonları

İsim Bit No

Buffer Tipi Fonksiyon

RCO/T1OSO/T1CKI Bit 0 ST Giriş/Çıkış, Timer1 osilatör çıkışı veya Timer1 saat girişi

RC1/T1OSI/CCP2 Bit 1 ST Giriş/Çıkış, Timer1 osilatör girişi, Capture2 girişi/Compare2 çıkışı/PWM2 çıkışı

RC2/CCP1 Bit 2 ST Giriş/Çıkış, Capture1 girişi/Compare1 çıkışı/PWM1 çıkışı

RC3/SCK/SCL Bit 3 ST SPI ve I2C modlarında senkron saat darbeleri yapar.

RC4/SDI/SDA Bit 4 ST SPI modu için SPI data girişi, I2C modu için data çıkışı

RC5/SDO Bit 5 ST Giriş/Çıkış veya senkran seri data çıkışı

RC6/TX/CK Bit 6 ST Giriş/Çıkış veya USART asenkron gönderme pini

RC7/RX/DT Bit 7 ST Giriş/Çıkış veya USART asenkron alma pini

28

Yukarıda açıklanan portlardan hariç iki tane daha port (PORTD ve PORTE) vardır,

fakat bu portlar PIC16C63’te bulunmadığı için burada sadece isimleri verilerek geçilmiştir.

3.3.2.2. Bellek Organizasyonu

Mikrolontrolörlerde bellek organizasyonu, program bellek organizasyonu ve data

bellek organizasyonu olmak üzere iki bölüm altında incelenebilir.

Program Bellek Organizasyonu: PIC16C6X serisi mikrokontrolörler 13 bit

program bellek kapasitesine sahiptirler. PIC16C63 mikrokontrolörü 4K x 14 program

belleği mevcut. Bu cihazlar için reset vektörü 0000h ve interrupt vektörü ise 0004h

adresinde bulunur. Şekil 3.12’de PIC16C63 için bellek haritası (memory map) ve yığının

(stack) şeması görülmektedir.

Şekil 3.13. PIC16C63 için bellek haritası ve yığın

29

Data Bellek Organizasyonu: Data bellek, genel amaçlı registerları ve özel

fonksiyon registerlarıni içeren banklara ayrılmıştır. RP0 ve RP1 bitleri bank seçim

bitleridir. Her bir bank için 7Fh, yani 128 byte alan ayrılmıştır.

RP1:RP0

0 0 : Bank0

0 1 : Bank1

1 0 : Bank2

1 1 : Bank3

Genel amaçlı registerlar, direkt veya endirekt olarak dosya seçim registerlarıdir.

Özel fonksiyon registerları,cihazlarda istenilen işlemlerin kontrol edilebilmeleri için, CPU

ile ve çevre birimlerle kullanılan registerlardır. Şekil 3.14.’te register dosya haritası

(register file map) şeması görülmektedir.

30

Şekil 3.14. Register adresleri

3.3.2.3. PIC16C63 Komut Seti

PIC16CXX mikrokontrolörlerinin komutları, bir OPCODE içinde14 bitlik

kelimelere bölünmüştür. Komutlar, byte yönlendirmeli, bit yönlendirmeli ve kontrol

komutları olmak üzere üç ana bölümde incelenebilir. Byte yönlendirmeli komutlarda “f (file

register)” ve “d (destination)” olmak üzere iki parametre vardır. F parametresi bilginin

31

alınacağı yeri veya bilgiyi temsil etmekte, d parametresi ise işlem sonucunun yazılacağı

hedef bölgeyi temsil etmektedir. Şayet d parametresine sıfır değeri verilirse, sonucun

yazılacağı yer W registeridir. Sıfırdan farklı bir değer verilirse, sonuç komutta belirtilen

registere yazılır. Bunun yanında bit yönlendirmeli komutlarda “b” parametresi ve kontrol

komutlarında “k” parametresi kullanılır. OPCODE’ların tanımlamaları tablo 3.13.’de ve

komut formatı da şekil 3.15.’te gösterilmiştir.

Tablo 3.13. PIC16C63 mikrokontrolör komutları için OPCODE tanımlamaları

OPCODE Açıklama F Register adresi (0x00’dan 0x7F’e kadar) W Akümülatör B 8 bitlik bir register içindeki bir bit adresi K Sabit değerli veri veya etiket X Tanımlanmamış alan

D Hedef seçimi; d=0 ise işlem sonucu w registerine, d=1 ise işlem sonucu f registerine kaydedilir.

label Etiket ismi TOS Yığının en üst seviyesi PC Program Counter

PCLATH Program counter yüksek 4 bit tutucusu GIE İnterrupt giriş biti

WDT Watchdog Timer TO Zaman aşım biti PD Kapatma dest Hedef register adresleri [ ] Opsiyonlar ( ) Parantez ayracı → Atama < > Register bit alanları

32

Şekil 3.15. PIC komutlarının yazılış formatı

PIC mikrokontrolörlerinin komutları aşağıda sırasıyla açıklanmıştır.

ADDLW (Add Literal and W): 8 bitlik k değeri ile W registerinin içeriğini

toplayarak sonucu yine W registerine yazar. Burada k 0 ile 255 arasında değer alabilir.

Komutun yazılışı: [etiket] ADDLW k

İşlem: (W) + k → (W)

Komutun OPCODE formatı:

Örnek:

ADDLW 0x15

Komuttan önce W registerinin içeriği 0x10 ise, komuttan sonra W içeriği 0x25 olur.

ANDLW (And Literal With W): 8 bitlik k değerini W registerinin içeriği ile AND

işlemine tabi tutar ve sonucu W registerine yazar. K’nın değeri 0 ile 255 arasında olabilir.

33

Komutun yazılışı: [etiket] ANDLW k

İşlem: (W) AND (k) → (W)

Komutun OPCODE formatı:

Örnek:

ANDLW 0x5F

Komuttan önce W registerinin içeriği 0xA3 ise komuttan sonra w içeriği 0x03 olur.

ADDWF (Add W and f): W registerinin içeriği ile f registerinin içeriğini toplar. F,

0 ile 127 arasında değer alabilir, d ise 0 veya 1 olabilir.eğer d=0 olursa sonuç W registerine,

d=1 olursa, d’den sonra belirtilen f adresine yazılır.

Komutun yazılışı: [etiket] ADDWF f,d

İşlem: (W) + (f) → (belirtilen registere)

Komutun OPCODE formatı:

Örnek:

ADDWF FSR, 0

Komuttan önce W içeriği 0x17, FSR içeriği 0xC2 olsun. Komuttan sonra W içeriği

0xD9 ve FSR içeriği 0xC2 olur.

ANDWF (And W with f): W registerinin içeriği ile f registerinin içeriğini AND

işlemine tabi tutar. Burada da yine f 0 ile 127 arasında değer alabilirken, d 0 veya 1 olabilir.

Eğer d=0 ise sonuç W registerine, d=1 ise sonuç belirlenen adrese yazılır.

Komutun yazılışı: [etiket] ANDWF f,d

İşlem: (W) AND (f) → (belirtilen registere)

Komutun OPCODE formatı:

Örnek:

ANDWF FSR,1

Komuttan önce W içeriği 0x17, FSR içeriği 0xC2 iken komuttan sonra W içeriği

0x17, FSR içeriği 0x02 olur.

BCF (Bit Clear f): f registeri içerisindeki belirlenen bitleri temizler, yani sıfır yapar.

F değeri 0 ile 127 arasında olabilirken, b değeri o ile 7 arasında olabilir.

34

Komutun yazılışı: [etiket] BCF f,b

İşlem: 0 → (f<b>)

Komutun OPCODE formatı:

Örnek:

BCF FLAG_REG, 7

Komuttan önce FLAG_REG registerinin içeriği 0xC7 iken komuttan sonra 0x47

olur.

BTFSC (Bit Test, Skip if Clear): f registerinin içerisindeki b bitini test eder. Eğer

bit 1 ise komutu izleyen sonraki komuta geçer, eğer bit 0 ise izleyen komutu atlayarak daha

sonraki komuta geçer. F, 0 ile 127 arasında, b ise 0 ile 7 arasında değer alabilir.

Komutun yazılışı: [etiket] BTFSC f,b

İşlem: skip if (f<b>) = 0

Komutun OPCODE formatı:

Örnek:

Basla BTFSC FLAG,1

Yanlis GOTO Son

Dogru .........

.........

Komuttan önce Program Counter’in (PC) değeri “Basla” adresidir. Komuttan sonra;

şayet FLAG adresindeki birinci bit 0 ise Program Counterin değeri “Dogru” adresini alır,

FLAG registerindeki birinci bit 1 ise, o zaman Program Counterin değeri “Yanlis” adresini

gösterir.

BSF (Bit Set f): f registerinin içindeki b bitini set eder, yani 1 yapar. F, 0 ile 127

arasında, b ise 0 ile 7 arasında değer alabilir.

Komutun yazılışı: [etiket] BSF f,b

İşlem: 1 → (f<b>)

Komutun OPCODE formatı:

35

Örnek:

BSF FLAG_REG, 7

Komuttan önce FLAG_REG içeriği 0x0A ise, komuttan sonra 0x8A olur.

BTFSS (Bit Test f, Skip if Set): f registerinin içerisindeki b bitini test eder, eğer bit

0 ise komutu izleyen sonraki komuta geçer, eğer bit 1 ise bir komut atlayarak daha sonraki

komuta geçer. F, 0 ile 127 arasında değer alırken b,0 ile 7 arasında değer alabilir.

Komutun yazılışı: [etiket] BTFSS f,b

İşlem: skip if (f<b>) = 1

Komutun OPCODE formatı:

Örnek:

Basla BTFSC FLAG,1

Yanlis GOTO Son

Dogru .........

.........

Komuttan önce Program Counter’in (PC) değeri “Basla” adresidir. Komuttan sonra;

şayet FLAG adresindeki birinci bit 1 ise Program Counterin değeri “Dogru” adresini alır,

FLAG registerindeki birinci bit 0 ise, o zaman Program Counterin değeri “Yanlis” adresini

gösterir.

CALL (Call Subroutine): Alt program çağırma komutudur. K değeri 0 ile 2047

arasında değer alabilir. CALL komutuyla, Program Counterin değerine 1 eklenerek Bu

değer STACK’e (yığına) kaydedilir. 11 bitlik adresleme, Program Counter’in sıfır ile

onuncu bitleri arasına yüklenir.

Komutun yazılışı: [etiket] CALL k

İşlem: (PC) + 1 → TOS (TOS: Top on Stack)

K → PC <10:0>

Komutun OPCODE formatı:

Örnek:

Basla CALL Altprg

36

Komuttan önce Program Counter’in değeri “Basla” adresi iken komuttan sonra

“Altprg” olur.

CLRF (Clear f): f registeri içerisindeki tim bitlerin değerini sıfır yapar ve Zero

(sıfır) bitini 1 yapar. F, 0 ile 127 arasında değer alabilir.

Komutun yazılışı: [etiket] CLRF f

İşlem: 00h → (f)

1 → Z

Komutun OPCODE formatı:

Örnek:

CLRF FLAG_REG

Komuttan önce FLAG_REG registerinin içeriği 0x5A ise, komuttan sonra 0x00

olur. Z (zero) biti ise 1 olur.

CLRW (Clear W): W registerinin içeriğini temizler (tüm bitleri 0 yapar), Zero biti (Z) 1

olur.

Komutun yazılışı: [etiket] CLRW

İşlem: 00h → (W)

1 → Z

Komutun OPCODE formatı:

Örnek:

CLRW

Komuttan önce W içeriği 0x5A ise, komuttan sonra 0x00 olur, Zero (Z) biti 1 olur.

CLRWDT (Clear Watchdog Timer): Watchdog Timer’i resetler. WDT, önceden

ayarlanan değerine gelir. Durum bitleri TO ve PD set olur.

Komutun yazılışı: [etiket] CLRWDT

İşlem: 00h → WDT

0 → WDT ön değeri

1 → TO

1 → PD

37

Komutun OPCODE formatı:

Örnek:

CLRWDT

Komuttan önce WDT herhangi bir değerde iken komuttan sonra WDT’nin değeri

00h olur, WDT ön değeri 0, TO ve PD ise 1 olur.

COMF (Complement f): f registerinin içerisindeki bilgilerin tümleyenini alır.

Parmetre olarak f ve d kullanılır. F, 0 ile 127 arasında değer alabilirken d, 0 veya 1 olabilir.

Eğer d=0 ise işlem sonucunu W registerine, d=1 ise sonucu f registerine kaydeder.

Komutun yazılışı: [etiket] COMF f,d

İşlem: ( f ) → (belirlenen hedefe)

Komutun OPCODE formatı:

Örnek:

COMF REG1,0

Komuttan önce REG1 registerinin içeriği 0x13 ise komuttan sonra REG1’in içeriği

yine 0x13 olurken, W’nun içeriği 0xEC olur.

DECF (Decrement f): f registerinin içindeki bilgiyi 1 azaltır. Yibe burada da d ve f

parametreleri vardır. D, 0 veya 1 olabilirken, f, 0 ile 127 arasında olabilir.

Komutun yazılışı: [etiket] DEC f,d

İşlem: ( f ) - 1 → (belirlenen hedefe)

Komutun OPCODE formatı:

Örnek:

DECF CNT,1

Komuttan önce CNT’nin içreiği 0x02 ise, komuttan sonra komuttan sonra CNT’nin

içeriği 0x01 olur.

DECFSZ (Decrement f, Skip if 0): f registerinin içeriğinden 1 çıkarır. Eğer d=0 ise

sonucu W’ye, d=1 ise sonucu belirtilen f registerine kaydeder. İşlem sonucu 0 çıkarsa

sonraki komutu işletmeden geçer ve ondan sonraki komutu işletir. d ve f parametrelerinin

değerleri burada da aynıdır.

38

Komutun yazılışı: [etiket] DECFSZ f,d

İşlem: ( f ) - 1 → (belirlenen hedefe)

Komutun OPCODE formatı:

Örnek:

BASLA DECFSZ CNT,1

GOTO DONGU

DEVAM ..........

..........

Komuttan önce Program Counter’in değeri BASLA adresidir. Komuttan sonra

CNT=CNT-1 olur. İşlemin sonucu 0 ise Program Counter’in değeri DEVAM adresini

gösterir. İşlem sonucu =’dan farklı çıkarsa Program Counter’in değeri BASLA’dan bir

sonraki komutun adresidir.

GOTO (Unconditional Branch): Koşulsuz dallanma komutudur. Komutun

parametresi k, 0 ile 2047 arasında değer alabilir. 11 bitlik adresleme, Program Counter’in

sıfır ile onuncu bitleri arasına yüklenir.

Komutun yazılışı: [etiket] GOTO k

İşlem: k → PC <10:0>

Komutun OPCODE formatı:

Örnek:

GOTO SON

Komuttan sonra Program Counter’in değeri SON adresini gösterir.

INCF (Increment f): f regsiterinin içeriğini 1 artırır. F, 0 ile 127 arasında, d ise 0

veya 1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.

Komutun yazılışı: [etiket] INCF f,d

İşlem: ( f ) + 1 → (belirlenen adrese)

Komutun OPCODE formatı:

Örnek:

INCF CNT,1

39

Komuttan önce CNT içeriği 0x90 ise komuttan sonra CNT içeriği 0x9A olur.

INCFSZ (Increment f, Skip if 0): f registerinin içeriğini 1 artırır. Eğer d=0 ise

sonucu W’ye, d=1 ise sonucu belirtilen f registerine kaydeder. İşlem sonucu 0 çıkarsa

sonraki komutu işletmeden geçer ve ondan sonraki komutu işletir. d ve f parametrelerinin

değerleri burada da aynıdır.

Komutun yazılışı: [etiket] DECFSZ f,d

İşlem: ( f ) - 1 → (belirlenen hedefe)

Komutun OPCODE formatı:

Örnek:

BASLA INCFSZ CNT,1

GOTO DONGU

DEVAM ..........

..........

Komuttan önce Program Counter’in değeri BASLA adresidir. Komuttan sonra

CNT=CNT-1 olur. İşlemin sonucu 0 ise Program Counter’in değeri DEVAM adresini

gösterir. İşlem sonucu =’dan farklı çıkarsa Program Counter’in değeri BASLA’dan bir

sonraki komutun adresidir.

IORLW (Inclusive OR Literal with W): W registerinin içeriğini 8 bitlik k değeri

ile OR işlemine tabi tutar. İşlemin sonucunu W registerine kaydeder. k, 0 ile 255 arasında

değer alabilir.

Komutun yazılışı: [etiket] IORLW k

İşlem: ( W) OR k → (W)

Komutun OPCODE formatı:

Örnek:

IORLW 0x35

Komuttan önce W’nun içeriği 0x9A ise, komuttan sonra 0xBF olur.

40

IORWF (Inclusive OR with f): W registerinin içeriği ile f registerinin içeriğini OR

işlemine tabi tutar. d=0 ise sonuç W registerine, d=1 ise sonuç f registerine kaydedilir. f, 0

ile 127 arasında, d ise 0 veya 1 arasında değer alabilir.

Komutun yazılışı: [etiket] IORWF f,d

İşlem: ( W) OR (f) → (Belirtilen adrese)

Komutun OPCODE formatı:

Örnek:

IORWF SONUC,0

Komuttan önce SONUC=0x13, W=0x91 ise, komuttan sonra SONUC=0x13,

W=0x93 olur.

MOVF (Move f): W registerinin içeriğini d parametresine bağlı olarak belirtilen

hedefe kopyalar. d=0 ise hedef W, d=1 ise hedef f registerinin kendisidir.

Komutun yazılışı: [etiket] MOVF f,d

İşlem: (f) → (Belirtilen adrese)

Komutun OPCODE formatı:

Örnek:

MOVF FSR,0

Komuttan sonra FSR’nin içeriğini W’ya kopyalar.

MOVLW (Move Literal to W): 8 bitlik k değerini W registerine yükler. k, 0 ile

255 arasında değer alabilir.

Komutun yazılışı: [etiket] MOVLW k

İşlem: k → (W)

Komutun OPCODE formatı:

Örnek:

MOVLW 0x5A

Komuttan sonra W içeriği 0x5A olur.

MOVWF (Move W to f): W registeri içerisindeki veriyi f registerine kopyalar. f, 0

ile 127 arasında değer alabilir.

41

Komutun yazılışı: [etiket] MOVWF f

İşlem: (W) → ( f )

Komutun OPCODE formatı:

Örnek:

MOVWF OPTION

Komuttan önce OPTION içeriği 0xFF, W içeriği 0x4F ise, komuttan sonra OPTION

içeriği 0x4F, W içeriği 0x4F olur.

NOP (No Operation): Bu komut geldiğinde mikrokontrolör 1 çevrim zamanı işlem

yapmaz.

Komutun yazılışı: [etiket] NOP

İşlem: Yok

Komutun OPCODE formatı:

Örnek:

NOP

OPTION (Load Option): W registerinin içeriğini OPTION registerinin içerisine

kopyalar.

Komutun yazılışı: [etiket] OPTION

İşlem: ( W ) → OPTION

Komutun OPCODE formatı:

RETFIE (Return from Interrupt): İnterruptan ana programa dönüş komutudur.

Stack’ın en üstündeki bilgi (TOS) Program Counter’e yüklenir ve interrupt biti (GIE) aktif

edilir.

Komutun yazılışı: [etiket] RETFIE İşlem: TOS → PC 1 → GIE

Komutun OPCODE formatı:

Örnek:

RETFIE

42

RETLW (Return with Literal): 8 bitlik k değerini W registerine yükler. k, 0 ile

255 arasında değer alabilir. TOS’taki bilgi Program Counter’e yüklenir.

Komutun yazılışı: [etiket] RETLW k

İşlem: k → (W)

TOS → PC

Komutun OPCODE formatı:

Örnek:

CALL TABLE

......

......

TABLE ADDWF PC

RETLW k1

RETLW k2

...........

...........

RETLW kn

Komuttan önce W’nun içeriği 0x07 ise, komuttan sonra 8 bitlik k değeri olur.

RETURN (Return from Subroutine): Alt programdan ana programa dönüş

komutudur. Stack’ın en üstündeki bilgi Program Counter’e yüklenir.

Komutun yazılışı: [etiket] RETURN

İşlem: TOS → PC

Komutun OPCODE formatı:

Örnek:

RETURN

Komuttan sonra Program Counter (PC)=TOS olur.

RLF (Rotate Left f through Carry): f registerinin içindeki bilgileri Carry Flag

üzerinden bir bit sola kaydırır. f ve d bu komutun parametreleri olup 0 ≤ f ≤ 127 olurken

d=0 veya d=1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.

43

Komutun OPCODE formatı:

Örnek:

RLF REG1,0

Komuttan önce REG1=1110 0110 ve Carry Falg(C)=0 olsun. Komuttan sonra

REG1=1110 0110durumunu korurken W=1100 1100 ve C=1olur.

RRF (Rotate Right f through Carry): f registerinin içindeki bilgileri Carry Flag

üzerinden bir bit sağa kaydırır. f ve d bu komutun parametreleri olup 0 ≤ f ≤ 127 olurken

d=0 veya d=1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.

Komutun OPCODE formatı:

Örnek:

RRF REG1,0

Komuttan önce REG1=1110 0110 ve Carry Falg(C)=0 olsun. Komuttan sonra

REG1=1110 0110 durumunu korurken W=0111 0011 ve C=0 olur.

SLEEP: Bu komutla power-down durum biti 0 yapılırken, time-out durum biti set

edilir (1 yapılır). WDT’nin değeri sıfırlanır. Mikrokontrolör sleep modunda iken osilatör

çalışmasını durdurur.

Komutun yazılışı: [etiket] SLEEP

İşlem: 00h → WDT

1 → TO

0 → PD

Komutun OPCODE formatı:

44

Örnek:

SLEEP

SUBLW (Substract W from Literal): W registerinin içerisindeki bilgi 2’ye

tümleyen metoduna göre 8 bitlik k sayısından çıkarılır. Sonuç W’ya yazılır. K, 0 ile 255

arasında değer alabilir.

Komutun yazılışı: [etiket] SUBLW k

İşlem: k – ( W ) → (W)

Komutun OPCODE formatı:

Örnek:

SUBLW 0x02

Komuttan önce W=2 ise komuttan sonra W=1, Z=0 ve C=1 olur. C’nin 2 olması

sonucun pozitif olduğu anlamına gelir.

SUBWF (Substract W from f): W registerinin içeriğini 2’ye tümleyen metoduna

göre f registerindeki bilgiden çıkarır. d parametresi 0 girilirse sonuç W’ye, d=1 girilirse

sonuç f’e kaydedilir.

Komutun yazılışı: [etiket] SUBWF f,d

İşlem: ( f ) – ( W ) → (Belirtilen adrese)

Komutun OPCODE formatı:

Örnek:

SUBWF REG1,1

Komuttan önce REG1 içerisinde 3, W içerisinde 2 bulunsun. Komuttan sonra W

içerisinde hala 2 bulunurken f içerisindeki bilgi 1 oldu. Z=0 ve C=1 olur (sonuç pozitif

olduğu için)

SWAPF (Swap Nibbles in f): f registeri içerisindeki 0’dan 3’e kadar olan bitlerle

4’ten 7’ye kadar olan bitlerin yerlerini değiştirir. d=0 ise sonuç W2ya, d=1 ise sonuç f’e

kaydedilir. f, 0 ile 127 arasında değer alabilir.

45

Komutun yazılışı: [etiket] SWAPW f,d

İşlem: ( f<3:0> ) → ( belirtilen adreste <7:4> )

( f<4:7> ) → ( belirtilen adreste <3:0> )

Komutun OPCODE formatı:

Örnek:

SWAPF REG,0

Komuttan önce REG içerisinde 0xA5 varsa komuttan sonra REG içerisinde yine

0xA5 olur fakat W içerisinde 0x5A olur.

TRIS (Load TRIS Register): W içeriğini f registerindeki TRIS’e kopyalar. f

burada 5 ile 7 arasında değer alabilir.

Komutun yazılışı: [etiket] TRIS f

İşlem: ( W ) → TRIS register f

Komutun OPCODE formatı:

XORLW (Exlusive OR Literal with W): W registeri ile 8 bitlik k sayısını XOR

işlemine tabi tutar. Sonuç W içerisine kaydedilir. k, 0 ile 255 arasında değer alabilir.

Komutun yazılışı: [etiket] XORLW k

İşlem: ( W ) XOR k → ( W )

Komutun OPCODE formatı:

Örnek:

XORLW 0xAF

Komuttan önce W içerisinde 0xB5 varsa, komuttan sonra W içerisinde 0x1A olur.

XORWF (Exlusive OR W with f): W registeri ile f registerinin içeriğini XOR

işlemine tabi tutar. Sonucu d parametresinin durumuna göre W’ye ya da f’e kaydeder. d=0

ise W’ya, d=1 ise f’e kaydeder. f, 0 ile 127 arasında değer alabilir.

Komutun yazılışı: [etiket] XORWF f,d

İşlem: ( W ) XOR ( f ) → ( Belirtilen adrese )

Komutun OPCODE formatı:

46

Örnek:

XORWF REG,1

Komuttan önce REG=0xAF ve W=0xB5 olsun. Komuttan sonra REG=0x1A,

W=0xB5 olur.

4. PIC16C63’ÜN PROGRAMLANMASI

PIC Mikrokontrolörü programlamak için önce yapılacak için birtakım ek cihaz

ve programlara gereksinim vardır. Bunlar; Microchip firmasının PIC mikrokontrolör

program geliştirme ve simülasyonu için kullanılan MPLAB – IDE programı, geliştirilen

programın mikrokontrolöre yüklenmesi içi PIC programlayıcı devre ve bu devrenin

yazılımı olarak sıralanabilir. Bu aşamadan sonra yazılacak programın tasarlanması

gerekmektedir. Yazılacak olan PIC programını tasarlayabilmek için önce akış

diyagramını oluşturmak programın geliştirilmesi aşamasında büyük kolaylık sağlar.

Oluşturulan akış diyagramı şekil 4.1’de görülmektedir.

Şekil4.1.Analog arabiri kartının akış diyagramı

başla

hazırla

seri sortu oku

adres aynı mı

komut ve kanal

oku

komutun gereğini

yap

48

Akış diyagramının açıklanması:

Hazırla :Bu aşamada PIC, kart üzerindeki birimlere bağlı olan bacakların

durumlarına göre ilgili registerlarında düzenlemeler yapar, seri haberleşme için

zamanlayıcıları ayarlar ve kart adresini okur.

Seri port oku : Bu aşamada, seri port daima okunur ve gelen veriler registerlara

kaydedilir.

Adres aynı mı : Bu aşamada seri porttan okunan adres bilgisi karttan okunan

adres bilgisi ile karşılaştırılır. Eğer adres bilgisi aynı değilse seri port okuma işlemine

geri dönülür. Aynı ise bir sonraki işlem gerçekleştirilir.

Komut ve kanal oku : Adres bilgisinin aynı olması durumunda porttan gelecek

ikinci veri beklenir. Bu veri alındıktan sonra içerdiği komut ve kanal bilgisi ilgili

registerlara kaydedilir.

Komutun gereğini yap : Okunan komut bilgisi çeşitli karşılaştırmalardan

geçerek komutun gerektirdiği alt rutinler çağırılır. Yapılması gereken işlemler

tamamlandıktan sonra seri port okumasına geri dönülür.

Bu akış diyagramına uygun olarak yazılan PIC programı EK1’de verilmiştir.

5. MONİTÖR PROGRAMI

5.1. Programın Kurulması

Analog arabirim kartından elde edilen değerleri okuyabilmek ve maksimum,

minimum değer karşılaştırmalarını yapabilmek için monitör programına gereksinim

vardır. Delphi 4.0 Professional programlama dilinde geliştirilen bu programı kurabilmek

için proje cd’sinde bulunan monitör alt klasöründeki setup.exe kurulum programının

çalıştırılması gerekir. Program çalıştırıldıktan sonra monitör ile ilgili genel açıklama

yazısı çıkar. Next butonuna tıklandığında bir sonraki adım olan programın kurulacağı

klasör seçimini gösteren pencere ekrana gelir. Buradan istenirse kurulum klasörü

değiştirilebilir. Değişiklik yapılmadan Next butonuna tıklandığında program varsayılan

“Program Files\Monitör” klasörüne kurulacaktır. Bir sonraki aşamada ise programlar

menüsündeki yerinin belirtilmesi istenecektir. Yine bir değişiklik yapılmadan Next

butonuna tıklandığında varsayılan “Monitör” klasörü açılacaktır. Program dosyaları

kopyalanmadan önceki son aşamada kurulum tipi, hedef klasör ve kullanıcı bilgilerinin

bulunduğu bir açıklama penceresi ekrana gelecektir. Bu adımda Next butonuna

basıldığında program dosyaları varsayılan yada seçilen klasöre kopyalanmaya başlanır.

Kopyalama işlemi sona erdikten sonra kurulumun bittiğini gösteren son adım penceresi

ekrana gelir. Buradaki checkbox işaretlenerek Finish butonuna tıklandığında korulan

Monitör programı otomatik olarak çalıştırılacaktır. Bu aşamada program kurulumu

tamamlanmıştır. Programı çalıştırmak için programlar menüsündeki klasör

değiştirilmediyse, Start>Program Files>Monitör>Monitör yolu kullanılarak program

çalıştırılır.

5.2. Monitör Programına Genel Bakış

Program temel olarak bir ana pencereden ve bu pencere içerisinde Proses, Alarm

ve Sistem isimli üç adet alt pencereden oluşmaktadır. Proses penceresinde kartlardan

okunan veriler değişik gösterim şekilleriyle izlenebilir. Alarm penceresinde ise

50

meydana gelen alarm durumları kaydedilir. Sistem penceresinde, kartların

çalışmalarının incelenmesi ve sistem analizi ile ilgili işlemler yapılabilir. Ana pencerede

bulunan Kartlar menüsünde, Kartlarla ilgili işlemlerin yapılabileceği seçenekler

bulunur. İletişim menüsünde ise bağlantının kurulması ve seri port ayarlarının

yapılmasını sağlayan seçenekler bulunur. Pencere menüsünde alt pencerelerin

konumlandırılmaları ve seçilmelerini sağlayan seçenekler mevcuttur. Çıkış menüsünde

ise çıkış ve program hakkında kısa bilgi içeren seçenekler vardır.

5.3. Monitör Programının Tanıtılması

5.3.1. Kartlar Menüsü

Programın ana penceresinde bulunan menülerden Kartlar menüsünde kartlarla

ilgili işlemlerin yapılabileceği seçenekler yer alır. Bunlar; Kartları doğrula ve Kayıt

defteri seçenekleridir.

5.3.1.1. Kartları Doğrula Seçeneği Kartları Doğrula seçeneği, sistem ilk defa kuruluyorsa veya eklenen, çıkarılan

kart varsa veya herhangi kartın adresinin değiştirilmesi halinde kullanılması gereken bir

seçenektir. Bu seçenek seçildiğinde mevcut bir veri akışı varsa durdurulur, bağlantı

yoksa bağlantı kurulur ve tüm kartlar taranır. Seri port veri iletişiminin bir özelliği olan

51

ve her kartın cevap verebilmesi için bir süre bekleme yapıldığından bu işlem birkaç

dakika sürebilir. Tarama sırasında bulunan kartlar listelenir, Bu işlem aynı zamanda kart

kayıt dosyasında her karta ait durum bilgisini yeniler. Kartları manuel olarak tanıtmak

için Kayıt defterinden kart durum kodlarını elle değiştirilerek aynı işlem yapılabilir.

Kart durum kodu hanesinde “0” rakamı kartın mevcut olmadığını, “7” rakamı ise kartın

mevcut olduğunu gösterir. Kart doğrulama işlemi bittikten sonra bağlantı otomatik olrak

kurularak bulunan kartlarla haberleşme başlatılır.

5.3.1.2. Kayıt Defteri Seçeneği

Kayıt defteri seçeneği seçildiğinde, eğer bu seçenek ilk defa seçiliyorsa ekrana,

üzerinde boş alanlar olan bir pencere gelecektir. Kanal bilgilerini ilk defa yüklemek için

Yenile butonuna tıklayınız. Kanal bilgileri yükleme işlemi tamamlandıktan sonra ağaç

görünümü penceresinden kartlar ve kartlara ait kana bilgilerine ulaşılabilir.

Görüntülenmek veya değiştirilmek istenen kart veya kanal üzerine tıklanarak bu kart

veya kanal bilgisinin pencerenin solunda bulunan alanda gösterilmesi sağlanır.

Herhangi değeri değiştirmek için ilgili alan seçildikten sonra değiştir butonuna tıklanır,

gelen giriş kutusuna ilgili değer yazılarak tamam butonuna basılarak ilgili değer

değiştirilir. Her ağaç seviyesine ait görüntülenen bilgiler şöyle sıralanabilir; Ana

düzeyde bulunan Monitör Tüm kartları içeren ana daldır ve buna ait version numarası

52

görüntülenir. Bu değer değiştirilemez. İkinci düzeyde ise tüm kartların listesi yer alır ve

bu kartlar Monitörün alt dallarıdır. Her kart düzeyinde gösterilecek bilgiler Kart bölge

adı ve kart durum kodudur. Bu iki bilgi değiştirilebilir özelliktedir. Kart bölge adı

bölümü, kartın çalıştığı ortamdır. Kart durum kodu bölümünde ise kartın bağlı olup

olmadığını gösterir. Bu bölgede iki adet sayısal bilgi bulunabilir. “0” bilgisi kartın bağlı

olmadığını, “7” bilgisi kartın bağlı ve çalışabilir durumda olduğunu gösterir. Bu kodlar

manuel olarak değiştirilebileceği gibi kartları doğrula seçeneği ile otomatik olarak

değiştirilirler. Ağaç görünümünde üçüncü düzeyde gösterilenler ise her karta ait 8 adet

kanaldır. Bu kanal bilgileri kart dalının bir alt düzeyindedir ve tüm bilgiler

değiştirilebilir niteliğe sahiptir. bu bilgiler;

Kanal adı : Kanala bağlı transdüserin verisini tanımlar. Örneğin kanala bağlı

transdüser bir sıcaklık transdüseri ise bu alana “sıcaklık” etiket bilgisi girilir.

Kanal durum kodu : Kanal durumu ile ilgili bilgilerin tutulduğu veri alanıdır

ve program tarafından kullanılmaktadır.

Öncelik seviyesi : Kanala bağlı transdüserin gönderdiği verilerin önemini

belirler. % cinsinden bir değerdir. Örneğin hayati önem taşıyan bir bilginin öncelik

seviyesi %100, daha az öneme sahip kanal bilgilerinin öncelik seviyesi ise daha düşük

olabilir.

Maximum değer : Kanala bağlı transdüserin sensörden maksimum okuduğu

değerlerdir. Bu değerin 0 ile 65535 arasında bir tam sayı olmasına dikkat edilmelidir.

Minimum değer : Kanala bağlı transdüserin sensörden minimum okuduğu

değerlerdir. Bu değerin 0 ile 65535 arasında bir tam sayı olmasına dikkat edilmelidir.

Maximum sınır : Bu değer transdüserden okunan verinin hangi değeri aşması

halinde alarm durumunun oluşacağını belirler. Yüzde cinsinden girilir. Girilen değer

kanalın maksimum değerinin yüzde oranı olacaktır.

Minimum sınır : Bu değer transdüserden okunan verinin hangi değerden daha

aşağı düşmesi halinde alarm durumunun oluşacağını belirler. Yüzde cinsinden girilir.

Girilen değer kanalın maksimum değerinin yüzde oranı olacaktır.

Birim : Kanala bağlı transdüserden okunan verinin biriminidir. Örneğin basınç

transdüserinden okunan verinin birimi “bar” ise bu haneye “bar” etiket bilgisi girilir.

53

5.3.2. İletişim Menüsü

Ana pencerede bulunan İletişim menüsü kartların haberleşmesi ve seri port

ayarlarının yapılabileceği seçeneklerin yer aldığı bir menüdür.

5.3.2.1 Bağlan Seçeneği

Bağlan seçeneği ayarlanan seri portla bağlantının kurulmasını sağlar. Bağlantı

başarılı bir şekilde kurulduğunda ana penceredeki durum çubuğu yeşil rengini alır ve

ilgili kutucukta “Online” yazısı görülür. Bağlantı kurulduğu anda kart kayıt dosyasında

kart durum kodu “7” olan kartlarla haberleşme trafiği başlar. Eğer durum kodu “7”

olupta cevap vermeyen kart olursa program uyarı vererek bağlantıyı otomatik olarak

keser. Prrogram, bağlı olan kartlardan verileri adres sırasına göre alır. Her iki kart

haberleşmesi arasında beklenecek süre varsayılan değer olarak 100ms’ye ayarlanmıştır.

Çok sayıda kart bağlanması halinde bu değer daha düşürülebilir fakat bu değerin aşırı

düşürülmesi iletişim problemlerine neden olacağından deneme-yanılma yöntemiyle

optimum düzeyde tutulmalıdır.

5.3.2.2. Bağlantıyı Kes Seçeneği

Kurulan bağlantının kesilmesini sağlar. Bağlantı kesildikten sonra karlarla olan

haberleşme de ortadan kalkar. Bağlantı kesildiğinde ana pencerenin durum çubuğunun

rengi sarıdır ve ilgili kutucukta “Offline” ibaresi yer alır. Bağlantı olmadığında kartlarla

bir haberleşme söz konusu olmadığından veri akışı olmaz. Göstergelerde ise son okunan

değerler korunur.

54

5.3.2.3. Port Ayarları Seçeneği

Port ayarları seçeneğinde kartların bağlı olduğu seri portla ilgili ayarlar yer alır.

Bu ayarlar herhangi sebeple değiştirilmiş ise kartların kullandığı ayarlara geri dönmek

için varsayılan butonuna tıklayınız. Diğer standart ayarlar için pencerenin üzerindeki

panele sağ tıklayarak veri formatını belirli standartlar ölçüsünde değiştirebilirsiniz. Port

ayar penceresinde bulunan ayarlar şöyle özetlenebilir,

Seri port : Kartlar bilgisayara hangi seri port üzerinden bağlandıysa bu grup

seçeneklerinden ilgili port seçilmelidir. Program ilk defa çalıştırıldığında varsayılan

değer COM2’dir. Eğer seçtiğiniz port bilgisayarda fiziksel olarak mevcut değilse veya

kartlar seçili porta bağlanmamışsa Bağlan seçeneğini seçtiğinizde program hata mesajı

vererek bağlantıyı gerçekleştirmek.

Baud Rate : Seri port iletişim hızını ayarlamak için bu grup seçeneklerinden

1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200 bps biri

seçilebilir. Kartlar için varsayılan değer 9600bps’dir. Kart iletişim hızından farklı bir hız

seçildiğinde iletişim kurulamayacağından program kartları göremez ve kartın hatta bağlı

olmadığını belirten bir hata mesajı verir.

Data bitleri : Seri haberleşme sisteminde gönderilen veri bitlerinin kaç bitten

oluşacağı seçilir. Kartlar için varsayılan değer 8 bit’tir. Kartın kullandığı veri biti

55

uzunluğundan farklı bir değer seçilmesi durumunda hatalı veriler alınması söz konusu

olduğundan bu kartlarda bu değerin “8 bit” olduğundan emin olmalısınız.

Eşlik biti : Eşlik biti grubundaki seçenlerden veri bitlerinin doğruluğunu

denetleyecek olan bitin kullanılıp kullanılmadığı veya kullanılıyorsa veri bitlerini

doğrulama şeklinin ne olduğu seçilir. Kartlar için varsayılan değer NONE’dur.

Durma Bitleri : Seri porttan gönderilen veri paketinin sonlandırılacağı bitin

uzunluğu bu grubun seçenekleri ile seçilir. Kartlar için varsayılan değer “1” dir.

Yazılım akış denetimi : Seri port veri akışının yazılım denetimli olup

olmayacağı bu grup seçenekleri yardımıyla belirlenir. Kartlar için varsayılan değer,

yazılım akış denetiminin olmamasıdır.

Donanım akış denetimi : Seri port veri akışında donanım denetimlerinin

kullanılıp kullanılmadığını veya ne çeşit denetim sinyallerinin kullanıldığını belirler.

Kartlarla iletişim için varsayılan değer RTS/CTS akış denetimidir.

5.3.3. Pencere Menüsü

Bu menüde ana pencede içerisinde bulunan Proses, Alarm ve Sistem

pencerelerinin yerleşim düzeni ve seçimi ile ilgili seçenekler bulunmaktadır.

5.3.3.1. Döşe Seçeneği

Bu seçenek ana pencere içerisinde bulunan Proses, alarm ve Sistem

pencerelerinden o an normal boyutlarda açık olanlarını ana pencere boyutlarını

kaplayacak şekilde döşer.

5.3.3.2. Basamakla Seçeneği

O an kapalı olmayan pencereleri ana pencerenin sol üst köşesinden itibaren alt

sağ köşeye doğru normal boyutlarıyla sıralar. Basamakla seçeneği seçildiğinde aktif

halde olan pencere en üstte olacak ve görünecek şekilde sıralama yapılır.

56

5.3.3.3. Tümünü Kapat Seçeneği

Tümünü kapat seçeneği seçildiğinde o an kapalı olmayan tüm pencereler

kapatılarak ana pencerenin sol alt köşesinden itibaren dizilirler. Pencereleri tekrar eski

boyutlarına getirmek için ya menüden ilgili pencere seçilir veya kapalı olan pencerenin

üzerindeki normal boyutlarına getir butonuna tıklayarak pencere restore edilir.

5.3.3.4. Proses Seçeneği

Bu seçenek ile proses penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer

pencere kapalı ise eski boyutlarında açılır.

5.3.3.5. Alarm Seçeneği

Bu seçenek ile alarm penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer

pencere kapalı ise eski boyutlarında açılır.

5.3.3.6. Sistem Seçeneği

Bu seçenek ile sistem penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer

pencere kapalı ise eski boyutlarında açılır.

5.3.4. Çıkış Menüsü

Çıkış menüsünde programdan çıkmak için ve program hakkında bilgi veren iki

seçenek vardır.

5.3.4.1. Çıkış Seçeneği

Programdan çıkmak için bu seçenek seçilmelidir. Programdan çıkmadan önce

kartlarla bağlantının kesilmesi gerekmektedir. Program, bağlantının kesilmemiş olması

durumunda çıkma isteği algıladığında bağlantıyı otomatik olarak keserek programdan

çıkar.

57

5.3.4.2. Program Hakkında

Program hakkında kısa bilgiler içeren bir pencere ekrana gelerek programın

yapımında emeği geçen kişi ve kuruluşların listesini güzel bir piyano eşliğinde gösterir.

5.3.5. Program Alt Pencerelerinin Tanıtılması

Programın üç alt penceresi mevcuttur. Bunlar Proses, Alarm ve Sistem

pencereleridir. Bu pencerelere Pencere menüsünden veya direkt üzerine tıklayarak

erişilebilir.

5.3.5.1. Proses Penceresi

Proses penceresi, kartlardan okunan verilerin çeşitli şekillerde görüntülenmesini

sağlar. Pencerenin sol tarafında bulunan liste kutusunda kartların listesi vardır. Sol

tarafında ise, liste kutusundan seçilen kartın kanallarını gösteren sekiz adet gösterge

vardır. Normalde liste kutunda bütün kartlar listelenir fakat liste kutusu üzerine sağ

tıklayıp çalışan kartlar seçeneğini seçtiğinizde sadece bağlı olan kartların listesi

görülecektir. Buradan verisi görülmek istenen kart seçilerek göstergelerden her kanal

izlenebilir. Analog göstergelerin üzerine sağ tıkladığınızda gelen seçeneklerden

58

gösterge kadranının kaç derecelik açıda olacağı seçilebilir. Trend sekmesinde ise seçili

kartın kanal bilgileri trend şeklinde gösterilir. Yine trendler üzerine sağ tıklayarak trend

tipi ve rengi değiştirilebilir. Digital sekmesinde ise okunan kanal verileri sayısal olarak

gösterilir.

5.3.5.2. Alarm Penceresi

Alarm penceresinde, kayıt defterinde her kanal için tanımlanan maksimum ve

minimum sınır değerlerinden bir taşma olduğunda tarih, saat, kart no, kanal no ve

durum bilgileri ile beraber bu penceredeki editöre bir satır eklenir. Eklenen bu satırlara

istenirse ek bilgiler yazılabilir. Alarm penceresinde bulunan araç çubuğunda ise editör

alanını temizleme, text dosya yükleme, editör içeriğini kaydetme, sesli iletileri aktif hale

getirme ve iptal etme, yazdırma butonları yer alır. Editör içeriğini temizle butonunda

editörün içeriği temizlenir. Dosyadan yükle butonunda ise text dosyanın içeriğini

editörde görüntüler. Bu dosya daha önceden kaydedilmiş alarm dosyalarından biri

olabileceği gibi farklı bir text dosyada olabilir. Dosyaya kaydet butonu ise o anki editör

içeriğini bir dosyaya kaydetmek amacıyla kullanılır. Dosyaya istenilen bir uzantı

verilebileceği gibi dosya text formatta kaydedileceği için uzantısının .txt olması dosyayı

tanımlamak bakımından rahatlık sağlar. Bu pencerede program online çalışırken

dosyalama işlemlerinin yapılmaması tavsiye edilir. Aksi halde bazı hataların çıkmasına

sebep olunabilir. Araç çubuğunda bulunan sesli iletileri aç ve sesli iletileri kapat

butonları ise, herhangi alarm durumunda alarm penceresine yazılan alarm satırıyla

beraber verilen sesli iletilerin açılıp kapanmasını sağlar. Yazdırma butonu ise o an

editör içeriğindeki tüm metni Windows'un tanımlamış olduğu geçerli yazıcıya gönderir.

59

5.3.5.3. Sistem Penceresi

Sistem penceresinde üç adet sekme bulunur. Bunları tek tek inceleyecek olursak;

Veri trafiği sekmesi: Programın kartlara gönderdiği ver kartlardan aldığı veri

paketlerini yakalayarak görüntüler. Bu sekmenin kendisine ait araç çubuğunda sırasıyla

editör içeriğini temizleme, text dosyayı editöre yükle, editördeki içeriği bir text dosyaya

kaydet, kopyala, kes, yapıştır, veri paketlerini görüntülemeye başla ve veri paketlerini

görüntülemeyi sonlandır butonları vardır. Kartlarla yapılan haberleşmede Veri trafiği

yoğun olduğundan kısa sürede çok sayıda veri paketi örneği alınmış olacaktır.

İncelemek amacıyla birkaç saniyelik veri trafiğinin örnekleri yeterli olacaktır.

Sistem analizi sekmesi: Bu sekmede istenilen karta istenilen komut ve kanal

numarası gönderilerek kartın verdiği cevap analiz edilebilir. Analiz verilerini

göndermek için önce sekmenin kendisina ait araç çubuğundaki veri trafiğini durdur

butonu ile veri akışı durdurulmalıdır. Daha sonra gönderilecek kart grubundan verinin

gönderileceği kart adres olarak veya kayıt defterinde belirtilen bölge ismi olarak seçilir.

Seçilen karta gönderilecek komut ise Kart komutu grubundan kod olarak veya kodun

açıklaması olarak seçilir. Son olarak işlem görecek kanal numarası seçilerek gönder

butonuna basılır. Butona her basılışta yalnız bir veri paketi gönderilir ve bir veri paketi

alınır. Alınan veri paketi ve çözümlemesi alınan grubunda gösterilir. Kart cevabı

grubunda karttan gelen cevap aynen veya taşıdığı anlam olarak izlenebilir. Kart

cevabının yanında ise karttan alınan çözümlenmiş veri gösterilir. En sağdaki kutuda ise

karttan gelen çözümlenmemiş veri paketi gösterilir. Analiz işlemi bittikten sonra araç

çubuğundaki veri trafiğini başlat butonu ile kart verilerinin alımına devam edilmesi

sağlanır.

60

Ayarlar sekmesi : Ayarlar sekmesinde bulunan iz çubuğu ile programın bir kart

ile haberleşme başladığından itibaren kaç milisaniye sonra diğer kartla haberleşmeye

başlayacağını belirler bu değer, çok sayıda kart bağlandığında bir kartın birinci kez

okunduktan sonra ikici kez okunması arasında geçen zamanın veri kaybına neden

olacak şekilde uzun olması durumunda düşürülebilir. Bu zamanın çok düşürülmesi,

kartların cevap verme sürelerinden daha düşük olduğunda haberleşme sorunları

meydana gelir ve kartlardan veri okumak imkansız hale gelir. Bu zamanın uzun

bırakılması halinde ise veri kayıplarına neden olacağından, tüm kartlar çalıştırıldıktan

sonra deneme yanılma yöntemiyle optimum çalışma aralığı belirlenmelidir. Sisteme kart

eklenip çıkartıldığında ise bu süre yeniden düzenlenmelidir. Adc gerilimleri ve referans

gerilimler gruplarında ise kart seçildikten sonra başla butonuna basılarak seçilen

karttaki analog digital dönüştürücü entegrenin + referans, - referans ve ortalama refens

değerleri ve kartın baud rate bölen değeri dur butonuna basılıncaya kadar tazelenerek

okunur. Referans gerilim grubunda ise +referans geriliminin 5V olması durumunda

okunan değere karşılık gelecek gerilim değeri hem sayısal hem grafiksel olarak

gösterilir. Okunan diğer değerler ham veriler olup minimum 0 ve maksimum 4096

değerleri arasında değişir.

5.4. Monitör Programının İlk Defa Çalıştırılması

Program ilk defa çalıştırılıyorsa aşağıdaki adımların izlenerek program

ayarlarının yapılması, en kısa zamanda sonuç alınmasını sağlayacaktır. Programı

çalıştırmadan önce kullanacağınız kartların üzerinde bulunan dip-swiçler yardımıyla her

karta bir adres tanımlayınız. Adres tanımlamada dikkat edilmesi gereken kural, aynı

adrese sahip iki adresin tanımlanmaması gereklidir. Bu işlemden sonra kartlara

transdüserleri bağlayınız ve hangi adresteki kartın hangi kanalına ne tip transdüser

bağladığınızı, max ve min değerlerini, alt ve üst sınır değerlerini, kartın kullanıldığı

ortamla ilgili bilgileri bir yere kaydediniz. Son olarak kartları haberleşme hattına

bağlayarak RS485/RS232 konvertörün RS485 girişine bağlayınız. Konvertörün RS232

girişini ise bilgisayarın boşta olan herhangi seri portuna bağlayınız ve hangi porta

bağladığınızı kaydediniz. Programı çalıştırmadan önce yapılması gereken işlemleri

tamamladıktan sonra Programı çalıştırınız. İlk olarak İletişim menüsünden Port ayarları

seçeneğini seçiniz. Buradan RS485/RS232 çeviriciyi bağladığınız seri port numarasını

seçerek tamam butonunu tıklayınız. Sonra Kartlar menüsünden Kayıt defteri seçeneğini

61

tıklayınız. Gelen pencereden yenile butonuna tıklayarak kanal bilgilerinin yüklenmesini

bekleyiniz. Kanal bilgileri yüklendikten sonra kartları bağlarken tanımladığınız

adresteki kartın kanallarına bağlı transdüserlere ait bilgileri ilgili hanelere yazınız.

Tamam butonuna tıklayıp pencereyi kapattıktan sonra Kartlar menüsünden Kartları

doğrula seçeneğini seçerek bağladığınız kartların bulunmasını bekleyiniz. Bağladığınız

tüm kartlar bulunduktan sonra veri aktarımı otomatik olarak başlayacaktır. Proses

penceresini seçerek aktif olmasını sağlayınız. Sağ tarafta bulunan liste kutusunun

üzerine sağ tıklayıp Çalışan kartlar seçeneğini seçerek sadece tanımlanan kartların

görüntülenmesini sağlayabilirsiniz. Verilerini görmek istediğiniz kart üzerine tıklayarak

tüm kanal bilgilerini göstergelerden izleyebilirsiniz. Sekme tuşlarından, verinin analog,

trend veya digital formatta gösterilmesini sağlayabilirsiniz. Yine analog göstergeler

veya trend üzerine sağ tıklayarak görünüm biçimlerini ayarlayabilirsiniz. Meydana

gelen alarm durumları alarm penceresine kaydedilecektir.

5.5. Monitör Programının Kaynak Kodunun Açıklanması

Delphi 4.0 Professional’da yazılan monitör programının kullandığı program

dosyaları, üniteler, komponentler, dinamik bağlı kütüphaneler dosya isimleriyle aşağıda

listelenmiştir.

monitor.pas : Ana program dosyası.

mainunit.pas : Ana program ünitesi. Ünitenin kaynak kodu EK2.1’de

verilmiştir.

proses.pas : Proses penceresine ait ünite

sistem.pas : Sistem penceresine ait ünite

alarm.pas : Alarm penceresine ait ünite

cardreg.pas : Kart kayıt defterine ait ünite

check.pas : Kartları doğrula penceresine ait ünite

checkval.pas :Okunan değerleri kontrol eden ve bir taşma olması

halinde ilgili prosedürleri çağıran ünite.

gauge.pas :Beklenmesi gereken yerlerde işlemin ne kadarının

yapıldığını gösteren göstergenin ünite dosyası

hakkunit.pas : Program hakkında bilgi veren pencereye ait ünite

portayar.pas : Seri port ayar penceresine ait ünite dosyası.

analogmeter.pas :Proses penceresindeki analog göstergeleri oluşturan ünite.

62

trend.pas :Proses penceresindeki trend göstergelerini oluşturan

ünite.

binary.pas :Bitsel düzeyde işlemlerin yapılmasını sağlayan

fonksiyonları içeren dinamik bağlı kütüphane. Kütüphanenin kaynak kodu EK2.2’de

verilmiştir.

cpdrv.pas : Seri port ile iletişimi sağlayan ünitedir.

fileman.pas :Tüm dosyalama işlemlerini yürüten ünite. Ünitenin

kaynak kodu EK2.3’te verilmiştir.

aicpro.pas : Haberleşme protokolünü kodlayan ve çözen dinamik

bağlı kütüphane.

data.ch : Kanal bilgilerinin tutulduğu kayıt dosyası

nameof.crd : Kart bilgilerinin tutulduğu kayıt dosyası.

Comm.dat : seri haberleşme port ayarlarının tutulduğu dosya.

Kullanılan tüm bu dosyalardan kart ile haberleşmeyi mümkün kılan aicpro.pas

ünitesinin kullanılma amacı, en az sayıda bit göndererek ve alarak gerekli verilerin en

kısa zamanda taşınmasını sağlamaktır. Bunu sağlayabilmek için giden ve gelen bilgiler

ikişer bayt olacak şekilde paketlenerek gönderilir. Bu işlemi sağlayan aicpro ünitesi

giden ve gelen veriler için farklı fonksiyonlara sahiptir. Bu fonksionlar;

encode_protokol : Gönderilecek bilgileri bir word olarak paketler

get_low : Verilen word bilgisinin düşük anlamlı baytını verir.

get_high : Verilen word bilgisinin yüksek anlamlı baytını verir.

get_word : Verilen iki baytı bir word’e dönüştürür.

get_card_response : Karttan gelen word paketli bilginin kart cevabı bölümünü

verir.

get_card_data : Karttan gelen word paketli bilginin taşıdığı veriyi alır.

Bu fonksiyonların kullanıldığı haberleşme ortamında giden ve gelen veri

paketlerinin şekilleri aşağıdaki gibi olmaktadır.

Monitör programından kartlara giden veri paketinin formatı;

63

Kartlardan Monitör programına gelen veri paketlerinin formatı ise;

Tüm bu işlemlerin gerçekleştirilmesini sağlayan aicpro ünitesinin kaynak kodu

EK2.4’te verilmiştir.

64

SONUÇ

Projenin ilk aşamalarında analog arabirim kartının, mikrokontrolör ve monitör

yazılımının ne şekilde olacağını düşünürken, analog veriyi okuyup bilgisayar ekranına taşıyan

basit bir mantıkla oluşturulmuş tasarımla proje çalışmaları başlamıştı. Projenin ilerleyen

aşamalarında, yapılmış olan eski tasarımın her defasında yetersiz ve birçok özellikten yoksun

olduğu görülüp, tasarım her defasında yeniden düzenlenerek geliştirilmiştir. Tasarımda

yapılan her değişiklik uzun zaman ve işgücü kayıplarına, dolayısıyla o zamana kadar yapılan

çalışmaların büyük kısmının silinip atılmasına neden olmaktaydı. Uzunca bir zaman alan bu

çalışmalardan elde edilen bilgi ve tecrübeler sonucunda daha sistemli, esnek yapılı ve projeye

temel teşkil edecek tasarım ve bu tasarımın çalışması, haberleşme şekli, programlanması net

bir şekilde tanımlanmıştır. Projenin gerçekleştirilmesi aşamasında çıkan küçük problemler

tasarımda bazı değişikliklerin yapılmasına neden olduysa da bunların etkisi, projeye her an

eklenen yeni özelliklerin getirdiği karmaşıklık kadar olmamıştır. Artık donanımdan ziyade

yazılımım yeteneğine göre şekillenecek olan proje adım adım gerçekleştikçe eklenen veya

eklenilmesi düşünülen her yeni özellik, ulaşılması gereken hedefi daha da uzaklaştırıyordu.

Projenin teslim tarihinin yaklaşması nedeniyle sonradan düşünülen birçok özellik iptal edilmiş

ve kalan zaman mevcut sistemin iyileştirilmesi, çıkan veya çıkabilecek hataların ayıklanması,

dökümantasyonun hazırlanması gibi işlere ayrılmıştır.

Tüm bu çalışmaların sonucunda, işin en başında tasarlandığından çok daha fazlası,

fakat son yapılan tasarımın ise pek azı gerçekleştirilmiş oldu. Sonuçta; amaçlanan işe hizmet

edebilecek çalışan bir sistem ortaya çıktı.

Yeterli zaman olmadığından dolayı monitör programına eklemekten vazgeçilen

özelliklerin en önemlisi; toplanan verilerin isteğe bağlı olarak günlük, haftalık, aylık ve yıllık

olarak kaydedilmesi ve bunların istenildiği zaman çağırılıp grafiklere uygulanarak analizinin

yapılabilmesi, ODBC (Open Data Base Connectivity – Açık Veri tabanı Bağlantısı) desteği ile

toplanan verilerin diğer programlarla paylaşılabilmesi özelliğidir. Bunun yanında analog

arabirim kartının kullanıldığı sahadan alınan değerlerin proses grafik ve animasyonlarını

içeren bir pencere içerisinde sunmak, istenilen sayıda proses penceresi oluşturularak her

proses tanımlaması için istenilen kartın istenilen kanal bilgisini bu prosese atamak monitör

65

programına eklenmeyen diğer bir özelliktir. Analog Arabirim kartında ise düşünüldüğü halde

gerçekleştirilemeyen en önemli özellik giriş kanallarının sadece 4-20mA değil, aynı zamanda

0-10V, 0-5V gibi diğer standartları da desteklemesiydi. Bununla beraber kartların adres

switch kullanmadan otomatik olarak tanımlanarak adreslerinin atanması özelliği, kartların

birbirine seri değil, tek hat üzerinden bağlamasına karar verildiğinde gerçekleştirilmesi

zorlaştığından iptal edilerek yerine adres switchleri konulmak durumunda kalınmıştır.

Gerek yazılımdan, gerekse analog arabirim kartı donanımından zaman yetmediği için

çıkarılmak zorunda kalan bu özelliklerin gerçekleştirilmiş olması halinde çok daha kapsamlı

ve verimli bir sistem elde edilebilir.

EKLER

EK1. PIC16C63 PROGRAMI

EK2.MONİTÖR PROGRAMI KAYNAK KODLARI

EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODU EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU EK2.3. FILEMEN ÜNİTESİNİN KAYNAK KODU EK 2.4. AICPRO ÜNİTESİNİN KAYNAK KODU

67

EK1. PIC16C63 PROGRAMI

;************************************************ ; Bu program, ; MARMARA UNIVERSITESI ; TEKNIK EGITIM FAKULTESI ; ELEKTRIK EGITIMI BOLUMU 'nde ; ; Bitirme projesi olarak hazirlanmistir. ; ; Proje Danismani : Doc. Dr. Koray TUNCALP ; ; Projeyi hazirlayanlar : 4A3 - 9601025 - M. Ozan AKI ; 4A3 - 9601029 - Ercan UYGUN ; ; Projeyi destekleyen : Prestij Endüstriyel Cihazlar A.Ş. ; ; Yapildigi donem : 1999 / 2000 ogretim yili ; ;*********************************************** ; ; Program hakkinda bilgiler; ; Kullanilan kontrolor : PIC 16C63A ; Rezonator : 11.059.200Hz HS ; 1 cycle : 2764800Hz - 361ns ; WatchDog Timer : Kullanılmıyor ; ; ;////////////////////////////////////////////// include "p16c63a.inc" ; //////////// Sigorta Tanimlamalari ///////////// ;//// Adres secici switch tanimlamalari //// card_status equ h'20' card_address equ h'21' sayac equ h'22' dcnt equ h'23' drpt1 equ h'24' drpt2 equ h'25' channel_no equ h'26' command equ h'27' card_response equ h'28' adc_access equ h'29' get_adress equ h'70' get_param equ h'71' send_lo equ h'72' send_hi equ h'73' adc_data_hi equ h'74' adc_data_lo equ h'75' endbuf equ h'7F'

68

#define line_driver portb,1 #define yesil_led portb,0 #define kirm_led portc,4 #define baud_9600 portb,5 #define baud_19200 portb,6 #define baud_115200 portb,7 #define adress_0 portc,1 #define adress_1 portc,2 #define adress_2 portc,3 #define read_adress porta,4 #define channel_0 portb,4 #define channel_1 portb,3 #define channel_2 portb,2 #define adc_eoc porta,0 #define adc_clock porta,1 #define adc_di porta,2 #define adc_do porta,3 #define adc_not_cs porta,5 org 00h ; init vektor goto init org 04h ; Reset Vektor goto init init ; ////////////// Baslangic icin ayar ve tanimlamalar /////////////// bcf status,rp0 ; bank 0 secildi ; //////////////// Status Settings //////////////// bcf status,dc ; digit carry bcf status,z ; zero flag bcf status,c ; carry flag ; //////////////// Baslangicta tum portlari sifirla //////////////// clrf porta ; porta latch clrf portb ; portb latch clrf portc ; portc latch ; /////////////// Global interrupt kontrol yazmaci ///////////////// bcf intcon,gie ; global interrupt enable bit bcf intcon,peie ; peripheral interrupt enable bit bcf intcon,t0ie ; timer 0 overflow interrupt enable bit bcf intcon,inte ; RB0/INT External Interrupt Enable bit bcf intcon,rbie ; RB Port Change Interrupt Enable bit bcf intcon,t0if ; timer 0 Overflow interrupt flag bit bcf intcon,intf ; RB0/INT External Interrupt Flag bit bcf intcon,rbif ; RB port Change Interrupt Flag bit ; //////////////// Peripheral interrupt register //////////////////// bcf pir1,sspif ; Synchronous Serial Port Interrupt Flag bit bcf pir1,ccp1if ; CCP1 Interrupt Flag bit bcf pir1,tmr2if ; TMR2 to PR2 match interrupt flag bit bcf pir1,tmr1if ; TMR1 Overflow Interrupt Flag bit bcf pir2,ccp2if ; CCP2 Interrupt Flag ; /////////////// Timer 1 Kontrol register //////////////////////

69

bcf t1con,t1ckps1 ; Timer1 Input Clock Prescale Select bits bcf t1con,t1ckps0 ; Timer1 Input Clock Prescale Select bits bcf t1con,t1oscen ; Timer1 Oscillator Enable Control bit bcf t1con,not_t1sync ; Timer1 External Clock Input Synchronization Control bit bcf t1con,tmr1cs ; Timer1 Clock Source Select bit bcf t1con,tmr1on ; Timer1 On bit ; /////////////// Timer 2 Kontrol Register ///////////////////// bcf t2con,toutps3 ; Timer2 Output Postscale Select bits bcf t2con,toutps2 ; Timer2 Output Postscale Select bits bcf t2con,toutps1 ; Timer2 Output Postscale Select bits bcf t2con,toutps0 ; Timer2 Output Postscale Select bits bcf t2con,tmr2on ; Timer2 On bit bcf t2con,t2ckps1 ; Timer2 Clock Prescale Select bits bcf t2con,t2ckps0 ; Timer2 Clock Prescale Select bits ; /////////////// Senkron Seri Port Kontrol Registeri /////////////// bcf sspcon,wcol ; Write Collision Detect bit bcf sspcon,sspov ; Receive Overflow Detect bit bcf sspcon,sspen ; Synchronous Serial Port Enable bit bcf sspcon,ckp ; Clock Polarity Select bit bcf sspcon,sspm3 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm2 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm1 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm0 ; Synchronous Serial Port Mode Select bits ; ///////////////// Capture Compare PWM Kontrol Register ////////////// bcf ccp1con,ccp1x ; PWM Least Significant bits bcf ccp1con,ccp1y ; PWM Least Significant bits bcf ccp1con,ccp1m3 ; CCPx Mode Select bits bcf ccp1con,ccp1m2 ; CCPx Mode Select bits bcf ccp1con,ccp1m1 ; CCPx Mode Select bits bcf ccp1con,ccp1m0 ; CCPx Mode Select bits ; /////////////// Asenkron Receive Register /////////////////// bsf rcsta,spen ; Serial Port Enable bit bsf rcsta,cren ; Cont. receive enable bit bcf rcsta,rx9 ; 9-bit Receive Enable bit bsf status,rp0 ; bank 1 secildi ; /////////////// Option Register Settings /////////////////// bsf option_reg,not_rbpu ; PortB Pull-up enable bit bcf option_reg,t0cs ; Timer 0 Clock Source Select Bit bcf option_reg,t0se ; TMR0 Source Edge Select Bit bsf option_reg,psa ; Prescaler Assignment bit bcf option_reg,ps2 ; Prescaler Rate Value; bcf option_reg,ps1 ; Prescaler Rate Value; bcf option_reg,ps0 ; Prescaler Rate Value; ; ///////////// Port giris-cikis tanimlamalari ///////////////////// movlw b'00011001' ; Porta Direction register movwf trisa movlw b'11100000' ; Portb Direction register movwf trisb movlw b'10000000' ; Portc Direction register movwf trisc ; ///////////////// Peripheral interrupt Enable Register ////////////

70

bcf pie1,rcie ; USART Receive Interrupt enable Bit bcf pie1,txie ; USART Transmit Interrupt Enable Bit bcf pie1,sspie ; Synchronous Srial Port Interrupt enable Bit bcf pie1,ccp1ie ; CCP1 Interrupt Enable Bit bcf pie1,tmr2ie ; TMR2 to PR2 Match ınterrupt Enable Bit bcf pie1,tmr1ie ; TMR1 Overflow Interrupt Enable Bit bcf pie2,ccp2ie ; CCP2 Interrupt Enable Bit ; /////////////// Power Control REgister //////////////////// bcf pcon,not_por ; Power on Reset Status bit bcf pcon,not_bor ; Brown Out Reset Status bit ; //////////// Asenkron Transmit Register /////////////////// bcf txsta,csrc ; Clock Source Select Bit bcf txsta,tx9 ; 9-bit Transmit Enable Bit bsf txsta,txen ; Transmit Enable Bit bcf txsta,sync ; USART Mode select bit bcf txsta,brgh ; High Baud Rate Select Bit ; //////////////// Baud Rate Generator /////////////////// ; 9600 bps -> spbrg=17 brgh=0 ; 19200 bps -> spbrg=8 brgh=0 ; 115200 bps -> spbrg=5 brgh=1 bcf status,rp0 btfss baud_9600 ; Test 9600 jumper goto set_9600 btfss baud_19200 ; Test 19200 jumper goto set_19200 btfss baud_115200 ; Test 115200 jumper goto set_115200 goto no_select set_9600 bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'17' ; Default Baud Rate Prescaler = 9600 bps movwf spbrg goto complate set_19200 bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'08' ; Default Baud Rate Prescaler = 19200 bps movwf spbrg goto complate set_115200 bsf status,rp0 bcf option_reg,not_rbpu bsf txsta,brgh movlw d'05' ; Default Baud Rate Prescaler = 115200 bps movwf spbrg goto complate

71

no_select bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'17' ; Default Baud Rate Prescaler = 9600 bps default movwf spbrg complate bsf option_reg,not_rbpu bcf status,rp0 ; //////////////// Kart adresini al //////////////////// clrf card_status bsf adc_not_cs call adres_al goto start adres_al bsf yesil_led bcf kirm_led bsf card_status,0 clrf card_address bcf adress_0 bcf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,0 bsf adress_0 bcf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,1 bcf adress_0 bsf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,2 bsf adress_0 bsf adress_1

72

bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,3 bcf adress_0 bcf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,4 bsf adress_0 bcf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,5 bcf adress_0 bsf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,6 bsf adress_0 bsf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,7 bcf yesil_led bcf kirm_led return adc_oku bsf yesil_led bcf kirm_led

73

bcf adc_not_cs bsf card_status,1 bcf channel_0 bcf channel_1 bcf channel_2 btfsc channel_no,2 bsf channel_2 nop nop nop btfsc channel_no,1 bsf channel_1 nop nop nop btfsc channel_no,0 bsf channel_0 nop nop nop clrf adc_data_hi clrf adc_data_lo bcf adc_clock bcf adc_di adc_bekle btfss adc_eoc goto adc_bekle bsf yesil_led bcf kirm_led nop nop nop nop nop bcf adc_di btfsc adc_access,3 ; Adc Access verisi bsf adc_di btfsc adc_do ; 11. biti oku bsf adc_data_hi,3 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,2 ; Adc Access verisi bsf adc_di btfsc adc_do ; 10. biti oku bsf adc_data_hi,2 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,1 ; Adc Access verisi

74

bsf adc_di btfsc adc_do ; 9. biti oku bsf adc_data_hi,1 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,0 ; Adc Access verisi bsf adc_di btfsc adc_do ; 8. biti oku bsf adc_data_hi,0 bsf adc_clock nop nop nop bcf adc_clock nop bcf adc_di nop nop btfsc adc_do ; 7. biti oku bsf adc_data_lo,7 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 6. biti oku bsf adc_data_lo,6 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 5. biti oku bsf adc_data_lo,5 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 4. biti oku bsf adc_data_lo,4 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 3. biti oku bsf adc_data_lo,3

75

bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 2. biti oku bsf adc_data_lo,2 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 1. biti oku bsf adc_data_lo,1 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 0. biti oku bsf adc_data_lo,0 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf yesil_led bcf kirm_led return gonder bsf yesil_led bcf kirm_led bsf line_driver bcf adc_data_hi,4 bcf adc_data_hi,5 bcf adc_data_hi,6 bcf adc_data_hi,7 btfsc card_response,0 bsf adc_data_hi,4 btfsc card_response,1 bsf adc_data_hi,5 btfsc card_response,2 bsf adc_data_hi,6 btfsc card_response,3 bsf adc_data_hi,7 movfw adc_data_lo movwf txreg bcf pir1,txif txd1 btfss pir1,txif goto txd1

76

movfw adc_data_hi movwf txreg bcf pir1,txif txd2 btfss pir1,txif goto txd2 bcf line_driver bcf yesil_led bcf kirm_led return frame_error bsf card_status,7 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return over_error bsf card_status,6 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return pro_error bsf card_status,5 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return start bekle bcf yesil_led bcf kirm_led bcf line_driver bsf adc_not_cs btfsc rcsta,ferr call frame_error btfsc rcsta,oerr call over_error btfss pir1,rcif goto bekle movfw rcreg clrf rcreg movwf get_adress movfw card_address subwf get_adress,w btfss status,z goto bekle wait_prm btfss pir1,rcif goto wait_prm

77

movfw rcreg clrf rcreg movwf get_param clrf channel_no clrf command btfsc get_param,1 bsf command,0 btfsc get_param,2 bsf command,1 btfsc get_param,3 bsf command,2 btfsc get_param,5 bsf channel_no,0 btfsc get_param,6 bsf channel_no,1 btfsc get_param,7 bsf channel_no,2 movlw h'0' subwf command,w btfsc status,z goto init; movlw h'1' subwf command,w btfsc status,z goto durum_bildir movlw h'2' subwf command,w btfsc status,z goto adres_bildir movlw h'3' subwf command,w btfsc status,z goto kanal_oku movlw h'4' subwf command,w btfsc status,z goto ref_neg_oku movlw h'5' subwf command,w btfsc status,z goto ref_poz_oku movlw h'6' subwf command,w btfsc status,z goto ref_ort_oku movlw h'7' subwf command,w btfsc status,z goto bilgi_ver miss_command call pro_error goto start

78

durum_bildir clrf adc_data_hi movfw card_status movwf adc_data_lo movlw d'01' movwf card_response call gonder goto start adres_bildir call adres_al movfw card_address movwf adc_data_lo clrf adc_data_hi movlw d'2' movwf card_response call gonder goto start kanal_oku clrf adc_access call adc_oku nop nop call adc_oku movlw d'03' movwf card_response call gonder goto start ref_neg_oku movlw b'00001100' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku movlw d'04' movwf card_response call gonder goto start ref_poz_oku movlw b'00001101' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku movlw d'05' movwf card_response call gonder goto start ref_ort_oku movlw b'00001011' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku

79

movlw d'06' movwf card_response call gonder goto start bilgi_ver bsf status,rp0 movfw spbrg bcf status,rp0 movwf adc_data_lo movlw d'07' movwf card_response clrf adc_data_hi call gonder goto start end

80

EK2. MONİTÖR PROGRAMI KAYNAK KODLARI

EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODLARI

unit mainunit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, fileman, ImgList, cardreg, proses, alarm, CPDrv,aicpro, ExtCtrls, AnalogMeter, StdCtrls, MPlayer; const cr:String[2]=#13+#10; Type Tmainform = class(TForm) MainMenu1: TMainMenu; kartlar: TMenuItem; pencere: TMenuItem; cikis: TMenuItem; arabul: TMenuItem; kayitdefteri: TMenuItem; cik: TMenuItem; N1: TMenuItem; hakkinda: TMenuItem; StatusBar1: TStatusBar; ImageList1: TImageList; dose: TMenuItem; basamakla: TMenuItem; kapat: TMenuItem; N2: TMenuItem; winproses: TMenuItem; winalarm: TMenuItem; CommPortDriver: TCommPortDriver; comm: TMenuItem; baglan: TMenuItem; kes: TMenuItem; N3: TMenuItem; ayar: TMenuItem; winSistem: TMenuItem; MediaPlayer1: TMediaPlayer; Procedure HintGoster(Sender:TObject); Function Calculate(adr,ch,okunan:integer):integer; Procedure refreshstatus;

81

procedure FormCreate(Sender: TObject); procedure kayitdefteriClick(Sender: TObject); procedure cikClick(Sender: TObject); procedure doseClick(Sender: TObject); procedure basamaklaClick(Sender: TObject); procedure kapatClick(Sender: TObject); procedure winprosesClick(Sender: TObject); procedure winalarmClick(Sender: TObject); procedure ayarClick(Sender: TObject); procedure hakkindaClick(Sender: TObject); procedure baglanClick(Sender: TObject); procedure kesClick(Sender: TObject); procedure winSistemClick(Sender: TObject); procedure arabulClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private Private declarations public Kart tanımlamaları card_no:byte; card_status:byte; zone_name:string; Total_Card_Ok:integer; Cards:array[0..127] of byte; Kanal tanımlamaları channel_no:byte; channel_name:string; channel_status:byte; channel_priority_level:byte; channel_max_value:integer; channel_min_value:integer; channel_max_limit:integer; channel_min_limit:integer; channel_unit_name:string; Haberleşme portu tanımlamaları Port:TPortNumber; Baud:TBaudRate; Data:TDataBits; Stop:TStopBits; Parity:TParity; hflow:THwFlowControl; sflow:TSwFlowControl; pmode:TPacketMode;

82

end; var mainform: Tmainform; command:byte; implementation Uses portayar, hakkunit, Sistem, Check; $R *.DFM Function TMainForm.Calculate(adr,ch,okunan:integer):integer; Var ch_max,ch_min:integer; gosterge:integer; code:integer; Begin code:=Open_Channel_Rec_File; if code=0 then Begin ch_max:=Get_Channel_Max_Value(adr,ch); ch_min:=Get_Channel_Min_Value(adr,ch); gosterge:=((ch_max-ch_min)*okunan) div 4096; Calculate:=gosterge; End Else Begin ShowMessage('Kanal kayıt dosyası açılamıyor. Ref:MainUnit.Calculate'); Exit; End; Close_Channel_Rec_File; End; Procedure TMainForm.refreshstatus; Var cap:string; Begin cap:=''; Case port of pnCOM1:cap:=cap+'COM1'; pnCOM2:cap:=cap+'COM2'; pnCOM3:cap:=cap+'COM3'; pnCOM4:cap:=cap+'COM4'; Else cap:=cap+'COMx'; End; Case baud of br1200:cap:=cap+'-1200'; br2400:cap:=cap+'-2400';

83

br4800:cap:=cap+'-4800'; br9600:cap:=cap+'-9600'; br14400:cap:=cap+'-14400'; br19200:cap:=cap+'-19200'; br38400:cap:=cap+'-34800'; br56000:cap:=cap+'-56000'; br57600:cap:=cap+'-57600'; br115200:cap:=cap+'-115200'; Else cap:=cap+'-bilinmiyor'; End; Case data of db5BITS:cap:=cap+'-5'; db6BITS:cap:=cap+'-6'; db7BITS:cap:=cap+'-7'; db8BITS:cap:=cap+'-8'; Else cap:=cap+'-x'; End; Case parity of ptNONE:cap:=cap+'-N'; ptODD:cap:=cap+'-O'; ptEVEN:cap:=cap+'-E'; ptMARK:cap:=cap+'-M'; ptSPACE:cap:=cap+'-S'; Else cap:=cap+'-x'; End; Case stop of sb1BITS:cap:=cap+'-1'; sb1HALFBITS:cap:=cap+'-1.5'; sb2BITS:cap:=cap+'-2'; Else cap:=cap+'-x'; End; Mainform.StatusBar1.Panels[3].Text:=cap; MainForm.statusBar1.Panels[1].Text:=DateToStr(Date); End; procedure Tmainform.FormCreate(Sender: TObject); Var code:byte; begin code:=open_comm_rec_file; if code<>0 then Begin showmessage('Seri haberleşme konfigrasyon dosyası bulunamadı.'+cr+ 'Yeni bir konfigrasyon dosyası açılacak.'); code:=create_comm_rec_file; if code<>0 then

84

Begin showmessage('Seri haberleşme için konfigrasyon dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olablir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_comm_rec_file; code:=open_card_rec_file; if code<>0 then Begin showmessage('Kart kayıt dosyası bulunamadı.'+cr+ ' Yeni bir kayıt dosyası oluşturulacak.'); code:=create_card_rec_file; if code<>0 then Begin showmessage('Kart kayıt dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olabilir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_card_rec_file; code:=open_channel_rec_file; if code<>0 then Begin showmessage('Kanal kayıt dosyası bulunamadı.'+cr+ ' Yeni bir kayıt dosyası oluşturulacak.'); code:=create_channel_rec_file; if code<>0 then Begin showmessage('Kanal kayıt dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olabilir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_channel_rec_file; code:=open_comm_rec_file; if code=0 then Begin port:=get_comm_port; baud:=get_comm_baud; data:=get_comm_data; stop:=get_comm_stop; parity:=get_comm_parity;

85

hflow:=get_comm_hflow; sflow:=get_comm_sflow; pmode:=get_comm_pmode; End Else Begin ShowMessage('Seri iletişim konfigrasyon dosyası açılamadı. Varsayılan ayarlar yüklenecek.'); port:=pnCOM2; baud:=br9600; data:=db8BITS; stop:=sb1BITS; parity:=ptNONE; hflow:=hfRTSCTS; sflow:=sfNONE; pmode:=pmDiscard; End; close_comm_rec_file; winproses.checked:=true; kes.enabled:=false; Application.OnHint:=HintGoster; RefreshStatus; end; Procedure TMainForm.HintGoster(Sender:TObject); Begin StatusBar1.Panels[0].Text:=Application.Hint; End; procedure Tmainform.kayitdefteriClick(Sender: TObject); begin kayitform.Show; end; procedure Tmainform.cikClick(Sender: TObject); begin mainform.Close; end; procedure Tmainform.doseClick(Sender: TObject); begin tile; end; procedure Tmainform.basamaklaClick(Sender: TObject); begin Cascade; end; procedure Tmainform.kapatClick(Sender: TObject);

86

Var i:integer; begin for i:=MDIChildCount-1 downto 0 do MDIChildren[i].windowState:=wsMinimized; end; procedure Tmainform.winprosesClick(Sender: TObject); begin prosesform.WindowState:=wsNormal; winproses.Checked:=true; winalarm.checked:=false; winSistem.checked:=false; prosesform.show; end; procedure Tmainform.winalarmClick(Sender: TObject); begin alarmform.WindowState:=wsNormal; winproses.Checked:=false; winSistem.Checked:=false; winalarm.checked:=true; alarmform.show; end; procedure Tmainform.winSistemClick(Sender: TObject); begin SistemForm.WindowState:=wsNormal; winproses.Checked:=false; winalarm.checked:=false; winSistem.Checked:=true; Sistemform.show; end; procedure Tmainform.ayarClick(Sender: TObject); begin portform.show; end; procedure Tmainform.hakkindaClick(Sender: TObject); begin hakkform.show; end; procedure Tmainform.baglanClick(Sender: TObject); Var i:integer; code:integer; begin

87

kes.Enabled:=true; baglan.Enabled:=false; ayar.Enabled:=false; Total_Card_Ok:=0; Code:=Open_Card_Rec_File; if code=0 then Begin for i:=0 to 127 do Begin if get_card_status(i)=07 then Begin Cards[Total_Card_Ok]:=i; inc(Total_Card_Ok); End; End; End else Begin ShowMessage('Kart kayıt dosyası açılamıyor. Ref:MainUnit.BaglanClick'); Exit End; CommPOrtDriver.Port:=port; CommPOrtDriver.BaudRate:=baud; CommPOrtDriver.DataBits:=data; CommPOrtDriver.StopBits:=stop; CommPOrtDriver.Parity:=parity; CommPOrtDriver.HwFlow:=hflow; CommPOrtDriver.SwFlow:=sflow; CommPOrtDriver.PacketMode:=pmode; if (not CommPOrtDriver.Connect) then Begin ShowMessage('Belirtilen seri port açılamıyor. Bağlantı kurulamadı.'); kesclick(self); End; end; procedure Tmainform.kesClick(Sender: TObject); begin kes.Enabled:=false; baglan.Enabled:=true; ayar.Enabled:=true; CommPOrtDriver.Disconnect; end; procedure Tmainform.arabulClick(Sender: TObject); Var i:integer; found:boolean; bulunan:integer;

88

tocard:word; fromcard:word; fromcard_lo:byte; fromcard_hi:byte; begin CheckForm.Show; CheckForm.CheckMemo.Clear; CheckForm.CheckMemo.Lines.Add('Bulunan kartlar...'); ProsesForm.Timer1.Enabled:=False; Open_Card_Rec_File; bulunan:=0; if (not CommPortDriver.Connected) then baglanclick(self); for i:=0 to 127 do Begin CheckForm.Gauge1.Progress:=i; tocard:=encode_protokol(i,6,5); CheckForm.Label1.Caption:='Kartlar aranıyor: '+IntToStr(i)+'/127'; CommPortDriver.SendByte(Get_Low(tocard)); CommPortDriver.SendByte(Get_High(tocard)); found:=false; if CommPortDriver.ReadByte(fromcard_lo) then found:=true else found:=false; if CommPortDriver.ReadByte(fromcard_hi) then found:=true else found:=false;; fromcard:=get_word(fromcard_lo,fromcard_hi); if found then Begin inc(bulunan); CheckForm.CheckMemo.Lines.Add(IntToStr(bulunan)+'. kart bulundu. Kart adresi: '+ IntToStr(i)+' Kart cevabı: '+IntToStr(Get_Card_Response(fromcard))); Set_Card_Status(i,07); Cards[bulunan-1]:=i; Total_Card_Ok:=bulunan; End else Set_card_status(i,00); CheckForm.Refresh; End; Close_Card_Rec_File; CheckForm.Animate1.Active:=False; CheckForm.BitBtn1.Visible:=True; ProsesForm.Timer1.Enabled:=True; end; procedure Tmainform.FormClose(Sender: TObject; var Action: TCloseAction); begin if CommPOrtDriver.Connect then CommPOrtDriver.Disconnect; end; end.

89

EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU

library binary; uses SysUtils, Classes; function exp_byte(var e:integer):integer; var r,i:integer; Begin if ((e<=7) and (e>=0)) then Begin r:=1; for i:=(e-1) downto 0 do r:=r*2; End Else r:=0; exp_byte:=r; End; function exp_word(var e:integer):integer; var r,i:integer; Begin if ((e<=15) and (e>=0)) then Begin r:=1; for i:=(e-1) downto 0 do r:=r*2; End Else r:=0; exp_word:=r; End; function IntToBoolean(var w:integer):boolean; Begin if w=0 then IntToBoolean:=False else IntToBoolean:=True; End; function read_byte_bit(var w:byte; bit:integer):boolean; export; var r:boolean; ri:integer; p:byte; Begin p:=exp_byte(bit);

90

ri:=w and p; r:=IntToBoolean(ri); read_byte_bit:=r; End; function read_byte_bit_to_int(var w:byte; bit:integer):integer; export; var ri:integer; p:byte; Begin p:=exp_byte(bit); ri:=w and p; read_byte_bit_to_int:=ri; End; function read_word_bit(var w:word; bit:integer):boolean; export; var r:boolean; ri:integer; p:word; Begin p:=exp_word(bit); ri:=w and p; r:=IntToBoolean(ri); read_word_bit:=r; End; function read_word_bit_to_int(var w:word; bit:integer):integer; export; var ri:integer; p:word; Begin p:=exp_word(bit); ri:=w and p; read_word_bit_to_int:=ri; End; function set_word_bit(var w:word; bit:integer):word; export; var r:word; p:word; Begin p:=exp_word(bit); r:=w or p; set_word_bit:=r; End;

91

function reset_word_bit(var w:word; bit:integer):word; export; var r:word; p:word; Begin p:=exp_word(bit); r:=w and (not p); reset_word_bit:=r; End; function set_byte_bit(var w:byte; bit:integer):byte; export; var r:byte; p:byte; Begin p:=exp_byte(bit); r:=w or p; set_byte_bit:=r; End; function reset_byte_bit(var w:byte; bit:integer):byte; export; var r:byte; p:byte; Begin p:=exp_byte(bit); r:=w and (not p); reset_byte_bit:=r; End; exports read_word_bit, read_word_bit_to_int, read_byte_bit, read_byte_bit_to_int, set_word_bit, reset_word_bit, set_byte_bit, reset_byte_bit; begin end.

92

EK2.3. FILEMAN ÜNİTESİNİN KAYNAK KODU

unit fileman; interface uses sysutils, dialogs, CPDrv; Const comm_rec_file_name='comm.dat'; card_rec_file_name='nameof.crd'; channel_rec_file_name='data.ch'; alarm_rec_file_name='alarmlog.dat'; Type Comm_Rec=Record port:TPortNumber; baud:TBaudRate; data:TDataBits; stop:TStopBits; parity:TParity; hflow:THwFlowControl; sflow:TSwFlowControl; pmode:TPacketMode; End; Card_Rec=Record card_no:byte; card_status:byte; zone_name:string[20]; End; Channel_rec=Record card_no:byte; channel_no:byte; name:string[15]; status:byte; priority_level:byte; max_value:integer; min_value:integer; max_limit:integer; min_limit:integer; unit_name:string[10]; End; Var comm_file:file of comm_rec; card_file:file of card_rec; channel_file:file of channel_rec; commrec:comm_rec;

93

cardrec:card_rec; channelrec:channel_rec; function create_comm_rec_file:integer; function create_card_rec_file:integer; function create_channel_rec_file:integer; function open_comm_rec_file:integer; function open_card_rec_file:integer; function open_channel_rec_file:integer; function close_comm_rec_file:integer; function close_card_rec_file:integer; function close_channel_rec_file:integer; function get_card_status(card_no:byte):byte; function get_card_zone_name(card_no:byte):string; function set_card_status(card_no,status:byte):byte; function set_card_zone_name(card_no:byte; zone_name:string):byte; function get_comm_port:TPortNumber; function get_comm_baud:TBaudRate; function get_comm_data:TDataBits; function get_comm_stop:TStopBits; function get_comm_parity:TParity; function get_comm_hflow:THwFlowControl; function get_comm_sflow:TSwFlowControl; function get_comm_pmode:TPacketMode; function get_channel_status(card_no,channel_no:byte):byte; function get_channel_name(card_no,channel_no:byte):string; function get_channel_priority_level(card_no,channel_no:byte):byte; function get_channel_max_value(card_no,channel_no:byte):integer; function get_channel_min_value(card_no,channel_no:byte):integer; function get_channel_max_limit(card_no,channel_no:byte):integer; function get_channel_min_limit(card_no,channel_no:byte):integer; function get_channel_unit_name(card_no,channel_no:byte):string; function set_comm_port(port:TPortNumber):integer; function set_comm_baud(baud:TBaudRate):integer; function set_comm_data(data:TDataBits):integer; function set_comm_stop(stop:TStopBits):integer; function set_comm_parity(parity:TParity):integer; function set_comm_hflow(hflow:THwFlowControl):integer; function set_comm_sflow(sflow:TSwFlowControl):integer; function set_comm_pmode(pmode:TPacketMode):integer; function set_channel_name(card_no,channel_no:byte; name:string):integer; function set_channel_status(card_no,channel_no:byte; status:byte):integer; function set_channel_priority_level(card_no,channel_no:byte; priority_level:byte ):integer; function set_channel_max_value(card_no,channel_no:byte; max_value:integer):integer; function set_channel_min_value(card_no,channel_no:byte; min_value:integer):integer; function set_channel_max_limit(card_no,channel_no:byte; max_limit:integer):integer; function set_channel_min_limit(card_no,channel_no:byte; min_limit:integer):integer; function set_channel_unit_name(card_no,channel_no:byte; unit_name:string):integer;

94

implementation function create_comm_rec_file:integer; Var code:integer; Begin create_comm_rec_file:=0; Assign(comm_file,comm_rec_file_name); $I- ReWrite(comm_file); code:=ioResult; if code<>0 then create_comm_rec_file:=code else Begin commrec.port:=pnCOM2; commrec.baud:=br9600; commrec.data:=db7bits; commrec.stop:=sb1bits; commrec.parity:=ptEVEN; commrec.hflow:=hfNONE; commrec.sflow:=sfNONE; commrec.pmode:=pmDiscard; seek(comm_file,0); write(comm_file,commrec); close(comm_file); End; $I+ End; function create_card_rec_file:integer; Var i:integer; code:integer; Begin create_card_rec_file:=0; Assign(card_file,card_rec_file_name); $I- ReWrite(card_file); code:=ioResult; if code<>0 then create_card_rec_file:=code else Begin for i:=0 to 127 do Begin seek(card_file,i); cardrec.card_no:=i; cardrec.card_status:=0; cardrec.zone_name:='Kart no : '+IntToStr(i); write(card_file,cardrec); End; close(card_file);

95

End; $I+ End; function create_channel_rec_file:integer; var i,j:integer; code:integer; Begin create_channel_rec_file:=0; Assign(channel_file,channel_rec_file_name); $I- ReWrite(channel_file); code:=ioresult; if code<>0 then create_channel_rec_file:=code else Begin for i:=0 to 127 do Begin for j:=0 to 7 do Begin seek(channel_file,filesize(channel_file)); channelrec.card_no:=i; channelrec.channel_no:=j; channelrec.name:='Kanal no : '+IntToStr(j); channelrec.status:=00; channelrec.priority_level:=50; channelrec.max_value:=100; channelrec.min_value:=0; channelrec.max_limit:=90; channelrec.min_limit:=10; channelrec.unit_name:='Birimsiz'; write(channel_file,channelrec); End; End; close(channel_file); End; $I+ End; function open_comm_rec_file:integer; Begin Assign(comm_file,comm_rec_file_name); $I- Reset(comm_file); open_comm_rec_file:=ioResult; $I+ End; function open_card_rec_file:integer; Begin

96

Assign(card_file,card_rec_file_name); $I- Reset(card_file); open_card_rec_file:=ioResult; $I+ End; function open_channel_rec_file:integer; Begin Assign(channel_file,channel_rec_file_name); $I- reset(channel_file); open_channel_rec_file:=ioResult; $I+ End; function close_comm_rec_file:integer; Begin $I- close(comm_file); close_comm_rec_file:=ioResult; $I+ End; function close_card_rec_file:integer; Begin $I- close(card_file); close_card_rec_file:=ioResult; $I+ End; function close_channel_rec_file:integer; Begin $I- close(channel_file); close_channel_rec_file:=ioResult; $I+ End; function get_comm_port:TPortNumber; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_port:=commrec.port; End else get_comm_port:=pnCOM2; $I+

97

End; function get_comm_baud:TBaudRate; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_baud:=commrec.baud; End else Begin ShowMessage('Baudrate değeri okunamadı'); get_comm_baud:=br9600; End; $I+ End; function get_comm_data:TDataBits; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_data:=commrec.data; End else Begin ShowMessage('Data değeri okunamadı'); get_comm_data:=db7BITS; end; $I+ End; function get_comm_stop:TStopBits; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin

98

seek(comm_file,0); read(comm_file,commrec); get_comm_stop:=commrec.stop; End else Begin ShowMessage('Stop değeri okunamadı'); get_comm_stop:=sb1BITS; End; $I+ End; function get_comm_parity:TParity; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_parity:=commrec.parity; End else Begin ShowMessage('Parity değeri okunamadı'); get_comm_parity:=ptEVEN; End; $I+ End; function get_comm_hflow:THwFlowControl; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_hflow:=commrec.hflow; End else Begin ShowMessage('Hardware Flow okunamadı'); get_comm_hflow:=hfNONE; End; $I+

99

End; function get_comm_sflow:TSwFlowControl; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_sflow:=commrec.sflow; End else Begin ShowMessage('Software okunamadı'); get_comm_sflow:=sfNONE; End; $I+ End; function get_comm_pmode:TPacketMode; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_pmode:=commrec.pmode; End else Begin ShowMessage('Pmode okunamadı'); get_comm_pmode:=pmDiscard; End; $I+ End; function get_card_status(card_no:byte):byte; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then

100

Begin read(card_file,cardrec); get_card_status:=cardrec.card_status; End else get_card_status:=255; $I+ End; function get_card_zone_name(card_no:byte):string; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin read(card_file,cardrec); get_card_zone_name:=cardrec.zone_name; End else get_card_zone_name:='!! Failed !!'; $I+ End; function set_comm_port(port:TPortNumber):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.port:=port; seek(comm_file,0); write(comm_file,commrec); set_comm_port:=0; End else set_comm_port:=255; $I+ End; function set_comm_baud(baud:TBaudRate):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin

101

seek(comm_file,0); read(comm_file,commrec); commrec.baud:=baud; seek(comm_file,0); write(comm_file,commrec); set_comm_baud:=0; End else set_comm_baud:=255; $I+ End; function set_comm_data(data:TDataBits):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.data:=data; seek(comm_file,0); write(comm_file,commrec); set_comm_data:=0; End else set_comm_data:=255; $I+ End; function set_comm_stop(stop:TStopBits):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.stop:=stop; seek(comm_file,0); write(comm_file,commrec); set_comm_stop:=0; End else set_comm_stop:=255; $I+ End;

102

function set_comm_parity(parity:TParity):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.parity:=parity; seek(comm_file,0); write(comm_file,commrec); set_comm_parity:=0; End else set_comm_parity:=255; $I+ End; function set_comm_hflow(hflow:THwFlowControl):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.hflow:=hflow; seek(comm_file,0); write(comm_file,commrec); set_comm_hflow:=0; End else set_comm_hflow:=255; $I+ End; function set_comm_sflow(sflow:TSwFlowControl):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.sflow:=sflow; seek(comm_file,0);

103

write(comm_file,commrec); set_comm_sflow:=0; End else set_comm_sflow:=255; $I+ End; function set_comm_pmode(pmode:TPacketMode):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.pmode:=pmode; seek(comm_file,0); write(comm_file,commrec); set_comm_pmode:=0; End else set_comm_pmode:=255; $I+ End; function set_card_status(card_no,status:byte):byte; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin seek(card_file,card_no); read(card_file,cardrec); cardrec.card_status:=status; seek(card_file,card_no); write(card_file,cardrec); set_card_status:=0; End else set_card_status:=255; $I+ End; function set_card_zone_name(card_no:byte; zone_name:string):byte; Var code:integer;

104

Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin seek(card_file,card_no); read(card_file,cardrec); cardrec.zone_name:=zone_name; seek(card_file,card_no); write(card_file,cardrec); set_card_zone_name:=0; End else set_card_zone_name:=code; $I+ End; function get_channel_status(card_no,channel_no:byte):byte; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_status:=channelrec.status; End else get_channel_status:=255; $I+ End; function get_channel_name(card_no,channel_no:byte):string; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_name:=channelrec.name; End else get_channel_name:='!! Hata !!'; $I+ End;

105

function get_channel_priority_level(card_no,channel_no:byte):byte; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_priority_level:=channelrec.priority_level; End else get_channel_priority_level:=255; $I+ End; function get_channel_max_value(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_max_value:=channelrec.max_value; End else get_channel_max_value:=(-1); $I+ End; function get_channel_min_value(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_min_value:=channelrec.min_value; End else get_channel_min_value:=(-1); $I+ End;

106

function get_channel_max_limit(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_max_limit:=channelrec.max_limit; End else get_channel_max_limit:=(-1); $I+ End; function get_channel_min_limit(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_min_limit:=channelrec.min_limit; End else get_channel_min_limit:=(-1); $I+ End; function get_channel_unit_name(card_no,channel_no:byte):string; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_unit_name:=channelrec.unit_name; End else get_channel_unit_name:='!! Hata !!';

107

$I+ End; function set_channel_name(card_no,channel_no:byte; name:string):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.name:=name; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_name:=code; $I+ End; function set_channel_status(card_no,channel_no:byte; status:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.status:=status; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_status:=code; $I+ End; function set_channel_priority_level(card_no,channel_no:byte; priority_level:byte ):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no;

108

$I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.priority_level:=priority_level; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_priority_level:=code; $I+ End; function set_channel_max_value(card_no,channel_no:byte; max_value:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.max_value:=max_value; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_max_value:=code; $I+ End; function set_channel_min_value(card_no,channel_no:byte; min_value:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.min_value:=min_value; seek(channel_file,i); write(channel_file,channelrec); End;

109

set_channel_min_value:=code; $I+ End; function set_channel_max_limit(card_no,channel_no:byte; max_limit:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.max_limit:=max_limit; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_max_limit:=code; $I+ End; function set_channel_min_limit(card_no,channel_no:byte; min_limit:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.min_limit:=min_limit; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_min_limit:=code; $I+ End; function set_channel_unit_name(card_no,channel_no:byte; unit_name:string):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no;

110

$I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.unit_name:=unit_name; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_unit_name:=code; $I+ End; end.

111

EK 2.4. AICPRO ÜNİTESİNİN KAYNAK KODLARI

library aicpro; uses SysUtils,Classes,binary; const cm_reset=0; cm_report=1; cm_read=2; cm_write=3; cm_reserve1=4; cm_reserve2=5; cm_reserve3=6; cm_reserve4=7; ch0=0; ch1=1; ch2=2; ch3=3; ch4=4; ch5=5; ch6=6; ch7=7; Var outgoing:Array[0..15] of boolean; incoming:Array[0..15] of boolean; procedure clear_outgoing; var i:integer; Begin for i:=15 downto 0 do outgoing[i]:=false; End; procedure word_to_incoming(w:word); var i:integer; Begin for i:=15 downto 0 do if read_word_bit(w,i) then incoming[i]:=true else incoming[i]:=false; End; function out_to_word:word; var

112

i:integer; r:word; Begin r:=0; for i:=0 to 15 do Begin if outgoing[i] then r:=set_word_bit(r,i) else r:=reset_word_bit(r,i); End; out_to_word:=r; End; function encode_protokol(ca,cm,ch:integer):word; export; var i:integer; t_ca:byte; t_cm:byte; t_ch:byte; r:word; Begin if ((ca<=255) and (ca>=0)) then t_ca:=ca else t_ca:=0; if ((cm<=7) and (cm>=0)) then t_cm:=cm else t_cm:=0; if ((ch<=7) and (cm>=0)) then t_ch:=ch else t_ch:=0; clear_outgoing; for i:=0 to 7 do outgoing[i]:=read_byte_bit(t_ca,i); i:=8; outgoing[i]:=false; for i:=9 to 11 do outgoing[i]:=read_byte_bit(t_cm,(i-9)); i:=12; outgoing[i]:=false; for i:=13 to 15 do outgoing[i]:=read_byte_bit(t_ch,(i-13)); r:=out_to_word; encode_protokol:=r; End; function get_low(w:word):byte; export; Var r:byte; Begin r:=w mod 256; get_low:=r; End; function get_high(w:word):byte; export; Var r:byte; Begin r:=w div 256; get_high:=r; End;

113

function get_word(high,low:byte):word; export; Var r:word; Begin r:=high*256+low; get_word:=r; End; function get_card_response(w:word):integer; export; var i:integer; r:word; Begin r:=0; word_to_incoming(w); for i:=15 downto 12 do if incoming[i] then r:=set_word_bit(r,(i-12)) else r:=reset_word_bit(r,(i-12)); get_card_response:=r; End; function get_card_data(w:word):integer; export; var i:integer; r:word; Begin r:=0; word_to_incoming(w); for i:=11 downto 0 do if incoming[i] then r:=set_word_bit(r,i) else r:=reset_word_bit(r,i); get_card_data:=r; End; exports encode_protokol, get_high, get_low, get_word, get_card_response, get_card_data; begin end.

114

KAYNAKLAR

[1] “Microchip”,<http://www.microchip.com/MCU’s>,Erişim tarihi : 01.03.2000

[2] < http://www.ti.com >, Erişim tarihi: 03.03.2000

[3] < http://www.maxim-ic.com >, Erişim tarihi: 12.04.2000

[4] MAXIM, “New Releases Data Book”, Volume III, 1994.

[5] MICROCHIP, “Embedded Control Handbook”, Volume I.

[6] MICROCHIP, “Technical Library CDROM”, First Edition, 1997.

[7] YANIK,M., “Delphi 3 ile Görsel Programlama”, Beta, 1.Basım, İstanbul, 1998.

[8] RUA,P., ÖZTÜRK,Ö., “PC’nin sırları – Kesmeler ve Düşük Seviyeli

Fonksiyonlar”, Sistem Yayıncılık, 1. Basım, İstanbul, 1995.

[9] NOLTHINGK, B.E., ”Cihaz Teknolojisi 4”, M.E.B., Etam A.Ş, Eskişehir, 1994.

[10] MORSE,M.J., ”Mikroişlemci Tabanlı Sistemler V”, M.E.B., Evren Ofset,

Ankara, 1994.

[11] KILLEN, H.B.,”Modern Elektronik İletişim Teknikleri”, M.E.B., Milli Eğitim

Basımevi, Ankara, 1997.

[12] TOMASI,W., ”Elektronik İletişim Teknikleri”, M.E.B., Milli Eğitim Basımevi,

2. Basılış, İstanbul, 1997.

[13] MARSHALLSOFT COMPUTING, INC., ” Windows Standart Serial Comm.

Lib. for Delphi.2.3”, MarshallSoft, 1998

115

ÖZGEÇMİŞLER

Muhammed Ozan AKI

1977 yılında Siegen / Almanya’da doğdu. 1984 yılında kesin dönüş yaptığı,

memleketi olan Tekirdağ / Malkara’da İlkokulu ve Ortaokulu bitirdi. 1992 yılında

başladığı Malkara Hüsniye Hanım Teknik Lisesi’ndeki öğrenimini 1996 yılında okul

birinciliği derecesi ile bitirdi. Aynı yıl girdiği ÖYS sınavında Marmara Üniversitesi

teknik Eğitim Fakültesi Elektrik Eğitimi Bölümünü kazandı. Dört yıl süren öğrenim

süreci sonunda bu bölümden mezun oldu.

Ercan UYGUN

1977’de Gaziantep’te doğdu. İlk ve orta öğrenimini sırasıyla Şehit Kamil

İlkokulu ve Gazi Ortaokulunda yaptıktan sonra 1991 yılında lise öğrenimini yapmak

için Gaziantep M.R.Uzel Endüstrü Meslek Lisesi Elektrik Bölümüne kayıt yaptırdı.

1996 yılında girdiği üniversite sınavlarında Marmara Üniversitesi Teknik Eğitim

Fakültesi Elektrik Eğitimi Bölümünü kazandı.