I2C und PCF8591

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
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

I2C und PCF8591

Post by Prefekt »

Hallo,

um vier analoge Spannungen mit dem IOW24 zu messen habe ich einen PCF8591 eingesetzt. Das funktioniert recht gut, bis auf die Tatsache, das der 3. Kanal immer 0 ausgibt. Die Analoge Spannung liegt an dem 3 Eingang an, also eine Verbindung zu einem anderen Kanal kann ich ausschließen.

Hier mal der Quellcode:

Code: Select all

 Dim i As Integer
        Dim Ret As Integer
        Dim Report(8) As Byte

        For i = 0 To 8
            Report(i) = &H0S
        Next

        ' if found activate IIC
        If iowHandles(iowHandel_ID) <> 0 Then
            'IIC activate
            Report(0) = &H1S
            Report(1) = &H1S
            Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

            ' start meassuring
            Report(0) = &H2S  ' ReportID IIC write request
            Report(1) = &HC2S ' 2 bytes with IIC Start and Stop
            Report(2) = &H90S ' PCF8591 address byte = ADR 0, write
            Report(3) = &H4S  ' setzt im PCF 8591 das Flag Autoincrement auf true
            Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)

            'start reading
            For i = 0 To 3
                Report(0) = &H3S  ' ReportID IIC read request
                Report(1) = &H1S ' 2 bytes with IIC Start and Stop
                Report(2) = &H91S ' PCF8591 address byte = ADR 0, read
                Report(3) = &H0S
                Ret = IowKitWrite(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                Report(0) = &H3S  ' ReportID IIC read request
                Report(1) = &H1S ' 2 bytes with IIC Start and Stop
                Report(2) = &H0S
                Report(3) = &H0S
                Ret = IowKitReadNonBlocking(iowHandles(iowHandel_ID), IOW_PIPE_SPECIAL_MODE, Report(0), 8)
                retValue(i) = Report(2)
            Next
        End If
Ich befasse mich das erste mal mit dem I2C Bus. Wenn ich das richtig verstanden habe, sende ich erst mal eine Read oder Write Anweisung im ersten Byte. Dann eine IIC Start Stop. Wobei &HC2 wohl start und &H1 wohl stop ist oder?
Dann folgt das Adressbyte und anschließend das Control Byte für den PCF8591, richtig?

Nur warum wird der 3 Kanal nicht angezeigt?

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

Re: I2C und PCF8591

Post by Christoph Jung »

Zum Lesen von I2C muss man erst schreiben und dann lesen. Danz wichtig ist, dass man nicht IowKitReadNonBlocking nimmt, da es vorkommen kann das die Antwort später kommt als man erwartet und somit nur Müll rauskommt weil IowKitReadNonBlocking schneller zurückkommt. Einfach IowKitRead nutzen um diese Fehlerquelle auszuschließen (TIPP).

Aber an sich schaut der Code oben korrekt aus. Warum der 3. Kanal nur 0 anzeigt kann, da kann ich leider nicht helfen. Evtl ist die Auslesestrategie falsch oder es wird von der Falschen Adresse gelesen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Prefekt
Posts: 23
Joined: Wed Mar 19, 2008 6:15 pm

Re: I2C und PCF8591

Post by Prefekt »

Hallo,
das mit dem Read Befehl werde ich testen.

Auslesestrategie? Was genau verstehe ich darunter?

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

Re: I2C und PCF8591

Post by Christoph Jung »

Unter Auslesestrategie versteht man die Reihenfolge oder die Art des Auslesens.
Man kann z.B. bei einigen I2C-Chips das Startregister angeben und von da an X Bytes lesen und das dann verarbeiten.
Oder man geht jedes Register einzeln durch.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply