IOW24 I2C Fehler

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
fr_a_nk
Posts: 6
Joined: Tue Jul 15, 2014 6:54 pm

IOW24 I2C Fehler

Post by fr_a_nk »

Hallo,

ich habe mit dem IOW24 Starterkit eine I2C Testanwendung bestehend aus 2x LM75, 1x RTC DS1307, 2x Portexpander PCA9555 und einem 7 Segment Treiber SAA1064 realisiert. Programmiert wurde das ganze zu Testzwecken jeweils mit VBA/VB6 und VB.Net. Orientiert habe ich mich an dem SDK und an dem Buch „Messen, Steuern und Regeln mit USB und C#“.
Über einen Timer gesteuert lese ich im Sekundentakt die Uhrzeit aus der RTC und die Temperaturen aus den jeweiligen LM75 aus und zeige die Uhrzeit und einen Temperaturwert auf einem LCD und den zweiten Temperaturwert auf einer 7 Segment Anzeige an. Funktioniert auch im Prinzip.

Nur nach einer undefinierbaren Zeitspanne liest der IOW24 aus den Registern der RTC und der LM75 die Werte 0 aus. Extrem häufig tritt dieser Effekt auf wenn der PC auf das Internet zugreift, entweder wenn ich Webseiten mit dem IE8 aufrufe oder der PC automatisch Updates runterläd. Ich muss den IOW24 erst schließen und wieder öffnen. Danach funktioniert es wieder bis zum nächsten Ausfall. Von alleine fängt sich der IOW24 nicht wieder.

Was ich bisher herausgefunden habe ist, dass im Fehlerfall eine falsche ReportID im Quittierungsbyte 0 zurückgegeben wird. Nämlich die Werte 3 für Write und 2 für Read. Das wurde mit zwei verschiedenen PCs, Privat und Firma, getestet und mit identischem Ergebnis. Da der Testaufbau zweimal vorhanden ist habe ich die RTC- und Temperaturmodule untereinander ausgetauscht was keinen Unterschied ausmachte. Nur der IOW24 war immer derselbe. Das Betriebsystem auf beiden PCs ist Win XP Professional SP3 (der Fehler trat auch schon vor April 2014 auf). Die Umgebungstemperaturen waren zwischen 20°C und 30°C.

Hat schon mal jemand anderes dies Phänomen beobachtet und kann mir weiterhelfen?
Ich will nicht ausschließen dass mein Code fehlerhaft ist, deswegen hänge ich die meiner Meinung nach entscheidenden Auszüge aus meinem VB6 Programm dran.

Vielen Dank schon mal.

Code: Select all

Private I2C_Data_Write(7) As Byte
Private I2C_Data_Read(7) As Byte    

____________________________________________________________________________________

Function LM75_GetTemp(ByVal DeviceAddress As Byte) As Double

Dim MSB As Byte
Dim LSB As Byte

I2C_Data_Write(0) = IOW_I2C_WRITE_REPORTID
I2C_Data_Write(1) = &H82
I2C_Data_Write(2) = DeviceAddress
I2C_Data_Write(3) = &H0
I2C_Data_Write(4) = &H0
I2C_Data_Write(5) = &H0
I2C_Data_Write(6) = &H0
I2C_Data_Write(7) = &H0

If IOW_I2C_WriteBytes(I2C_Data_Write()) = True Then
    I2C_Data_Write(0) = IOW_I2C_READ_REPORTID
    I2C_Data_Write(1) = &H2
    I2C_Data_Write(2) = DeviceAddress + 1
    
    Call IOW_I2C_ReadBytes(I2C_Data_Write(), I2C_Data_Read())
    
    MSB = I2C_Data_Read(2)
    LSB = I2C_Data_Read(3)   

    'Hier erfolgt die Temperaturumrechnung
 
End If
Call Clear_I2C_Buffer

End Function

_____________________________________________________________________________________

Private Function IOW_I2C_WriteBytes(ByRef WriteData() As Byte) As Boolean

If IowKitWrite(IOW_Handle, IOW_PIPE_SPECIAL_MODE, WriteData(0), 8) = 8 Then
    If IowKitRead(IOW_Handle, IOW_PIPE_SPECIAL_MODE, I2C_Data_Read(0), 8) = 8 Then
        If I2C_Data_Read(0) = IOW_I2C_WRITE_REPORTID Then
            If (I2C_Data_Read(1) And &H80) = &H80 Then
                IOW_I2C_WriteBytes = False
            Else
                IOW_I2C_WriteBytes = True
            End If
        Else
            Else
            Debug.Print "ReportID von Write ist falsch, Sollwert 2, Istwert  " & Hex(I2C_Data_Read(0))
            IOW_I2C_WriteBytes = False        
        End If
    Else
        IOW_I2C_WriteBytes = False
    End If
