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
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>
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>
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.