Forum: Projekte & Code LM 75 mit VB ansprechen


von Jürgen (Gast)


Lesenswert?

Hallo,
ich habe an der COM-Schnittstelle einen RS232-I²C-Treiber (MAX 232
CPE).
Am I²C hängt ein LM 75 für die Temperaturmessung. Soweit so gut.
Nun meine Frage: wie spreche ich den LM 75 nun an, bzw. wie kann ich
nun die Temperatur ermitteln? Da ich viel mit Visual Basic 6 arbeite,
wäre es schön, wenn mir jemand einen Beispielquelltext für VB geben
könnte.
Ich habe leider keine Idee, wie das funktioniert...

Schöne Grüsse Jürgen

von Ralf W. (Gast)


Lesenswert?

Hallo,

Code unten habe ich hier gefunden:

http://www.horter.de/i2c/i2c-beispiele/beisp_cpp_1.html

Dort wird aber die port.dll benutzt(Burkhard Kainka).Ich hab
den mal noch schnell für VB übersetzt(Sharpdevelop). Das ist aber
für VB.Net. Aber unter VB6 sollte es ähnlich aussehen. Die DLL
Einbindung weglassen und die speziellen Funktionen aus der DLL
mit denen der MSComm.ocx ersetzen.
Oder du lädst dir die Port.dll hier:

http://www.b-kainka.de/schnfaq.htm
Ganz unten auf der Seite ist ein Link zum Download.

Referenz zu Port.dll  (da stehen auch die Beispiele zum Einbinden mit
VB)
http://www.b-kainka.de/referenz.txt

Dann kannst du die DLL wieder einbinden Frag mich aber nicht wie
das unter VB6 genau geht. Aber vielleicht findest du was auf den
Seiten von Burkhard.

Hier noch zwei andere Links:

Bei I2C mit PC
http://www.umnicom.de/Elektronik/Schaltungssammlung/Schaltungssammlung.html

ganz einfache Hardware ohne den Max:
http://www.hans-dampf.org/index.php?page=i2c/seriell.php&expand=1

