Visual Basic 6 da lpt interrupt

Başlatan esensoy, 23 Şubat 2012, 09:29:48

esensoy

VB6 da paralel port interruptını nasıl yakalarız?
Rotary encoder okumak istiyorum,
En tehlikeli an "zafer" anıdır.

ZZombie

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) :)

OptimusPrime

arada işletim sistemi varken interruptları kullanabilmek zor iş. bunun yerine event oluşturup bunları takip etmek gerekiyor...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Erol YILMAZ

Rotary encoder düşük çözünürlüklü ise mümkün görünüyor,

z

Çö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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

isikyasar

#5
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

esensoy

yazdığınız kodun içinde interrupt göremiyorum??
En tehlikeli an "zafer" anıdır.

isikyasar

step motor için bu kod. rotary encoder için değil. ona bakmam lazım. bulduğumda atarım buraya.

computerboy

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