VB6 da paralel port interruptını nasıl yakalarız?
Rotary encoder okumak istiyorum,
Merhaba.
Fi tarihinde benzer bir şey yapmıştık, kodu bulursam buraya atarım.
Ama bir hatırlatmada bulunmak istiyorum.
Ecoder okumak için bilgisayar pek sağlıklı br sonuç vermiyor. Veri kayıpları oluşuyor işletim sistemi sebebi ile.
Eğer encoder ile PC arasına bir devre yapabilirseniz (PIC, PLC vs.) çok daha sağlıklı sonuçlar alırsınız.
Aksi durumda PC den aldığınız veriler sizi yanıltabilir. (en azından bizde olan oydu) :)
arada işletim sistemi varken interruptları kullanabilmek zor iş. bunun yerine event oluşturup bunları takip etmek gerekiyor...
Rotary encoder düşük çözünürlüklü ise mümkün görünüyor,
Çözünürlükle yakından alakası olsada yavaş sistemler gene sorun çıkartır.
Encoderi döndüren mekanizmanın hareketinin durduğu noktada encoder çizgilerinin tam optik göz önünde pozisyonlandığı durumu varsayın.
Mekanizmadaki ufak titreşimler encoder milini de titreştirir ve optik disk bir ileri bir geri titreşir. Bu olay, kontaklardaki bounce olayına benzer. Bu durumda pozisyonun max +/-1 hata ile takip edilebilmesi gerekir. Encoderı okuyan lojik ve/veya yazılım hızlı ise bu hiç sorun olmaz fakat yavaşsa o zaman hata alıp başını gider. Çünkü ileri ve geri yöndeki hızlı değişen palslerin bir kısmı kaçırılır ve sanki encoder dönüyormuş gibi algılanır.
Command1.Caption = "Açık"
Else
Command1.Caption = "Kapalı"
End If
End Sub
Private Sub Command2_Click()
sayi = sayi - 1
Out &H378, sayi
Label1.Caption = sayi
End Sub
Private Sub Command3_Click()
sayi = 0
Label1.Caption = sayi
End Sub
Private Sub Form_Load()
Label1.Caption = sayi
End Sub
Private Sub Timer1_Timer()
If Command1.Caption = "Açık" Then
sayi = sayi + 1
Timer1.Interval = 50
Out &H378, sayi
Label1.Caption = sayi
If sayi = 255 Then
sayi = 0
End If
End If
End Sub
bu kodu bi incele. butonun biri sayıyı yükseltiyor, diğeri düşürüyor. biraz değişiklikle işini görür.
mesaj birleştirme:: 12 Şubat 2013, 20:20:03
Public Class Form1
Dim sayi As Integer
Dim toplam As Integer
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)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Button1.Text = "kapalı" Then
sayi = 1
Button1.Text = "açık"
Else
Button1.Text = "kapalı"
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Out(&H378, sayi)
sayi = 0
Label1.Text = sayi
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Button2.Text = "kapalı" Then
Button2.Text = "açık"
Else
Button2.Text = "kapalı"
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Button2.Text = "açık" Then
Out(&H378, sayi)
sayi = sayi >> 1
If sayi = 0 Then
sayi = 8
End If
Label1.Text = sayi
End If
'-------------------------------------------
If Button1.Text = "açık" Then
Out(&H378, sayi)
sayi = sayi << 1
If sayi = 16 Then
sayi = 1
End If
Label1.Text = sayi
End If
'-------------------------------------
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
step motor için yazmıştım bu kodu deneme amaçlı. studio 2010 kullanarak
yazdığınız kodun içinde interrupt göremiyorum??
step motor için bu kod. rotary encoder için değil. ona bakmam lazım. bulduğumda atarım buraya.
hocam bilgisayarı incelerken şu kodları buldum belki işine yarar io.ocx nesnesi ile çalışıyor.
Private Sub Timer2_Timer()
Dim Read As Boolean
Dim Status As Integer
Status = IO1.In(&H379)
Control = IO1.In(&H37A)
If Status And &H8 Then
Read = True
Else
Read = False
End If
End Sub
Private Sub Timer1_Timer()
If Read = True Then
Dim darray(1) As Byte
res = IO1.ReadBytes(darray, 1)
res = darray(0)
res = darray(1)
'IO1.SetTimeOut (1) 'in ms
'IO1.Wait (1) ' 1 ms
End If
End Sub
Hocam Şurayı bir inceleyiniz.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68664&lngWId=1 (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68664&lngWId=1)
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=14194&lngWId=1 (http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=14194&lngWId=1)