Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
T.C MARMARA ÜNİVERSİTESİ
TEKNİK EĞİTİM FAKÜLTESİ ELEKTRİK EĞİTİMİ BÖLÜMÜ
8 ANALOG BİLGİNİN ARABİRİM KARTI İLE
BİLGİSAYARLA İZLENMESİ VE RAPORLAMA
BİTİRME PROJESİ
9601025 M. Ozan AKI 9601029 Ercan UYGUN
TEZ DANIŞMANI:
Yrd. Doç. Dr. Koray TUNÇALP
İSTANBUL, 2000
T.C MARMARA ÜNİVERSİTESİ
TEKNİK EĞİTİM FAKÜLTESİ ELEKTRİK EĞİTİMİ BÖLÜMÜ
8 ANALOG BİLGİNİN ARABİRİM KARTI İLE
BİLGİSAYARLA İZLENMESİ VE RAPORLAMA
BİTİRME PROJESİ
9601025 M. Ozan AKI 9601029 Ercan UYGUN
TEZ DANIŞMANI : Yrd. Doç. Dr. Koray TUNÇALP
KOMİSYON ÜYELERİ : Öğr. Gör. Fuat BÜYÜKTÜMTÜRK
Öğr. Gör. Bülent ORAL
KONTROL İMZA : ...........................................................
...........................................................
...........................................................
İSTANBUL, 2000
I
TEŞEKKÜR
Bu projeyi bize vererek bizim farklı bir proje gerçekleştirmemizi sağlayan ve tez
aşamasında bize gereken yolu gösteren,bizden yardımlarını esirgemeyen proje danışmanımız
sayın Yrd. Doç. Dr. Koray TUNÇALP’e, proje süresince bize her türlü finansal desteği ve
malzeme teminini sağlayan, bu konuda bizden yardımlarını esirgemeyen PRESTİJ A.Ş. Genel
Müdürü Sayın Hakan UĞUR ’a, teknik destek ve enformasyon konusunda her türlü yardım ve
desteği gösteren sayın Haşim TEPELİOĞLU’na, bilgisayar programı için gereken
seslendirme aşamasında bizlere yardım eden arkadaşımız Esra BÜYÜR’e, yine program
içerisinde kullanılan animasyon konusunda yardım eden arkadaşımız Mert KALDIRIM’a ve
baskı devre işlerinde bizlere destek olan SANEM ELEKTRONİK çalışanlarına teşekkürü bir
borç biliriz.
II
ÖZET
Bir bilgisayarla analog verileri okumak,izlemek ve kaydetmek olasıdır. Analog
arabirim kartı ile ölçme sisteminden verilerin alınıp bilgisayarda gösterilmesi işlemi
farklı aşamalardan oluşur. Bu aşamaları, bir verinin sensörden bilgisayar ekranına
gelinceye kadar olan yolculuğuyla açıklamak daha uygundur. Analog arabirim kartına
bağlı transdüser, sensörden okuduğu analog bilgiyi 4-20mA standart akım döngüsüne
çevirir. Daha sonra bu akım dirençlerle gerilime dönüştürülerek, kanal seçici
demultiplexer üzerinden opamp girişine uygulanır. Opamp, girişine gelen gerilimi 12
bitlik analog-dijital dönüştürücünün girişine uygular. Kart üzerinde bulunan
mikrokontrolöre bir kanal okuma isteği geldiğinde ilgili kanal demultiplexer ile seçilir
ve analog-dijital dönüştürücüden bu kanala ait veriler 12 bitlik senkron seri iletişim hattı
üzerinden okunur. Okunan kanal verisine kart cevap kodları eklenerek veri paketlenir ve
asenkron seri haberleşme hattı üzerinden gönderilir. Mikrokontrolör çıkışında dijital
gerilim seviyelerinde olan haberleşme sinyallerinin seviyeleri, RS485 hat sürücüsü ile
yükseltilerek, veri paketleri şeklinde hatta yollanır. Bilgisayar tarafında bulunan
RS485/RS232 dönüştürücü ile bu sinyal bilgisayarların kabul edebileceği seviyelere
dönüştürülür. Monitör programı, seri porta ulaşan bu veri paketlerini alarak çözümler ve
kart cevabı ile kanal verilerini ayırır. İlgili gösterge, kart verisinin içerdiği kanal
verisine set edilir. Maksimum – minimum sınırlarının kontrolu yapılır, eğer taşma varsa
uyarı verilir.
Analog arabirim kartının birimleri kabaca şu şekilde gruplanabilir; opamp
devresi, adc, mikrokontrolör, mikrokontrolör programı, haberleşme hatları ve bilgisayar
programı. Bu çerçevede projede konuya bir giriş teşkil etmesi açısından bilgisayarlı
ölçme sistemleriyle ilgili genel bilgiler yazılmış, daha sonra bu arabirim kartının
bileşenleri tek tek açıklanmıştır. Son bölümde kart ile okunan analog değerlerin
bilgisayar üzerinden izleme ve raporlamasının yapılabileceği bilgisayar programı
açıklanmıştır.
III
ABSTRACT
Reading, following and recording for the analog datas are possible by a
Personaal Computer. The proces of taking the datas from the measurement system and
following in PC consist of very different steps. These steps could be explained by a
journey which a data arrives from the sensor to the PC monitor. The transducer
connected to the analog interface converts the analog data to 4-20 mA standart current
circle. Afterwards, this current is applied to the opamp input through the channel
selective demultiplexer being converted to voltage by the resistors. The opamp applies
this voltage to 12 bit ADC’s input. When a channel reading requiest happens for the
microcontroller on the electronic card, the interested channel is selected by the
multiplexer, and the datas for this channel is read through 12 bit synchronous series
communication line. Adding the answer codes to the read channel data, the data is
packed, and this data is sent via the asynchronous series communication line. Being
amplified by the RS485 line driver of the communication signals’ levels in the packs are
sent to the line. This signal is converted to the levels which will be accepted for the PC
by the RS485/RS232 converter located inside of the PC. The monitor software analyzes
the these data packs arriving the series port, and it seperates the channel datas by the
card response. The interested indicator is set the channel data which includes the card
data. Maximum and minimum borders are controlled, if there is overflow, the warning
is given.
The analog interface units are = the opamp circuit, ADC, µC, µC software,
communication lines and PC software. For this purpose, in order to get an input to the
project, the general information about PC instrumentation systemshave been written,
later than, these components of the interface has been explained one by one. In the last
chapter, the PC software which has been explained viewing of the analog values
through PC, reporting of them.
IV
İÇİNDEKİLER
Sayfa
TEŞEKKÜR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I
ÖZET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . II
ABSTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III
İÇİNDEKİLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV
TABLOLAR VE ŞEKİLLER LİSTESİ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VI
1. GİRİŞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. BİLGİSAYAR VE BİLGİSAYARLI ÖLÇME DÜZENLERİ . . . . . . . . . . 3
2.1. Bilgisayarlı Ölçme ve Kontrol Sistemlerinin Avantajları . . . . . . . . . . 4
3. ANALOG ARABİRİM KARTI DONANIM YAPISI . . . . . . . . . . . . . . . . 6
3.1. Seri Arabirim Sitemleri ve Seri Veri İletimi . . . . . . . . . . . . . . . . . . . . 7 3.1.1. RS232C Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.1.2. RS422 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.3. RS485 Standardı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.1.4. SN75176 Seviye Dönüştürücüsü . . . . . . . . . . . . . . . . . . . . . . 15 3.2. Analog ve Dijital Dönüştürücü (ADC ) . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.1. Analog ve Sayısal Sinyaller . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.1.1. Analog ve Dijital Sinyallerin Birbirine Dönüşümü. . 17 3.2.2. TLC2543 ADC’si . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.2.1. Yapısı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3. Mikrokontrolör . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.3.1. Mikrokontrolörler ve Mikroişlemciler . . . . . . . . . . . . . . . . . . 20 3.3.2. Microchip PIC Mikrokontrolörleri . . . . . . . . . . . . . . . . . . . . 21 3.3.2.1. PIC16C63’ün Yapısı . . . . . . . . . . . . . . . . . . . . . . . . 21 3.3.2.1.1. Osilatör ve Rezonatör . . . . . . . . . . . . . . 22 3.3.2.1.2. Reset ve Besleme Devreleri . . . . . . . . . 23 3.3.2.1.3. Watchdog Timer . . . . . . . . . . . . . . . . . . 24 3.3.2.1.4. Input / Output ( I/O ) Portları . . . . . . . . 26 3.3.2.2. Bellek Organizasyonu . . . . . . . . . . . . . . . . . . . . . . . 28 3.3.2.3. PIC16C63 Komut Seti . . . . . . . . . . . . . . . . . . . . . . 30
V
4. PIC16C63’ÜN PROGRAMLANMASI . . . . . . . . . . . . . . . . . . . . . . . . . . . 47.
5. PC PROGRAMI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.1. Programın Kurulması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.2. Monitör Programına Genel Bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.3. Monitör Programının Tanıtılması . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.3.1. Kartlar Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5.3.1.1. Kartları Doğrula Seçeneği . . . . . . . . . . . . . . . . . . . . 50 5.3.1.2. Kayıt Defteri Seçeneği . . . . . . . . . . . . . . . . . . . . . . . 51 5.3.2. İletişim Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.1. Bağlan Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.2. Bağlantıyı Kes Seçeneği . . . . . . . . . . . . . . . . . . . . . . 53 5.3.2.3. Port Ayarları Seçeneği . . . . . . . . . . . . . . . . . . . . . . . 54 5.3.3. Pencere Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.1. Döşe Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.2. Basamakla Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . 55 5.3.3.3. Tümünü Kapat Seçeneği . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.4. Proses Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.5. Alarm Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.3.6. Sistem Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4. Çıkış Menüsü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4.1. Çıkış Seçeneği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.3.4.2. Program Hakkında . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.5. Program Alt Pencerelerinin Tanıtılması . . . . . . . . . . . . . . . . . 57 5.3.5.1. Proses Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.5.2. Alarm Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.3.5.3. Sistem Penceresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.4. Monitör Programının İlk Defa Çalıştırılması . . . . . . . . . . . . . . . . . . . 60
6. SONUÇ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
EKLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
EK1. PIC16C63 PROGRAMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
EK2. MONİTÖR PROGRAMI KAYNAK KODLARI . . . . . . . . . . . . . . . . . 80
EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . . . 80
EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . . . . . 89
EK2.3. FILEMAN.PAS ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . 92
EK2.4. AICPRO.PAS ÜNİTESİNİN KAYNAK KODU . . . . . . . . . . . . . 111
KAYNAKLAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
ÖZGEÇMİŞLER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
VI
TABLOLAR VE ŞEKİLLER LİSTESİ
Tablolar Listesi Sayfa
1. Tablo 3.1. RS232C standardı gerilim seviyeleri 8
2. Tablo 3.2. 25 pin RS232C konnektörü için pin adlandırmaları 10
3. Tablo 3.3. 9 pin RS232C konnektörü için pin adlandırmaları 12
4. Tablo 3.4. RS485 gerilim seviyeleri 15
5. Tablo 3.5. SN75176 Fonksiyon tablosu 16
6 Tablo 3.6. SN75176’nın giriş gerilimlerine göre çıkış durumları 16
5. Tablo 3.7. TLC2543 ADC’sinin pin adlandırmaları 20
6. Tablo 3.8. Osilatör tipine göre C1 ve C2’nin belirlenmesi 22
7. Tablo 3.9. PIC16C63 reset devrelerinin elektriksel özellikleri 24
8. Tablo 3.10. PORTA fonksiyonları 26
9. Tablo 3.11. PORTB fonksiyonları 27
10. Tablo 3.12. PORTC fonksiyonları 27
11. Tablo 3.13. PIC16C63 mikrokontrolör için OPCODE tanımlamaları 31
VII
Şekiller Listesi Sayfa
1. Şekil 3.1. Analog arabirim kartı 6
2. Şekil 3.2. Asenkron veri iletim biçimi 7
3. Şekil 3.3. RS232C‘nin elektriksel özellikleri 8
4. Şekil 3.4. RS232C arabiriminin temel çalışması 13
5. Şekil 3.5. RS422 elektriksel özellikleri 14
6. Şekil 3.6. RS485 elektriksel özellikleri 14
7. Şekil 3.7. SN75176 Pin adlandırması 16
7. Şekil3.8. Rampa tipi ADC’nin temel çalışma prensibi 18
8. Şekil3.9. TLC2543 ADC’si 19
9. Şekil 3.10. PIC16C63’ün pin isimlendirmeleri 21
10. Şekil 3.11. PIC16CXX için kristal osilatör bağlantı şeması 22
11. Şekil 3.12. Watchdog Timer blok diyagramı 25
12. Şekil 3.13. PIC16C63 için bellek haritası ve yığın 28
13. Şekil 3.14. Register adresleri 30
14. Şekil 3.15. PIC komutlarının yazılış formatı 32
15. Şekil 4.1. Analog arabirim kartının akış diyagramı 47
1. GİRİŞ
1980’li yılların başında “Kişisel Bilgisayar” olarak nitelendirilen cihazlar,
kullanıma sunulduğunda büyük çoğunlukla veri depolama, hesap tablosu ve kelime işlem
uygulamaları çalıştıran gerçek makinalardı. Büyük bir hızla gelişen bilgisayar teknolojisi
ile artan depolama kapasitelerinin yanında yeterince hızlı işlem yapabilir duruma
geldiklerinde çok çeşitli ve farklı amaçlara hizmet eden grafik tabanlı uygulamalar ve bu
uygulamaları çalıştıracak olan grafik tabanlı işletim sistemleri geliştirilmiştir. Aynı
zamanda insanların bilgiyi paylaşmaya ihtiyaçları, bilgisayarları kişisel olmaktan çıkaran
haberleşme araçlarının da gelişmesine neden olmuştur. Network(ağ) sistemleri, network
tabanlı işletim sistemleri ve uygulama programları, BBS(Bulletin Board System) ve
sonucunda internet. bilgisayarlarla paralel olarak gelişen bu haberleşme sistemleri birçok
cihazı bu haberleşme ağına bağlanmak zorunda bırakmıştır. Otomasyon sistemleri de
bundan nasibini almış, kontrol elemanları ve arabirim cihazlarının haberleşmesi için birçok
network sistemleri ortaya çıkmış ve bunların bilgisayar ortamına adaptasyonu sağlanmıştır.
Bunun sonucunda SCADA, DCS gibi sistemler geliştirilmiştir. Günümüzde, özellikle
ülkemizde bu sistemlerin seçim kriterleri veya alternatif uygulamalarının pek bilinmemesi
nedeniyle yüksek maliyetli sistemlerle karşı karşıya kalınması, bu tip sistemlerin pek az
uygulama alanı bulmasına neden olmuştur. Sadece endüstriyel amaçlara hizmet ettiği
düşünülen bu sistemler, yeterince ucuz ve kolay uygulanabilir olduğunda evlerdeki
bilgisayarlarda bile uygulama alanı bulacaktır. Bu nedenle bitirme projesi olarak seçilen
analog arabirim kartları düşük maliyetli, kolay uygulanabilir ve çok yönlü yazılım desteği
ile tasarlanmaya çalışılmıştır. Her birinin üzerinde 8 adet 4-20mA analog girişe sahip olan
bu kartlarda, tek bir hat üzerinden 127 adet bağlanabilen, her kartın verileri bilgisayar
üzerinden izlenebilen ve kaydedilebilen bir sistem oluşturmaya çalışılmıştır. İleride daha
ayrıntılı bilgiler verilecek bu kart üzerinde Microchip firmasına ait PIC16C63
mikrokontrolörünü ve kartların uzun mesafede güvenle haberleşebilmesini sağlamak
2
amacıyla RS485 arabirimini kullanılmıştır. Bilgisayar yazılımında ise programın kolay
uygulanabilir, sade fakat ihtiyaçlara cevap verebilecek fonksiyonlarla desteklenmiş
olmasına çalışılmıştır. Sonuçta ortaya çıkan ürünün piyasada kullanılan pahalı veri toplama
sistemlerinin yanında maliyeti kıyaslanırsa, yaptığı işin hiçte az olmadığı ortaya çıkacaktır.
Düşüncemiz her sistemin, her cihazın, hatta bir tost makinesinin bile diğer cihaz ve
sistemlerle haberleşebilmesi ve denetimlerinin yapılmasına olanak veren bir bilgisayar
sistemine bağlanabilmesidir.
2. BİLGİSAYAR VE BİLGİSAYARLI ÖLÇME SİSTEMLERİ
Bilindiği gibi modern bilgisayar teknolojisinin tarihi 1946’da başlamaktadır. Üç
yıllık bir çalışmanın sonucunda Pensillvania Üniversitesinde ilk dijital bilgisayar
yapılmıştı. Cihazın ağırlığı 30 tondan fazla olmakla beraber enerji tüketimi çok fazlaydı.
1960’lı yıllarda bilgisayar üretiminde devrim olmuş ve bu ilk bilgisayarların yerini
transistör ve diyotlardan oluşan bilgisayarlar olmuştur. Ölçüm ve bilgisayar teknolojisi
ile yakından ilgilenme 1963’ten sonra başlamış ve aynı yıl ilk mini bilgisayar
üretilmiştir.
Mini bilgisayarların ortaya çıkması, ölçme konusunda bilgisayar kullanımında
büyük bir adım olmuştur. Çok kısa zaman öncesine kadar bir ölçme ve kontrol sistemi
yükselticiler, röleler, göstergeler gibi elemanlardan oluşmaktaydı. Bunların komple bir
kontrol sistemi haline getirilmesi için her sistemin kendine özgü tasarımının olması
gerekmekteydi. Günümüzde, yüksek hızlarda işlem yapabilme, veri depolayabilme ve
sorgulama, verileri işleme ve paylaşabilme yeteneklerinden dolayı her alanda olduğu
gibi ölçme alanında da bilgisayar tercih edilen bir araç durumuna gelmiştir. Bilgisayar
içeren ölçme sistemleri birden fazla ölçmeyi aynı anda yapan ve bu ölçmelerle ilgili
hesaplamaları yapabilen, çeşitli parametreler arasındaki ilişkileri sayısal veya grafiksel
olarak çıkışa verebilen ölçü sistemleridir. O halde bilgisayar, ölçme ve kontrol
işlemlerinin çoğunu en az çaba ile çok kısa sürede yazılabilecek duruma getirmektedir.
Aynı bilgisayar ile bir borunun içindeki sıvının debisini ölçüp sürekli kaydedebilir, bir
üretim makinasının kontrolü yapılabilir veya değişik yerlerden gelen aynı tipteki bilgiler
karşılaştırılarak analiz yapılabilir. Tüm bu sistemler arasında bir tek fark vardır, o da her
sistem için yazılan komutların farklı olmasıdır.
Bilgisayarlı ölçme sistemlerinde temel olarak üç eleman vardır. Bunlardan
birincisi; gerekli ölçmeyi yapan ve bilgisayarla uyumlu olarak çalışabilen cihaz,
ikincisi; ölçme ile ilgili yazılımı içeren bilgisayar ve üçüncüsü de bilgisayar ile ölçme
sistemi arasındaki veri iletimini sağlayan haberleşme sistemidir.
Enstrümantasyon ve kontrol için kullanılan bilgisayar sistemlerinin temelinde
mikro veya mini bilgisayarlar vardır ve yüksek seviyeli bir dilde programlanırlar. Bu
4
yüzden kullanıcı sistemin yaptığı işlerde yazılımla değişiklikler yapabilir. Bu tip
sistemler tarafından yapılan işlerden bazıları şöyle sıralanabilir:
1. Cihazlardan veya prosesten alarm sinyallerinin alınması ile birlikte veri
toplama, analog ve dijital sinyalleri kaydetme
2. Kaydedilmiş veriler üzerinde kullanıcının kontrolü altında istatistiksel ve
sayısal analiz veya birbiriyle ilişkili ölçümlerin elde edilmesi amacıyla
hesaplama
3. Proseslerin sıralı işletilmesi ve kontrolu
4. Birtakım analog kontrol cihazlarının ayar noktalarının bilgisayar
tarafından izlenip ayarlanması
5. Ölçme sistemindeki parametrelerin optimizasyonu
2.1. Bilgisayarlı Ölçme ve Kontrol Sistemlerinin Avantajları
Herhangi bir ölçme veya kontrol sistemi, tasarım aşamasından itibaren
tamamlanıncaya kadar çeşitli aşamalardan geçmektedir. Bu aşamalar belirli bir sıra
takip eder, birbiriyle çakışmaz ve bu nedenle, projenin süresi bu aşamaların aldığı
toplam süredir. Klasik ölçme ve kontrol sistemleriyle bilgisayarlı ölçme ve kontrol
sistemlerinin her bir aşama için ayrı ayrı karşılaştırmasını yapılırsa şu sonuçları
çıkarılabilir:
Tasarım aşamasında; klasik sistemlerle ilgili çalışma yaparken, yapım aşamasına
geçmeden önce kontrol elemanları için tek sipariş verilmesi gerektiği için dizayn
çalışmalarının tamamlanmaya yakın bir seviyeye gelmiş olması şarttır. Bilgisayarlı bir
sisteme ilişkin çalışma yapılırken yapım aşamasından önce belirlenmesi gereken tüm
özellikler, bilgisayarın tipi ve büyüklüğü ile I/O (giriş/çıkış) şartlarıdır. Sistemin
tasarımı aslında bilgisayar programının yazılmasından ibarettir. Bu çalışma sistemin
donanım yapısı ile paralel olarak yürütülebilir ve böylece projenin toplam süresini
kısaltır.
Konstrüksiyon (kurulum,yapı) aşamasında; klasik kontrol sistemlerinde her
elemanın ayrı bir yapısı ve bağlantı devresi vardır. Doğal olarak bu durum,
işçilik,zaman ve maliyet yönünden dezavantajlıdır. Bilgisayarlı sistemlerin kurulması
ise standart parçaların bir araya getirilmesinden ibarettir.Belirli bir amacı
gerçekleştirmek için yapılmış ışıklı panolar yerine görüntü birimlerinin kullanılmasında,
5
proses kontrolünün röleler ve kontrol elemanları yerine programlarla yapılmasında
şüphesiz maliyetten tasarruf sağlanmaktadır. Ayrıca, Bilgisayar sistemi, klasik
sistemlerden daha düzenlidir.
İşletmeye alma aşamasında; herhangi bir karmaşık sistemin ilk çalıştırıldığı
zaman iyi performans vermesi çok zordur. Muhtemelen bazı tasarım hataları olacaktır.
Bilgisayar kullanılmayan klasik sistemlerde hataların arındırılması ve düzeltilmesi çok
güçtür. İşletmeye alma sırasında, dizayn hataları kaydedilmediği için dökümantasyonda
eksiklikler olabilir. Bilgisayar programlarında ise, yapısal özelliklerinden dolayı
dökümantasyon daima güncel durumda tutulabilir.
Bakım aşamasında; bilgisayar sistemleri çok kolay bakım yapılabilir özelliktedir
ve arıza bulmakla görevli işinin bilgisayar konusunda çok fazla bilgi sahibi olmasına
gerek yoktur. Bilgisayarlı sistemlerde arızaların büyük çoğunluğu bilgisayarın
kendisinde değil, bir takım çevresel cihazlarda olmaktadır.
3. ANALOG ARABİRİM KARTI
Daha önce açıklandığı gibi, bilgisayarlı ölçme sistemlerinde üç temel eleman vardır.
Bunlardan biri gerekli ölçmeyi yapan ve bilgisayarla haberleşebilen cihaz, ikincisi
bilgisayar programı ve üçüncüsü de bilgisayar ile cihaz arasındaki iletişimi sağlayacak olan
haberleşme sistemidir. Bu projede yapılan arabirim kartı da ölçmeyi yapan ve bilgisayara
bağlanabilen cihazdır.
Bir arabirim kartında bulunması gereken temel elemanlar kısaca bir analog dijital
konvertör (ADC), veri iletimi için bir arayüz (RS485 veya RS232 gibi) ve ana eleman olan
mikrokontrolör olarak sıralanabilir. Bu bölümde analog arabirim kartının donanım kısmını
oluşturan bu elemanların yapıları, bağlantıları ve çalışma şekillerine değinilmiştir. Analog
arabirim kartının temel bileşenleri ve baskı devresi şekil 3.1’de görülmektedir.
a) Temel bileşenler
b) Baskı devresi Şekil 3.1. Analog arabirim kartı
7
3.1. Seri Arabirim Sistemleri ve Seri Veri İletimi
Bilgisayarlı ölçme ve kontrol sistemlerinde herhangi iki modülün veya modüllerle
bilgisayarın birlikte çalışabilmesi için bunların birbirleriyle ve bilgisayarla haberleşmeleri
gereklidir. Cihazlar birbirleriyle haberleşirken birbirlerini sistemli bir şekilde
etkileyebilmeleri için ortak bir haberleşme tekniği kullanmak zorundadır. Bu teknikler
genelde iki ana başlık altında toplanırlar. Bunlar seri ve paralel arabirimler olarak
adlandırılır.
Paralel arabirimde verileri içeren bitler arabirim üzerinde paralel hatlardan aynı
anda iletilirler. Her bit için ayrı hat kullanılır. Seri arabirime oranla daha hızlı çalışır. Yalnız
burada her bir hat için alıcı-verici gereklidir.
Seri arabirimlerde veriler tek hat üzerinden iletilirler. Seri arabirimler senkron veya
asenkron olabilirler. Senkron veri iletiminde veri bit hızı verici ve alıcıdaki saatler
tarafından belirlenir, bu yüzden de sabit hızdadır.
Asenkron sistemler genellikle düşük hızlı terminallerde (1200 bit/saniyeden düşük
hızlarda) kullanılır. Sadece veri iletileceği zaman çalışırlar. Önce başlama biti, arkasından
veri bitleri ve ondan sonra da bitiş (durdurma) biti gelir. Başlatma biti her zaman lojik 0
düzeyindedir. Durdurma biti ise her zaman için lojik 1 düzeyinde olur. Aşağıdaki şekilde
asenkron veri iletim biçimi görülmektedir.
Şekil 3.2. Asenkron veri iletim biçimi
Donanım ara bağlantılarının neden olduğu çeşitli sorunları ortadan kaldırmak
amacıyla seri veri iletiminde de bir takım standartlar uygulanmaktadır. Bu standartlardan en
çok kullanılanlarına RS232C, RS422, RS485, IEEE488 örnek olarak verilebilir. Bu
standartlar çok kullanılan standartlar oldukları için burada bunlardan bahsetmek faydalı
olacaktır.
8
3.1.1. RS232C Standardı
RS232C standardı bir donanımın iki parçası arasında elektriksel topraklama, veri
değişimi, kontrol ve zamanlama sinyalleri elde etmek amacıyla kullanılan 9 pinli veya 25
pinli bir fiş ve soketin uçlarını isimlendirmek suretiyle bir elektromekanik arabirim
tanımlar.
Şekil 3.2.’de RS232C’nin elektriksel özellikleri görülmektedir.Kablonun terminal
yük kapasitansı kablo kapasitansı ile birlikte 2500 pF olarak belirlenmiştir. Sonlandırma
ucundaki empedans 3000 Ω ile 7000 Ω arasında, çıkış empedansı da 300Ω olarak
belirlenmiştir. Bu elektriksel özelliklerle ve maksimum 20000bps’lik (bit per second) veri
iletim hızı için, RS232C arabiriminin maksimum uzunluğunun anma değeri 15 m
civarındadır.
Şekil 3.3. RS232C’nin elektriksel özellikleri
Tablo 3.1. RS232C standardı gerilim seviyeleri (volt DC)
Veri Pinleri
Lojik 1 Düzeyi (Volt) Jojik 0 Düzeyi (Volt)
Sürücü -5 ile –15 arası +5 ile +15 arası
Alıcı -3 ile –25 arası +3 ile +25 arası
Denetim Pinleri
Yetkilendirme “Açık”(Volt) Yetkisizlik “Kapalı” (Volt)
Sürücü +5 ile +15 arası -5 ile –15 arası
Alıcı +3 ile +25 arası -3 ile –25 arası
9
Tablo 3.1.’de RS232C arabiriminde sürücülerin ve alıcıların gerilim sınırları
görülmektedir. Tabloya dikkat edilirse alıcının sınırlarının sürücünün sınırlarından daha
fazla olduğu görülecektir. Sürücü +5 ile +15 ya da –5 ile –15 V dc arasındaki herhangi bir
gerilimde çıkış yapabilirken, alıcı +3 ile +25 veya –3 ile –25 V dc arasındaki herhangi bir
gerilimi kabul edebilmektedir. Alıcı ile sürücü arasındaki bu gerilim düzeyi farkına gürültü
aralığı denir.
RS232C arabirim kablosu üzerindeki pinler gördükleri işlevlere göre çeşitli sınıflara
ayrılmışlardır: Toprak pinleri, veri pinleri, denetim (onay) pinleri ve zamanlama pinleri.
Bütün pinler tek yönlü olarak çalışırlar. Sinyaller ya veri terminalinden (Data Terminal,
DTE) Veri haberleşme cihazlarına (Data Communication Equipment, DCE), ya da tersi
şekilde iletilirler.
25 pinli RS232’deki 25 pinden yirmi tanesi belirli amaçlar için ayrılmıştır. 9, 10, 11,
18 ve 25 nolu pinler herhangi bir işleve sahip değildir. 1 ve 7 nolu pinler toprak pinleri, 2,
3, 14 ve 16 nolu pinler veri pinleri, 15, 17 ve 24 nolu pinler ise zamanlama pinleri olarak
belirlenmiş, geriye kalan tüm pinler denetim (onay) sinyallerine ayrılmıştır. Toprak A, veri
B, denetim C ve zamanlama bacağı da D harfi ile belirtilir.
RS232C’de kullanılabilir iki veri kanalı mevcuttur. Birinci kanal birincil (gerçek)
veriler için, ikinci kanal ise ikincil veri (tanı bilgisi ve onay sinyalleri) içindir.
1 nolu pin (koruyucu toprak): Elektriksel şoka karşı koruma amacıyla kullanılır.1
nolu pin alıcının bir ucunda (ya DTE, ya da DCE, ikisinde birden değil) AC elektriksel
sistemin üçüncü tel toprağına bağlanmalıdır.
2 nolu pin (iletilen veri, TX): Veri terminalinden (DTE) veri haberleşme cihazına
(DCE) seri veri bu pinden gönderilir. Bu pin göndermeye açık (CTS) bacağının etkin
olması durumunda yetkilendirilir.
3 nolu pin (alınan veri, RX): Birincil kanaldaki seri veri, veri haberleşme cihazından
(DCE) veri terminaline (DTE) bu pinden gönderilir. Bu bacağın yetkilendirilebilmesi için
alınan hat sinyali algılama (RLSD) bacağının etkin olması gerekir.
10
Tablo 3.2. 25 pin RS232C konnektörü için pin adlandırmaları
Pin
No
Sinyalin
Kısaltması Sinyalin Tanımı Sinyalin Yönü Kategori
1 GND Koruyucu toprak Yok Toprak 2 TX İletilen veri DTE’den DCE’ye Veri 3 RX Alınan veri DCE’den DTE’ye Veri 4 RTS Gönderme isteği DTE’den DCE’ye 5 CTS Göndermeye açık DCE’den DTE’ye Kontrol 6 DSR Veri devresi hazır DCE’den DTE’ye Kontrol 7 GND Sinyal toprağı Yok Toprak 8 RLSD Alınan hat sinyali algılama DCE’den DTE’ye Kontrol 9 - - - - 10 - - - - 11 - - - - 12 SRLSD İkincil alınan hat sinyali
algılama DCE’den DTE’ye Kontrol
13 SCTS İkincil göndermeye açık DCE’den DTE’ye Kontrol 14 STX İkincil iletilen veri DTE’den DCE’ye Veri 15 - İletim sinyal öğesi
zamanlaması DCE’den DTE’ye Zamanlama
16 SRX İkincil alınan veri DCE’den DTE’ye Veri 17 SCR Alıcı sinyal öğesi
zamanlaması DCE’den DTE’ye Zamanlama
18 - - - - 19 SRTS İkincil gönderme isteği DTE’den DCE’ye Kontrol 20 TDR Veri terminali hazır DTE’den DCE’ye Kontrol 21 SQD Sinyal kalite dedektörü DCE’den DTE’ye Kontrol 22 RI Çağrı göstergesi DCE’den DTE’ye Kontrol 23 DSRS Veri sinyal hızı seçici DTE’den DCE’ye Kontrol 24 SCTE Gönderme sinyal öğesi
zamanlaması DTE’den DCE’ye Zamanlama
25 - - - -
4 nolu pin (gönderme isteği, RTS): DTE, DCE’ye birincil kanaldan veri gönderme
isteğini bu pinden iletir. Etkin olması halinde modemin analog taşıyıcısını açık duruma
getirir. Etkin olması için 6 nolu bacağın (DSR) etkin olması gerekir.
5 nolu pin (göndermeye açık, CTS): Gönderme isteğine yanıt olarak veri
haberleşme cihazından veri terminaline bir onaydır. Etkin olması durumunda gönderme
verisi (TX) bacağını yetkilendirir.
6 nolu pin (veri devresi hazır, DSR): Veri haberleşme cihazı (DCE) iletişim
kanalının kullanılabilir olup olmadığını gösterir. DCE iletişim kanalına bağlı olduğu sürece
DSR etkindir.
7 nolu pin (sinyal toprak, GND): Bu pin tüm veri, haberleşme ve zamanlama pinleri
11
için sinyal referansıdır. Genelde 1 nolu bacağa bağlanır.
8 nolu pin (alınan hat sinyali algılama, RLSD): Veri haberleşme aygıtı veri
terminaline birincil kanaldan analog bir taşıyıcı almakta olduğunu bu pini kullanarak
belirtir. Alınan veri (RD) bacağını yetkilendirir.
12 nolu pin (ikincil alınan hat sinyali algılama, SRLSD): DCE ikincil kanalda
analog bir taşıyıcı almakta olduğunda bu pin etkindir. İkincil alınan veri bacağını (16 nolu
pin) yetkilendirir.
13 nolu pin (ikincil göndermeye açık, SCTS): Veri haberleşme aygıtı (DCE) bu
bacağı, ikincil gönderme isteğinde etkin duruma yanıt olarak, veri terminaline (DTE) onay
göndermede kullanır. 14 nolu bacağı yetkilendirir.
14 nolu pin (ikincil iletilen veri, STD): Tanı verileri, DTE’den DCE’ye bu pinden
aktarılır. 13 nolu pin etkin durumda olduğunda bu pin ta etkin olur.
15 nolu pin (iletim sinyal öğesi zamanlaması, SCT): Gönderme saat sinyallerinin
iletilmesi bu pinden yapılır.
16 nolu pin (ikincil alınan veri): Tanı verileri DCE’den DTE’ye buradan aktarılır.
Yetkilenebilmesi için 13 nolu bacağın etkin durumda olması gereklidir.
17 nolu pin (alıcı sinyal öğesi zamanlaması, SCR): Alma saat sinyalleri bu pinden
gönderilir. Saat frekansı birincil veri kanalının bit iletim hızına eşittir.
19 nolu pin (ikincil gönderme isteği, SRS): Veri terminali (DTE), veri haberleşme
cihazına (DCE) ikincil iletim kanalından veri gönderme isteğini bu pinden iletir.
20 nolu pin (veri terminali hazır, DTR): DTE DCE’ye bu pinden, veri terminal
donanımının kullanılabilirliği ile ilgili bilgi gönderir.
21 nolu pin (sinyal kalite dedektörü, SQD): Veri kontr0ol aygıtı (DCE) veri
terminaline (DTE) bu pin ile alma analog taşıyıcısının kalitesiyle ilgili bilgi verir.
22 nolu pin (halka göstergesi, RI): Bu pin, numara çevirme hatlarında DCE’nin
DTE’ye gelen bir arama olduğunu bildirmesi için kullanılır.
23 nolu pin (veri sinyal hızı seçici, DSRS): DTE bu bacağı DCE’nin bit iletim hızını
(saat frekansını) seçmesinde kullanır.
24 nolu pin (gönderme sinyal öğesi zamanlaması, SCTE): Ana saat osilatörü
DTE’de bulunduğunda, gönderme saat sinyalleri DTE’den DCE’yeburadan gönderilir.
12
Aşağıda ise 9 pinli RS232’nin pin adlandırmaları verilmiştir.
Tablo 3.3. 9 pin RS232C konnektörü için pin adlandırmaları
Pin
No
Sinyalin
Kısaltması Sinyalin Tanımı Sinyalin Yönü Kategori
1 2 RX Alınan veri DCE’den DTE’ye Veri 3 TX Gönderilen veri DTE’den DCE’ye Veri 4 DTR Veri terminali DTE’den DCE’ye Kontrol 5 GND Koruyucu toprak Yok Toprak 6 DSR Veri devresi hazır DCE’den DTE’ye Kontrol 7 RTS Gönderme isteği Yok Kontrol 8 CTS Göndermeye açık DCE’den DTE’ye Kontrol 9 RI Çağrı göstergesi DTE’den DCE’ye Kontrol
2 nolu pin (alınan veri, RX): seri veri, veri haberleşme cihazından (DCE) veri
terminaline (DTE) bu pinden gönderilir.
3 nolu pin (iletilen veri, TX): Veri terminalinden (DTE) veri haberleşme cihazına
(DCE) seri veri bu pinden gönderilir. Bu pin göndermeye açık (CTS) bacağının etkin
olması durumunda yetkilendirilir.
4 nolu pin (veri terminali hazır, DTR): DTE DCE’ye bu pinden, veri terminal
donanımının kullanılabilirliği ile ilgili bilgi gönderir.
5 nolu pin (koruyucu toprak): Elektriksel şoka karşı koruma amacıyla kullanılır.5
nolu pin alıcının bir ucunda (ya DTE, ya da DCE, ikisinde birden değil) ac elektriksel
sistemin üçüncü tel toprağına bağlanmalıdır.
6 nolu pin (veri devresi hazır, DSR): Veri haberleşme cihazı (DCE) iletişim
kanalının kullanılabilir olup olmadığını gösterir. DCE iletişim kanalına bağlı olduğu sürece
DSR etkindir.
7 nolu pin (gönderme isteği, RTS): DTE, DCE’ye veri gönderme isteğini bu pinden
iletir. Etkin olması halinde modemin analog taşıyıcısını açık duruma getirir. Etkin olması
için 6 nolu bacağın (DSR) etkin olması gerekir.
8 nolu pin (göndermeye açık, CTS): Gönderme isteğine yanıt olarak veri
haberleşme cihazından veri terminaline bir onaydır. Etkin olması durumunda gönderme
verisi (TX) bacağını yetkilendirir.
9 nolu pin (çağrı göstergesi, RI): Bu pin, numara çevirme hatlarında DCE’nin
13
DTE’ye gelen bir arama olduğunu bildirmesi için kullanılır.
Şekil 3.4.’te RS232C ‘nin temel çalışması görülmektedir. Buna göre; DTE (veri
terminali) birincil veri göndermek istediği zaman gönderme isteğini yetkilendirir (t=0 anı).
Belirli bir zaman gecikmesinden sonra (50 ms) 4 nolu pin (CS) etkin hale gelir. RS /CS
gecikmesi sırasında modemin çıkışı analog bir taşıyıcıdır (iletişim kurma sırası). İletişim
kurma sırası, iletişim hattını kullanıma hazırlamada ve alma modeminde taşıyıcı ile saat
darbesini tekrar elde etme devrelerini senkronize etmede kullanılır. RS /CS gecikmesinden
sonra, TD (2 nolu pin) yetkilendirilir ve DTE (veri terminali) veri göndermeye başlar. Alma
DTE’si bir analog taşıyıcı algıladığında RD (3 nolu pin) yetkilenir. İletim tamamlandıktan
sonra (t = 150 ms), RS (4 nolu pin) lojik 0 konumuna geçerek analog taşıyıcıyı keser ve
CS’yi (5 nolu pin) kapar. Böylece veri iletimi tamamlanmış olur.
Şekil 3.4. RS232C arabiriminin temel çalışması (zamanlama diyagramı)
14
3.1.2. RS422 Standardı
RS 422 standardı, RS232C standardını bir bakıma tamamlama görevi görmektedir.
RS232C standardından daha yüksek veri transfer hızına ve daha uzun mesafelerde
kullanılmak için tasarlanmıştır ( ≤ 2Mbit / saniye).
Şekil 3.5. RS422 Elektriksel özellikleri
D : Driver (Sürücü) R : Receiver (Alıcı) ZT: Terminal empedansı
Şekil 3.5.’te RS422 standardının elektriksel eşdeğer devresi görülmektedir. Burada
sürücü (driver) D, alıcı R ve alıcı empedansı da ZT ile gösterilmiştir. Terminal empedansı
kablonun karakteristik empedansına (Z0) eşit olarak alınmış ve sadece devrenin sonunda
bir kez kullanılmıştır. Kablo boyunca, A ve B noktalarıyla A’ ve B’ noktaları arasında
sırasıyla 9 adede kadar alıcı (receiver) bağlanabilir.
3.1.3. RS485 Standardı
5 voltluk bir sistemde, şayet birden fazla alıcı isteniyorsa, RS485 uyumlu cihazların
kullanılması tavsiye edilmektedir. 485 standardı bir anda sadece bir sürücüden data (veri)
gönderilmesine müsaade etmekle birlikte, tek bus (ağ) üzerinde çok miktarda alıcı (32
adede kadar) yerleştirilebilir. Şekil 3.6 RS485 standardının elektriksel özelliklerini
göstermektedir.
Şekil 3.6. RS485 elektriksel özellikleri
D1: Driver (sürücü) D3/R3: Transceiver R2: Receiver (alıcı) ZT: Terminal empedansı
15
Şekil 3.5. ile şekil 3.6 karşılaştırıldığında 422 ve 485 sistemlerinin topolojilerinin
farkı açıkça görülmektedir. 485 dengeli çok noktalı sistemlerde çalışabilmekte, buna karşın
422 bir bus (ağ) için yalnızca bir sürücüyü desteklemektedir. RS 485 için belirlenmiş
maksimum kablo uzunluğu 1200 metredir. Tablo 3.4.’te RS485 standardının gerilim
seviyeleri verilmiştir.
Tablo 3.4. RS485 gerilim seviyeleri
UYGULAMA GERİLİMİ
VIA’ VIB’
OLUŞAN GERİLİM
VID
OLUŞAN GERİLİM
VCM
ALICI OUTPUT DURUMU
ÖLÇÜM AMACI
-7 V -6,8 V -200 mV -6,9 V Q -VCM ‘deki minimum VI
+12 V
+11,8 V +200 mV +11,9 V Q +VCM ‘deki
minimum VI
-7 V -2 V -5 V -4,5 V Q -VCM ‘deki minimum VI
+12 V +7 V +5 V +9,5 V Q +VCM ‘deki
minimum VI
3.1.4. SN75176 Seviye Dönüştürücüsü
SN75176, 3 durumlu bir diferansiyel hat sürücüsü ve diferansiyel input hat alıcısı
birleşiminde, bunlardan hangisinin 5 voltluk kaynakta çalıştırılacağını belirler. Sürücü ve
alıcı sırasıyla lojik 1 ve lojik 0 seviyesine sahip olduklarında, doğrusal kontrol
fonksiyonunda olduğu gibi ikisini birlikte harici olarak birleştirir.Sürücünün pasif olduğu
herhangi bir zamanda ağ (bus) üzerinde minimum yüklenme olması için, sürücü çıkışlarının
ve alıcı girişleri ağ üzerinde farklı giriş çıkış portları üzerinde dahili olarak bağlanacak
şekilde tasarlanmıştır. Bu portların özelliği pozitif ile negatif arasında geniş bir gerilim
aralığı sağlar. Çalışma sıcaklığı 0oC ile 70oC arasındadır.
16
Şekil 3.7. SN75176 pin adlandırması
Şekil 3.7.’de SN75176’ya ait pin numaralandırmaları ve tablo 3.5. ve tablo 3.6.’da
da fonksiyon tabloları görülmektedir.
Tablo 3.5. SN75176 fonksiyon tablosu
Tablo 3.6. SN75176’nın giriş gerilimlerine göre çıkış durumları
17
3.2. Analog Dijital Dönüştürücü (ADC)
3.2.1. Analog ve Sayısal (Dijital) Sinyaller)
Elektronikte temel olarak iki işaret vardır: Analog ve sayısal (dijital) sinyaller.
Analog sinyal, herhangi iki uç sınır arasında sonsuz sayıda değer alabilen sinyaldir. 0 oC ile
100oC arasındaki sıcaklık değerleri buna örnek olarak verilebilir. Dijital sinyal ise sadece
belli değerler alabilen sinyaldir. Dijital sistemlere ise bilgisayarlar örnek olarak verilebilir.
Bilgisayarlarda tüm bilgiler 1 ve 0 ile temsil edilir. Örneğin; sinyal var ise 1 ile, sinyal
yoksa 0 ile belirtilir.
Dönüştürücülerin çoğu tarafından üretilen sinyaller analog sinyaller olmasına
rağmen, mikroişlemciler ve mikrobilgisayarlar ile daha ucuz hesaplama gücünün
gelişmesiyle birlikte, çoğu verilerin ve bilgilerin sayısal olarak iletimi ve işlenmesi sayısal
olarak gerçekleştirilmektedir. Sayısal sistemler analog sistemlere göre birtakım avantajlar
sağlamaktadırlar. Sayısal sistemler sinyalin iletilmesi sırasında çok az veri bozulması
problemi yaşarlar ve bu problemler, iletilen verilere basit hata kontrol kodları uygulamak
suretiyle kabul edilebilir seviyeye düşürülür. Analog sistemler yüksek frekans ve düşük
seviyeli sinyallerin işlenmesinde kullanılır.
3.2.1.1. Analog ve Sayısal Sinyallerin Birbirine Dönüşümü
Analog sinyallerin dijital sinyallere dönüştürülmesinde ADC (analog – digital
converter) olarak tanımlanan entegreler kullanılır. ADC’ler çok geniş bir konu olmakla
beraber, projemizin asıl konusu olmadığı için burada genel bir rampa tipi ADC’nin yapısını
anlatmakla yetineceğiz. Projede kullanılan TLC2543 ADC’si ile ilgili detaylı bilgiler ileriki
konuda anlatılacaktır. Ayrıca projede kullanılmadığından Dijital–Analog dönüştürücülere
(DAC) burada değinilmemiştir
Şekil 3.8.’deki devre analog giriş gerilimi ile doğru orantılı olan ve rampa şeklinde
sinyal üreten bir rampa üretecini kullandığı için rampa tipi ADC olarak adlandırılır. Rampa
gerilimi 0’dan başlayarak sabit bir değere kadar artar. Rampa üreteci ise gerilim
karşılaştırıcının beslemesi olan VCC ile çalışır. Devrede analog giriş gerilimi Vi,
karşılaştırıcının evirmeyen ucuna uygulanır. Rampa gerilimi Vr , Vi gerilim seviyesinin
altında iken karşılaştırıcı çıkışı lojik 1’dir. Bu durumda sinyallerin clock üretecinden AND
18
kapısı aracılığıyla sayma devrelerine (register veya kaydedici) geçmesine izin verilir. Vr
gerilimi Vi’ye tam olarak eşit olduğunda karşılaştırıcı çıkışı lojik 0 seviyesine gelir.
Böylece kaydediciye takla (toggle) işleminden sonra gelen clock sinyalleri AND kapısı
çıkışı 0 olduğundan durdurulmuş olur.
Şekil 3.8. Rampa tipi ADC’nin temel çalışma prensibi
Lojik 1 seviyesinin zaman periyodu doğrudan Vi giriş gerilimi ile doğru orantılıdır.
Sadece t1 süresince sayma devreleri takla (toggle) yaptığı için sayma, analog girişin dijital
eşdeğeri olur. Rampa sinyali ve sayma periyodu tekrar başlamadan önce negatife giden
gerilim adımı, kaydediciyi yeniden başlangıç şartlarına kurar (reset işlemi).
3.2.2. TLC2543 ADC’si
3.2.2.1. Yapısı
Projede kullanılan TLC2543C ADC’si kapasitör anahtarlamalı, ardışıl yakın değer
veren tipte, 12 bit çözünürlükte bir ADC’dir. Yapı itibariyle şu özellikleri içerir. 11nalog
giriş, çalışma ısısında 10 µs çevirme süresi, kendine özgü örnekleme ve tutma fonksiyonu,
on chip (çip üzerinde) olarak sistem saati, programlanabilir çıkış veri (data) uzunluğu
özelliklerinden bir kaçıdır.
Yüksek hızlı dönüştürmesi ve çok yönlü kontrol kabiliyetine ek olarak, 11 adet
inputtan veya üç dahili self-test (kendi kendini test etme) geriliminden herhangi birini
seçebilen “on chip” olarak 14 kanal multiplexer’a (çoğullayıcı) sahiptir. Çalışma
sıcaklıkları 0oC ile 70oC arasındadır. TLC2543C ADC’sinin genel görünüşü ve blok
19
diyagramı Şekil 3.9.’de görülmektedir.
a) TLC2543 görünüşü ve pin isimleri
b)
Şekil 3.9. TLC2543C ADC’si. a) görünüşü, b) blok diyagramı
TLC2543C’ye ait pin numaraları ve adlandırmaları tablo 3.7.’de verilmiştir.
20
Tablo 3.7. TLC2543 ADC’sinin pin adlandırmaları
PİN
ADI PİN NO I/O AÇIKLAMA
AIN0 -AIN10 1-9,11, 12 I
Analog giriş. Bu 11 analog sinyal dahili olarak çoklanmış. Sürücü kaynak empedansı 4,1 MHz I/O clock işleminde 50Ω’dan küçük veya eşit olmalı ve 60 pF kapasitanstaki analog input voltaj kabiliyeti daha fazla olmalı.
CS 15 I Chip select. Yüksekten düşüğe (lojik 1’den lojik 0’a) geçişte CS, iç (dahili) sayıcıları (counter), kontrolları, data out, data input ve I/O clock’larını resetler.
DATA INPUT 17 I Seri data (veri) girişi. Dönüştürdükten sonra istenilen analog giriş veya test gerilimi 4 bitlik bir seri adres seçer.
DATA OUT 16 O
EOC 19 O Dönüştürme sonu. EOC, en son I/O clock darbesinin düşen kenarı geldikten sonra lojik 1’den lojik 0’a geçerve dönüştürme tamamlanıp transfer için data okununcaya kadar lojik 0 olarak kalır.
GND 10 I/O CLOCK 18 I REF+ 14 I REF- 13 I Negatif referans gerilimi. VCC 20 Pozitif kaynak gerilimi
3.3. Mikrokontrolör
3.3.1. Mikrokontrolörler ve Mikroişlemciler
Mikroişlemci, kullanıldığı sistemdeki merkezi işlem birimidir. Mikroişlemci,
bulunduğu sistemdeki cihazların çalışmalarını kontrol eder ve sisteme aritmetik ve lojik
işlem yapabilme kapasitesini sağlar. Mikroişlemci, bellekten komut okur, o komuta ait kodu
çözer ve komutu icra eder. Kısaca mikroişlemci komut icra eden yarı iletken bir elektronik
devre elemanıdır. Günümüzde mikroişlemciler genelde bilgisayarlarda kullanılmaktadırlar.
Mikrokontrolör (mikro denetleyici) ise, kısaca bir tümdevre üzerinde üretilen
bilgisayar olarak adlandırılabilir. Bir mikrokontrolör tümdevresinde bulunan hafıza ve
Giriş/Çıkış (I/O) alt sistemleri, mikrokontrolörlerin bir çok uygulama içinde devre üzerinde
gömülü olarak, mikroişlemcilere göre çok daha basit ve ucuz arabirim teknikleriyle, kontrol
amaçlı olarak kullanılmalarını sağlar. Mikrokontrolör uygulamalarına kameralarda ışık ve
odaklama kontrolu, fotokopi ve faks cihazları, otomobillerde motor kontrolu, telefon ve
modem gibi çeşitli haberleşme cihazları ve özel amaçlı olarak tasarlanan bir çok elektronik
kart örnek olarak verilebilir. Bu kadar geniş uygulama alanına sahip olan mikrokontrolörler,
21
tümdevresi üzerinde yer alan çok çeşitli donanım özellikleri sunmaktadır. Bunlardan birkaç
tanesi paralel ve seri I/O portları, zamanlayıcı ve sayıcılar, ADC, RAM, ROM olarak
sıralanabilir.
3.3.2. Microchip PIC Mikrokontrolörleri
Proje, mikrokontrolör içeren bir arabirim kartı olduğu için kart üzerinde
kullanılacak olan mikrokontrolörün seçimi çok önemli bir yer tutmaktadır. Bu projede
Microchip firmasına ait PIC mikrokontrolörünü seçilmiştir. Endüstriyel uygulamalarda en
çok tercih edilen bu mikrokontrolörün en büyük özelliği RISC ( Reduced Instruction Set
Computer = Komut sayısı azaltılmış işlemci) temelli bir işlemci olmasıdır. Bu özelliği ile
toplam 35 adet komutu vardır ve her komut işlevini sadece bir saat çevriminde
tamamlamaktadır. Ayrıca bitsel düzeyde çok rahat işlem yapılabilmesini sağlayan komutları
endüstriyel kontrol uygulamalarında büyük kolaylık sağlamaktadır. Bunların yanında çok
geniş bir mikrokontrolör ürün yelpazesi ile kullanıcının farklı nitelikleri üzerinde taşıyan
kontrolör seçimine olanak tanır. Geliştirilecek olan program herhangi bir mikrokontrolöre
kolayca uyarlanabilir. Ayrıca gelişmiş güç kontrol sistemiyle meydana gelebilecek
parazitlerden en az etkilenen ve bir kilitlenme durumunda watchdog timer özelliği ile kendi
kendini resetleyebilme özelliği bu mikrokontrolörün seçilmesine neden olmuştur.
3.3.2.1. PIC16C63’ün Yapısı
Şekil 3.10. PIC16C63 pin isimlendirmeleri
22
3.3.2.1.1. Osilatör ve Rezonatör
PIC’i çalıştırabilmek için gereken asgari donanım bir osilatörden ibarettir. Osilatör,
bir direnç ve kapasitörden veya bir kristal/seramik rezonatörden oluşabilir. PIC16CXXX
serici mikrokontrolörler dört farklı osilatör modunda çalışabilirler; LP (low power crystal),
XT (crystal /resonator), HS (high speed crystal / resonator) ve RC (resistor / capasitor).
Kullanıcı, bu dört osilatör tipinden herhangi birisini kullanarak konfigürasyon bitlerini
(FOSC0 ve FOSC1) programlayabilir. Kristal osilatör için FOSC0 ve FOSC1 bitlerinin her
ikisinin de lojik 1 yapılması gerekir. Burada, projede kullanıldığından dolayı sadece kristal
osilatör devresi anlatılacaktır.
Şekil 3.11. PIC16CXX için kristal osilatör bağlantı şeması (rezonatör devresi)
Şekil 3.11.’de kristal osilatörün PIC mikrokontrolörüne bağlantısı görülmektedir.
Şekilde görülen C1 ve C2 kapasitörlerin değeri, kullanılan PIC’e ve osilatöre göre
değişmektedir. Tablo 3.8.’de PIC16C63 için C1 ve C2 kapasitörlerinin seçim tablosu
görülmektedir.
Tablo 3.8. Osilatör tipine göre C1 ve C2 ‘nin belirlenmesi
OSİLATÖR TİPİ
KRİSTAL FREKANSI C1 C2
32 kHz 33 pF 33 pF LP 200 kHz 15 pF 15 pF 200 kHz 47-68 pF 47-68 pF 1 MHz 15 pF 15 pF XT 4 MHz 15 pF 15 pF 4 MHz 15 pF 15 pF 8 MHz 15-33 pF 15-33 pF HS 20 MHz 15-33 pF 15-33 pF
23
Tablo 3.8.’e göre 200 kHz’lik bit kristal osilatör için C1 ve C2, 47 ile 68 pF arasında
seçilebilirken, 4 MHz’lik bir osilatör için 15 pF olarak seçilmelidir.
3.3.2.1.2. Reset ve Besleme Devreleri
Mikroişlemcili/mikrokontrolörlü sistemlerde reset devrelerinin kullanılmasının bir
çok avantajı vardır. Bunlardan bazıları şu şekilde sıralanabilir:
ü Program sayacı, I/O ve kontrol registerları gibi belirli registerler için bilinen
bir durumun varlığından emin olunmasını sağlar.
ü Saatin doğru frekansa yerleşmesi için yeterli zamanın verilmesine yardımcı
olur.
ü Şebeke geriliminde herhangi bir sorun olduğu zaman mikrokontrolörün
düzgün olarak yeniden başlayacağından emin olunmasını sağlar.
PIC16CXX mikrokontrolörleri birkaç çeşit reset devresinden birini seçme imkanı
vermektedir. Bunlar:
ð Power on Reset (POR)
ð MCLR Reset (normal çalışma esnasında)
ð MCLR Reset (uyku modunda)
ð WDT (normal çalışma esnasında)
ð Brown Out Reset (BOR)
Bazı registerler hiçbir reset durumundan etkilenmezler. Bunların Power on Reset
(POR) anındaki durumları belli değildir. Bunların dışındaki registerler , yukarıda berlirtilen
reset çeşitlerinden birisiyle karşılaştıklarında resetlenirler. Bir reset işlemi gerçekleştikten
sonra PIC, Program Sayacı’nı önceden belirlenmiş olan bir değere ayarlar. Bu, bilinen bir
program başlama noktasına sahip olduğundan emin olunması için gereklidir. Program
Sayacı reset adresi PIC16CXX serisi için 000H adresidir. PIC16C63 için reset devrelerinin
elektriksel özellikleri tablo 3.7.’de verilmiştir.
24
Tablo 3.9. PIC16C63 Reset devrelerinin elektriksel özellikleri
DC KARAKTERİSTİKLERİ
Karakteristik Sembol Min Tipik (5V 25o) Maks Birimi Açıklama
Kaynak gerilimi VDD 4 - 6 Volt XT, RC ve LP osilatör
modlarında RAM veri tutma gerilimi VDR - 1.5 - Volt
PORsinyalinin VDD’ye oranı. SVDD 0.05 - - Volt/ms
Brown Out Resetgerilimi BVDD 3.7 4 4.3 Volt
Kaynak akımı IDD - 2.7 5 MA XT osilatör frekansı FOSC=4 MHz,VDD= 5.5 V
Brown Out Reset akımı ΔIBOR - 350 425 ΜA BOR aktif, VDD = 5 V
Tablo 3.9.’daki ‘Tipik’ sütununda verilen değerler 5 volt, 25o’deki değerlerdir.
Power on Reset (POR): VDD geriliminin yükselen kenarı geldiği zaman, power on
reset bir darbe üretir. Power on reset devresinin üstün bir tarafı, MCLR/VPP pinine direk
olarak VDD geriliminin uygulanmasıdır.
Brown Out Reset (BOR): konfigürasyon biti BODEN, Brown Out Reset devresini
aktif veya pasif yapabilir. Analog arabirim devresinde PIC16C63 için Brown Out Reset
devresi seçilmiştir. Tablo 3.9.’da bu devrenin elektriksel özellikleri görülmektedir.
3.3.2.1.3. Watchdog Timer
Watchdog Timer’in (WDT) kullanılmasının nedeni, PIC’i veya herhangi bir
işlemciyi bir döngüde kilitlenmekten uzak tutmaktır.Böyle bir durum yazılımda bir hata
veya harici elektriksel kıvılcımlar nedeniyle ortaya çıkabilir. WDT, PIC’e bir çeşit kalp atışı
sağlar ve eğer WDT belirli aralıklarda temizlenmezse bu kalp atışları PIC’i reset olmaya
zorlar.
Watchdog Timer’in normal çalışma süresi, 25Co’de 5V’luk bir kaynakla beslendiği
zaman 18 ms’dir. Fakat, sıcaklık, kaynak gerilimi (VDD) devre elemanlarından kaynaklanan
25
işlem değişkenleri gibi sebeplerle bu değer değişebilir. Eğer Time out değeri istenenden
daha uzun olursa, prescaler değeri 1:28 oranında bölünerek OPTION registerine yazmak
suretiyle WDT yazılımla kontrol edilebilir. Böylece zaman aşımı (Time Out) periyodu 2.5
saniyede gerçekleştirilmiş olur. Watchdog Timer ayarlanmış, zaman aşımı devre dışı
bırakılmış ve cihaz reset durumu üretmiş ise, CLRWDT ve SLEEP komutları Watchdog
Timer’i temizler.
Şekil 3.12. Watch Dog Timer Blok Diyagramı
Herhangi bir zamanda bir reset işlemi gerçekleşirse, STATU registerindeki iki bit
resetin nedenini gösterir. Bu bitler TO ve PD (Time Out ve Power Down) bitleridir.
TO PD Reset Nedeni
0 0 WDT, SLEEP (uyku) modundan çıkmıştır.
0 1 WDT, SLEEP haricinde zaman aşımına uğramıştır.
1 0 SLEEP durumundayken harici reset (WDT kapalı)
1 1 Açılma durumu.
Reset gerçekleştikten hemen sonra bu bitlerin incelenmesiyle, program nasıl
davranacağını ve nereye dallanacağını belirler.
26
3.3.2.1.4. I/O (Giriş / Çıkış) Portları
PIC mikrokontrolörlerindeki bazı pinler, cihazın çevre birimlerinin özelliklerine
değişik fonksiyonlar yükleyebilmek için I/O portları olarak ayrılmıştır. Genellikle bir çevre
birim girilirse, bu pinler genel amaçlı I/O pini olarak kullanılamaz.
PORTA ve TRISA Registeri: Tüm PIC mikrokontrolörlerinde 6 bit genişliğinde
PORTA registeri bulunur. RA4/T0CK1 pini Schmitt Trigger girişi ve Open Drain çıkışıdır.
Diğer tüm pinler TTL giriş seviyesindedirler ve hepsi CMOS output sürücüleridir. Tablo
3.8.’de PORTA registerinin fonksiyonları görülmektedir.
Tablo 3.10. PORTA Fonksiyonları.
İsim Bit No Buffer Tipi Fonksiyon
RA0 Bit 0 TTL Giriş/Çıkış
RA1 Bit 1 TTL Giriş/Çıkış
RA2 Bit 2 TTL Giriş/Çıkış
RA3 Bit 3 TTL Giriş/Çıkış
RA4/T0CK1 Bit 4 ST Timer0 için giriş/çıkış veya harici saat girişi. Çıkış open drain tiptedir.
RA5/SS Bit 5 TTL Giriş/Çıkış veya senkron seri port için ikincil giriş seçimi.
PORTB ve TRISB Registeri: PORTB, 8bitlik çift yönlü bir porttur. Data yönleri
TRISB’ye kaydedilir. Herhangi bir bit giriş olarak set edildiğinde, TRISB, o bit için çıkış
sürücüsünü yüksek empedans moduna getirir.
PORTB pinlerinin hepsinde dahili olarak pull-up dirençleri vardır. Pull-up’lar tek bir
kontrol biti ile on konumuna getirilebilirler. Şayet pinler çıkış olarak ayarlanmışlarsa pull-
up’lar otomatik olarak off konumuna gelirler. Buradaki önemli bir nokta, pull-up
irençlerinin Power on Reset (POR) anında kullanılamadıklarıdır.
27
Tablo 3.11. PORTB Fonksiyonları
İsim Bit No Buffer Tipi Fonksiyon
RB0/INT Bit 0 TTL/ST Giriş/Çıkış veya harici interrupt girişi.
RB1 Bit 1 TTL Giriş/Çıkış RB2 Bit 2 TTL Giriş/Çıkış RB3 Bit 3 TTL Giriş/Çıkış RB4 Bit 4 TTL Giriş/Çıkış RB5 Bit 5 TTL Giriş/Çıkış RB6 Bit 6 TTL/ST Giriş/Çıkış RB7 Bit 7 TTL/ST Giriş/Çıkış
Eğer RB0 pini harici interrupt pini olarak kullanılırsa, bu pin için buffer olarak
Schmitt Trigger seçilir. Yine aynı şekilde RB6 ve RB7 pinleri seri programlama modunda
kullanılırsa, bu pinler için de buffer olarak Schmitt Trigger seçilir.
PORTC ve TRISC Registeri: PORTC de 8 bit çift yönlü porttur. Her bir pin
bağımsız olarak TRISC registeri içerisinde giriş veya çıkış olarak düzenlenebilir. PORTC
pinlerinde Schmitt Trigger giriş buffer’i kullanılır. PORTC, birkaç tane çevresel fonksiyon
ile çoklanmıştır. Tablo 3.12. PORTC Fonksiyonları
İsim Bit No
Buffer Tipi Fonksiyon
RCO/T1OSO/T1CKI Bit 0 ST Giriş/Çıkış, Timer1 osilatör çıkışı veya Timer1 saat girişi
RC1/T1OSI/CCP2 Bit 1 ST Giriş/Çıkış, Timer1 osilatör girişi, Capture2 girişi/Compare2 çıkışı/PWM2 çıkışı
RC2/CCP1 Bit 2 ST Giriş/Çıkış, Capture1 girişi/Compare1 çıkışı/PWM1 çıkışı
RC3/SCK/SCL Bit 3 ST SPI ve I2C modlarında senkron saat darbeleri yapar.
RC4/SDI/SDA Bit 4 ST SPI modu için SPI data girişi, I2C modu için data çıkışı
RC5/SDO Bit 5 ST Giriş/Çıkış veya senkran seri data çıkışı
RC6/TX/CK Bit 6 ST Giriş/Çıkış veya USART asenkron gönderme pini
RC7/RX/DT Bit 7 ST Giriş/Çıkış veya USART asenkron alma pini
28
Yukarıda açıklanan portlardan hariç iki tane daha port (PORTD ve PORTE) vardır,
fakat bu portlar PIC16C63’te bulunmadığı için burada sadece isimleri verilerek geçilmiştir.
3.3.2.2. Bellek Organizasyonu
Mikrolontrolörlerde bellek organizasyonu, program bellek organizasyonu ve data
bellek organizasyonu olmak üzere iki bölüm altında incelenebilir.
Program Bellek Organizasyonu: PIC16C6X serisi mikrokontrolörler 13 bit
program bellek kapasitesine sahiptirler. PIC16C63 mikrokontrolörü 4K x 14 program
belleği mevcut. Bu cihazlar için reset vektörü 0000h ve interrupt vektörü ise 0004h
adresinde bulunur. Şekil 3.12’de PIC16C63 için bellek haritası (memory map) ve yığının
(stack) şeması görülmektedir.
Şekil 3.13. PIC16C63 için bellek haritası ve yığın
29
Data Bellek Organizasyonu: Data bellek, genel amaçlı registerları ve özel
fonksiyon registerlarıni içeren banklara ayrılmıştır. RP0 ve RP1 bitleri bank seçim
bitleridir. Her bir bank için 7Fh, yani 128 byte alan ayrılmıştır.
RP1:RP0
0 0 : Bank0
0 1 : Bank1
1 0 : Bank2
1 1 : Bank3
Genel amaçlı registerlar, direkt veya endirekt olarak dosya seçim registerlarıdir.
Özel fonksiyon registerları,cihazlarda istenilen işlemlerin kontrol edilebilmeleri için, CPU
ile ve çevre birimlerle kullanılan registerlardır. Şekil 3.14.’te register dosya haritası
(register file map) şeması görülmektedir.
30
Şekil 3.14. Register adresleri
3.3.2.3. PIC16C63 Komut Seti
PIC16CXX mikrokontrolörlerinin komutları, bir OPCODE içinde14 bitlik
kelimelere bölünmüştür. Komutlar, byte yönlendirmeli, bit yönlendirmeli ve kontrol
komutları olmak üzere üç ana bölümde incelenebilir. Byte yönlendirmeli komutlarda “f (file
register)” ve “d (destination)” olmak üzere iki parametre vardır. F parametresi bilginin
31
alınacağı yeri veya bilgiyi temsil etmekte, d parametresi ise işlem sonucunun yazılacağı
hedef bölgeyi temsil etmektedir. Şayet d parametresine sıfır değeri verilirse, sonucun
yazılacağı yer W registeridir. Sıfırdan farklı bir değer verilirse, sonuç komutta belirtilen
registere yazılır. Bunun yanında bit yönlendirmeli komutlarda “b” parametresi ve kontrol
komutlarında “k” parametresi kullanılır. OPCODE’ların tanımlamaları tablo 3.13.’de ve
komut formatı da şekil 3.15.’te gösterilmiştir.
Tablo 3.13. PIC16C63 mikrokontrolör komutları için OPCODE tanımlamaları
OPCODE Açıklama F Register adresi (0x00’dan 0x7F’e kadar) W Akümülatör B 8 bitlik bir register içindeki bir bit adresi K Sabit değerli veri veya etiket X Tanımlanmamış alan
D Hedef seçimi; d=0 ise işlem sonucu w registerine, d=1 ise işlem sonucu f registerine kaydedilir.
label Etiket ismi TOS Yığının en üst seviyesi PC Program Counter
PCLATH Program counter yüksek 4 bit tutucusu GIE İnterrupt giriş biti
WDT Watchdog Timer TO Zaman aşım biti PD Kapatma dest Hedef register adresleri [ ] Opsiyonlar ( ) Parantez ayracı → Atama < > Register bit alanları
32
Şekil 3.15. PIC komutlarının yazılış formatı
PIC mikrokontrolörlerinin komutları aşağıda sırasıyla açıklanmıştır.
ADDLW (Add Literal and W): 8 bitlik k değeri ile W registerinin içeriğini
toplayarak sonucu yine W registerine yazar. Burada k 0 ile 255 arasında değer alabilir.
Komutun yazılışı: [etiket] ADDLW k
İşlem: (W) + k → (W)
Komutun OPCODE formatı:
Örnek:
ADDLW 0x15
Komuttan önce W registerinin içeriği 0x10 ise, komuttan sonra W içeriği 0x25 olur.
ANDLW (And Literal With W): 8 bitlik k değerini W registerinin içeriği ile AND
işlemine tabi tutar ve sonucu W registerine yazar. K’nın değeri 0 ile 255 arasında olabilir.
33
Komutun yazılışı: [etiket] ANDLW k
İşlem: (W) AND (k) → (W)
Komutun OPCODE formatı:
Örnek:
ANDLW 0x5F
Komuttan önce W registerinin içeriği 0xA3 ise komuttan sonra w içeriği 0x03 olur.
ADDWF (Add W and f): W registerinin içeriği ile f registerinin içeriğini toplar. F,
0 ile 127 arasında değer alabilir, d ise 0 veya 1 olabilir.eğer d=0 olursa sonuç W registerine,
d=1 olursa, d’den sonra belirtilen f adresine yazılır.
Komutun yazılışı: [etiket] ADDWF f,d
İşlem: (W) + (f) → (belirtilen registere)
Komutun OPCODE formatı:
Örnek:
ADDWF FSR, 0
Komuttan önce W içeriği 0x17, FSR içeriği 0xC2 olsun. Komuttan sonra W içeriği
0xD9 ve FSR içeriği 0xC2 olur.
ANDWF (And W with f): W registerinin içeriği ile f registerinin içeriğini AND
işlemine tabi tutar. Burada da yine f 0 ile 127 arasında değer alabilirken, d 0 veya 1 olabilir.
Eğer d=0 ise sonuç W registerine, d=1 ise sonuç belirlenen adrese yazılır.
Komutun yazılışı: [etiket] ANDWF f,d
İşlem: (W) AND (f) → (belirtilen registere)
Komutun OPCODE formatı:
Örnek:
ANDWF FSR,1
Komuttan önce W içeriği 0x17, FSR içeriği 0xC2 iken komuttan sonra W içeriği
0x17, FSR içeriği 0x02 olur.
BCF (Bit Clear f): f registeri içerisindeki belirlenen bitleri temizler, yani sıfır yapar.
F değeri 0 ile 127 arasında olabilirken, b değeri o ile 7 arasında olabilir.
34
Komutun yazılışı: [etiket] BCF f,b
İşlem: 0 → (f<b>)
Komutun OPCODE formatı:
Örnek:
BCF FLAG_REG, 7
Komuttan önce FLAG_REG registerinin içeriği 0xC7 iken komuttan sonra 0x47
olur.
BTFSC (Bit Test, Skip if Clear): f registerinin içerisindeki b bitini test eder. Eğer
bit 1 ise komutu izleyen sonraki komuta geçer, eğer bit 0 ise izleyen komutu atlayarak daha
sonraki komuta geçer. F, 0 ile 127 arasında, b ise 0 ile 7 arasında değer alabilir.
Komutun yazılışı: [etiket] BTFSC f,b
İşlem: skip if (f<b>) = 0
Komutun OPCODE formatı:
Örnek:
Basla BTFSC FLAG,1
Yanlis GOTO Son
Dogru .........
.........
Komuttan önce Program Counter’in (PC) değeri “Basla” adresidir. Komuttan sonra;
şayet FLAG adresindeki birinci bit 0 ise Program Counterin değeri “Dogru” adresini alır,
FLAG registerindeki birinci bit 1 ise, o zaman Program Counterin değeri “Yanlis” adresini
gösterir.
BSF (Bit Set f): f registerinin içindeki b bitini set eder, yani 1 yapar. F, 0 ile 127
arasında, b ise 0 ile 7 arasında değer alabilir.
Komutun yazılışı: [etiket] BSF f,b
İşlem: 1 → (f<b>)
Komutun OPCODE formatı:
35
Örnek:
BSF FLAG_REG, 7
Komuttan önce FLAG_REG içeriği 0x0A ise, komuttan sonra 0x8A olur.
BTFSS (Bit Test f, Skip if Set): f registerinin içerisindeki b bitini test eder, eğer bit
0 ise komutu izleyen sonraki komuta geçer, eğer bit 1 ise bir komut atlayarak daha sonraki
komuta geçer. F, 0 ile 127 arasında değer alırken b,0 ile 7 arasında değer alabilir.
Komutun yazılışı: [etiket] BTFSS f,b
İşlem: skip if (f<b>) = 1
Komutun OPCODE formatı:
Örnek:
Basla BTFSC FLAG,1
Yanlis GOTO Son
Dogru .........
.........
Komuttan önce Program Counter’in (PC) değeri “Basla” adresidir. Komuttan sonra;
şayet FLAG adresindeki birinci bit 1 ise Program Counterin değeri “Dogru” adresini alır,
FLAG registerindeki birinci bit 0 ise, o zaman Program Counterin değeri “Yanlis” adresini
gösterir.
CALL (Call Subroutine): Alt program çağırma komutudur. K değeri 0 ile 2047
arasında değer alabilir. CALL komutuyla, Program Counterin değerine 1 eklenerek Bu
değer STACK’e (yığına) kaydedilir. 11 bitlik adresleme, Program Counter’in sıfır ile
onuncu bitleri arasına yüklenir.
Komutun yazılışı: [etiket] CALL k
İşlem: (PC) + 1 → TOS (TOS: Top on Stack)
K → PC <10:0>
Komutun OPCODE formatı:
Örnek:
Basla CALL Altprg
36
Komuttan önce Program Counter’in değeri “Basla” adresi iken komuttan sonra
“Altprg” olur.
CLRF (Clear f): f registeri içerisindeki tim bitlerin değerini sıfır yapar ve Zero
(sıfır) bitini 1 yapar. F, 0 ile 127 arasında değer alabilir.
Komutun yazılışı: [etiket] CLRF f
İşlem: 00h → (f)
1 → Z
Komutun OPCODE formatı:
Örnek:
CLRF FLAG_REG
Komuttan önce FLAG_REG registerinin içeriği 0x5A ise, komuttan sonra 0x00
olur. Z (zero) biti ise 1 olur.
CLRW (Clear W): W registerinin içeriğini temizler (tüm bitleri 0 yapar), Zero biti (Z) 1
olur.
Komutun yazılışı: [etiket] CLRW
İşlem: 00h → (W)
1 → Z
Komutun OPCODE formatı:
Örnek:
CLRW
Komuttan önce W içeriği 0x5A ise, komuttan sonra 0x00 olur, Zero (Z) biti 1 olur.
CLRWDT (Clear Watchdog Timer): Watchdog Timer’i resetler. WDT, önceden
ayarlanan değerine gelir. Durum bitleri TO ve PD set olur.
Komutun yazılışı: [etiket] CLRWDT
İşlem: 00h → WDT
0 → WDT ön değeri
1 → TO
1 → PD
37
Komutun OPCODE formatı:
Örnek:
CLRWDT
Komuttan önce WDT herhangi bir değerde iken komuttan sonra WDT’nin değeri
00h olur, WDT ön değeri 0, TO ve PD ise 1 olur.
COMF (Complement f): f registerinin içerisindeki bilgilerin tümleyenini alır.
Parmetre olarak f ve d kullanılır. F, 0 ile 127 arasında değer alabilirken d, 0 veya 1 olabilir.
Eğer d=0 ise işlem sonucunu W registerine, d=1 ise sonucu f registerine kaydeder.
Komutun yazılışı: [etiket] COMF f,d
İşlem: ( f ) → (belirlenen hedefe)
Komutun OPCODE formatı:
Örnek:
COMF REG1,0
Komuttan önce REG1 registerinin içeriği 0x13 ise komuttan sonra REG1’in içeriği
yine 0x13 olurken, W’nun içeriği 0xEC olur.
DECF (Decrement f): f registerinin içindeki bilgiyi 1 azaltır. Yibe burada da d ve f
parametreleri vardır. D, 0 veya 1 olabilirken, f, 0 ile 127 arasında olabilir.
Komutun yazılışı: [etiket] DEC f,d
İşlem: ( f ) - 1 → (belirlenen hedefe)
Komutun OPCODE formatı:
Örnek:
DECF CNT,1
Komuttan önce CNT’nin içreiği 0x02 ise, komuttan sonra komuttan sonra CNT’nin
içeriği 0x01 olur.
DECFSZ (Decrement f, Skip if 0): f registerinin içeriğinden 1 çıkarır. Eğer d=0 ise
sonucu W’ye, d=1 ise sonucu belirtilen f registerine kaydeder. İşlem sonucu 0 çıkarsa
sonraki komutu işletmeden geçer ve ondan sonraki komutu işletir. d ve f parametrelerinin
değerleri burada da aynıdır.
38
Komutun yazılışı: [etiket] DECFSZ f,d
İşlem: ( f ) - 1 → (belirlenen hedefe)
Komutun OPCODE formatı:
Örnek:
BASLA DECFSZ CNT,1
GOTO DONGU
DEVAM ..........
..........
Komuttan önce Program Counter’in değeri BASLA adresidir. Komuttan sonra
CNT=CNT-1 olur. İşlemin sonucu 0 ise Program Counter’in değeri DEVAM adresini
gösterir. İşlem sonucu =’dan farklı çıkarsa Program Counter’in değeri BASLA’dan bir
sonraki komutun adresidir.
GOTO (Unconditional Branch): Koşulsuz dallanma komutudur. Komutun
parametresi k, 0 ile 2047 arasında değer alabilir. 11 bitlik adresleme, Program Counter’in
sıfır ile onuncu bitleri arasına yüklenir.
Komutun yazılışı: [etiket] GOTO k
İşlem: k → PC <10:0>
Komutun OPCODE formatı:
Örnek:
GOTO SON
Komuttan sonra Program Counter’in değeri SON adresini gösterir.
INCF (Increment f): f regsiterinin içeriğini 1 artırır. F, 0 ile 127 arasında, d ise 0
veya 1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.
Komutun yazılışı: [etiket] INCF f,d
İşlem: ( f ) + 1 → (belirlenen adrese)
Komutun OPCODE formatı:
Örnek:
INCF CNT,1
39
Komuttan önce CNT içeriği 0x90 ise komuttan sonra CNT içeriği 0x9A olur.
INCFSZ (Increment f, Skip if 0): f registerinin içeriğini 1 artırır. Eğer d=0 ise
sonucu W’ye, d=1 ise sonucu belirtilen f registerine kaydeder. İşlem sonucu 0 çıkarsa
sonraki komutu işletmeden geçer ve ondan sonraki komutu işletir. d ve f parametrelerinin
değerleri burada da aynıdır.
Komutun yazılışı: [etiket] DECFSZ f,d
İşlem: ( f ) - 1 → (belirlenen hedefe)
Komutun OPCODE formatı:
Örnek:
BASLA INCFSZ CNT,1
GOTO DONGU
DEVAM ..........
..........
Komuttan önce Program Counter’in değeri BASLA adresidir. Komuttan sonra
CNT=CNT-1 olur. İşlemin sonucu 0 ise Program Counter’in değeri DEVAM adresini
gösterir. İşlem sonucu =’dan farklı çıkarsa Program Counter’in değeri BASLA’dan bir
sonraki komutun adresidir.
IORLW (Inclusive OR Literal with W): W registerinin içeriğini 8 bitlik k değeri
ile OR işlemine tabi tutar. İşlemin sonucunu W registerine kaydeder. k, 0 ile 255 arasında
değer alabilir.
Komutun yazılışı: [etiket] IORLW k
İşlem: ( W) OR k → (W)
Komutun OPCODE formatı:
Örnek:
IORLW 0x35
Komuttan önce W’nun içeriği 0x9A ise, komuttan sonra 0xBF olur.
40
IORWF (Inclusive OR with f): W registerinin içeriği ile f registerinin içeriğini OR
işlemine tabi tutar. d=0 ise sonuç W registerine, d=1 ise sonuç f registerine kaydedilir. f, 0
ile 127 arasında, d ise 0 veya 1 arasında değer alabilir.
Komutun yazılışı: [etiket] IORWF f,d
İşlem: ( W) OR (f) → (Belirtilen adrese)
Komutun OPCODE formatı:
Örnek:
IORWF SONUC,0
Komuttan önce SONUC=0x13, W=0x91 ise, komuttan sonra SONUC=0x13,
W=0x93 olur.
MOVF (Move f): W registerinin içeriğini d parametresine bağlı olarak belirtilen
hedefe kopyalar. d=0 ise hedef W, d=1 ise hedef f registerinin kendisidir.
Komutun yazılışı: [etiket] MOVF f,d
İşlem: (f) → (Belirtilen adrese)
Komutun OPCODE formatı:
Örnek:
MOVF FSR,0
Komuttan sonra FSR’nin içeriğini W’ya kopyalar.
MOVLW (Move Literal to W): 8 bitlik k değerini W registerine yükler. k, 0 ile
255 arasında değer alabilir.
Komutun yazılışı: [etiket] MOVLW k
İşlem: k → (W)
Komutun OPCODE formatı:
Örnek:
MOVLW 0x5A
Komuttan sonra W içeriği 0x5A olur.
MOVWF (Move W to f): W registeri içerisindeki veriyi f registerine kopyalar. f, 0
ile 127 arasında değer alabilir.
41
Komutun yazılışı: [etiket] MOVWF f
İşlem: (W) → ( f )
Komutun OPCODE formatı:
Örnek:
MOVWF OPTION
Komuttan önce OPTION içeriği 0xFF, W içeriği 0x4F ise, komuttan sonra OPTION
içeriği 0x4F, W içeriği 0x4F olur.
NOP (No Operation): Bu komut geldiğinde mikrokontrolör 1 çevrim zamanı işlem
yapmaz.
Komutun yazılışı: [etiket] NOP
İşlem: Yok
Komutun OPCODE formatı:
Örnek:
NOP
OPTION (Load Option): W registerinin içeriğini OPTION registerinin içerisine
kopyalar.
Komutun yazılışı: [etiket] OPTION
İşlem: ( W ) → OPTION
Komutun OPCODE formatı:
RETFIE (Return from Interrupt): İnterruptan ana programa dönüş komutudur.
Stack’ın en üstündeki bilgi (TOS) Program Counter’e yüklenir ve interrupt biti (GIE) aktif
edilir.
Komutun yazılışı: [etiket] RETFIE İşlem: TOS → PC 1 → GIE
Komutun OPCODE formatı:
Örnek:
RETFIE
42
RETLW (Return with Literal): 8 bitlik k değerini W registerine yükler. k, 0 ile
255 arasında değer alabilir. TOS’taki bilgi Program Counter’e yüklenir.
Komutun yazılışı: [etiket] RETLW k
İşlem: k → (W)
TOS → PC
Komutun OPCODE formatı:
Örnek:
CALL TABLE
......
......
TABLE ADDWF PC
RETLW k1
RETLW k2
...........
...........
RETLW kn
Komuttan önce W’nun içeriği 0x07 ise, komuttan sonra 8 bitlik k değeri olur.
RETURN (Return from Subroutine): Alt programdan ana programa dönüş
komutudur. Stack’ın en üstündeki bilgi Program Counter’e yüklenir.
Komutun yazılışı: [etiket] RETURN
İşlem: TOS → PC
Komutun OPCODE formatı:
Örnek:
RETURN
Komuttan sonra Program Counter (PC)=TOS olur.
RLF (Rotate Left f through Carry): f registerinin içindeki bilgileri Carry Flag
üzerinden bir bit sola kaydırır. f ve d bu komutun parametreleri olup 0 ≤ f ≤ 127 olurken
d=0 veya d=1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.
43
Komutun OPCODE formatı:
Örnek:
RLF REG1,0
Komuttan önce REG1=1110 0110 ve Carry Falg(C)=0 olsun. Komuttan sonra
REG1=1110 0110durumunu korurken W=1100 1100 ve C=1olur.
RRF (Rotate Right f through Carry): f registerinin içindeki bilgileri Carry Flag
üzerinden bir bit sağa kaydırır. f ve d bu komutun parametreleri olup 0 ≤ f ≤ 127 olurken
d=0 veya d=1 olabilir. d=0 ise sonuç W’ye, d=1 ise sonuç f’e kaydedilir.
Komutun OPCODE formatı:
Örnek:
RRF REG1,0
Komuttan önce REG1=1110 0110 ve Carry Falg(C)=0 olsun. Komuttan sonra
REG1=1110 0110 durumunu korurken W=0111 0011 ve C=0 olur.
SLEEP: Bu komutla power-down durum biti 0 yapılırken, time-out durum biti set
edilir (1 yapılır). WDT’nin değeri sıfırlanır. Mikrokontrolör sleep modunda iken osilatör
çalışmasını durdurur.
Komutun yazılışı: [etiket] SLEEP
İşlem: 00h → WDT
1 → TO
0 → PD
Komutun OPCODE formatı:
44
Örnek:
SLEEP
SUBLW (Substract W from Literal): W registerinin içerisindeki bilgi 2’ye
tümleyen metoduna göre 8 bitlik k sayısından çıkarılır. Sonuç W’ya yazılır. K, 0 ile 255
arasında değer alabilir.
Komutun yazılışı: [etiket] SUBLW k
İşlem: k – ( W ) → (W)
Komutun OPCODE formatı:
Örnek:
SUBLW 0x02
Komuttan önce W=2 ise komuttan sonra W=1, Z=0 ve C=1 olur. C’nin 2 olması
sonucun pozitif olduğu anlamına gelir.
SUBWF (Substract W from f): W registerinin içeriğini 2’ye tümleyen metoduna
göre f registerindeki bilgiden çıkarır. d parametresi 0 girilirse sonuç W’ye, d=1 girilirse
sonuç f’e kaydedilir.
Komutun yazılışı: [etiket] SUBWF f,d
İşlem: ( f ) – ( W ) → (Belirtilen adrese)
Komutun OPCODE formatı:
Örnek:
SUBWF REG1,1
Komuttan önce REG1 içerisinde 3, W içerisinde 2 bulunsun. Komuttan sonra W
içerisinde hala 2 bulunurken f içerisindeki bilgi 1 oldu. Z=0 ve C=1 olur (sonuç pozitif
olduğu için)
SWAPF (Swap Nibbles in f): f registeri içerisindeki 0’dan 3’e kadar olan bitlerle
4’ten 7’ye kadar olan bitlerin yerlerini değiştirir. d=0 ise sonuç W2ya, d=1 ise sonuç f’e
kaydedilir. f, 0 ile 127 arasında değer alabilir.
45
Komutun yazılışı: [etiket] SWAPW f,d
İşlem: ( f<3:0> ) → ( belirtilen adreste <7:4> )
( f<4:7> ) → ( belirtilen adreste <3:0> )
Komutun OPCODE formatı:
Örnek:
SWAPF REG,0
Komuttan önce REG içerisinde 0xA5 varsa komuttan sonra REG içerisinde yine
0xA5 olur fakat W içerisinde 0x5A olur.
TRIS (Load TRIS Register): W içeriğini f registerindeki TRIS’e kopyalar. f
burada 5 ile 7 arasında değer alabilir.
Komutun yazılışı: [etiket] TRIS f
İşlem: ( W ) → TRIS register f
Komutun OPCODE formatı:
XORLW (Exlusive OR Literal with W): W registeri ile 8 bitlik k sayısını XOR
işlemine tabi tutar. Sonuç W içerisine kaydedilir. k, 0 ile 255 arasında değer alabilir.
Komutun yazılışı: [etiket] XORLW k
İşlem: ( W ) XOR k → ( W )
Komutun OPCODE formatı:
Örnek:
XORLW 0xAF
Komuttan önce W içerisinde 0xB5 varsa, komuttan sonra W içerisinde 0x1A olur.
XORWF (Exlusive OR W with f): W registeri ile f registerinin içeriğini XOR
işlemine tabi tutar. Sonucu d parametresinin durumuna göre W’ye ya da f’e kaydeder. d=0
ise W’ya, d=1 ise f’e kaydeder. f, 0 ile 127 arasında değer alabilir.
Komutun yazılışı: [etiket] XORWF f,d
İşlem: ( W ) XOR ( f ) → ( Belirtilen adrese )
Komutun OPCODE formatı:
4. PIC16C63’ÜN PROGRAMLANMASI
PIC Mikrokontrolörü programlamak için önce yapılacak için birtakım ek cihaz
ve programlara gereksinim vardır. Bunlar; Microchip firmasının PIC mikrokontrolör
program geliştirme ve simülasyonu için kullanılan MPLAB – IDE programı, geliştirilen
programın mikrokontrolöre yüklenmesi içi PIC programlayıcı devre ve bu devrenin
yazılımı olarak sıralanabilir. Bu aşamadan sonra yazılacak programın tasarlanması
gerekmektedir. Yazılacak olan PIC programını tasarlayabilmek için önce akış
diyagramını oluşturmak programın geliştirilmesi aşamasında büyük kolaylık sağlar.
Oluşturulan akış diyagramı şekil 4.1’de görülmektedir.
Şekil4.1.Analog arabiri kartının akış diyagramı
başla
hazırla
seri sortu oku
adres aynı mı
komut ve kanal
oku
komutun gereğini
yap
48
Akış diyagramının açıklanması:
Hazırla :Bu aşamada PIC, kart üzerindeki birimlere bağlı olan bacakların
durumlarına göre ilgili registerlarında düzenlemeler yapar, seri haberleşme için
zamanlayıcıları ayarlar ve kart adresini okur.
Seri port oku : Bu aşamada, seri port daima okunur ve gelen veriler registerlara
kaydedilir.
Adres aynı mı : Bu aşamada seri porttan okunan adres bilgisi karttan okunan
adres bilgisi ile karşılaştırılır. Eğer adres bilgisi aynı değilse seri port okuma işlemine
geri dönülür. Aynı ise bir sonraki işlem gerçekleştirilir.
Komut ve kanal oku : Adres bilgisinin aynı olması durumunda porttan gelecek
ikinci veri beklenir. Bu veri alındıktan sonra içerdiği komut ve kanal bilgisi ilgili
registerlara kaydedilir.
Komutun gereğini yap : Okunan komut bilgisi çeşitli karşılaştırmalardan
geçerek komutun gerektirdiği alt rutinler çağırılır. Yapılması gereken işlemler
tamamlandıktan sonra seri port okumasına geri dönülür.
Bu akış diyagramına uygun olarak yazılan PIC programı EK1’de verilmiştir.
5. MONİTÖR PROGRAMI
5.1. Programın Kurulması
Analog arabirim kartından elde edilen değerleri okuyabilmek ve maksimum,
minimum değer karşılaştırmalarını yapabilmek için monitör programına gereksinim
vardır. Delphi 4.0 Professional programlama dilinde geliştirilen bu programı kurabilmek
için proje cd’sinde bulunan monitör alt klasöründeki setup.exe kurulum programının
çalıştırılması gerekir. Program çalıştırıldıktan sonra monitör ile ilgili genel açıklama
yazısı çıkar. Next butonuna tıklandığında bir sonraki adım olan programın kurulacağı
klasör seçimini gösteren pencere ekrana gelir. Buradan istenirse kurulum klasörü
değiştirilebilir. Değişiklik yapılmadan Next butonuna tıklandığında program varsayılan
“Program Files\Monitör” klasörüne kurulacaktır. Bir sonraki aşamada ise programlar
menüsündeki yerinin belirtilmesi istenecektir. Yine bir değişiklik yapılmadan Next
butonuna tıklandığında varsayılan “Monitör” klasörü açılacaktır. Program dosyaları
kopyalanmadan önceki son aşamada kurulum tipi, hedef klasör ve kullanıcı bilgilerinin
bulunduğu bir açıklama penceresi ekrana gelecektir. Bu adımda Next butonuna
basıldığında program dosyaları varsayılan yada seçilen klasöre kopyalanmaya başlanır.
Kopyalama işlemi sona erdikten sonra kurulumun bittiğini gösteren son adım penceresi
ekrana gelir. Buradaki checkbox işaretlenerek Finish butonuna tıklandığında korulan
Monitör programı otomatik olarak çalıştırılacaktır. Bu aşamada program kurulumu
tamamlanmıştır. Programı çalıştırmak için programlar menüsündeki klasör
değiştirilmediyse, Start>Program Files>Monitör>Monitör yolu kullanılarak program
çalıştırılır.
5.2. Monitör Programına Genel Bakış
Program temel olarak bir ana pencereden ve bu pencere içerisinde Proses, Alarm
ve Sistem isimli üç adet alt pencereden oluşmaktadır. Proses penceresinde kartlardan
okunan veriler değişik gösterim şekilleriyle izlenebilir. Alarm penceresinde ise
50
meydana gelen alarm durumları kaydedilir. Sistem penceresinde, kartların
çalışmalarının incelenmesi ve sistem analizi ile ilgili işlemler yapılabilir. Ana pencerede
bulunan Kartlar menüsünde, Kartlarla ilgili işlemlerin yapılabileceği seçenekler
bulunur. İletişim menüsünde ise bağlantının kurulması ve seri port ayarlarının
yapılmasını sağlayan seçenekler bulunur. Pencere menüsünde alt pencerelerin
konumlandırılmaları ve seçilmelerini sağlayan seçenekler mevcuttur. Çıkış menüsünde
ise çıkış ve program hakkında kısa bilgi içeren seçenekler vardır.
5.3. Monitör Programının Tanıtılması
5.3.1. Kartlar Menüsü
Programın ana penceresinde bulunan menülerden Kartlar menüsünde kartlarla
ilgili işlemlerin yapılabileceği seçenekler yer alır. Bunlar; Kartları doğrula ve Kayıt
defteri seçenekleridir.
5.3.1.1. Kartları Doğrula Seçeneği Kartları Doğrula seçeneği, sistem ilk defa kuruluyorsa veya eklenen, çıkarılan
kart varsa veya herhangi kartın adresinin değiştirilmesi halinde kullanılması gereken bir
seçenektir. Bu seçenek seçildiğinde mevcut bir veri akışı varsa durdurulur, bağlantı
yoksa bağlantı kurulur ve tüm kartlar taranır. Seri port veri iletişiminin bir özelliği olan
51
ve her kartın cevap verebilmesi için bir süre bekleme yapıldığından bu işlem birkaç
dakika sürebilir. Tarama sırasında bulunan kartlar listelenir, Bu işlem aynı zamanda kart
kayıt dosyasında her karta ait durum bilgisini yeniler. Kartları manuel olarak tanıtmak
için Kayıt defterinden kart durum kodlarını elle değiştirilerek aynı işlem yapılabilir.
Kart durum kodu hanesinde “0” rakamı kartın mevcut olmadığını, “7” rakamı ise kartın
mevcut olduğunu gösterir. Kart doğrulama işlemi bittikten sonra bağlantı otomatik olrak
kurularak bulunan kartlarla haberleşme başlatılır.
5.3.1.2. Kayıt Defteri Seçeneği
Kayıt defteri seçeneği seçildiğinde, eğer bu seçenek ilk defa seçiliyorsa ekrana,
üzerinde boş alanlar olan bir pencere gelecektir. Kanal bilgilerini ilk defa yüklemek için
Yenile butonuna tıklayınız. Kanal bilgileri yükleme işlemi tamamlandıktan sonra ağaç
görünümü penceresinden kartlar ve kartlara ait kana bilgilerine ulaşılabilir.
Görüntülenmek veya değiştirilmek istenen kart veya kanal üzerine tıklanarak bu kart
veya kanal bilgisinin pencerenin solunda bulunan alanda gösterilmesi sağlanır.
Herhangi değeri değiştirmek için ilgili alan seçildikten sonra değiştir butonuna tıklanır,
gelen giriş kutusuna ilgili değer yazılarak tamam butonuna basılarak ilgili değer
değiştirilir. Her ağaç seviyesine ait görüntülenen bilgiler şöyle sıralanabilir; Ana
düzeyde bulunan Monitör Tüm kartları içeren ana daldır ve buna ait version numarası
52
görüntülenir. Bu değer değiştirilemez. İkinci düzeyde ise tüm kartların listesi yer alır ve
bu kartlar Monitörün alt dallarıdır. Her kart düzeyinde gösterilecek bilgiler Kart bölge
adı ve kart durum kodudur. Bu iki bilgi değiştirilebilir özelliktedir. Kart bölge adı
bölümü, kartın çalıştığı ortamdır. Kart durum kodu bölümünde ise kartın bağlı olup
olmadığını gösterir. Bu bölgede iki adet sayısal bilgi bulunabilir. “0” bilgisi kartın bağlı
olmadığını, “7” bilgisi kartın bağlı ve çalışabilir durumda olduğunu gösterir. Bu kodlar
manuel olarak değiştirilebileceği gibi kartları doğrula seçeneği ile otomatik olarak
değiştirilirler. Ağaç görünümünde üçüncü düzeyde gösterilenler ise her karta ait 8 adet
kanaldır. Bu kanal bilgileri kart dalının bir alt düzeyindedir ve tüm bilgiler
değiştirilebilir niteliğe sahiptir. bu bilgiler;
Kanal adı : Kanala bağlı transdüserin verisini tanımlar. Örneğin kanala bağlı
transdüser bir sıcaklık transdüseri ise bu alana “sıcaklık” etiket bilgisi girilir.
Kanal durum kodu : Kanal durumu ile ilgili bilgilerin tutulduğu veri alanıdır
ve program tarafından kullanılmaktadır.
Öncelik seviyesi : Kanala bağlı transdüserin gönderdiği verilerin önemini
belirler. % cinsinden bir değerdir. Örneğin hayati önem taşıyan bir bilginin öncelik
seviyesi %100, daha az öneme sahip kanal bilgilerinin öncelik seviyesi ise daha düşük
olabilir.
Maximum değer : Kanala bağlı transdüserin sensörden maksimum okuduğu
değerlerdir. Bu değerin 0 ile 65535 arasında bir tam sayı olmasına dikkat edilmelidir.
Minimum değer : Kanala bağlı transdüserin sensörden minimum okuduğu
değerlerdir. Bu değerin 0 ile 65535 arasında bir tam sayı olmasına dikkat edilmelidir.
Maximum sınır : Bu değer transdüserden okunan verinin hangi değeri aşması
halinde alarm durumunun oluşacağını belirler. Yüzde cinsinden girilir. Girilen değer
kanalın maksimum değerinin yüzde oranı olacaktır.
Minimum sınır : Bu değer transdüserden okunan verinin hangi değerden daha
aşağı düşmesi halinde alarm durumunun oluşacağını belirler. Yüzde cinsinden girilir.
Girilen değer kanalın maksimum değerinin yüzde oranı olacaktır.
Birim : Kanala bağlı transdüserden okunan verinin biriminidir. Örneğin basınç
transdüserinden okunan verinin birimi “bar” ise bu haneye “bar” etiket bilgisi girilir.
53
5.3.2. İletişim Menüsü
Ana pencerede bulunan İletişim menüsü kartların haberleşmesi ve seri port
ayarlarının yapılabileceği seçeneklerin yer aldığı bir menüdür.
5.3.2.1 Bağlan Seçeneği
Bağlan seçeneği ayarlanan seri portla bağlantının kurulmasını sağlar. Bağlantı
başarılı bir şekilde kurulduğunda ana penceredeki durum çubuğu yeşil rengini alır ve
ilgili kutucukta “Online” yazısı görülür. Bağlantı kurulduğu anda kart kayıt dosyasında
kart durum kodu “7” olan kartlarla haberleşme trafiği başlar. Eğer durum kodu “7”
olupta cevap vermeyen kart olursa program uyarı vererek bağlantıyı otomatik olarak
keser. Prrogram, bağlı olan kartlardan verileri adres sırasına göre alır. Her iki kart
haberleşmesi arasında beklenecek süre varsayılan değer olarak 100ms’ye ayarlanmıştır.
Çok sayıda kart bağlanması halinde bu değer daha düşürülebilir fakat bu değerin aşırı
düşürülmesi iletişim problemlerine neden olacağından deneme-yanılma yöntemiyle
optimum düzeyde tutulmalıdır.
5.3.2.2. Bağlantıyı Kes Seçeneği
Kurulan bağlantının kesilmesini sağlar. Bağlantı kesildikten sonra karlarla olan
haberleşme de ortadan kalkar. Bağlantı kesildiğinde ana pencerenin durum çubuğunun
rengi sarıdır ve ilgili kutucukta “Offline” ibaresi yer alır. Bağlantı olmadığında kartlarla
bir haberleşme söz konusu olmadığından veri akışı olmaz. Göstergelerde ise son okunan
değerler korunur.
54
5.3.2.3. Port Ayarları Seçeneği
Port ayarları seçeneğinde kartların bağlı olduğu seri portla ilgili ayarlar yer alır.
Bu ayarlar herhangi sebeple değiştirilmiş ise kartların kullandığı ayarlara geri dönmek
için varsayılan butonuna tıklayınız. Diğer standart ayarlar için pencerenin üzerindeki
panele sağ tıklayarak veri formatını belirli standartlar ölçüsünde değiştirebilirsiniz. Port
ayar penceresinde bulunan ayarlar şöyle özetlenebilir,
Seri port : Kartlar bilgisayara hangi seri port üzerinden bağlandıysa bu grup
seçeneklerinden ilgili port seçilmelidir. Program ilk defa çalıştırıldığında varsayılan
değer COM2’dir. Eğer seçtiğiniz port bilgisayarda fiziksel olarak mevcut değilse veya
kartlar seçili porta bağlanmamışsa Bağlan seçeneğini seçtiğinizde program hata mesajı
vererek bağlantıyı gerçekleştirmek.
Baud Rate : Seri port iletişim hızını ayarlamak için bu grup seçeneklerinden
1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200 bps biri
seçilebilir. Kartlar için varsayılan değer 9600bps’dir. Kart iletişim hızından farklı bir hız
seçildiğinde iletişim kurulamayacağından program kartları göremez ve kartın hatta bağlı
olmadığını belirten bir hata mesajı verir.
Data bitleri : Seri haberleşme sisteminde gönderilen veri bitlerinin kaç bitten
oluşacağı seçilir. Kartlar için varsayılan değer 8 bit’tir. Kartın kullandığı veri biti
55
uzunluğundan farklı bir değer seçilmesi durumunda hatalı veriler alınması söz konusu
olduğundan bu kartlarda bu değerin “8 bit” olduğundan emin olmalısınız.
Eşlik biti : Eşlik biti grubundaki seçenlerden veri bitlerinin doğruluğunu
denetleyecek olan bitin kullanılıp kullanılmadığı veya kullanılıyorsa veri bitlerini
doğrulama şeklinin ne olduğu seçilir. Kartlar için varsayılan değer NONE’dur.
Durma Bitleri : Seri porttan gönderilen veri paketinin sonlandırılacağı bitin
uzunluğu bu grubun seçenekleri ile seçilir. Kartlar için varsayılan değer “1” dir.
Yazılım akış denetimi : Seri port veri akışının yazılım denetimli olup
olmayacağı bu grup seçenekleri yardımıyla belirlenir. Kartlar için varsayılan değer,
yazılım akış denetiminin olmamasıdır.
Donanım akış denetimi : Seri port veri akışında donanım denetimlerinin
kullanılıp kullanılmadığını veya ne çeşit denetim sinyallerinin kullanıldığını belirler.
Kartlarla iletişim için varsayılan değer RTS/CTS akış denetimidir.
5.3.3. Pencere Menüsü
Bu menüde ana pencede içerisinde bulunan Proses, Alarm ve Sistem
pencerelerinin yerleşim düzeni ve seçimi ile ilgili seçenekler bulunmaktadır.
5.3.3.1. Döşe Seçeneği
Bu seçenek ana pencere içerisinde bulunan Proses, alarm ve Sistem
pencerelerinden o an normal boyutlarda açık olanlarını ana pencere boyutlarını
kaplayacak şekilde döşer.
5.3.3.2. Basamakla Seçeneği
O an kapalı olmayan pencereleri ana pencerenin sol üst köşesinden itibaren alt
sağ köşeye doğru normal boyutlarıyla sıralar. Basamakla seçeneği seçildiğinde aktif
halde olan pencere en üstte olacak ve görünecek şekilde sıralama yapılır.
56
5.3.3.3. Tümünü Kapat Seçeneği
Tümünü kapat seçeneği seçildiğinde o an kapalı olmayan tüm pencereler
kapatılarak ana pencerenin sol alt köşesinden itibaren dizilirler. Pencereleri tekrar eski
boyutlarına getirmek için ya menüden ilgili pencere seçilir veya kapalı olan pencerenin
üzerindeki normal boyutlarına getir butonuna tıklayarak pencere restore edilir.
5.3.3.4. Proses Seçeneği
Bu seçenek ile proses penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer
pencere kapalı ise eski boyutlarında açılır.
5.3.3.5. Alarm Seçeneği
Bu seçenek ile alarm penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer
pencere kapalı ise eski boyutlarında açılır.
5.3.3.6. Sistem Seçeneği
Bu seçenek ile sistem penceresi aktif yapılarak görüntülenmesi sağlanır. Eğer
pencere kapalı ise eski boyutlarında açılır.
5.3.4. Çıkış Menüsü
Çıkış menüsünde programdan çıkmak için ve program hakkında bilgi veren iki
seçenek vardır.
5.3.4.1. Çıkış Seçeneği
Programdan çıkmak için bu seçenek seçilmelidir. Programdan çıkmadan önce
kartlarla bağlantının kesilmesi gerekmektedir. Program, bağlantının kesilmemiş olması
durumunda çıkma isteği algıladığında bağlantıyı otomatik olarak keserek programdan
çıkar.
57
5.3.4.2. Program Hakkında
Program hakkında kısa bilgiler içeren bir pencere ekrana gelerek programın
yapımında emeği geçen kişi ve kuruluşların listesini güzel bir piyano eşliğinde gösterir.
5.3.5. Program Alt Pencerelerinin Tanıtılması
Programın üç alt penceresi mevcuttur. Bunlar Proses, Alarm ve Sistem
pencereleridir. Bu pencerelere Pencere menüsünden veya direkt üzerine tıklayarak
erişilebilir.
5.3.5.1. Proses Penceresi
Proses penceresi, kartlardan okunan verilerin çeşitli şekillerde görüntülenmesini
sağlar. Pencerenin sol tarafında bulunan liste kutusunda kartların listesi vardır. Sol
tarafında ise, liste kutusundan seçilen kartın kanallarını gösteren sekiz adet gösterge
vardır. Normalde liste kutunda bütün kartlar listelenir fakat liste kutusu üzerine sağ
tıklayıp çalışan kartlar seçeneğini seçtiğinizde sadece bağlı olan kartların listesi
görülecektir. Buradan verisi görülmek istenen kart seçilerek göstergelerden her kanal
izlenebilir. Analog göstergelerin üzerine sağ tıkladığınızda gelen seçeneklerden
58
gösterge kadranının kaç derecelik açıda olacağı seçilebilir. Trend sekmesinde ise seçili
kartın kanal bilgileri trend şeklinde gösterilir. Yine trendler üzerine sağ tıklayarak trend
tipi ve rengi değiştirilebilir. Digital sekmesinde ise okunan kanal verileri sayısal olarak
gösterilir.
5.3.5.2. Alarm Penceresi
Alarm penceresinde, kayıt defterinde her kanal için tanımlanan maksimum ve
minimum sınır değerlerinden bir taşma olduğunda tarih, saat, kart no, kanal no ve
durum bilgileri ile beraber bu penceredeki editöre bir satır eklenir. Eklenen bu satırlara
istenirse ek bilgiler yazılabilir. Alarm penceresinde bulunan araç çubuğunda ise editör
alanını temizleme, text dosya yükleme, editör içeriğini kaydetme, sesli iletileri aktif hale
getirme ve iptal etme, yazdırma butonları yer alır. Editör içeriğini temizle butonunda
editörün içeriği temizlenir. Dosyadan yükle butonunda ise text dosyanın içeriğini
editörde görüntüler. Bu dosya daha önceden kaydedilmiş alarm dosyalarından biri
olabileceği gibi farklı bir text dosyada olabilir. Dosyaya kaydet butonu ise o anki editör
içeriğini bir dosyaya kaydetmek amacıyla kullanılır. Dosyaya istenilen bir uzantı
verilebileceği gibi dosya text formatta kaydedileceği için uzantısının .txt olması dosyayı
tanımlamak bakımından rahatlık sağlar. Bu pencerede program online çalışırken
dosyalama işlemlerinin yapılmaması tavsiye edilir. Aksi halde bazı hataların çıkmasına
sebep olunabilir. Araç çubuğunda bulunan sesli iletileri aç ve sesli iletileri kapat
butonları ise, herhangi alarm durumunda alarm penceresine yazılan alarm satırıyla
beraber verilen sesli iletilerin açılıp kapanmasını sağlar. Yazdırma butonu ise o an
editör içeriğindeki tüm metni Windows'un tanımlamış olduğu geçerli yazıcıya gönderir.
59
5.3.5.3. Sistem Penceresi
Sistem penceresinde üç adet sekme bulunur. Bunları tek tek inceleyecek olursak;
Veri trafiği sekmesi: Programın kartlara gönderdiği ver kartlardan aldığı veri
paketlerini yakalayarak görüntüler. Bu sekmenin kendisine ait araç çubuğunda sırasıyla
editör içeriğini temizleme, text dosyayı editöre yükle, editördeki içeriği bir text dosyaya
kaydet, kopyala, kes, yapıştır, veri paketlerini görüntülemeye başla ve veri paketlerini
görüntülemeyi sonlandır butonları vardır. Kartlarla yapılan haberleşmede Veri trafiği
yoğun olduğundan kısa sürede çok sayıda veri paketi örneği alınmış olacaktır.
İncelemek amacıyla birkaç saniyelik veri trafiğinin örnekleri yeterli olacaktır.
Sistem analizi sekmesi: Bu sekmede istenilen karta istenilen komut ve kanal
numarası gönderilerek kartın verdiği cevap analiz edilebilir. Analiz verilerini
göndermek için önce sekmenin kendisina ait araç çubuğundaki veri trafiğini durdur
butonu ile veri akışı durdurulmalıdır. Daha sonra gönderilecek kart grubundan verinin
gönderileceği kart adres olarak veya kayıt defterinde belirtilen bölge ismi olarak seçilir.
Seçilen karta gönderilecek komut ise Kart komutu grubundan kod olarak veya kodun
açıklaması olarak seçilir. Son olarak işlem görecek kanal numarası seçilerek gönder
butonuna basılır. Butona her basılışta yalnız bir veri paketi gönderilir ve bir veri paketi
alınır. Alınan veri paketi ve çözümlemesi alınan grubunda gösterilir. Kart cevabı
grubunda karttan gelen cevap aynen veya taşıdığı anlam olarak izlenebilir. Kart
cevabının yanında ise karttan alınan çözümlenmiş veri gösterilir. En sağdaki kutuda ise
karttan gelen çözümlenmemiş veri paketi gösterilir. Analiz işlemi bittikten sonra araç
çubuğundaki veri trafiğini başlat butonu ile kart verilerinin alımına devam edilmesi
sağlanır.
60
Ayarlar sekmesi : Ayarlar sekmesinde bulunan iz çubuğu ile programın bir kart
ile haberleşme başladığından itibaren kaç milisaniye sonra diğer kartla haberleşmeye
başlayacağını belirler bu değer, çok sayıda kart bağlandığında bir kartın birinci kez
okunduktan sonra ikici kez okunması arasında geçen zamanın veri kaybına neden
olacak şekilde uzun olması durumunda düşürülebilir. Bu zamanın çok düşürülmesi,
kartların cevap verme sürelerinden daha düşük olduğunda haberleşme sorunları
meydana gelir ve kartlardan veri okumak imkansız hale gelir. Bu zamanın uzun
bırakılması halinde ise veri kayıplarına neden olacağından, tüm kartlar çalıştırıldıktan
sonra deneme yanılma yöntemiyle optimum çalışma aralığı belirlenmelidir. Sisteme kart
eklenip çıkartıldığında ise bu süre yeniden düzenlenmelidir. Adc gerilimleri ve referans
gerilimler gruplarında ise kart seçildikten sonra başla butonuna basılarak seçilen
karttaki analog digital dönüştürücü entegrenin + referans, - referans ve ortalama refens
değerleri ve kartın baud rate bölen değeri dur butonuna basılıncaya kadar tazelenerek
okunur. Referans gerilim grubunda ise +referans geriliminin 5V olması durumunda
okunan değere karşılık gelecek gerilim değeri hem sayısal hem grafiksel olarak
gösterilir. Okunan diğer değerler ham veriler olup minimum 0 ve maksimum 4096
değerleri arasında değişir.
5.4. Monitör Programının İlk Defa Çalıştırılması
Program ilk defa çalıştırılıyorsa aşağıdaki adımların izlenerek program
ayarlarının yapılması, en kısa zamanda sonuç alınmasını sağlayacaktır. Programı
çalıştırmadan önce kullanacağınız kartların üzerinde bulunan dip-swiçler yardımıyla her
karta bir adres tanımlayınız. Adres tanımlamada dikkat edilmesi gereken kural, aynı
adrese sahip iki adresin tanımlanmaması gereklidir. Bu işlemden sonra kartlara
transdüserleri bağlayınız ve hangi adresteki kartın hangi kanalına ne tip transdüser
bağladığınızı, max ve min değerlerini, alt ve üst sınır değerlerini, kartın kullanıldığı
ortamla ilgili bilgileri bir yere kaydediniz. Son olarak kartları haberleşme hattına
bağlayarak RS485/RS232 konvertörün RS485 girişine bağlayınız. Konvertörün RS232
girişini ise bilgisayarın boşta olan herhangi seri portuna bağlayınız ve hangi porta
bağladığınızı kaydediniz. Programı çalıştırmadan önce yapılması gereken işlemleri
tamamladıktan sonra Programı çalıştırınız. İlk olarak İletişim menüsünden Port ayarları
seçeneğini seçiniz. Buradan RS485/RS232 çeviriciyi bağladığınız seri port numarasını
seçerek tamam butonunu tıklayınız. Sonra Kartlar menüsünden Kayıt defteri seçeneğini
61
tıklayınız. Gelen pencereden yenile butonuna tıklayarak kanal bilgilerinin yüklenmesini
bekleyiniz. Kanal bilgileri yüklendikten sonra kartları bağlarken tanımladığınız
adresteki kartın kanallarına bağlı transdüserlere ait bilgileri ilgili hanelere yazınız.
Tamam butonuna tıklayıp pencereyi kapattıktan sonra Kartlar menüsünden Kartları
doğrula seçeneğini seçerek bağladığınız kartların bulunmasını bekleyiniz. Bağladığınız
tüm kartlar bulunduktan sonra veri aktarımı otomatik olarak başlayacaktır. Proses
penceresini seçerek aktif olmasını sağlayınız. Sağ tarafta bulunan liste kutusunun
üzerine sağ tıklayıp Çalışan kartlar seçeneğini seçerek sadece tanımlanan kartların
görüntülenmesini sağlayabilirsiniz. Verilerini görmek istediğiniz kart üzerine tıklayarak
tüm kanal bilgilerini göstergelerden izleyebilirsiniz. Sekme tuşlarından, verinin analog,
trend veya digital formatta gösterilmesini sağlayabilirsiniz. Yine analog göstergeler
veya trend üzerine sağ tıklayarak görünüm biçimlerini ayarlayabilirsiniz. Meydana
gelen alarm durumları alarm penceresine kaydedilecektir.
5.5. Monitör Programının Kaynak Kodunun Açıklanması
Delphi 4.0 Professional’da yazılan monitör programının kullandığı program
dosyaları, üniteler, komponentler, dinamik bağlı kütüphaneler dosya isimleriyle aşağıda
listelenmiştir.
monitor.pas : Ana program dosyası.
mainunit.pas : Ana program ünitesi. Ünitenin kaynak kodu EK2.1’de
verilmiştir.
proses.pas : Proses penceresine ait ünite
sistem.pas : Sistem penceresine ait ünite
alarm.pas : Alarm penceresine ait ünite
cardreg.pas : Kart kayıt defterine ait ünite
check.pas : Kartları doğrula penceresine ait ünite
checkval.pas :Okunan değerleri kontrol eden ve bir taşma olması
halinde ilgili prosedürleri çağıran ünite.
gauge.pas :Beklenmesi gereken yerlerde işlemin ne kadarının
yapıldığını gösteren göstergenin ünite dosyası
hakkunit.pas : Program hakkında bilgi veren pencereye ait ünite
portayar.pas : Seri port ayar penceresine ait ünite dosyası.
analogmeter.pas :Proses penceresindeki analog göstergeleri oluşturan ünite.
62
trend.pas :Proses penceresindeki trend göstergelerini oluşturan
ünite.
binary.pas :Bitsel düzeyde işlemlerin yapılmasını sağlayan
fonksiyonları içeren dinamik bağlı kütüphane. Kütüphanenin kaynak kodu EK2.2’de
verilmiştir.
cpdrv.pas : Seri port ile iletişimi sağlayan ünitedir.
fileman.pas :Tüm dosyalama işlemlerini yürüten ünite. Ünitenin
kaynak kodu EK2.3’te verilmiştir.
aicpro.pas : Haberleşme protokolünü kodlayan ve çözen dinamik
bağlı kütüphane.
data.ch : Kanal bilgilerinin tutulduğu kayıt dosyası
nameof.crd : Kart bilgilerinin tutulduğu kayıt dosyası.
Comm.dat : seri haberleşme port ayarlarının tutulduğu dosya.
Kullanılan tüm bu dosyalardan kart ile haberleşmeyi mümkün kılan aicpro.pas
ünitesinin kullanılma amacı, en az sayıda bit göndererek ve alarak gerekli verilerin en
kısa zamanda taşınmasını sağlamaktır. Bunu sağlayabilmek için giden ve gelen bilgiler
ikişer bayt olacak şekilde paketlenerek gönderilir. Bu işlemi sağlayan aicpro ünitesi
giden ve gelen veriler için farklı fonksiyonlara sahiptir. Bu fonksionlar;
encode_protokol : Gönderilecek bilgileri bir word olarak paketler
get_low : Verilen word bilgisinin düşük anlamlı baytını verir.
get_high : Verilen word bilgisinin yüksek anlamlı baytını verir.
get_word : Verilen iki baytı bir word’e dönüştürür.
get_card_response : Karttan gelen word paketli bilginin kart cevabı bölümünü
verir.
get_card_data : Karttan gelen word paketli bilginin taşıdığı veriyi alır.
Bu fonksiyonların kullanıldığı haberleşme ortamında giden ve gelen veri
paketlerinin şekilleri aşağıdaki gibi olmaktadır.
Monitör programından kartlara giden veri paketinin formatı;
63
Kartlardan Monitör programına gelen veri paketlerinin formatı ise;
Tüm bu işlemlerin gerçekleştirilmesini sağlayan aicpro ünitesinin kaynak kodu
EK2.4’te verilmiştir.
64
SONUÇ
Projenin ilk aşamalarında analog arabirim kartının, mikrokontrolör ve monitör
yazılımının ne şekilde olacağını düşünürken, analog veriyi okuyup bilgisayar ekranına taşıyan
basit bir mantıkla oluşturulmuş tasarımla proje çalışmaları başlamıştı. Projenin ilerleyen
aşamalarında, yapılmış olan eski tasarımın her defasında yetersiz ve birçok özellikten yoksun
olduğu görülüp, tasarım her defasında yeniden düzenlenerek geliştirilmiştir. Tasarımda
yapılan her değişiklik uzun zaman ve işgücü kayıplarına, dolayısıyla o zamana kadar yapılan
çalışmaların büyük kısmının silinip atılmasına neden olmaktaydı. Uzunca bir zaman alan bu
çalışmalardan elde edilen bilgi ve tecrübeler sonucunda daha sistemli, esnek yapılı ve projeye
temel teşkil edecek tasarım ve bu tasarımın çalışması, haberleşme şekli, programlanması net
bir şekilde tanımlanmıştır. Projenin gerçekleştirilmesi aşamasında çıkan küçük problemler
tasarımda bazı değişikliklerin yapılmasına neden olduysa da bunların etkisi, projeye her an
eklenen yeni özelliklerin getirdiği karmaşıklık kadar olmamıştır. Artık donanımdan ziyade
yazılımım yeteneğine göre şekillenecek olan proje adım adım gerçekleştikçe eklenen veya
eklenilmesi düşünülen her yeni özellik, ulaşılması gereken hedefi daha da uzaklaştırıyordu.
Projenin teslim tarihinin yaklaşması nedeniyle sonradan düşünülen birçok özellik iptal edilmiş
ve kalan zaman mevcut sistemin iyileştirilmesi, çıkan veya çıkabilecek hataların ayıklanması,
dökümantasyonun hazırlanması gibi işlere ayrılmıştır.
Tüm bu çalışmaların sonucunda, işin en başında tasarlandığından çok daha fazlası,
fakat son yapılan tasarımın ise pek azı gerçekleştirilmiş oldu. Sonuçta; amaçlanan işe hizmet
edebilecek çalışan bir sistem ortaya çıktı.
Yeterli zaman olmadığından dolayı monitör programına eklemekten vazgeçilen
özelliklerin en önemlisi; toplanan verilerin isteğe bağlı olarak günlük, haftalık, aylık ve yıllık
olarak kaydedilmesi ve bunların istenildiği zaman çağırılıp grafiklere uygulanarak analizinin
yapılabilmesi, ODBC (Open Data Base Connectivity – Açık Veri tabanı Bağlantısı) desteği ile
toplanan verilerin diğer programlarla paylaşılabilmesi özelliğidir. Bunun yanında analog
arabirim kartının kullanıldığı sahadan alınan değerlerin proses grafik ve animasyonlarını
içeren bir pencere içerisinde sunmak, istenilen sayıda proses penceresi oluşturularak her
proses tanımlaması için istenilen kartın istenilen kanal bilgisini bu prosese atamak monitör
65
programına eklenmeyen diğer bir özelliktir. Analog Arabirim kartında ise düşünüldüğü halde
gerçekleştirilemeyen en önemli özellik giriş kanallarının sadece 4-20mA değil, aynı zamanda
0-10V, 0-5V gibi diğer standartları da desteklemesiydi. Bununla beraber kartların adres
switch kullanmadan otomatik olarak tanımlanarak adreslerinin atanması özelliği, kartların
birbirine seri değil, tek hat üzerinden bağlamasına karar verildiğinde gerçekleştirilmesi
zorlaştığından iptal edilerek yerine adres switchleri konulmak durumunda kalınmıştır.
Gerek yazılımdan, gerekse analog arabirim kartı donanımından zaman yetmediği için
çıkarılmak zorunda kalan bu özelliklerin gerçekleştirilmiş olması halinde çok daha kapsamlı
ve verimli bir sistem elde edilebilir.
EKLER
EK1. PIC16C63 PROGRAMI
EK2.MONİTÖR PROGRAMI KAYNAK KODLARI
EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODU EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU EK2.3. FILEMEN ÜNİTESİNİN KAYNAK KODU EK 2.4. AICPRO ÜNİTESİNİN KAYNAK KODU
67
EK1. PIC16C63 PROGRAMI
;************************************************ ; Bu program, ; MARMARA UNIVERSITESI ; TEKNIK EGITIM FAKULTESI ; ELEKTRIK EGITIMI BOLUMU 'nde ; ; Bitirme projesi olarak hazirlanmistir. ; ; Proje Danismani : Doc. Dr. Koray TUNCALP ; ; Projeyi hazirlayanlar : 4A3 - 9601025 - M. Ozan AKI ; 4A3 - 9601029 - Ercan UYGUN ; ; Projeyi destekleyen : Prestij Endüstriyel Cihazlar A.Ş. ; ; Yapildigi donem : 1999 / 2000 ogretim yili ; ;*********************************************** ; ; Program hakkinda bilgiler; ; Kullanilan kontrolor : PIC 16C63A ; Rezonator : 11.059.200Hz HS ; 1 cycle : 2764800Hz - 361ns ; WatchDog Timer : Kullanılmıyor ; ; ;////////////////////////////////////////////// include "p16c63a.inc" ; //////////// Sigorta Tanimlamalari ///////////// ;//// Adres secici switch tanimlamalari //// card_status equ h'20' card_address equ h'21' sayac equ h'22' dcnt equ h'23' drpt1 equ h'24' drpt2 equ h'25' channel_no equ h'26' command equ h'27' card_response equ h'28' adc_access equ h'29' get_adress equ h'70' get_param equ h'71' send_lo equ h'72' send_hi equ h'73' adc_data_hi equ h'74' adc_data_lo equ h'75' endbuf equ h'7F'
68
#define line_driver portb,1 #define yesil_led portb,0 #define kirm_led portc,4 #define baud_9600 portb,5 #define baud_19200 portb,6 #define baud_115200 portb,7 #define adress_0 portc,1 #define adress_1 portc,2 #define adress_2 portc,3 #define read_adress porta,4 #define channel_0 portb,4 #define channel_1 portb,3 #define channel_2 portb,2 #define adc_eoc porta,0 #define adc_clock porta,1 #define adc_di porta,2 #define adc_do porta,3 #define adc_not_cs porta,5 org 00h ; init vektor goto init org 04h ; Reset Vektor goto init init ; ////////////// Baslangic icin ayar ve tanimlamalar /////////////// bcf status,rp0 ; bank 0 secildi ; //////////////// Status Settings //////////////// bcf status,dc ; digit carry bcf status,z ; zero flag bcf status,c ; carry flag ; //////////////// Baslangicta tum portlari sifirla //////////////// clrf porta ; porta latch clrf portb ; portb latch clrf portc ; portc latch ; /////////////// Global interrupt kontrol yazmaci ///////////////// bcf intcon,gie ; global interrupt enable bit bcf intcon,peie ; peripheral interrupt enable bit bcf intcon,t0ie ; timer 0 overflow interrupt enable bit bcf intcon,inte ; RB0/INT External Interrupt Enable bit bcf intcon,rbie ; RB Port Change Interrupt Enable bit bcf intcon,t0if ; timer 0 Overflow interrupt flag bit bcf intcon,intf ; RB0/INT External Interrupt Flag bit bcf intcon,rbif ; RB port Change Interrupt Flag bit ; //////////////// Peripheral interrupt register //////////////////// bcf pir1,sspif ; Synchronous Serial Port Interrupt Flag bit bcf pir1,ccp1if ; CCP1 Interrupt Flag bit bcf pir1,tmr2if ; TMR2 to PR2 match interrupt flag bit bcf pir1,tmr1if ; TMR1 Overflow Interrupt Flag bit bcf pir2,ccp2if ; CCP2 Interrupt Flag ; /////////////// Timer 1 Kontrol register //////////////////////
69
bcf t1con,t1ckps1 ; Timer1 Input Clock Prescale Select bits bcf t1con,t1ckps0 ; Timer1 Input Clock Prescale Select bits bcf t1con,t1oscen ; Timer1 Oscillator Enable Control bit bcf t1con,not_t1sync ; Timer1 External Clock Input Synchronization Control bit bcf t1con,tmr1cs ; Timer1 Clock Source Select bit bcf t1con,tmr1on ; Timer1 On bit ; /////////////// Timer 2 Kontrol Register ///////////////////// bcf t2con,toutps3 ; Timer2 Output Postscale Select bits bcf t2con,toutps2 ; Timer2 Output Postscale Select bits bcf t2con,toutps1 ; Timer2 Output Postscale Select bits bcf t2con,toutps0 ; Timer2 Output Postscale Select bits bcf t2con,tmr2on ; Timer2 On bit bcf t2con,t2ckps1 ; Timer2 Clock Prescale Select bits bcf t2con,t2ckps0 ; Timer2 Clock Prescale Select bits ; /////////////// Senkron Seri Port Kontrol Registeri /////////////// bcf sspcon,wcol ; Write Collision Detect bit bcf sspcon,sspov ; Receive Overflow Detect bit bcf sspcon,sspen ; Synchronous Serial Port Enable bit bcf sspcon,ckp ; Clock Polarity Select bit bcf sspcon,sspm3 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm2 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm1 ; Synchronous Serial Port Mode Select bits bcf sspcon,sspm0 ; Synchronous Serial Port Mode Select bits ; ///////////////// Capture Compare PWM Kontrol Register ////////////// bcf ccp1con,ccp1x ; PWM Least Significant bits bcf ccp1con,ccp1y ; PWM Least Significant bits bcf ccp1con,ccp1m3 ; CCPx Mode Select bits bcf ccp1con,ccp1m2 ; CCPx Mode Select bits bcf ccp1con,ccp1m1 ; CCPx Mode Select bits bcf ccp1con,ccp1m0 ; CCPx Mode Select bits ; /////////////// Asenkron Receive Register /////////////////// bsf rcsta,spen ; Serial Port Enable bit bsf rcsta,cren ; Cont. receive enable bit bcf rcsta,rx9 ; 9-bit Receive Enable bit bsf status,rp0 ; bank 1 secildi ; /////////////// Option Register Settings /////////////////// bsf option_reg,not_rbpu ; PortB Pull-up enable bit bcf option_reg,t0cs ; Timer 0 Clock Source Select Bit bcf option_reg,t0se ; TMR0 Source Edge Select Bit bsf option_reg,psa ; Prescaler Assignment bit bcf option_reg,ps2 ; Prescaler Rate Value; bcf option_reg,ps1 ; Prescaler Rate Value; bcf option_reg,ps0 ; Prescaler Rate Value; ; ///////////// Port giris-cikis tanimlamalari ///////////////////// movlw b'00011001' ; Porta Direction register movwf trisa movlw b'11100000' ; Portb Direction register movwf trisb movlw b'10000000' ; Portc Direction register movwf trisc ; ///////////////// Peripheral interrupt Enable Register ////////////
70
bcf pie1,rcie ; USART Receive Interrupt enable Bit bcf pie1,txie ; USART Transmit Interrupt Enable Bit bcf pie1,sspie ; Synchronous Srial Port Interrupt enable Bit bcf pie1,ccp1ie ; CCP1 Interrupt Enable Bit bcf pie1,tmr2ie ; TMR2 to PR2 Match ınterrupt Enable Bit bcf pie1,tmr1ie ; TMR1 Overflow Interrupt Enable Bit bcf pie2,ccp2ie ; CCP2 Interrupt Enable Bit ; /////////////// Power Control REgister //////////////////// bcf pcon,not_por ; Power on Reset Status bit bcf pcon,not_bor ; Brown Out Reset Status bit ; //////////// Asenkron Transmit Register /////////////////// bcf txsta,csrc ; Clock Source Select Bit bcf txsta,tx9 ; 9-bit Transmit Enable Bit bsf txsta,txen ; Transmit Enable Bit bcf txsta,sync ; USART Mode select bit bcf txsta,brgh ; High Baud Rate Select Bit ; //////////////// Baud Rate Generator /////////////////// ; 9600 bps -> spbrg=17 brgh=0 ; 19200 bps -> spbrg=8 brgh=0 ; 115200 bps -> spbrg=5 brgh=1 bcf status,rp0 btfss baud_9600 ; Test 9600 jumper goto set_9600 btfss baud_19200 ; Test 19200 jumper goto set_19200 btfss baud_115200 ; Test 115200 jumper goto set_115200 goto no_select set_9600 bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'17' ; Default Baud Rate Prescaler = 9600 bps movwf spbrg goto complate set_19200 bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'08' ; Default Baud Rate Prescaler = 19200 bps movwf spbrg goto complate set_115200 bsf status,rp0 bcf option_reg,not_rbpu bsf txsta,brgh movlw d'05' ; Default Baud Rate Prescaler = 115200 bps movwf spbrg goto complate
71
no_select bsf status,rp0 bcf option_reg,not_rbpu bcf txsta,brgh movlw d'17' ; Default Baud Rate Prescaler = 9600 bps default movwf spbrg complate bsf option_reg,not_rbpu bcf status,rp0 ; //////////////// Kart adresini al //////////////////// clrf card_status bsf adc_not_cs call adres_al goto start adres_al bsf yesil_led bcf kirm_led bsf card_status,0 clrf card_address bcf adress_0 bcf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,0 bsf adress_0 bcf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,1 bcf adress_0 bsf adress_1 bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,2 bsf adress_0 bsf adress_1
72
bcf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,3 bcf adress_0 bcf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,4 bsf adress_0 bcf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,5 bcf adress_0 bsf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,6 bsf adress_0 bsf adress_1 bsf adress_2 nop nop nop nop nop nop nop btfsc read_adress bsf card_address,7 bcf yesil_led bcf kirm_led return adc_oku bsf yesil_led bcf kirm_led
73
bcf adc_not_cs bsf card_status,1 bcf channel_0 bcf channel_1 bcf channel_2 btfsc channel_no,2 bsf channel_2 nop nop nop btfsc channel_no,1 bsf channel_1 nop nop nop btfsc channel_no,0 bsf channel_0 nop nop nop clrf adc_data_hi clrf adc_data_lo bcf adc_clock bcf adc_di adc_bekle btfss adc_eoc goto adc_bekle bsf yesil_led bcf kirm_led nop nop nop nop nop bcf adc_di btfsc adc_access,3 ; Adc Access verisi bsf adc_di btfsc adc_do ; 11. biti oku bsf adc_data_hi,3 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,2 ; Adc Access verisi bsf adc_di btfsc adc_do ; 10. biti oku bsf adc_data_hi,2 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,1 ; Adc Access verisi
74
bsf adc_di btfsc adc_do ; 9. biti oku bsf adc_data_hi,1 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf adc_di btfsc adc_access,0 ; Adc Access verisi bsf adc_di btfsc adc_do ; 8. biti oku bsf adc_data_hi,0 bsf adc_clock nop nop nop bcf adc_clock nop bcf adc_di nop nop btfsc adc_do ; 7. biti oku bsf adc_data_lo,7 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 6. biti oku bsf adc_data_lo,6 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 5. biti oku bsf adc_data_lo,5 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 4. biti oku bsf adc_data_lo,4 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 3. biti oku bsf adc_data_lo,3
75
bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 2. biti oku bsf adc_data_lo,2 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 1. biti oku bsf adc_data_lo,1 bsf adc_clock nop nop nop bcf adc_clock nop nop nop btfsc adc_do ; 0. biti oku bsf adc_data_lo,0 bsf adc_clock nop nop nop bcf adc_clock nop nop nop bcf yesil_led bcf kirm_led return gonder bsf yesil_led bcf kirm_led bsf line_driver bcf adc_data_hi,4 bcf adc_data_hi,5 bcf adc_data_hi,6 bcf adc_data_hi,7 btfsc card_response,0 bsf adc_data_hi,4 btfsc card_response,1 bsf adc_data_hi,5 btfsc card_response,2 bsf adc_data_hi,6 btfsc card_response,3 bsf adc_data_hi,7 movfw adc_data_lo movwf txreg bcf pir1,txif txd1 btfss pir1,txif goto txd1
76
movfw adc_data_hi movwf txreg bcf pir1,txif txd2 btfss pir1,txif goto txd2 bcf line_driver bcf yesil_led bcf kirm_led return frame_error bsf card_status,7 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return over_error bsf card_status,6 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return pro_error bsf card_status,5 bsf kirm_led bcf yesil_led bcf rcsta,cren nop bsf rcsta,cren return start bekle bcf yesil_led bcf kirm_led bcf line_driver bsf adc_not_cs btfsc rcsta,ferr call frame_error btfsc rcsta,oerr call over_error btfss pir1,rcif goto bekle movfw rcreg clrf rcreg movwf get_adress movfw card_address subwf get_adress,w btfss status,z goto bekle wait_prm btfss pir1,rcif goto wait_prm
77
movfw rcreg clrf rcreg movwf get_param clrf channel_no clrf command btfsc get_param,1 bsf command,0 btfsc get_param,2 bsf command,1 btfsc get_param,3 bsf command,2 btfsc get_param,5 bsf channel_no,0 btfsc get_param,6 bsf channel_no,1 btfsc get_param,7 bsf channel_no,2 movlw h'0' subwf command,w btfsc status,z goto init; movlw h'1' subwf command,w btfsc status,z goto durum_bildir movlw h'2' subwf command,w btfsc status,z goto adres_bildir movlw h'3' subwf command,w btfsc status,z goto kanal_oku movlw h'4' subwf command,w btfsc status,z goto ref_neg_oku movlw h'5' subwf command,w btfsc status,z goto ref_poz_oku movlw h'6' subwf command,w btfsc status,z goto ref_ort_oku movlw h'7' subwf command,w btfsc status,z goto bilgi_ver miss_command call pro_error goto start
78
durum_bildir clrf adc_data_hi movfw card_status movwf adc_data_lo movlw d'01' movwf card_response call gonder goto start adres_bildir call adres_al movfw card_address movwf adc_data_lo clrf adc_data_hi movlw d'2' movwf card_response call gonder goto start kanal_oku clrf adc_access call adc_oku nop nop call adc_oku movlw d'03' movwf card_response call gonder goto start ref_neg_oku movlw b'00001100' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku movlw d'04' movwf card_response call gonder goto start ref_poz_oku movlw b'00001101' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku movlw d'05' movwf card_response call gonder goto start ref_ort_oku movlw b'00001011' ; dusuk 4 biti adcye yuksek dort bit olarak gonderilir. movwf adc_access call adc_oku nop nop call adc_oku
79
movlw d'06' movwf card_response call gonder goto start bilgi_ver bsf status,rp0 movfw spbrg bcf status,rp0 movwf adc_data_lo movlw d'07' movwf card_response clrf adc_data_hi call gonder goto start end
80
EK2. MONİTÖR PROGRAMI KAYNAK KODLARI
EK2.1. MAINUNIT ÜNİTESİNİN KAYNAK KODLARI
unit mainunit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, fileman, ImgList, cardreg, proses, alarm, CPDrv,aicpro, ExtCtrls, AnalogMeter, StdCtrls, MPlayer; const cr:String[2]=#13+#10; Type Tmainform = class(TForm) MainMenu1: TMainMenu; kartlar: TMenuItem; pencere: TMenuItem; cikis: TMenuItem; arabul: TMenuItem; kayitdefteri: TMenuItem; cik: TMenuItem; N1: TMenuItem; hakkinda: TMenuItem; StatusBar1: TStatusBar; ImageList1: TImageList; dose: TMenuItem; basamakla: TMenuItem; kapat: TMenuItem; N2: TMenuItem; winproses: TMenuItem; winalarm: TMenuItem; CommPortDriver: TCommPortDriver; comm: TMenuItem; baglan: TMenuItem; kes: TMenuItem; N3: TMenuItem; ayar: TMenuItem; winSistem: TMenuItem; MediaPlayer1: TMediaPlayer; Procedure HintGoster(Sender:TObject); Function Calculate(adr,ch,okunan:integer):integer; Procedure refreshstatus;
81
procedure FormCreate(Sender: TObject); procedure kayitdefteriClick(Sender: TObject); procedure cikClick(Sender: TObject); procedure doseClick(Sender: TObject); procedure basamaklaClick(Sender: TObject); procedure kapatClick(Sender: TObject); procedure winprosesClick(Sender: TObject); procedure winalarmClick(Sender: TObject); procedure ayarClick(Sender: TObject); procedure hakkindaClick(Sender: TObject); procedure baglanClick(Sender: TObject); procedure kesClick(Sender: TObject); procedure winSistemClick(Sender: TObject); procedure arabulClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private Private declarations public Kart tanımlamaları card_no:byte; card_status:byte; zone_name:string; Total_Card_Ok:integer; Cards:array[0..127] of byte; Kanal tanımlamaları channel_no:byte; channel_name:string; channel_status:byte; channel_priority_level:byte; channel_max_value:integer; channel_min_value:integer; channel_max_limit:integer; channel_min_limit:integer; channel_unit_name:string; Haberleşme portu tanımlamaları Port:TPortNumber; Baud:TBaudRate; Data:TDataBits; Stop:TStopBits; Parity:TParity; hflow:THwFlowControl; sflow:TSwFlowControl; pmode:TPacketMode;
82
end; var mainform: Tmainform; command:byte; implementation Uses portayar, hakkunit, Sistem, Check; $R *.DFM Function TMainForm.Calculate(adr,ch,okunan:integer):integer; Var ch_max,ch_min:integer; gosterge:integer; code:integer; Begin code:=Open_Channel_Rec_File; if code=0 then Begin ch_max:=Get_Channel_Max_Value(adr,ch); ch_min:=Get_Channel_Min_Value(adr,ch); gosterge:=((ch_max-ch_min)*okunan) div 4096; Calculate:=gosterge; End Else Begin ShowMessage('Kanal kayıt dosyası açılamıyor. Ref:MainUnit.Calculate'); Exit; End; Close_Channel_Rec_File; End; Procedure TMainForm.refreshstatus; Var cap:string; Begin cap:=''; Case port of pnCOM1:cap:=cap+'COM1'; pnCOM2:cap:=cap+'COM2'; pnCOM3:cap:=cap+'COM3'; pnCOM4:cap:=cap+'COM4'; Else cap:=cap+'COMx'; End; Case baud of br1200:cap:=cap+'-1200'; br2400:cap:=cap+'-2400';
83
br4800:cap:=cap+'-4800'; br9600:cap:=cap+'-9600'; br14400:cap:=cap+'-14400'; br19200:cap:=cap+'-19200'; br38400:cap:=cap+'-34800'; br56000:cap:=cap+'-56000'; br57600:cap:=cap+'-57600'; br115200:cap:=cap+'-115200'; Else cap:=cap+'-bilinmiyor'; End; Case data of db5BITS:cap:=cap+'-5'; db6BITS:cap:=cap+'-6'; db7BITS:cap:=cap+'-7'; db8BITS:cap:=cap+'-8'; Else cap:=cap+'-x'; End; Case parity of ptNONE:cap:=cap+'-N'; ptODD:cap:=cap+'-O'; ptEVEN:cap:=cap+'-E'; ptMARK:cap:=cap+'-M'; ptSPACE:cap:=cap+'-S'; Else cap:=cap+'-x'; End; Case stop of sb1BITS:cap:=cap+'-1'; sb1HALFBITS:cap:=cap+'-1.5'; sb2BITS:cap:=cap+'-2'; Else cap:=cap+'-x'; End; Mainform.StatusBar1.Panels[3].Text:=cap; MainForm.statusBar1.Panels[1].Text:=DateToStr(Date); End; procedure Tmainform.FormCreate(Sender: TObject); Var code:byte; begin code:=open_comm_rec_file; if code<>0 then Begin showmessage('Seri haberleşme konfigrasyon dosyası bulunamadı.'+cr+ 'Yeni bir konfigrasyon dosyası açılacak.'); code:=create_comm_rec_file; if code<>0 then
84
Begin showmessage('Seri haberleşme için konfigrasyon dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olablir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_comm_rec_file; code:=open_card_rec_file; if code<>0 then Begin showmessage('Kart kayıt dosyası bulunamadı.'+cr+ ' Yeni bir kayıt dosyası oluşturulacak.'); code:=create_card_rec_file; if code<>0 then Begin showmessage('Kart kayıt dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olabilir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_card_rec_file; code:=open_channel_rec_file; if code<>0 then Begin showmessage('Kanal kayıt dosyası bulunamadı.'+cr+ ' Yeni bir kayıt dosyası oluşturulacak.'); code:=create_channel_rec_file; if code<>0 then Begin showmessage('Kanal kayıt dosyası oluşturulamıyor.'+cr+ ' Disk dolu veya yazmaya karşı korunmuş olabilir.'+cr+ 'Program burada sonlandırılacak.'); Halt; End; End; close_channel_rec_file; code:=open_comm_rec_file; if code=0 then Begin port:=get_comm_port; baud:=get_comm_baud; data:=get_comm_data; stop:=get_comm_stop; parity:=get_comm_parity;
85
hflow:=get_comm_hflow; sflow:=get_comm_sflow; pmode:=get_comm_pmode; End Else Begin ShowMessage('Seri iletişim konfigrasyon dosyası açılamadı. Varsayılan ayarlar yüklenecek.'); port:=pnCOM2; baud:=br9600; data:=db8BITS; stop:=sb1BITS; parity:=ptNONE; hflow:=hfRTSCTS; sflow:=sfNONE; pmode:=pmDiscard; End; close_comm_rec_file; winproses.checked:=true; kes.enabled:=false; Application.OnHint:=HintGoster; RefreshStatus; end; Procedure TMainForm.HintGoster(Sender:TObject); Begin StatusBar1.Panels[0].Text:=Application.Hint; End; procedure Tmainform.kayitdefteriClick(Sender: TObject); begin kayitform.Show; end; procedure Tmainform.cikClick(Sender: TObject); begin mainform.Close; end; procedure Tmainform.doseClick(Sender: TObject); begin tile; end; procedure Tmainform.basamaklaClick(Sender: TObject); begin Cascade; end; procedure Tmainform.kapatClick(Sender: TObject);
86
Var i:integer; begin for i:=MDIChildCount-1 downto 0 do MDIChildren[i].windowState:=wsMinimized; end; procedure Tmainform.winprosesClick(Sender: TObject); begin prosesform.WindowState:=wsNormal; winproses.Checked:=true; winalarm.checked:=false; winSistem.checked:=false; prosesform.show; end; procedure Tmainform.winalarmClick(Sender: TObject); begin alarmform.WindowState:=wsNormal; winproses.Checked:=false; winSistem.Checked:=false; winalarm.checked:=true; alarmform.show; end; procedure Tmainform.winSistemClick(Sender: TObject); begin SistemForm.WindowState:=wsNormal; winproses.Checked:=false; winalarm.checked:=false; winSistem.Checked:=true; Sistemform.show; end; procedure Tmainform.ayarClick(Sender: TObject); begin portform.show; end; procedure Tmainform.hakkindaClick(Sender: TObject); begin hakkform.show; end; procedure Tmainform.baglanClick(Sender: TObject); Var i:integer; code:integer; begin
87
kes.Enabled:=true; baglan.Enabled:=false; ayar.Enabled:=false; Total_Card_Ok:=0; Code:=Open_Card_Rec_File; if code=0 then Begin for i:=0 to 127 do Begin if get_card_status(i)=07 then Begin Cards[Total_Card_Ok]:=i; inc(Total_Card_Ok); End; End; End else Begin ShowMessage('Kart kayıt dosyası açılamıyor. Ref:MainUnit.BaglanClick'); Exit End; CommPOrtDriver.Port:=port; CommPOrtDriver.BaudRate:=baud; CommPOrtDriver.DataBits:=data; CommPOrtDriver.StopBits:=stop; CommPOrtDriver.Parity:=parity; CommPOrtDriver.HwFlow:=hflow; CommPOrtDriver.SwFlow:=sflow; CommPOrtDriver.PacketMode:=pmode; if (not CommPOrtDriver.Connect) then Begin ShowMessage('Belirtilen seri port açılamıyor. Bağlantı kurulamadı.'); kesclick(self); End; end; procedure Tmainform.kesClick(Sender: TObject); begin kes.Enabled:=false; baglan.Enabled:=true; ayar.Enabled:=true; CommPOrtDriver.Disconnect; end; procedure Tmainform.arabulClick(Sender: TObject); Var i:integer; found:boolean; bulunan:integer;
88
tocard:word; fromcard:word; fromcard_lo:byte; fromcard_hi:byte; begin CheckForm.Show; CheckForm.CheckMemo.Clear; CheckForm.CheckMemo.Lines.Add('Bulunan kartlar...'); ProsesForm.Timer1.Enabled:=False; Open_Card_Rec_File; bulunan:=0; if (not CommPortDriver.Connected) then baglanclick(self); for i:=0 to 127 do Begin CheckForm.Gauge1.Progress:=i; tocard:=encode_protokol(i,6,5); CheckForm.Label1.Caption:='Kartlar aranıyor: '+IntToStr(i)+'/127'; CommPortDriver.SendByte(Get_Low(tocard)); CommPortDriver.SendByte(Get_High(tocard)); found:=false; if CommPortDriver.ReadByte(fromcard_lo) then found:=true else found:=false; if CommPortDriver.ReadByte(fromcard_hi) then found:=true else found:=false;; fromcard:=get_word(fromcard_lo,fromcard_hi); if found then Begin inc(bulunan); CheckForm.CheckMemo.Lines.Add(IntToStr(bulunan)+'. kart bulundu. Kart adresi: '+ IntToStr(i)+' Kart cevabı: '+IntToStr(Get_Card_Response(fromcard))); Set_Card_Status(i,07); Cards[bulunan-1]:=i; Total_Card_Ok:=bulunan; End else Set_card_status(i,00); CheckForm.Refresh; End; Close_Card_Rec_File; CheckForm.Animate1.Active:=False; CheckForm.BitBtn1.Visible:=True; ProsesForm.Timer1.Enabled:=True; end; procedure Tmainform.FormClose(Sender: TObject; var Action: TCloseAction); begin if CommPOrtDriver.Connect then CommPOrtDriver.Disconnect; end; end.
89
EK2.2. BINARY ÜNİTESİNİN KAYNAK KODU
library binary; uses SysUtils, Classes; function exp_byte(var e:integer):integer; var r,i:integer; Begin if ((e<=7) and (e>=0)) then Begin r:=1; for i:=(e-1) downto 0 do r:=r*2; End Else r:=0; exp_byte:=r; End; function exp_word(var e:integer):integer; var r,i:integer; Begin if ((e<=15) and (e>=0)) then Begin r:=1; for i:=(e-1) downto 0 do r:=r*2; End Else r:=0; exp_word:=r; End; function IntToBoolean(var w:integer):boolean; Begin if w=0 then IntToBoolean:=False else IntToBoolean:=True; End; function read_byte_bit(var w:byte; bit:integer):boolean; export; var r:boolean; ri:integer; p:byte; Begin p:=exp_byte(bit);
90
ri:=w and p; r:=IntToBoolean(ri); read_byte_bit:=r; End; function read_byte_bit_to_int(var w:byte; bit:integer):integer; export; var ri:integer; p:byte; Begin p:=exp_byte(bit); ri:=w and p; read_byte_bit_to_int:=ri; End; function read_word_bit(var w:word; bit:integer):boolean; export; var r:boolean; ri:integer; p:word; Begin p:=exp_word(bit); ri:=w and p; r:=IntToBoolean(ri); read_word_bit:=r; End; function read_word_bit_to_int(var w:word; bit:integer):integer; export; var ri:integer; p:word; Begin p:=exp_word(bit); ri:=w and p; read_word_bit_to_int:=ri; End; function set_word_bit(var w:word; bit:integer):word; export; var r:word; p:word; Begin p:=exp_word(bit); r:=w or p; set_word_bit:=r; End;
91
function reset_word_bit(var w:word; bit:integer):word; export; var r:word; p:word; Begin p:=exp_word(bit); r:=w and (not p); reset_word_bit:=r; End; function set_byte_bit(var w:byte; bit:integer):byte; export; var r:byte; p:byte; Begin p:=exp_byte(bit); r:=w or p; set_byte_bit:=r; End; function reset_byte_bit(var w:byte; bit:integer):byte; export; var r:byte; p:byte; Begin p:=exp_byte(bit); r:=w and (not p); reset_byte_bit:=r; End; exports read_word_bit, read_word_bit_to_int, read_byte_bit, read_byte_bit_to_int, set_word_bit, reset_word_bit, set_byte_bit, reset_byte_bit; begin end.
92
EK2.3. FILEMAN ÜNİTESİNİN KAYNAK KODU
unit fileman; interface uses sysutils, dialogs, CPDrv; Const comm_rec_file_name='comm.dat'; card_rec_file_name='nameof.crd'; channel_rec_file_name='data.ch'; alarm_rec_file_name='alarmlog.dat'; Type Comm_Rec=Record port:TPortNumber; baud:TBaudRate; data:TDataBits; stop:TStopBits; parity:TParity; hflow:THwFlowControl; sflow:TSwFlowControl; pmode:TPacketMode; End; Card_Rec=Record card_no:byte; card_status:byte; zone_name:string[20]; End; Channel_rec=Record card_no:byte; channel_no:byte; name:string[15]; status:byte; priority_level:byte; max_value:integer; min_value:integer; max_limit:integer; min_limit:integer; unit_name:string[10]; End; Var comm_file:file of comm_rec; card_file:file of card_rec; channel_file:file of channel_rec; commrec:comm_rec;
93
cardrec:card_rec; channelrec:channel_rec; function create_comm_rec_file:integer; function create_card_rec_file:integer; function create_channel_rec_file:integer; function open_comm_rec_file:integer; function open_card_rec_file:integer; function open_channel_rec_file:integer; function close_comm_rec_file:integer; function close_card_rec_file:integer; function close_channel_rec_file:integer; function get_card_status(card_no:byte):byte; function get_card_zone_name(card_no:byte):string; function set_card_status(card_no,status:byte):byte; function set_card_zone_name(card_no:byte; zone_name:string):byte; function get_comm_port:TPortNumber; function get_comm_baud:TBaudRate; function get_comm_data:TDataBits; function get_comm_stop:TStopBits; function get_comm_parity:TParity; function get_comm_hflow:THwFlowControl; function get_comm_sflow:TSwFlowControl; function get_comm_pmode:TPacketMode; function get_channel_status(card_no,channel_no:byte):byte; function get_channel_name(card_no,channel_no:byte):string; function get_channel_priority_level(card_no,channel_no:byte):byte; function get_channel_max_value(card_no,channel_no:byte):integer; function get_channel_min_value(card_no,channel_no:byte):integer; function get_channel_max_limit(card_no,channel_no:byte):integer; function get_channel_min_limit(card_no,channel_no:byte):integer; function get_channel_unit_name(card_no,channel_no:byte):string; function set_comm_port(port:TPortNumber):integer; function set_comm_baud(baud:TBaudRate):integer; function set_comm_data(data:TDataBits):integer; function set_comm_stop(stop:TStopBits):integer; function set_comm_parity(parity:TParity):integer; function set_comm_hflow(hflow:THwFlowControl):integer; function set_comm_sflow(sflow:TSwFlowControl):integer; function set_comm_pmode(pmode:TPacketMode):integer; function set_channel_name(card_no,channel_no:byte; name:string):integer; function set_channel_status(card_no,channel_no:byte; status:byte):integer; function set_channel_priority_level(card_no,channel_no:byte; priority_level:byte ):integer; function set_channel_max_value(card_no,channel_no:byte; max_value:integer):integer; function set_channel_min_value(card_no,channel_no:byte; min_value:integer):integer; function set_channel_max_limit(card_no,channel_no:byte; max_limit:integer):integer; function set_channel_min_limit(card_no,channel_no:byte; min_limit:integer):integer; function set_channel_unit_name(card_no,channel_no:byte; unit_name:string):integer;
94
implementation function create_comm_rec_file:integer; Var code:integer; Begin create_comm_rec_file:=0; Assign(comm_file,comm_rec_file_name); $I- ReWrite(comm_file); code:=ioResult; if code<>0 then create_comm_rec_file:=code else Begin commrec.port:=pnCOM2; commrec.baud:=br9600; commrec.data:=db7bits; commrec.stop:=sb1bits; commrec.parity:=ptEVEN; commrec.hflow:=hfNONE; commrec.sflow:=sfNONE; commrec.pmode:=pmDiscard; seek(comm_file,0); write(comm_file,commrec); close(comm_file); End; $I+ End; function create_card_rec_file:integer; Var i:integer; code:integer; Begin create_card_rec_file:=0; Assign(card_file,card_rec_file_name); $I- ReWrite(card_file); code:=ioResult; if code<>0 then create_card_rec_file:=code else Begin for i:=0 to 127 do Begin seek(card_file,i); cardrec.card_no:=i; cardrec.card_status:=0; cardrec.zone_name:='Kart no : '+IntToStr(i); write(card_file,cardrec); End; close(card_file);
95
End; $I+ End; function create_channel_rec_file:integer; var i,j:integer; code:integer; Begin create_channel_rec_file:=0; Assign(channel_file,channel_rec_file_name); $I- ReWrite(channel_file); code:=ioresult; if code<>0 then create_channel_rec_file:=code else Begin for i:=0 to 127 do Begin for j:=0 to 7 do Begin seek(channel_file,filesize(channel_file)); channelrec.card_no:=i; channelrec.channel_no:=j; channelrec.name:='Kanal no : '+IntToStr(j); channelrec.status:=00; channelrec.priority_level:=50; channelrec.max_value:=100; channelrec.min_value:=0; channelrec.max_limit:=90; channelrec.min_limit:=10; channelrec.unit_name:='Birimsiz'; write(channel_file,channelrec); End; End; close(channel_file); End; $I+ End; function open_comm_rec_file:integer; Begin Assign(comm_file,comm_rec_file_name); $I- Reset(comm_file); open_comm_rec_file:=ioResult; $I+ End; function open_card_rec_file:integer; Begin
96
Assign(card_file,card_rec_file_name); $I- Reset(card_file); open_card_rec_file:=ioResult; $I+ End; function open_channel_rec_file:integer; Begin Assign(channel_file,channel_rec_file_name); $I- reset(channel_file); open_channel_rec_file:=ioResult; $I+ End; function close_comm_rec_file:integer; Begin $I- close(comm_file); close_comm_rec_file:=ioResult; $I+ End; function close_card_rec_file:integer; Begin $I- close(card_file); close_card_rec_file:=ioResult; $I+ End; function close_channel_rec_file:integer; Begin $I- close(channel_file); close_channel_rec_file:=ioResult; $I+ End; function get_comm_port:TPortNumber; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_port:=commrec.port; End else get_comm_port:=pnCOM2; $I+
97
End; function get_comm_baud:TBaudRate; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_baud:=commrec.baud; End else Begin ShowMessage('Baudrate değeri okunamadı'); get_comm_baud:=br9600; End; $I+ End; function get_comm_data:TDataBits; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_data:=commrec.data; End else Begin ShowMessage('Data değeri okunamadı'); get_comm_data:=db7BITS; end; $I+ End; function get_comm_stop:TStopBits; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin
98
seek(comm_file,0); read(comm_file,commrec); get_comm_stop:=commrec.stop; End else Begin ShowMessage('Stop değeri okunamadı'); get_comm_stop:=sb1BITS; End; $I+ End; function get_comm_parity:TParity; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_parity:=commrec.parity; End else Begin ShowMessage('Parity değeri okunamadı'); get_comm_parity:=ptEVEN; End; $I+ End; function get_comm_hflow:THwFlowControl; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_hflow:=commrec.hflow; End else Begin ShowMessage('Hardware Flow okunamadı'); get_comm_hflow:=hfNONE; End; $I+
99
End; function get_comm_sflow:TSwFlowControl; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_sflow:=commrec.sflow; End else Begin ShowMessage('Software okunamadı'); get_comm_sflow:=sfNONE; End; $I+ End; function get_comm_pmode:TPacketMode; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); get_comm_pmode:=commrec.pmode; End else Begin ShowMessage('Pmode okunamadı'); get_comm_pmode:=pmDiscard; End; $I+ End; function get_card_status(card_no:byte):byte; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then
100
Begin read(card_file,cardrec); get_card_status:=cardrec.card_status; End else get_card_status:=255; $I+ End; function get_card_zone_name(card_no:byte):string; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin read(card_file,cardrec); get_card_zone_name:=cardrec.zone_name; End else get_card_zone_name:='!! Failed !!'; $I+ End; function set_comm_port(port:TPortNumber):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.port:=port; seek(comm_file,0); write(comm_file,commrec); set_comm_port:=0; End else set_comm_port:=255; $I+ End; function set_comm_baud(baud:TBaudRate):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin
101
seek(comm_file,0); read(comm_file,commrec); commrec.baud:=baud; seek(comm_file,0); write(comm_file,commrec); set_comm_baud:=0; End else set_comm_baud:=255; $I+ End; function set_comm_data(data:TDataBits):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.data:=data; seek(comm_file,0); write(comm_file,commrec); set_comm_data:=0; End else set_comm_data:=255; $I+ End; function set_comm_stop(stop:TStopBits):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.stop:=stop; seek(comm_file,0); write(comm_file,commrec); set_comm_stop:=0; End else set_comm_stop:=255; $I+ End;
102
function set_comm_parity(parity:TParity):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.parity:=parity; seek(comm_file,0); write(comm_file,commrec); set_comm_parity:=0; End else set_comm_parity:=255; $I+ End; function set_comm_hflow(hflow:THwFlowControl):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.hflow:=hflow; seek(comm_file,0); write(comm_file,commrec); set_comm_hflow:=0; End else set_comm_hflow:=255; $I+ End; function set_comm_sflow(sflow:TSwFlowControl):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.sflow:=sflow; seek(comm_file,0);
103
write(comm_file,commrec); set_comm_sflow:=0; End else set_comm_sflow:=255; $I+ End; function set_comm_pmode(pmode:TPacketMode):integer; Var code:integer; Begin $I- seek(comm_file,0); code:=ioresult; if code=0 then Begin seek(comm_file,0); read(comm_file,commrec); commrec.pmode:=pmode; seek(comm_file,0); write(comm_file,commrec); set_comm_pmode:=0; End else set_comm_pmode:=255; $I+ End; function set_card_status(card_no,status:byte):byte; Var code:integer; Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin seek(card_file,card_no); read(card_file,cardrec); cardrec.card_status:=status; seek(card_file,card_no); write(card_file,cardrec); set_card_status:=0; End else set_card_status:=255; $I+ End; function set_card_zone_name(card_no:byte; zone_name:string):byte; Var code:integer;
104
Begin $I- seek(card_file,card_no); code:=ioresult; if code=0 then Begin seek(card_file,card_no); read(card_file,cardrec); cardrec.zone_name:=zone_name; seek(card_file,card_no); write(card_file,cardrec); set_card_zone_name:=0; End else set_card_zone_name:=code; $I+ End; function get_channel_status(card_no,channel_no:byte):byte; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_status:=channelrec.status; End else get_channel_status:=255; $I+ End; function get_channel_name(card_no,channel_no:byte):string; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_name:=channelrec.name; End else get_channel_name:='!! Hata !!'; $I+ End;
105
function get_channel_priority_level(card_no,channel_no:byte):byte; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_priority_level:=channelrec.priority_level; End else get_channel_priority_level:=255; $I+ End; function get_channel_max_value(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_max_value:=channelrec.max_value; End else get_channel_max_value:=(-1); $I+ End; function get_channel_min_value(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_min_value:=channelrec.min_value; End else get_channel_min_value:=(-1); $I+ End;
106
function get_channel_max_limit(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_max_limit:=channelrec.max_limit; End else get_channel_max_limit:=(-1); $I+ End; function get_channel_min_limit(card_no,channel_no:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_min_limit:=channelrec.min_limit; End else get_channel_min_limit:=(-1); $I+ End; function get_channel_unit_name(card_no,channel_no:byte):string; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin read(channel_file,channelrec); get_channel_unit_name:=channelrec.unit_name; End else get_channel_unit_name:='!! Hata !!';
107
$I+ End; function set_channel_name(card_no,channel_no:byte; name:string):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.name:=name; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_name:=code; $I+ End; function set_channel_status(card_no,channel_no:byte; status:byte):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.status:=status; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_status:=code; $I+ End; function set_channel_priority_level(card_no,channel_no:byte; priority_level:byte ):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no;
108
$I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.priority_level:=priority_level; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_priority_level:=code; $I+ End; function set_channel_max_value(card_no,channel_no:byte; max_value:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.max_value:=max_value; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_max_value:=code; $I+ End; function set_channel_min_value(card_no,channel_no:byte; min_value:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.min_value:=min_value; seek(channel_file,i); write(channel_file,channelrec); End;
109
set_channel_min_value:=code; $I+ End; function set_channel_max_limit(card_no,channel_no:byte; max_limit:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.max_limit:=max_limit; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_max_limit:=code; $I+ End; function set_channel_min_limit(card_no,channel_no:byte; min_limit:integer):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no; $I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.min_limit:=min_limit; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_min_limit:=code; $I+ End; function set_channel_unit_name(card_no,channel_no:byte; unit_name:string):integer; Var i:integer; code:integer; Begin i:=card_no*8+channel_no;
110
$I- seek(channel_file,i); code:=ioresult; if code=0 then Begin seek(channel_file,i); read(channel_file,channelrec); channelrec.unit_name:=unit_name; seek(channel_file,i); write(channel_file,channelrec); End; set_channel_unit_name:=code; $I+ End; end.
111
EK 2.4. AICPRO ÜNİTESİNİN KAYNAK KODLARI
library aicpro; uses SysUtils,Classes,binary; const cm_reset=0; cm_report=1; cm_read=2; cm_write=3; cm_reserve1=4; cm_reserve2=5; cm_reserve3=6; cm_reserve4=7; ch0=0; ch1=1; ch2=2; ch3=3; ch4=4; ch5=5; ch6=6; ch7=7; Var outgoing:Array[0..15] of boolean; incoming:Array[0..15] of boolean; procedure clear_outgoing; var i:integer; Begin for i:=15 downto 0 do outgoing[i]:=false; End; procedure word_to_incoming(w:word); var i:integer; Begin for i:=15 downto 0 do if read_word_bit(w,i) then incoming[i]:=true else incoming[i]:=false; End; function out_to_word:word; var
112
i:integer; r:word; Begin r:=0; for i:=0 to 15 do Begin if outgoing[i] then r:=set_word_bit(r,i) else r:=reset_word_bit(r,i); End; out_to_word:=r; End; function encode_protokol(ca,cm,ch:integer):word; export; var i:integer; t_ca:byte; t_cm:byte; t_ch:byte; r:word; Begin if ((ca<=255) and (ca>=0)) then t_ca:=ca else t_ca:=0; if ((cm<=7) and (cm>=0)) then t_cm:=cm else t_cm:=0; if ((ch<=7) and (cm>=0)) then t_ch:=ch else t_ch:=0; clear_outgoing; for i:=0 to 7 do outgoing[i]:=read_byte_bit(t_ca,i); i:=8; outgoing[i]:=false; for i:=9 to 11 do outgoing[i]:=read_byte_bit(t_cm,(i-9)); i:=12; outgoing[i]:=false; for i:=13 to 15 do outgoing[i]:=read_byte_bit(t_ch,(i-13)); r:=out_to_word; encode_protokol:=r; End; function get_low(w:word):byte; export; Var r:byte; Begin r:=w mod 256; get_low:=r; End; function get_high(w:word):byte; export; Var r:byte; Begin r:=w div 256; get_high:=r; End;
113
function get_word(high,low:byte):word; export; Var r:word; Begin r:=high*256+low; get_word:=r; End; function get_card_response(w:word):integer; export; var i:integer; r:word; Begin r:=0; word_to_incoming(w); for i:=15 downto 12 do if incoming[i] then r:=set_word_bit(r,(i-12)) else r:=reset_word_bit(r,(i-12)); get_card_response:=r; End; function get_card_data(w:word):integer; export; var i:integer; r:word; Begin r:=0; word_to_incoming(w); for i:=11 downto 0 do if incoming[i] then r:=set_word_bit(r,i) else r:=reset_word_bit(r,i); get_card_data:=r; End; exports encode_protokol, get_high, get_low, get_word, get_card_response, get_card_data; begin end.
114
KAYNAKLAR
[1] “Microchip”,<http://www.microchip.com/MCU’s>,Erişim tarihi : 01.03.2000
[2] < http://www.ti.com >, Erişim tarihi: 03.03.2000
[3] < http://www.maxim-ic.com >, Erişim tarihi: 12.04.2000
[4] MAXIM, “New Releases Data Book”, Volume III, 1994.
[5] MICROCHIP, “Embedded Control Handbook”, Volume I.
[6] MICROCHIP, “Technical Library CDROM”, First Edition, 1997.
[7] YANIK,M., “Delphi 3 ile Görsel Programlama”, Beta, 1.Basım, İstanbul, 1998.
[8] RUA,P., ÖZTÜRK,Ö., “PC’nin sırları – Kesmeler ve Düşük Seviyeli
Fonksiyonlar”, Sistem Yayıncılık, 1. Basım, İstanbul, 1995.
[9] NOLTHINGK, B.E., ”Cihaz Teknolojisi 4”, M.E.B., Etam A.Ş, Eskişehir, 1994.
[10] MORSE,M.J., ”Mikroişlemci Tabanlı Sistemler V”, M.E.B., Evren Ofset,
Ankara, 1994.
[11] KILLEN, H.B.,”Modern Elektronik İletişim Teknikleri”, M.E.B., Milli Eğitim
Basımevi, Ankara, 1997.
[12] TOMASI,W., ”Elektronik İletişim Teknikleri”, M.E.B., Milli Eğitim Basımevi,
2. Basılış, İstanbul, 1997.
[13] MARSHALLSOFT COMPUTING, INC., ” Windows Standart Serial Comm.
Lib. for Delphi.2.3”, MarshallSoft, 1998
115
ÖZGEÇMİŞLER
Muhammed Ozan AKI
1977 yılında Siegen / Almanya’da doğdu. 1984 yılında kesin dönüş yaptığı,
memleketi olan Tekirdağ / Malkara’da İlkokulu ve Ortaokulu bitirdi. 1992 yılında
başladığı Malkara Hüsniye Hanım Teknik Lisesi’ndeki öğrenimini 1996 yılında okul
birinciliği derecesi ile bitirdi. Aynı yıl girdiği ÖYS sınavında Marmara Üniversitesi
teknik Eğitim Fakültesi Elektrik Eğitimi Bölümünü kazandı. Dört yıl süren öğrenim
süreci sonunda bu bölümden mezun oldu.
Ercan UYGUN
1977’de Gaziantep’te doğdu. İlk ve orta öğrenimini sırasıyla Şehit Kamil
İlkokulu ve Gazi Ortaokulunda yaptıktan sonra 1991 yılında lise öğrenimini yapmak
için Gaziantep M.R.Uzel Endüstrü Meslek Lisesi Elektrik Bölümüne kayıt yaptırdı.
1996 yılında girdiği üniversite sınavlarında Marmara Üniversitesi Teknik Eğitim
Fakültesi Elektrik Eğitimi Bölümünü kazandı.