Home    Impressum / Datenschutz    Shop    Download    Links     Blog  

I2C-Temperatursensor mit LM75 Programmbeispiel

Excel VBA-Makro mit einem Beispiel ffür die Ansteuerung mit dem I2C-Koppler

'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


 

Beispiele als Excel Makro
I2C-Ps-LM75-Test.xls und port.dll als ZIP-Datei (68 kB)
Excel-Makro mit dem die Funktion des I2C-Temperatursensors mit dem I2C-Koppler getestet werden kann.
I2C-Modem-Test.zip (83 kB)
Excel-Makro
mit je einem Beispiel zur Ansteuerung der I2C-Ausgabekarte,
I2C-Eingabekarte und dem Temperatursensor LM75 mit dem I2C-Modem und der port.dll
vba-makros.pdf (528 kB)
Bei den Makros kann es je nach Sicherheitseinstellungen zu Fehlermeldungen kommen. Eine Anleitung wie Sie die Makros ausführen können finden Sie in diesem Dokument