I2C Analogkarte Programmbeispiel / I2C analog card programming example

 Home    Impressum / Datenschutz    Shop    Download    Links     Blog  

I2C-Analogkarte Programmierbeispiele

vier analoge Eingänge 0-10V und ein analoger Ausgang 0-10V mit dem PC lesen bzw. ansteuern

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
            'I2C-Bus initialisieren
            i2cInit
            i2cStart
            i2cStop
            'Buttons einbelnden
            Command_OpenCom.Caption = "COM schließen"
            Command_0_Lesen.Visible = True
            Command_1_Lesen.Visible = True
            Command_2_Lesen.Visible = True
            Command_3_Lesen.Visible = True
            Command_alle_Lesen.Visible = True
            Command_Schreiben.Visible = True
        End If
    End If
Else

    'Serielle Schnittstelle schließen
    CLOSECOM
    'Buttons ausbelnden
    Command_OpenCom.Caption = "COM öffnen"
    Command_0_Lesen.Visible = False
    Command_1_Lesen.Visible = False
    Command_2_Lesen.Visible = False
    Command_3_Lesen.Visible = False
    Command_alle_Lesen.Visible = False
    Command_Schreiben.Visible = False

End If

End Sub

Private Sub Command_Schreiben_Click()
On Error GoTo ErrorHandler

If TextBox_SWert.Text > 255 Then
    MsgBox ("Im Feld WERT nur Zahlen <= 255 erlaubt")
Else
    i2cStart
    If i2cSlave(Combo_SAdresse.Text) Then   'Bus-Adresse des PCF 8591 
        i2cOut 64                  'DA-Wandler freigeben
        i2cOut TextBox_SWert.Text  'Ausgabewert zum Portbaustein schreiben  
    End If
    i2cStop


End If

ErrorHandler:
Select Case Err.Number              'Fehlernummer auswerten.
    Case 0 'ok
    Case 13
         MsgBox ("Im Feld WERT nur Zahlen erlaubt")
         TextBox_SWert.Text = ""
    Case Else
        MsgBox ("Fehler " & Err.Number)
    End Select

End Sub
Private Sub Command_alle_Lesen_Click()
Dim AltWert As Integer

i2cStart
If i2cSlave(Combo_SAdresse.Text) Then      'Bus-Adresse des PCF 8591 
    i2cOut 64 + 4                          '4 einstellen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    AltWert = i2cIn                   'alter Wert lesen und verwerfen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)
    TextBox_LWert_0.Text = i2cIn      'Wert vom Kanal 0 lesen
    i2cAck
    TextBox_LWert_1.Text = i2cIn      'Wert vom Kanal 1 lesen
    i2cAck
    TextBox_LWert_2.Text = i2cIn      'Wert vom Kanal 2 lesen
    i2cAck
    TextBox_LWert_3.Text = i2cIn      'Wert vom Kanal 3 lesen
    i2cNoAck
    i2cStop
End If
i2cStop

End Sub 
Private Sub Command_0_Lesen_Click()
Dim AltWert As Integer

i2cStart
If i2cSlave(Combo_SAdresse.Text) Then 'Bus-Adresse des PCF 8591 
    i2cOut 64 + 0                     'Kanal 0 einstellen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    AltWert = i2cIn                   'alter Wert lesen und verwerfen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    TextBox_LWert_0.Text = i2cIn      'Wert vom Kanal 0 lesen und ausgeben
    i2cStop
    
End If
i2cStop

End Sub 
Private Sub Command_1_Lesen_Click()
Dim AltWert As Integer

i2cStart
If i2cSlave(Combo_SAdresse.Text) Then 'Bus-Adresse des PCF 8591 
    i2cOut 64 + 1                     'Kanal 1 einstellen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    AltWert = i2cIn                   'alter Wert lesen und verwerfen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)
    TextBox_LWert_1.Text = i2cIn      'Wert vom Kanal 1 lesen und ausgeben
    i2cStop
End If
i2cStop

End Sub 
Private Sub Command_2_Lesen_Click()
Dim AltWert As Integer

i2cStart
If i2cSlave(Combo_SAdresse.Text) Then 'Bus-Adresse des PCF 8591 
    i2cOut 64 + 2                     'Kanal 2 einstellen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    AltWert = i2cIn                   'alter Wert lesen und verwerfen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)
    TextBox_LWert_2.Text = i2cIn      'Wert vom Kanal 2 lesen und ausgeben
    i2cStop
End If
i2cStop

End Sub 
Private Sub Command_3_Lesen_Click()
Dim AltWert As Integer

i2cStart
If i2cSlave(Combo_SAdresse.Text) Then 'Bus-Adresse des PCF 8591 
    i2cOut 64 + 3                     'Kanal 3 einstellen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)'DA-Wandlung anstoßen
    AltWert = i2cIn                   'alter Wert lesen und verwerfen
    i2cStop
    
    i2cStart
    i2cSlave (Combo_SAdresse.Text + 1)
    TextBox_LWert_3.Text = i2cIn      'Wert vom Kanal 3 lesen und ausgeben
    i2cStop
End If
i2cStop

End Sub

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

Public Function SCL(i) As Boolean
'SCL auf der RTS-Leitung am COM-Port

RTS i
End Function

Public Function SDA(i) As Boolean
'Die Daten werden über DTR am COM-Port geschreiben
DTR i
End Function

Public Function SDA_in() As Boolean
'Die SDA-Leitung wird über DSR am COM-Port wieder zurückgelesen
If DSR = 1 Then
   SDA_in = True
Else
   SDA_in = False
End If
End Function

Public Function I2C_INT() As Boolean
'Die INT-Leitung der Eingabekarten wird über CTS am COM-Port überwacht
If CTS = 1 Then
   I2C_INT = True
Else
   I2C_INT = False
End If
End Function


Public Sub i2cInit()
'Ruhezustand SDA=high und SCL=high
SDA 1
SCL 1
If Not SDA_in Then MsgBox ("Keine Antwort vom I2C-Seriell Interface")
End Sub


Public Sub i2cStart()
'START => SDA=low anschließend SCL=low
SDA 0
SCL 0
End Sub


Public Sub i2cStop()
'STOP => SDA=high, dann SCL=high
SDA 0
SDA 1
SCL 1
End Sub


Public Sub i2cAck()
'ACKNOWLEDGE => Byte empfangen weitere Daten senden
SDA 0
SCL 1
SCL 0
SDA 1
End Sub


Public Sub i2cNoAck()
'NO ACKNOWLEDGE => Byte empfangen - Keine weiteren Daten senden
SDA 1
SCL 1
SCL 0
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


 

Beispiele als Excel Makro
I2C-Ps-Analog.xls und port.dll (69 kB)
Excel-Makro mit Beispielen zum Analogwert lesen und schreiben mit dem I2C-Koppler
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

 

Bausätze können Sie günstig in unserem Onlineshop in der Rubrik
"I2C-Komponenten" bestellen.