Makale Özeti

Bu yazıda VB. Net ile Paralel Port Kontrolünün nasıl yapıldığını öğreneceğiz...

Makale

» VB. Net ile Paralel Port Kontrolü - I

Dikkat: Bu makalede bulunan örnek kodları uygulamanız için giriş seviyesinde elektronik bilgisine ihtiyacınız vardır. Makalede anlatılan örnek kodlar uygulanmış ve başarılı sonuçlar alınmıştır, herhangi bir sebepten dolayı bilgisayarınız arızalanırsa sorumluluk kabul edilmez!

  Bilgisayar programlamayla ilgenen birçok kişinin hayalleri arasındadır bilgisayarla dışarıdan bir birimi kontrol etmek.. Herhangi bir birim yani sizin hayal gücünüze kalmış. Lambayı yakın, televizyonu çalışırın, buzdolabını veya kombiyi açıp ısısını ayarlayın.. Tamamen hayal gücünüze (ve birazcıkta elektronik bilginize) kalmış. Bu makalede giriş seviyesinde örneklemelerle anlatmaya çalışacağım yinede örnekler ile ilgili sorunlarınız olursa lütfen omerduzyol@infinity-soft.com adresine mail atın.

  Paralel port anakartın üzerinde sabit olarak gelen(eskiden I/O kartlar kullanılarak bu ihtiyaç gideriliyordu..) genelde çok hızlı veri transfer ihtiyacı duyulmayan uygulamalar için kullanılan dış birimlerin kullanımı ve kontrolü amacıyla tasarlanmış bir giriş - çıkış portudur. Paralel port 25 Pin D tipi konnektöre sahip 8 bit Input/Output mode, 4 Bit Output mode ve 5 bit de Input mode çalışan 3 adet register a sahiptir. Bu registerlar BIOS aracılığıyla ayarlanabilir(default olarak 0x378, 0x37A ve 0x379) ve Data Latch, Control, Status registerı olmak üzere isimlendirilirler.

  Bu port mimarisinde kullanılan entegrelerin iç yapısından dolayı çıkış seviyesi olarak standart TTL (Transistor Transistor Logic) seviyesinde yani teorik olarak max. +5V kabul edilir. Bilindiği gibi paralel port logic olarak ve adından da anlaşıldığı gibi 8 bitlik veri setleri kullanarak paralel olarak çalışır. Paralel portun "Logic 1"(High) kabul ettiği seviye 2,4V~5V arasındadır, "Logic 0"(Low) kabul ettiği seviye ise 0V~0,8V arasındadır. Anlatımda Logic 0 için Low, Logic 1 için High veya tam tersi ifadeler kullanabiliriz..

  Biz bu makaledeki örneklerde veya anlatımlarda(giriş seviyesinde olduğundan) yalnızca Data Latch registerını kullanacağız. Bu registerın adresi default olarak 0x378 dir. Data Latch registerına yazılan bilgiler bir yenisi yazılana kadar registerda tutulur ve istenilen anda tekrar tekrar okunabilir. Bu register diğer registerlar gibi 8 Bitlik veri setinden oluşur.

Örneğin:

Decimal Binary
0 00000000
1 00000001
3 00000011
6 00000110
7 00000111
8 00001000
11 00001011
12 00001100
... ..
32 00100000
128 01000000
135 01000111
254 11111110
255 11111111
  Yani örnekte gösterildiği gibi register a göndereceğiniz data decimal formatında olmalıdır. Paralel portun data latch registerinin çıkış bitleri D0,D1,D2,D3,D4,D5,D6,D7 etiketleriyle isimlendirilir ve sıralama sağdan sola doğrudur. D0 ~ D7 I/O bitleri pin numaraları olarak 2 ~ 9 a karşılık gelir.

D0 1
D1 1
D2 0
D3 0
D4 0
D5 0
D6 0
D7 0
  Örneğin binary 00000011 sayısı decimal 3 e karşılık gelir ve register a yazıldığında, soldaki şekilde sıralanır.   Bu durumda paralel portun 2. ve 3. pini high gerisi D7 ye kadar(yani 9 pine kadar) low olur. Low yani şase   potansiyelindedir. Böylece D2~D7 çıkışlarına bağlanacak yükler çalışmaz.

    Portun çıkışlarını nasıl kullanacağımıza gelince, data latch registerinin I/O bitlerine birer tane 330 ohm direnç   ve dirençlere seri olarakta birer adet led (Light Emitting Diode) bağlayacağız.

    Aşağıdaki devre şemasında belirtilen basit devreyi kurun ve bilgisayarınızın paralel portuna bağlayın. Daha   sonra programlamaya geçeceğiz.. Yük olarak bu devremizde LED seçtik. Eğer led yerine daha fazla akım çekecek bir yük bağlarsanız yada DC değil AC gerilimde çalışacak bir yük bağlarsanız bilgisayarınıza ciddi hasarlar verebilirsiniz!

 

  Devrede kullanılan seri dirençler akım sınırlaması içindir. 330 ohmluk seri dirençler ile +5V luk kaynak gerilimi ledler üzeriden 15mA akım geçişini sağlar. Ledlerin görünür şekilde parlaklığı için ortalama 10mA~25mA akım geçişi sağlanmalıdır. Yani burada kaynak bilgisayarın dahili güç kaynağıdır ve güç tüketimi bilgisayar üzerinden yapılmaktadır.

  Devreyi kurarken pinlerin kısa devre etmemesine özen gösteriniz. Devreyi pertinax üzerine veya bread board üzerine kurabilirsiniz. Devrenin tam eleman listesi aşağıda belirtilmiştir.

   -  8 x 330 ohm direnç,
   -  8 x Led (tercihen kırmızı),
   -  D tipi 25 Erkek Konnektör

  O kadar elektronik bilgilerine boğulduk ki nerdeyse programlama makalesi olduğunu unutacaktım :)

  Evet, Quick Basic kullananlar bilirler eskiden registerları kullanmak için qbasicte Out komutu vardı. Visual Basic 6 da bu destek yok ve extra API dlller yardımı ile yapılıyordu. Logix4u takımımın geliştirdiği Inpout32.dll apisi qbasicte kullandığımız komutların birebir aynısı..(apiyi kullananlar bilirler) Bizde aynı API dllin Windows XP ve W2K uyumlu olanını kullanacağız. Aslında kernel32.dll içerisinde ReadFile ve WriteFile APIleri bu iş için de kullanılabiliyor ama ben tam olarak nasıl register adresi verildiğini anlayamadığım için yine eski yöntemlere kaldık.. ;)


