Home

 Kontakt

 Shop

 Download

 Links

 

Die I²C-Analogkarte - vier analoge Eingänge 0-10V und ein analoger Ausgang 0-10V

© http://www.horter.de

Ansteuerung mit I2C-RS232-Koppler


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
 

 

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