Hier jetzt der Code:
<c>
'
'* Created by SharpDevelop.
'* User: VeithC
'* Date: 04.10.2005
'* Time: 08:31
'*
'* To change this template use Tools | Options | Coding | Edit
Standard Headers.
'
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Namespace I2C
  ''' <summary>
  ''' Make Connection between Port.dll and MainForm.
  ''' </summary>
  Public Class i2c_connection
    <DllImport("port.dll")> _
    Private Shared Function OPENCOM(ByVal A As String) As Boolean
    End Function
    <DllImport("port.dll")> _
    Private Shared Sub CLOSECOM()
    End Sub
    <DllImport("port.dll")> _
    Private Shared Sub DTR(ByVal B As Integer)
    End Sub
    <DllImport("port.dll")> _
    Private Shared Sub RTS(ByVal B As Integer)
    End Sub
    <DllImport("port.dll")> _
    Private Shared Function CTS() As Boolean
    End Function
    <DllImport("port.dll")> _
    Private Shared Function DSR() As Boolean
    End Function
    Public Sub New()
    End Sub
    Public Function I2C_Open(ByVal Port As String) As Boolean
      Try
        OPENCOM(Port + ":1200,n,8,1")
        Return True
      Catch ex As Exception
        MessageBox.Show("Com-Port " + Port + " nicht vorhanden" +
ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Hand,
MessageBoxDefaultButton.Button1)
        Return False
      End Try
    End Function
    Public Sub I2C_Close()
      CLOSECOM()
    End Sub
    ' I2C Taktleitung an RTS Leitung der RS-232 schalten
    Public Sub SCL(ByVal i As Integer)
      RTS(i)
    End Sub
    ' I2C Datenleitung an DTR Leitung der RS-232 schalten
    Public Sub SDA(ByVal i As Integer)
      DTR(i)
    End Sub
    ' Rücklesen der SDA-Leitung am DSR der RS-232
    Public Function SDA_in() As Boolean
      If DSR() Then
        Return True
      Else
        Return False
      End If
    End Function
    ' Auslesen des INT am CTS der RS-232
    Public Function I2C_INT() As Boolean
      If CTS() Then
        Return True
      Else
        Return False
      End If
    End Function
    ' Initialisieren des I2C Busses SDA=High, SCL = High
    Public Function I2C_Init() As Boolean
      SDA(1)
      SCL(1)
      Return SDA_in()
    End Function
    ' Start der I2C Übertragung. Erst SDA dann SCL Low
    Public Sub I2C_Start()
      SDA(0)
      SCL(0)
    End Sub
    ' Stoppen der I2C Übertragung durch SDA dann SCL High
    Public Sub I2C_Stop()
      SDA(1)
      SCL(1)
    End Sub
    ' Acknowledge -> Byte wurde empfangen weiter Daten senden
    Public Sub I2C_Ack()
      SDA(0)
      SCL(1)
      SCL(0)
    End Sub
    ' No Ack -> Byte empfangen - Nichts senden
    Public Sub I2C_NoAck()
      SDA(1)
      SCL(1)
      SCL(0)
    End Sub
    ' Slave adressieren
    Public Function I2C_Slave(ByVal Addr As Byte) As Boolean
      Dim BytePos As Byte = 128
      For count As Integer = 0 To 7
        ' Die 8 Bits der Slaveadresse werden nacheinander auf
        ' die SDA-Leitung gelegt und
        ' jeweils mit einem Impuls auf der SCL-Leitung bestätigt.
        ' nach dem Stop-Befehl quittiert der Slave den Empfang der Daten
        If (Addr And BytePos) = 0 Then
          SDA(0)
        Else
          SDA(1)
        End If
        SCL(1)
        SCL(0)
        BytePos /= 2
      Next
      ' SDA auf High Pegel setzen. Slave zieht auf Masse
      SDA(1)
      ' 9. Impuls
      SCL(1)
      ' Der Slave antwortet darauf mit neg. Flanke an SDA
      If SDA_in() Then
        SCL(0)
        Throw New Exception("Kein Slave mit Addr. " + Addr + "
vorhanden.")
      Else
        SCL(0)
        Return True
      End If
    End Function
    ' Werte von Slave auslesen
    ' Master sendet dazu 8 Impulse auf SCL und erhält high <
    ' und low Pegel auf SDA.
    Public Function I2C_in() As Byte
      Dim BytePos As Byte = 128
      Dim Wert As Byte = 0
      SDA(1)
      For count As Integer = 0 To 7
        SCL(1)
        If SDA_in() Then
          Wert += BytePos
        End If
        SCL(0)
        BytePos /= 2
      Next
      Return Wert
    End Function
    ' Wert zu Slave senden
    Public Function I2C_Out(ByVal Wert As Byte) As Boolean
      ' Die Datenbits werden nacheinander auf SDA gelegt <
      ' und mit SCL bestätigt
      ' nach dem neunten Impuls quittierung durch Slave
      Dim BytePos As Byte = 128
      For count As Integer = 0 To 7
        If (Wert And BytePos) = 0 Then
          SDA(0)
        Else
          SDA(1)
        End If
        SCL(1)
        SCL(0)
        BytePos /= 2
      Next
      SDA(1)
      SCL(1)
      ' Slave antwortet mit neg. Flanke auf Daten
      If SDA_in() Then
        SCL(0)
        Throw New Exception("Kein Ack von Slave")
      Else
        SCL(0)
        Return True
      End If
    End Function
  End Class
End Namespace
<\c>

von Ralf W. (Gast)


Lesenswert?

nochmal der Code ein wenig besser zu lesen
<c>
'
'* Created by SharpDevelop.
'* User: VeithC
'* Date: 04.10.2005
'* Time: 08:31
'*
'* To change this template use Tools | Options | Coding | Edit
Standard Headers.
'
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Namespace I2C
  ''' <summary>
  ''' Make Connection between Port.dll and MainForm.
  ''' </summary>
  Public Class i2c_connection
    <DllImport("port.dll")> _
    Private Shared Function OPENCOM(ByVal A As String) As Boolean
    End Function
    <DllImport("port.dll")> _
    Private Shared Sub CLOSECOM()
    End Sub
    <DllImport("port.dll")> _
    Private Shared Sub DTR(ByVal B As Integer)
    End Sub
    <DllImport("port.dll")> _
    Private Shared Sub RTS(ByVal B As Integer)
    End Sub
    <DllImport("port.dll")> _
    Private Shared Function CTS() As Boolean
    End Function
    <DllImport("port.dll")> _
    Private Shared Function DSR() As Boolean
    End Function

    Public Sub New()
    End Sub

    Public Function I2C_Open(ByVal Port As String) As Boolean
      Try
        OPENCOM(Port + ":1200,n,8,1")
        Return True
      Catch ex As Exception
        MessageBox.Show("Com-Port " + Port + " nicht vorhanden" +
ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Hand,
MessageBoxDefaultButton.Button1)
        Return False
      End Try
    End Function

    Public Sub I2C_Close()
      CLOSECOM()
    End Sub

    ' I2C Taktleitung an RTS Leitung der RS-232 schalten
    Public Sub SCL(ByVal i As Integer)
      RTS(i)
    End Sub

    ' I2C Datenleitung an DTR Leitung der RS-232 schalten
    Public Sub SDA(ByVal i As Integer)
      DTR(i)
    End Sub

    ' Rücklesen der SDA-Leitung am DSR der RS-232
    Public Function SDA_in() As Boolean
      If DSR() Then
        Return True
      Else
        Return False
      End If
    End Function

    ' Auslesen des INT am CTS der RS-232
    Public Function I2C_INT() As Boolean
      If CTS() Then
        Return True
      Else
        Return False
      End If
    End Function

    ' Initialisieren des I2C Busses SDA=High, SCL = High
    Public Function I2C_Init() As Boolean
      SDA(1)
      SCL(1)
      Return SDA_in()
    End Function

    ' Start der I2C Übertragung. Erst SDA dann SCL Low
    Public Sub I2C_Start()
      SDA(0)
      SCL(0)
    End Sub

    ' Stoppen der I2C Übertragung durch SDA dann SCL High
    Public Sub I2C_Stop()
      SDA(1)
      SCL(1)
    End Sub

    ' Acknowledge -> Byte wurde empfangen weiter Daten senden
    Public Sub I2C_Ack()
      SDA(0)
      SCL(1)
      SCL(0)
    End Sub

    ' No Ack -> Byte empfangen - Nichts senden
    Public Sub I2C_NoAck()
      SDA(1)
      SCL(1)
      SCL(0)
    End Sub

    ' Slave adressieren
    Public Function I2C_Slave(ByVal Addr As Byte) As Boolean
      Dim BytePos As Byte = 128
      For count As Integer = 0 To 7
        ' Die 8 Bits der Slaveadresse werden nacheinander auf
        ' die SDA-Leitung gelegt und
        ' jeweils mit einem Impuls auf der SCL-Leitung bestätigt.
        ' nach dem Stop-Befehl quittiert der Slave den Empfang der Daten
        If (Addr And BytePos) = 0 Then
          SDA(0)
        Else
          SDA(1)
        End If
        SCL(1)
        SCL(0)
        BytePos /= 2
      Next
      ' SDA auf High Pegel setzen. Slave zieht auf Masse
      SDA(1)
      ' 9. Impuls
      SCL(1)
      ' Der Slave antwortet darauf mit neg. Flanke an SDA
      If SDA_in() Then
        SCL(0)
        Throw New Exception("Kein Slave mit Addr. " + Addr + "
vorhanden.")
      Else
        SCL(0)
        Return True
      End If
    End Function

    ' Werte von Slave auslesen
    ' Master sendet dazu 8 Impulse auf SCL und erhält high <
    ' und low Pegel auf SDA.
    Public Function I2C_in() As Byte
      Dim BytePos As Byte = 128
      Dim Wert As Byte = 0
      SDA(1)
      For count As Integer = 0 To 7
        SCL(1)
        If SDA_in() Then
          Wert += BytePos
        End If
        SCL(0)
        BytePos /= 2
      Next
      Return Wert
    End Function

    ' Wert zu Slave senden
    Public Function I2C_Out(ByVal Wert As Byte) As Boolean
      ' Die Datenbits werden nacheinander auf SDA gelegt <
      ' und mit SCL bestätigt
      ' nach dem neunten Impuls quittierung durch Slave
      Dim BytePos As Byte = 128
      For count As Integer = 0 To 7
        If (Wert And BytePos) = 0 Then
          SDA(0)
        Else
          SDA(1)
        End If
        SCL(1)
        SCL(0)
        BytePos /= 2
      Next
      SDA(1)
      SCL(1)
      ' Slave antwortet mit neg. Flanke auf Daten
      If SDA_in() Then
        SCL(0)
        Throw New Exception("Kein Ack von Slave")
      Else
        SCL(0)
        Return True
      End If
    End Function

  End Class
End Namespace

</c>

von Jürgen (Gast)


Lesenswert?

Dafür auf jeden Fall schonmal vielen Dank! Also Ansprechen kann ich die
Schnittstelle jetzt immerhin schonmal. Wenn ich am I2C-Bus messe,
kommen dort auch die passenden Signale an.
Das Problem ist aber nun, dass der LM 75 irgendwie nicht antworten
will. Wenn ich die Adresse sende, müsste ja der Temperaturwert zurück
kommen, richtig? Das einzige was da aber raus kommt ist 0. Woran könnte
das liegen? hat da jemand ne Idee?

von Chris (Gast)


Lesenswert?

Hallo,

wenn's auch am Parallelport sein darf, schau mal auf unserer Homepage
unter www.hobbyelektronik.org vorbei.

Vielleicht gibt's auch mal ne Implementierung für die COM-Ports...

Viele Grüße

Chris

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.