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