Büyük boyutu için tıklayınız.

  Bilgisayarınızın C:\Windows\System32 klasörü altına www.logix4u.net adresindeki inpout32.dll dosyasının en güncel versiyonunu kopyalayın ve yeni bir VB.Net Windows Application açın. Projenizdeki Class içerisine aşağıdaki API tanımlamalarını ekleyin.

Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

  Tanımlamaları ekledikten sonra forma 2 adet Button ve 1 adet TextBox ekleyin. Butonların birincisi registera textBoxa yazılan veriyi gönderecek, diğeri ise Data Latch registerını temizleyecek. Yukarıda porta gönderilecek verinin decimal formatında olması gerektiğinden bahsetmiştik. Aşağıda binaryi decimale ve decimal i binarye çeviren basit birer fonksiyon bulunmakta isterseniz bunlarıda classınız içerisine ekleyip programınızı daha esnek hale getirebilirsiniz.

Private Function Bin2Dec(ByVal Bin As String) As Long
   Dim i As Long, lngLen As Long
   If Len(Bin) > 8 Then Exit Function
   lngLen = Len(Bin)

   For i = lngLen To 1 Step -1
      Bin2Dec = Bin2Dec + IIf(Mid$(Bin, i, 1) = "1", 2 ^ (lngLen - i), 0)
   Next i
End Function


Private Function Dec2Bin(ByVal Dez) As String
   Dim X%
   Dim binData, tempBin As String

   If Dez >= 2 ^ 8 Then Exit Function
   Do
      If
(Dez And 2 ^ X) Then
         tempBin = "1" & tempBin
      Else
         tempBin = "0" & tempBin
      End If
      X = X + 1
   Loop Until 2 ^ X > Dez

   binData = "00000000" & tempBin
   Dec2Bin = Mid(binData, Len(tempBin) + 1, Len(binData) - Len(tempBin))
End Function

  Şimdi birinci buttonun click eventine Out(&H378,Bin2Dec(TextBox1.Text)) yazın. Böylece yazılan binary datayı decimale çevirip registera gönderecektir. Burada &H378 hex formatında adres bilgisidir ve yukarıda bahsettiğimiz Data Latch registerının adresidir.
Not: Default olarak register adresi bu şekildedir eğer programınız bu satırda hata verirse veya devredeki ledlerden hiçbirisi yanmaz ise register adresi farklı demektir. Bilgisayarınızın bios ayarlarından bu register adresini değiştirebilirsiniz.

  Forma eklediğiniz ikinci butonun click eventine de Out(&H378, 0) yazın. Bu satırda bildiğiniz gibi registerı sıfır yapar ve ledlerin tümü söner. TextBox a 11111111 yazıp butona bastığınızda ledlerin tümü yanar. Yine textboxa 10101010 yazdığınızda ledler birer atlayarak yanacaktır. Data Latch register ına yazılan datayı okumak için;

MessageBox.Show(Dec2Bin(Inp(&H378)))

komutunu kullanabilirsiniz. Sadece basit bir şekilde registerdaki bilgiyi okur ve decimalden binary e çevirip ekranda gösterir. Sonraki makalelerde bu şekilde okunan bilgiyi parse edip yorumlama yapacağız.

  Bundan sonrası sizin hayal gücünüze kalmış isterseniz timer kullanarak ledleri karaşimşek olarak yaktırın, ister timerla sıralı olarak yaktırın, yada dışarıda kullanmak üzere Clock Pulse üretin.Clock pulse üretmek için en basit yöntem üretmek istediğiniz frekansın T süresini hesaplayın ve timer interval olarak T yi verin.

  Bugünlükte bu kadar, şuanda saat 23:52 ve ben yarın sabah erkenden okula gitmek için yollarda olucam.. :) erken yatmalıydım :) Hemen linkte örnek vb.net projesinin kodlarını veriyorum isteyen varsa inceleyip baksın. Bu yazının bir sonrakinde paralel port kullanarak ışık veya ısı sensör uygulamaları yapacağız. Umarım anlatmaya çalıştıklarımla sizlere yardımcı olabilmişimdir. İyi çalışmalar dileğiyle.

     Ömer DÜZYOL

   Infinity Software
Developing Solutions

http://www.infinity-soft.com/

Not : Bu makale ve ilgili örnekler ile bilgisayarınız bir zarar görürse bundan Infinity Software ve Ömer Düzyol sorumlu tutulamaz. Bu makale eğitim amacı ile yazılmış ve yayınlanmıştır.