'Programmbeispiel für den I2C-Koppler
Declare Function OPENCOM Lib "Port.dll" (ByVal A$) As Integer
Declare Sub CLOSECOM Lib "Port.dll" ()
Declare Sub DTR Lib "Port.dll" (ByVal b%)
Declare Sub RTS Lib "Port.dll" (ByVal b%)
Declare Function CTS Lib "Port.dll" () As Integer
Declare Function DSR Lib "Port.dll" () As Integer
Declare Sub DELAY Lib "Port.dll" (ByVal b%)
Public Function SCL(i) As Boolean
Option Explicit
Private Sub Command_OpenCom_Click()
If Command_OpenCom.Caption = "COM
öffnen" Then
'Serielle Schnittstelle öffnen
If OPENCOM(Combo_Com.Text & ":"
& Combo_Baud.Text & ",n,8,1") = 0 Then
MsgBox ("Fehler, kann " & Combo_Com.Text & " nicht öffnen")
Else
SDA 1 'I2C-Interface testen
If Not SDA_in
Then
MsgBox ("Keine Antwort vom I2C-Seriell
Interface")
Else
Command_OpenCom.Caption = "COM
schließen"
'I2C-Bus initialisieren
i2cInit
i2cStart
i2cStop
End If
End If
Else
CLOSECOM 'Serielle Schnittstelle schließen
Command_OpenCom.Caption = "COM öffnen"
End If
End Sub
Private Sub Command_LM75_Lesen_Click()
'Temperatur vom LM75 lesen
Dim Temperatur
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 0 'Register auf Temperatur setzen
i2cStop
i2cStart
i2cSlave (Combo_LM75_Adresse.Text + 1) 'Bus-Adresse
des LM75 schreiben
Temperatur = i2cLM75_in
'Temperatur auslesen
TextBox_Temperatur.Text = Format(Temperatur, "##,##0.00 °C")
End If
i2cAck
i2cStop
End Sub
Private Sub Command_LM75_Hyget_Click()
'Hysterese vom LM75 lesen
Dim HyTemp
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 2
'Register auf "Thyst" setzen
i2cStop
i2cStart
i2cSlave (Combo_LM75_Adresse.Text + 1) 'Bus-Adresse
des LM75 schreiben
HyTemp = i2cLM75_in 'Hysterese auslesen
TextBox_Hysterese.Text = Format(HyTemp, "##,##0.00 °C")
End If
i2cAck
i2cStop
End Sub
Private Sub Command_LM75_Hyset_Click()
'Hysterese am LM75 setzen
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 2
'Register auf "Thyst" setzen
i2cLM75_out (TextBox_Hysterese.Text)
End If
i2cStop
End Sub
Private Sub Command_LM75_SPget_Click()
'Schaltpunkt vom LM75 lesen
Dim SPTemp
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 3
'Register auf "Tos" setzen
i2cStop
i2cStart
i2cSlave (Combo_LM75_Adresse.Text + 1) 'Bus-Adresse
des LM75 schreiben
SPTemp = i2cLM75_in
'Schaltpunkt auslesen
TextBox_Schaltpunkt.Text = Format(SPTemp, "##,##0.00 °C")
End If
i2cAck
i2cStop
End Sub
Private Sub Command_LM75_SPset_Click()
'Schaltpunkt am LM75 setzen
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 3
'Register auf "Tos" setzen
i2cLM75_out (TextBox_Schaltpunkt.Text) 'Wert
schreiben
End If
i2cStop
End Sub
Private Sub
Command_LM75_Konfget_Click() 'Konfiguration
vom LM75 lesen
Dim Konfig
i2cInit
i2cStart
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 1
'Register auf "Config" setzen
i2cStop
i2cStart
i2cSlave (Combo_LM75_Adresse.Text + 1) 'Bus-Adresse
des LM75 schreiben
TextBox_Konfig.Text = i2cIn
'Konfigurationsbyte lesen
End If
i2cAck
i2cStop
End Sub
Private Sub
Command_LM75_Konfset_Click() 'Konfiguration
vom LM75 setzen
i2cInit
i2cStart^
If i2cSlave(Combo_LM75_Adresse.Text)
Then
i2cOut 1 'Register auf "Config" setzen
i2cOut (TextBox_Konfig.Text)
'Konfigurationsbyte schreiben
End If
i2cStop
End Sub
Function i2cSlave(Adresse)
'Slave adressieren
' 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 Empfnag der Daten
Bit = 128
For n = 1 To 8 '8 Bits senden
If (Adresse And Bit) = 0
Then SDA 0 Else SDA 1
'Daten übertragen
SCL 1 'pos Impuls
SCL 0 'neg Impuls
Bit = Bit / 2
Next n
SDA 1 'SDA high setzen - wird vom Slave heruntergezogen
SCL 1 '9. Impuls
' Slave antwortet mit neg. Flanke
If SDA_in Then
MsgBox ("Kein I2C-Slave an Adresse " & Adresse)
i2cSlave = False
Else
'ok
i2cSlave = True
End If
SCL 0
End Function
Public Function i2cIn()
'Wert vom Slave empfangen
' Der Master sendet 8 Impulse auf die SCL-Leitung und erhält die
' high- oder low-Signale über die SDA-Leitung zurück.
Bit = 128
Wert = 0
SDA 1
For n = 1 To 8
SCL 1 'pos Impuls
If SDA_in
Then Wert = Wert + Bit
SCL 0 'neg Impuls
Bit = Bit / 2
Next n
i2cIn = Wert
End Function
Public Sub i2cOut(Wert)
'Wert zum Slave senden
Dim Bit, n
' Die 8 Datenbits werden nacheinander auf die SDA-Leitung gelegt und
' jeweils mit einem Impuls auf der SCL-Leitung bestätigt.
' nach dem neunten Impuls quittiert der Slave den Empfnag der Daten
Bit = 128
For n = 1 To 8
'8 Bits senden
If (Wert And Bit) = 0 Then SDA 0 Else SDA 1
'Daten übertragen
SCL 1 'pos Impuls
SCL 0 'neg Impuls
Bit = Bit / 2
Next n
' 9. Impuls
SDA 1
SCL 1 'pos Impuls
' Slave antwortet mit neg. Flanke
If SDA_in Then MsgBox ("keine quittierung der Daten vom Slave " &
Adresse)
SCL 0 'neg Impuls
End Sub
Public Function i2cLM75_in()
'Liest einen Wert (2 Byte) vom LM75
Dim By1, By2, Wert
By1 = i2cIn '1. Byte Wert
vom LM75 lesen
i2cAck
By2 = i2cIn '2. Byte lesen
i2cNoAck
If (By1 And
128) = 0 Then
Wert = By1
'Temperatur Vorkomma >= 0°C
Else
Wert = By1 - 255
'Temperatur Vorkomma < 0°C
End If
If (By2
And 128) <> 0
Then
Wert = Wert + 0.5
End If
i2cLM75_in = Wert
End Function
Public Function i2cLM75_out(Wert)
'Schreibt einen Wert (2 Byte) zum LM75
Dim VK, NK, ZZ$, Z$
'nur Zahlen ausfiltern
For I = 1 To
Len(Wert)
Z$ = Mid$(Wert, I, 1)
Select Case Z$
Case "-", "1", "2",
"3", "4", "5", "6", "7", "8", "9", "0"
ZZ$ = ZZ$ & Z$
Case ".", ","
ZZ$ = ZZ$ & ","
End Select
Next I
VK = Fix(CInt(ZZ$))
NK = CInt(ZZ$) - VK
If VK >= 0 Then
'Vorkommawert schreiben
i2cOut VK ' Wert
positiv
Else
i2cOut 255 + VK ' Wert negativ
End If
If NK >= 0.5 Then
'Nachkommawert schreiben
i2cOut 128 ' xx,5
schreiben
Else
i2cOut 0 '
xx,0 schreiben
End If
End Function
|