Eylul Forum

Would you like to react to this message? Create an account in a few clicks or log in to continue.

    C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü

    kskumut
    kskumut
    Ultra Üye
    Ultra Üye


    Mesaj Sayısı : 67
    Kayıt tarihi : 02/08/08


    Başarı Puanı:
    C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_le10200/2987C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_ba10  (200/2987)
    Seviye:
    C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_le10113/2557C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_ba10  (113/2557)
    Güçlülük:
    C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_le1079/2319C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Img_ba10  (79/2319)

    C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü Empty C# ile Paralel Port Üzerinden Elektronik Devre Kontrolü

    Mesaj tarafından kskumut Cuma Ağus. 22 2008, 22:05

    C# kullanarak, bilgisayarınızın paralel portu’na bağladığınız kendinizin yaptığınız bir elektronik devreyi kontrol etmek çoğunuza heyecan verecektir. Bu elektronik devre çok değişik amaçlarla kullanılmak istenmiş olabilir;örneğin bir motor kontrol devresi, bazı led’leri yakıp söndürmeye yarayan bir devre veya bazı sezicilerden bilgi toplayıp, bilgisayara besleyip, buna göre bilgisayarın bazı cihazları kapatma veya açma eylemlerinde bulunmasını istediğimiz bir devre olabilir. Veya daha da heyecan verici şey; evinizdeki bilgisayarınıza bağlı bir cihazı (örneğin bir kahve makinesiniveya balıklarınızı yemleyen bir düzeneği) internet üzerinden, bulunduğunuz mekandan(burası Sahra çölü de olabilir, eskimoları ziyarete gittiğiniz kutuplarda bir yer de) , yeter ki internet bağlantınısı kurabileceğiniz bir yer olsun(Hey CELL-O!; kutuplarda var mısınız? ) kontrol etmek olsa gerek. İleriki bölümlerde bir ASP.NET sayfası üzerinden böyle bir şeyi gerçekleştireceğiz. Yeterince heyecan verici buldunuzsa okumaya devam edin!..
    PARALEL PORT:

    Kontrol kartımızı takacağımız port bu port olacaktır. Centronics port’u da denilen bu port, endüstriyel bir standart olup, USB portlarından önce yazıcılar için kullanılan temel bir porttu. Bir bilgisayarda en azından bir adet böyle bir port bulunmaktadır. Port, bilgisayarla gelmekte olup, ya bilgisayarın ana kartı üzerinde, ya da sonradan eklenebilen I/O kartlarıyla bize sunulmaktadır. Bir bilgisayarda birden fazla böyle portlar bulunabilir. Bunların adları LPT1,LPT2..., diye gidecektir.

    Bilgisayaraınızdaki portların adreslerini Control Panel>System>Hardware>Device Manager>Ports>LPT1 ‘den kolaylıkla öğrenebilirsiniz. Eğer bir adet port varsa, adresi büyük olasılıkla 0x378’dir(Hexadesimal biçemde). Bu değer, portun temel-adresini tanımlamaktadır.

    DONANIM:

    Bu bölümde, denemelerimde kullandığım , paralel porta takılacak devrenin şemasını vereceğim. Bu devreyi bir breadboard üzerinde kurmanız zor olmayacaktır.Yok eğer, “ben daha derli toplu olmayı ve ileriki projeleri de düşünüyorum”, diyorsanız ve de kartın baskı devre ve elemanlardan oluşan kitini bütün halinde elde etmek isterseniz , benimle temas kurabilirsiniz.

    Gelin önce, paralel porta bir göz atalım.Nasıl bu port kontrol amaçları için kullanılabilir, onu inceleyelim ve daha sonra da devremize göz atalım.

    Şemada(Şekil1.1) gösterildiği gibi, bir paralel port üç gruptan oluşur.

    1)Data grubu:

    8 kanalı bulunan bu grup üzerinden bağlı devremize sinyal gönderebiliriz. Bu grup 8bitlik bir CPU port adresine karşılık gelir. Yani bu grubun adresi, ilgili paralel portun temel adresi neyse odur.

    2)Kontrol grubu:

    Bu grubun kanallarının amacı da bağlı cihaz veya devrelere kontrol sinyali yollamaktır. Bu grupta 4 adet sürgülü çıktı kanalları( -STROBE,-LF/CR,-SLN ve –INITILAIZE) bulunur. Bu grubun kontrolu ilgili CPU portunun temel adresi+2 adresinden yapılır. STROBE,LF/CR ve SLIN yolları mantıksal olarak tersine dönüktür(inverted). Halbuki, INITIALIZE böyle değildir. Yani dışarıya bir yüksek sinyal göndermek istersek, dönük olan kanallara düşük sinyal koymalıyız.
    3)Status grubu

    Bu grup portumuza bağlı devrelerden, bilgisayarımıza bilgi girişinin yapılabileceği kanalları barındırır.Bu grupta 5 kanal vardır. (-ERROR,SLCT,PE,-ACK, ve BUSY) diye..ve dışarıdan içeriye doğru yönlendirilmişlerdir. Gelen bilgiler ilgili CPU portuna

    beslenir ve bu portun adresi temeladres+1’dir.Bu adresin içeriğini okuyarak , gelen sinyalleri toplayıp değerlendirebiliriz.BUSY kanalı terslenmiştir, fakat diğerleri değil.
    KARTIMIZIN ŞEMASI
    Şimdi bu bilgiler ışığında , kullanacağımız devrenin şemasına bir göz atalım.

    Bu kart, bilgisayarımız ve kontrol veya bilgi toplamaya yarayacak sezici devrelerimiz arasında ara yüz görevi görecektir.Kartımızda her bir girdi veya çıktı hattının mantıksal değerini göstermek için LED’ler bulunmaktadır. Bu LED’ler acalığıyla programımıza yaptırdığımız I/O işlemlerini takip edebileceğiz, kolaylıkla..

    Kartımızdaki her bir I/O hattına kolaylıkla bağlantı yapabilmek için vidalı klemens bulunmaktadır. Bilgisayarımıza giren hatlar ise, Schmitt trigger tampon tümleşik devreleri aracılığıyla tamponlanmışlardır.

    Devremiz, 8-15V’lık bir düzeltilmemiş doğru akım güç kaynağından beslenebilir.Kart üzerinde bunu düzelten ve istenen düzeye getiren bir 7805 +5V 1A ve ek elemanlardan oluşan voltaj düzenleme devresi de bulunmaktadır. Kaynağımızdan çekilecek akımın düzeyini sınırlamak için bir adet 1A’lik sigorta da bulunmaktadır.
    Paralel portumuzun DB0-DB7 ‘den oluşan Data port’u 74LS244 Schmitt trigger tampon devresi(IC2) ninin girdi kanallarına 8 adet 100ohm’luk dirençler aracılığıyla beslenmektedir. Tampon devreninin çıktı kanalları ise vidalı klemense getirilmiştir.Her bir hat aynı zamanda düşük akımlı bir LED’e 3.3Kohm’luk direnç üzerinden bağlanmıştır. Ne zaman ki, hattımızı mantıksal yüksek yaptık, ilgili hattın LED’i yanacaktır. Kontrol portunun 4 hattı da Data port’ta olduğu gibi tamponlanıp, klemense getirilmiştir.

    Status portu’nun girdi işlemleri için kullanıldığından bahsetmiştik, yukarıda. Dolayısıyla, vidalı klemensten gelen girdi sinyalleri, bu defa yine bir Schmitt trigger tarafından karşılanır. Bu devrenin çıktı kanalları ise Status portuna beslenir. Portlardan sağlanabilecek akım oldukça düşük olduğu için, küçük ledler kullanılmıştır.

    YAZILIM:

    Devremizi kontrol etmek için, şimdiye kadarki söylediklerimizden de anlaşılacağı üzere bazı adreslere bilgi göndermek, bazılarından ise bilgi okumak gerekmektedir. Bu işlemleri C# veya VB.NET’de doğrudan bazı komutlarla yapmamız olası değil. Bunlarda böyle olanaklar yok. O zaman biz de başka bir dilde yazılmış DLL(Dynamic Data Library)’ler kullanarak bu işin üstesinden geleceğiz.

    Dolayısıyla biz burada, bu eksikliği kapatacak , C++ diliyle yazılmış bir DLL kullanacağız. Çünkü C/C++’da doğrudan belirli port adreslerine veri koymak ve oralardan veri okumak için komutlar bulunmaktadır. Bunu kendimizin yazmasına da gerek yok. Zaten halihazırda bu işi oldukça iyi yapan ve her türden Windows’la (95/98, 2000,XP) uyumlu, Inpout32.dll (http://www.logix4u.net bir dll dosyası kullanacağız. Bu “dll”’i ParalelPortApp2.zip dosyamızın içersinde de bulabilirsiniz.

    Devre detaylarımızı bu şekilde verdikten sonra şimdi, yukarıda bahsettiğimiz dll hakkında biraz bilgi verelim. Bu dll dosyasında bizim için önemli olan iki adet metot bulunmaktadır.

    1) Inp(int adress) metodu . Bu metodla belirli bir adresten bilgi okuruz.

    2) Out32(int adres,int veri) Bu metod da belirli bir adrese bilgi göndermeye yarar.

    Diyelim ki, bizim okumak istediğimiz paralel portun temel adresi 0x378’dir. Bu durumda Status portunun adresi 0x378+2 yani, 0x380 olacaktır. Bu adresten , int data=Inp32(0x380) diyerek status portundaki bilgiyi okuyabiliriz. Şimdi asıl programımıza geçelim. Önce bu hazır aldığımız Inpout32.dll’i nasıl kendi programımıza ekleyeceğiz onu görelim. Bu dll dosyasını indirdikten sonra , bilgisayarınızın C:\Windows\System32 dizinine kopyalayın. Sonra, bir C# Windows Form uygulaması açın. Projede yeni bir sınıf dosyası ekleyin. Adına InpOut.cs diyelim.

    Burada , .NET Framework’ün System.Runtime.Interopservices sınıfından yaralanarak, DLL’deki istediğimiz metodları çekeceğiz.
    Henüz kartımızı takmadan bir deneme yapalım isterseniz. Formumuzun üzerine bir adet “button” ve iki tane de textBox sürükleyelim. Burada yapacağımız şey, TextBox1’in içerisine yazacağımız, hexadesimal bir sayıyı paralel portumuzun Dataport kısmına yazdırmak, sonra da bu yazdığımız değeri oradan geri okuyup, TextBox2’ye yazmak olacaktır. Kısacası, Data port’a değer göndereceğiz, gönderdiğimiz değeri oradan tekrar okuyacağız;bu arada hem Out32(int address,int data) hem de Inp32(int address) metodlarını kullanmış olacağız.Data portuna koyduğumuz değer, ikili sistemde: 01000111, hexadesimal(67) , onlu olarak da 103 dür. Programımız, kutuya hexadesimal rakam koymaya uygun olarak düzenlenmiştir. Aslında, metotlarımız yazılan ve okunulan değerleri tam rakam(integer) veya hexadesimal biçemli(0x67) gibi kabul etmektedir. Hexadesimal rakam versek bile o, içeride bunu tam rakama çevirir. Inp32() metodundan okuduğumuz değer ise devamlı onlu tam rakamdır. Biz bunu basit bir işlemle tekrar hexadesimal’a çevirip , TextBox2 kutusuna yazdırıyoruz. Hexadesimal’a çevirme nedenimiz, kafamızda hangi bit’lerin 0, hangilerinin 1 olduğunun daha iyi canlanması içindir.Örneğin, desimal 123 dediğimizde aslında 01111011 demekteyiz. Hexadesimal sitemde bu 7B’dir. “B” harfinden dolayı sağdaki 4 bitten, 2.bit dışındakilerin 1 olduğu kolaylıkla anlışılır. 7’nin çözümü ise hiç zor değildir. Halbuki, 123 dendiğinde bundan hangi bitlerin yüksek, hangilerinin düşük seviyede olduğunu çıkarmak ancak biraz hesaptan sonra olabilir.

    İkinci programımız daha detaylı olup, hem Data ve Control Portuna bütün bir değer yazıp, aynı anda tüm bitleri kontrol etmek, hem de her bir bit’in ayrı ayrı açılıp-kapanmasını sağlamaya olanak verecek şekilde tasarlanmıştır.

    Bu programda ayrıca girdi kanalı olarak kullanılan Status Portunu bir zamanlayıcı kontrolüne(Timer) bağlı olarak tarayıp, bu portun durumunu form üzerindeki “CheckBox” kontrollerine aktaran bir metot da bulunmaktadır.

    Birinci olarak, control veya data port grubuna toptan değer göndermeye yarayan “Data Kelimesi yazma” groupBox’una bir göz atalım. Burada, kutulara girilecek değer hexadesimal olmalı. İlgili düğme tıklandığında , içeride program bu değeri (örneğin FF) normal byte değerine çevirip, öylece ilgili porta yazmaktadır.

    Programda , ana form üzerine Data ve Control Portunun herbir kanalı için ayrı bir düğme sürükleyip, bırakma ve bunların herbirinin “Click” olayı içine ilgili veri değerini girmek oldukça kolay , fakat bir o kadar da hamallık gerektiren bir şeydir. Biz , burada bunun yerine ButtonArray diye bir Collection sınıfı oluşturduk. Bu ButtonArray sınıfının her bir elemanı NewButton diye , kendisi de Button kontrol sınıfından türemiş bir elemandan oluşmaktadır. Bu NewButton kontrol nesnesinin normal Button nesnesinden tek farkı, fazladan “status” diye bir boolean değişken içermesidir. Bu değişken, düğmenin açık mı, kapalı mı olduğunu belleyerek, düğmeye basıldığında, açıksa kapanmasını(beyaz renge dönüş), kapalıysa açılmasını(kırmızı renge dönüş) sağlamaktadır. Yani, sadece görsellik açısından, işimize yaramaktadır, bu değişken.

    ButtonArray sınıfının AddNewButtonC()(control port grubu için) ve AddnewButtonD()(data port grubu için) metotlarını kullanarak, program çalışmaya başladığında , gerekli sayıda düğmeler ilgili groupBox kutusu içerisinde otomatik olarak oluşturulmaktadır. Her bir düğmenin “Tag” özelliğine düğme yaratılırken sayı numarası atandığından , düğmelerden birisi tıklandığında bunun hangi düğme olduğu kolaylıkla anlaşılabilmektedir. Böylece, her bir düğme için bir “EventHandler” yazmak yerine, iki ayrı grup için birer “EventHandler” yazabilmekteyiz. Hangi düğmeye basıldığı , “Handler” metodu içerisinde “Tag” özelliği kontrol edilerek bulunur.

      Similar topics

      -

      Forum Saati Paz Mayıs 19 2024, 15:50