Else
    IOW_I2C_WriteBytes = False
End If

End Function

_____________________________________________________________________________________

Private Sub IOW_I2C_ReadBytes(ByRef WriteData() As Byte, ByRef ReadData() As Byte)

On Error GoTo I2C_Error

If IowKitWrite(IOW_Handle, IOW_PIPE_SPECIAL_MODE, WriteData(0), 8) = 8 Then
    If IowKitRead(IOW_Handle, IOW_PIPE_SPECIAL_MODE, ReadData(0), 8) = 8 Then
        If ReadData(0) = IOW_I2C_READ_REPORTID Then
            If (ReadData(1) And &H80) <> 0 Then
                GoTo I2C_Error
            End If
        Else
            Debug.Print "ReportID von Read ist falsch, Sollwert  3, Istwert  " & Hex(ReadData(0))          
            GoTo I2C_Error
        End If
    Else
        GoTo I2C_Error
    End If
End If

Exit Sub

I2C_Error:
Call I2C_Stop
Call Clear_I2C_Buffer

End Sub

_____________________________________________________________________________________

Private Sub Clear_I2C_Buffer()

Dim i As Integer

For i = 0 To 7
    I2C_Data_Write(i) = 0
    I2C_Data_Read(i) = 0
Next i

End Sub
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW24 I2C Fehler

Post by Christoph Jung »

Bisher ist mir so ein Verhalten nicht bekannt.
Ich habe diverse langzeit Aufbauten betrieben und keine Abbrüche oder sonstige Fehler dieser Art festgestellt.

Was mich am meisten verwundert ist der Zusammenhang mit dem IE8 / Internet, da das nichts mit USB oder der gleichen zu tun hat.
Es ist schon ein paar mal auf leistungsschwachen Rechner vorgekommen, dass bei extremer CPU-Last das Programm, das den IO-Warrior anspricht nicht mehr korrekt arbeitet. Aber das liegt dann an der Software, die dann die Windows-Nachrichtenloop nicht mehr richtige verarbeitet wird. Und das die Timer-Funktion eine Solche Nachricht ist könnte es daher rühren. Windows kritische Nachrichten haben immer vorrang.

Das wenn Windowsupdates durchgeführt werden evtl. die IO-Warrior aussteigen liegt meist daran, dass Windows neu Treiber bezieht. Da haben wir leider keinen Einfluss drauf.

Was mir am Code aufgefallen ist, ist das die Arrays Write und Read mit 7 initialisiert werden, aber nachher 8 Positionen haben.
Bin mir aber nicht sicher ob das bei VB so sein soll. Ist nicht so mein Steckenpferd :(
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
fr_a_nk
Posts: 6
Joined: Tue Jul 15, 2014 6:54 pm

Re: IOW24 I2C Fehler

Post by fr_a_nk »

Hallo Herr Jung,
vielen Dank für ihre Antwort. Ich werde in der nächsten Zeit mal weiter versuchen ob ich noch etwas herausbekommen und das Programm stabil zum laufen kriege. Privat sowie in der Firma ist sowieso ein PC Generationswechsel geplant und evtl. erledigt sich das Problem danach von selber. Sollte ich weitere Erkenntnisse erlangen werde ich das hier mitteilen.

In VB ist es möglich die Größe eines Arrays zu initialisieren indem man in der Klammer den größten vorkommenden Index angibt. Array(7) hat demnach 8 Member Array(0)...Array(7). Hatte ich zu Anfang auch immer falsch gemacht gerade weil es in C++ oder C# anders behandelt wird.


Viele Grüße
fr_a_nk
Posts: 6
Joined: Tue Jul 15, 2014 6:54 pm

Re: IOW24 I2C Fehler

Post by fr_a_nk »

Wie vorher schon mal angekündigt hier die neusten Erkenntnisse.

Es lag tatsächlich an meinem alten XP Rechner. Seit einigen Tagen habe ich jetzt einen WIN 8.1 64bit
Rechner und nachdem ich hier im Forum herausgefunden habe wohin nun welche iowkit.dll Version
kopiert werden muß läuft es mit VBA und VB.net problemlos.

Viele Grüße
Post Reply