8 analog bilginin arabirim kartı ile bilgisayarla

Transkript

8 analog bilginin arabirim kartı ile bilgisayarla
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
9601029
M. Ozan AKI
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
9601029
TEZ DANIŞMANI
M. Ozan AKI
Ercan UYGUN
: 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
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.
I
Ö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.
II
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.
III
İÇİ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 . . . . . . . . . . . . . . . . . . . .
3.1.1. RS232C Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2. RS422 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3. RS485 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.4. SN75176 Seviye Dönüştürücüsü . . . . . . . . . . . . . . . . . . . . . .
3.2. Analog ve Dijital Dönüştürücü (ADC ) . . . . . . . . . . . . . . . . . . . . . . .
3.2.1. Analog ve Sayısal Sinyaller . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1.1. Analog ve Dijital Sinyallerin Birbirine Dönüşümü. .
3.2.2. TLC2543 ADC’si . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.2.1. Yapısı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. Mikrokontrolör . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1. Mikrokontrolörler ve Mikroişlemciler . . . . . . . . . . . . . . . . . .
3.3.2. Microchip PIC Mikrokontrolörleri . . . . . . . . . . . . . . . . . . . .
3.3.2.1. PIC16C63’ün Yapısı . . . . . . . . . . . . . . . . . . . . . . . .
3.3.2.1.1. Osilatör ve Rezonatör . . . . . . . . . . . . . .
3.3.2.1.2. Reset ve Besleme Devreleri . . . . . . . . .
3.3.2.1.3. Watchdog Timer . . . . . . . . . . . . . . . . . .
3.3.2.1.4. Input / Output ( I/O ) Portları . . . . . . . .
3.3.2.2. Bellek Organizasyonu . . . . . . . . . . . . . . . . . . . . . . .
3.3.2.3. PIC16C63 Komut Seti . . . . . . . . . . . . . . . . . . . . . .
7
8
14
14
15
17
17
17
18
18
20
20
21
21
22
23
24
26
28
30
IV
4. PIC16C63’ÜN PROGRAMLANMASI . . . . . . . . . . . . . . . . . . . . . . . . . . .
47.
5. PC PROGRAMI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
5.1. Programın Kurulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Monitör Programına Genel Bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3. Monitör Programının Tanıtılması . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1. Kartlar Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1.1. Kartları Doğrula Seçeneği . . . . . . . . . . . . . . . . . . . .
5.3.1.2. Kayıt Defteri Seçeneği . . . . . . . . . . . . . . . . . . . . . . .
5.3.2. İletişim Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.2.1. Bağlan Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.2.2. Bağlantıyı Kes Seçeneği . . . . . . . . . . . . . . . . . . . . . .
5.3.2.3. Port Ayarları Seçeneği . . . . . . . . . . . . . . . . . . . . . . .
5.3.3. Pencere Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3.1. Döşe Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3.2. Basamakla Seçeneği . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3.3. Tümünü Kapat Seçeneği . . . . . . . . . . . . . . . . . . . . . .
5.3.3.4. Proses Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3.5. Alarm Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.3.6. Sistem Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.4. Çıkış Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.4.1. Çıkış Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.4.2. Program Hakkında . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.5. Program Alt Pencerelerinin Tanıtılması . . . . . . . . . . . . . . . . .
5.3.5.1. Proses Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.5.2. Alarm Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3.5.3. Sistem Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4. Monitör Programının İlk Defa Çalıştırılması . . . . . . . . . . . . . . . . . . .
49
49
50
50
50
51
53
53
53
54
55
55
55
56
56
56
56
56
56
57
57
57
58
59
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
V
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
VI
Ş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
VII
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
Sinyalin
No
Kısaltması
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
GND
TX
RX
RTS
CTS
DSR
GND
RLSD
SRLSD
SCTS
STX
SRX
SCR
SRTS
TDR
SQD
RI
DSRS
SCTE
-
Sinyalin Tanımı
Sinyalin Yönü
Kategori
Koruyucu toprak
İletilen veri
Alınan veri
Gönderme isteği
Göndermeye açık
Veri devresi hazır
Sinyal toprağı
Alınan hat sinyali algılama
İkincil alınan hat sinyali
algılama
İkincil göndermeye açık
İkincil iletilen veri
İletim
sinyal
öğesi
zamanlaması
İkincil alınan veri
Yok
DTE’den DCE’ye
DCE’den DTE’ye
DTE’den DCE’ye
DCE’den DTE’ye
DCE’den DTE’ye
Yok
DCE’den DTE’ye
DCE’den DTE’ye
DCE’den DTE’ye
DTE’den DCE’ye
DCE’den DTE’ye
DCE’den DTE’ye
DCE’den DTE’ye
DTE’den DCE’ye
DTE’den DCE’ye
DCE’den DTE’ye
DCE’den DTE’ye
DTE’den DCE’ye
DTE’den DCE’ye
-
Toprak
Veri
Veri
Alıcı
sinyal
zamanlaması -
öğesi
İkincil gönderme isteği
Veri terminali hazır
Sinyal kalite dedektörü
Çağrı göstergesi
Veri sinyal hızı seçici
Gönderme
sinyal
öğesi
zamanlaması -
Kontrol
Kontrol
Toprak
Kontrol
Kontrol
Kontrol
Veri
Zamanlama
Veri
Zamanlama
Kontrol
Kontrol
Kontrol
Kontrol
Kontrol
Zamanlama
-
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
Sinyalin
No
Kısaltması
1
2
3
4
5
6
7
8
9
RX
TX
DTR
GND
DSR
RTS
CTS
RI
Sinyalin Tanımı
Sinyalin Yönü
Kategori
Alınan veri
Gönderilen veri
Veri terminali
Koruyucu toprak
Veri devresi hazır
Gönderme isteği
Göndermeye açık
Çağrı göstergesi
DCE’den DTE’ye
DTE’den DCE’ye
DTE’den DCE’ye
Yok
DCE’den DTE’ye
Yok
DCE’den DTE’ye
DTE’den DCE’ye
Veri
Veri
Kontrol
Toprak
Kontrol
Kontrol
Kontrol
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 OLUŞAN
GERİLİMİ
GERİLİM
VID
V
V
IA’
IB’
OLUŞAN
ALICI
GERİLİM OUTPUT
VCM
DURUMU
-7 V
-6,8 V
-200 mV
-6,9 V
Q
+12
V
+11,8
V
+200 mV
+11,9 V
Q
-7 V
-2 V
-5 V
-4,5 V
Q
+12
V
+7 V
+5 V
+9,5 V
Q
ÖLÇÜM
AMACI
-VCM ‘deki
minimum VI
+VCM ‘deki
minimum VI
-VCM ‘deki
minimum VI
+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 70 oC 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ı 0 oC 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
I/O
ADI
1-9,11,
12
I
CS
15
I
DATA INPUT
17
I
DATA OUT
16
O
EOC
19
O
GND
I/O CLOCK
REF+
REFVCC
10
18
14
13
20
I
I
I
AIN0 -AIN10
AÇIKLAMA
PİN NO
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ı.
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.
Seri data (veri) girişi. Dönüştürdükten sonra istenilen analog giriş
veya test gerilimi 4 bitlik bir seri adres seçer.
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.
Negatif referans gerilimi.
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İ
LP
XT
HS
KRİSTAL
C1
C2
FREKANSI
32 kHz
33 pF
33 pF
200 kHz
15 pF
15 pF
200 kHz
47-68 pF 47-68 pF
1 MHz
15 pF
15 pF
4 MHz
15 pF
15 pF
4 MHz
15 pF
15 pF
8 MHz
15-33 pF 15-33 pF
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
Kaynak
gerilimi
RAM veri
tutma gerilimi
PORsinyalinin
VDD’ye oranı.
Sembol Min
Tipik
Maks
(5V 25o)
Birimi
Açıklama
XT, RC ve LP osilatör
modlarında
VDD
4
-
6
Volt
VDR
-
1.5
-
Volt
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
ΔIBOR
-
350
425
ΜA
BOR aktif, VDD = 5 V
Brown Out
Reset akımı
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
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 Nedeni
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
RA0
Bit 0
TTL
Giriş/Çıkış
RA1
Bit 1
TTL
Giriş/Çıkış
RA2
Bit 2
TTL
Giriş/Çıkış
RA3
Bit 3
TTL
RA4/T0CK1
Bit 4
ST
RA5/SS
Bit 5
TTL
Giriş/Çıkış
Timer0 için giriş/çıkış veya
harici saat girişi. Çıkış open
drain tiptedir.
Giriş/Çıkış veya senkron seri
port için ikincil giriş seçimi.
Fonksiyon
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 pullup’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
RB0/INT
Bit 0
TTL/ST
RB1
RB2
RB3
RB4
RB5
RB6
RB7
Bit 1
Bit 2
Bit 3
Bit 4
Bit 5
Bit 6
Bit 7
TTL
TTL
TTL
TTL
TTL
TTL/ST
TTL/ST
Fonksiyon
Giriş/Çıkış veya
harici interrupt girişi.
Giriş/Çıkış
Giriş/Çıkış
Giriş/Çıkış
Giriş/Çıkış
Giriş/Çıkış
Giriş/Çıkış
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
RCO/T1OSO/T1CKI Bit 0
ST
RC1/T1OSI/CCP2
Bit 1
ST
RC2/CCP1
Bit 2
ST
RC3/SCK/SCL
Bit 3
ST
RC4/SDI/SDA
Bit 4
ST
RC5/SDO
Bit 5
ST
RC6/TX/CK
Bit 6
ST
RC7/RX/DT
Bit 7
ST
Fonksiyon
Giriş/Çıkış, Timer1 osilatör çıkışı
veya Timer1 saat girişi
Giriş/Çıkış, Timer1 osilatör girişi,
Capture2 girişi/Compare2
çıkışı/PWM2 çıkışı
Giriş/Çıkış, Capture1
girişi/Compare1 çıkışı/PWM1 çıkışı
SPI ve I2C modlarında senkron saat
darbeleri yapar.
SPI modu için SPI data girişi, I2C
modu için data çıkışı
Giriş/Çıkış veya senkran seri data
çıkışı
Giriş/Çıkış veya USART asenkron
gönderme pini
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
00
: Bank0
01
: Bank1
10
: Bank2
11
: 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
F
W
B
K
X
D
label
TOS
PC
PCLATH
GIE
WDT
TO
PD
dest
[ ]
( )
→
<>
Açıklama
Register adresi (0x00’dan 0x7F’e kadar)
Akümülatör
8 bitlik bir register içindeki bir bit adresi
Sabit değerli veri veya etiket
Tanımlanmamış alan
Hedef seçimi; d=0 ise işlem sonucu w registerine,
d=1 ise işlem sonucu f registerine kaydedilir.
Etiket ismi
Yığının en üst seviyesi
Program Counter
Program counter yüksek 4 bit tutucusu
İnterrupt giriş biti
Watchdog Timer
Zaman aşım biti
Kapatma
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
İşlem: 1 → (f<b>)
Komutun OPCODE formatı:
f,b
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
DEVAM
DECFSZ
CNT,1
GOTO
DONGU
..........
..........
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
DEVAM
INCFSZ
CNT,1
GOTO
DONGU
..........
..........
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]
İşlem: TOS → PC
1 → GIE
Komutun OPCODE formatı:
Örnek:
RETFIE
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
k → (W)
İşlem:
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]
İşlem: 00h
→ WDT
1 → TO
0
→ PD
Komutun OPCODE formatı:
SLEEP
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.
başla
hazırla
seri
sortu
oku
adres
aynı mı
komut
ve kanal
oku
komutun
gereğini
yap
Şekil4.1.Analog arabiri kartının akış diyagramı
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
binary.pas
:Bitsel
ünite.
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ü
get_card_data
: Karttan gelen word paketli bilginin taşıdığı veriyi alır.
verir.
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
card_address
sayac
dcnt
drpt1
drpt2
channel_no equ
command
card_response
adc_access equ
h'20'
equ
equ
equ
equ
equ
h'26'
equ
equ
h'29'
get_adress equ
get_param equ
send_lo
send_hi
adc_data_hi
adc_data_lo
endbuf
h'70'
h'71'
equ
equ
equ
equ
equ
h'21'
h'22'
h'23'
h'24'
h'25'
h'27'
h'28'
h'72'
h'73'
h'74'
h'75'
h'7F'
68
#define line_driver portb,1
#define yesil_led
#define kirm_led
portb,0
portc,4
#define baud_9600 portb,5
#define baud_19200 portb,6
#define baud_115200
#define
adress_0
#define adress_1
#define adress_2
#define read_adress
portc,1
portc,2
portc,3
porta,4
#define channel_0
#define channel_1
#define channel_2
portb,4
portb,3
portb,2
#define adc_eoc
#define adc_clock porta,1
#define adc_di
#define adc_do
#define adc_not_cs porta,5
portb,7
porta,0
porta,2
porta,3
org
goto
00h
init
; init vektor
org
goto
04h
init
; Reset Vektor
init
bcf
; ////////////// Baslangic icin ayar ve tanimlamalar ///////////////
status,rp0; bank 0 secildi
; //////////////// Status Settings ////////////////
bcf
bcf
bcf
status,dc ; digit carry
status,z ; zero flag
status,c ; carry flag
; //////////////// Baslangicta tum portlari sifirla ////////////////
clrf
clrf
clrf
porta
portb
portc
; porta latch
; portb latch
; portc latch
; /////////////// Global interrupt kontrol yazmaci /////////////////
bcf
bcf
bcf
bcf
bcf
bcf
bcf
bcf
intcon,gie
intcon,peie
intcon,t0ie
intcon,inte
intcon,rbie
intcon,t0if
intcon,intf
intcon,rbif
; global interrupt enable bit
; peripheral interrupt enable bit
; timer 0 overflow interrupt enable bit
; RB0/INT External Interrupt Enable bit
; RB Port Change Interrupt Enable bit
; timer 0 Overflow interrupt flag bit
; RB0/INT External Interrupt Flag bit
; RB port Change Interrupt Flag bit
; //////////////// Peripheral interrupt register ////////////////////
bcf
bcf
bcf
bcf
bcf
pir1,sspif ; Synchronous Serial Port Interrupt Flag bit
pir1,ccp1if
; CCP1 Interrupt Flag bit
pir1,tmr2if
; TMR2 to PR2 match interrupt flag bit
pir1,tmr1if
; TMR1 Overflow Interrupt Flag bit
pir2,ccp2if
; CCP2 Interrupt Flag
; /////////////// Timer 1 Kontrol register //////////////////////
69
bcf
bcf
bcf
bcf
bcf
bcf
t1con,t1ckps1
t1con,t1ckps0
t1con,t1oscen
t1con,not_t1sync
t1con,tmr1cs
t1con,tmr1on
; Timer1 Input Clock Prescale Select bits
; Timer1 Input Clock Prescale Select bits
; Timer1 Oscillator Enable Control bit
; Timer1 External Clock Input Synchronization Control bit
; Timer1 Clock Source Select bit
; Timer1 On bit
; /////////////// Timer 2 Kontrol Register /////////////////////
bcf
bcf
bcf
bcf
bcf
bcf
bcf
t2con,toutps3
t2con,toutps2
t2con,toutps1
t2con,toutps0
t2con,tmr2on
t2con,t2ckps1
t2con,t2ckps0
; Timer2 Output Postscale Select bits
; Timer2 Output Postscale Select bits
; Timer2 Output Postscale Select bits
; Timer2 Output Postscale Select bits
; Timer2 On bit
; Timer2 Clock Prescale Select bits
; Timer2 Clock Prescale Select bits
; /////////////// Senkron Seri Port Kontrol Registeri ///////////////
bcf
bcf
bcf
bcf
bcf
bcf
bcf
bcf
sspcon,wcol
sspcon,sspov
sspcon,sspen
sspcon,ckp
sspcon,sspm3
sspcon,sspm2
sspcon,sspm1
sspcon,sspm0
; Write Collision Detect bit
; Receive Overflow Detect bit
; Synchronous Serial Port Enable bit
; Clock Polarity Select bit
; Synchronous Serial Port Mode Select bits
; Synchronous Serial Port Mode Select bits
; Synchronous Serial Port Mode Select bits
; Synchronous Serial Port Mode Select bits
; ///////////////// Capture Compare PWM Kontrol Register //////////////
bcf
bcf
bcf
bcf
bcf
bcf
ccp1con,ccp1x
ccp1con,ccp1y
ccp1con,ccp1m3
ccp1con,ccp1m2
ccp1con,ccp1m1
ccp1con,ccp1m0
; PWM Least Significant bits
; PWM Least Significant bits
; CCPx Mode Select bits
; CCPx Mode Select bits
; CCPx Mode Select bits
; CCPx Mode Select bits
; /////////////// Asenkron Receive Register ///////////////////
bsf
bsf
bcf
rcsta,spen
; Serial Port Enable bit
rcsta,cren; Cont. receive enable bit
rcsta,rx9 ; 9-bit Receive Enable bit
bsf
status,rp0; bank 1 secildi
; /////////////// Option Register Settings ///////////////////
bsf
bcf
bcf
bsf
bcf
bcf
bcf
option_reg,not_rbpu
; PortB Pull-up enable bit
option_reg,t0cs
; Timer 0 Clock Source Select Bit
option_reg,t0se
; TMR0 Source Edge Select Bit
option_reg,psa
; Prescaler Assignment bit
option_reg,ps2 ; Prescaler Rate Value;
option_reg,ps1 ; Prescaler Rate Value;
option_reg,ps0 ; Prescaler Rate Value;
; ///////////// Port giris-cikis tanimlamalari /////////////////////
movlw
movwf
movlw
movwf
movlw
movwf
b'00011001'
trisa
b'11100000'
trisb
b'10000000'
trisc
; Porta Direction register
; Portb Direction register
; Portc Direction register
; ///////////////// Peripheral interrupt Enable Register ////////////
70
bcf
bcf
bcf
bcf
bcf
bcf
bcf
pie1,rcie ; USART Receive Interrupt enable Bit
pie1,txie ; USART Transmit Interrupt Enable Bit
pie1,sspie
; Synchronous Srial Port Interrupt enable Bit
pie1,ccp1ie
; CCP1 Interrupt Enable Bit
pie1,tmr2ie
; TMR2 to PR2 Match ınterrupt Enable Bit
pie1,tmr1ie
; TMR1 Overflow Interrupt Enable Bit
pie2,ccp2ie
; CCP2 Interrupt Enable Bit
; /////////////// Power Control REgister ////////////////////
bcf
bcf
pcon,not_por
pcon,not_bor
; Power on Reset Status bit
; Brown Out Reset Status bit
; //////////// Asenkron Transmit Register ///////////////////
bcf
bcf
bsf
bcf
bcf
txsta,csrc ; Clock Source Select Bit
txsta,tx9 ; 9-bit Transmit Enable Bit
txsta,txen; Transmit Enable Bit
txsta,sync
; USART Mode select bit
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
goto set_9600
; Test 9600 jumper
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
bsf adc_data_lo,2
bsf adc_clock
nop
nop
nop
bcf adc_clock
nop
nop
nop
btfsc adc_do
bsf adc_data_lo,1
bsf adc_clock
nop
nop
nop
bcf adc_clock
nop
nop
nop
btfsc adc_do
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
; 2. biti oku
; 1. biti oku
; 0. biti oku
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'
movwf adc_access
call adc_oku
nop
nop
call adc_oku
movlw d'04'
movwf card_response
call gonder
goto start
; dusuk 4 biti adcye yuksek dort bit olarak gonderilir.
ref_poz_oku
movlw b'00001101'
movwf adc_access
call adc_oku
nop
nop
call adc_oku
movlw d'05'
movwf card_response
call gonder
goto start
; dusuk 4 biti adcye yuksek dort bit olarak gonderilir.
ref_ort_oku
movlw b'00001011'
movwf adc_access
call adc_oku
nop
nop
call adc_oku
; dusuk 4 biti adcye yuksek dort bit olarak gonderilir.
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ı.

Benzer belgeler