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_IDENT_Click()
Dim A
'Befehl 16: INDENT
'Modem sendet I2C-OK. Dieser Befehl kann dazu
'verwendet werden, das I2C-Modem an der

'RS232 zu erkennen. Empfängt das I2C-Modem diesen Befehl,
'wird ein Datenbyte generiert,

'in dem die Bits 6 und 7 gesetzt sind. (192 dez)

SENDBYTE (16)   'Befehl IDENT absetzen
TextBox_IDENT.Text = M_Stat(READBYTE)   'Status vom Modem Abfragen

End Sub


Private Sub Command_SPEED_Click()
Dim A
'Befehl 32: SPEED
'Die Busgeschwindigkeit des I2C-Busses wird auf 
'den gewünschten Wert eingestellt.
'Der Defaultwert ist Null und stellt die 
'maximale Busgeschwindigkeit ein.

' Folgende Werte sind mäglich:
' 0 = 43 KHz,  1 = 28 KHz,  2 = 17 KHz,  3 = 9 KHz
' 4 = 5  KHz,  5 = 2,5 KHz, 6 = 1,3 KHz

' Beispiel: SENDBYTE (32 + 5) stellt den Bustakt auf 2,5 kHz ein

' Antwort 192 = OK

SENDBYTE (32 + Combo_SPEED.ListIndex)
TextBox_SPEED.Text = M_Stat(READBYTE)   'Status vom Modem Abfragen

End Sub 

Private Sub Command_VERSION_Click()
Dim By1, By2
'Befehl 80: VERSION
'Das I2C-Modem antwortet mit zwei Byte.
'Werden die Bytes in der Reihenfolge zusammengesetzt 
'so ergibt sich die Versionsnummer der geladenen Firmware

SENDBYTE (80)                      'Befehl 80 = Versionsabfrage
By1 = READBYTE                     '1. Byte lesen
By2 = READBYTE                     '2. Byte lesen

TextBox_VERSION.Text = "Version: " & By1 & "." & By2

End Sub 

Private Sub Command_STATUS_Click()
Dim A
'Befehl 48: STATUS
'liest er die Zustände der Leitungen SDA, SCL und INT aus.
'Diese werden zusammen mit einem OK in einem Byte an 
'den PC zurückgesendet.

SENDBYTE (48)                       'Befehl 48 = Statusabfrage
A = READBYTE                        'Status vom Modem abfragen

If (A And 1) > 0 Then
   TextBox_STATUS_SDA.BackColor = vbGreen
Else
   TextBox_STATUS_SDA.BackColor = vbWhite
End If

If (A And 2) > 0 Then
   TextBox_STATUS_SCL.BackColor = vbYellow
Else
   TextBox_STATUS_SCL.BackColor = vbWhite
End If

If (A And 4) > 0 Then
   TextBox_STATUS_INT.BackColor = vbWhite
Else
   TextBox_STATUS_INT.BackColor = vbRed
End If

TextBox_STATUS.Text = A & " = " & Dec2Bin(A)

End Sub 

Private Sub Command_SCHREIBEN_Click()
'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben

On Error GoTo ErrorHandler          'Für falsche Eingaben im Feld

If TextBox_SWert.Text > 255 Then
    MsgBox ("Im Feld WERT nur Zahlen <= 255 erlaubt")
Else
    SENDBYTE (64 + 1)              '64 = Multiwrite + (Anzahl Bytes -1)
    SENDBYTE (Combo_SAdresse.Text) 'Bus-Adresse des PCF8591 schreiben
    SENDBYTE (64)                  'AD-Wandler freigeben
    SENDBYTE (TextBox_SWert.Text)  'Wert ausgeben
End If

TextBox_SCHREIBEN.Text = M_Stat(READBYTE)   'Status vom Modem Abfragen

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_LESE_AIN0_Click()
Dim Altwert, STAT

'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
SENDBYTE (64)                    '64 = Multiwrite + (Anzahl Bytes -1)
SENDBYTE (Combo_SAdresse.Text)   'Bus-Adresse des PCF8591 schreiben
SENDBYTE (64 + 0)                'Kanal 0 einstellen
STAT = READBYTE                  'Status vom Modem Abfragen
TextBox_LESEN.Text = M_Stat(STAT)

If STAT = 192 Then
    'Befehl 128: READ
    'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
    
    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    Altwert = READBYTE                   'Altwert lesen und verwerfen

    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    TextBox_LWert_AIN0 = READBYTE        'Analogwert lesen
End If

End Sub 

Private Sub Command_LESE_AIN1_Click()
Dim Altwert, STAT

'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
SENDBYTE (64)                           '64 = Multiwrite + (Anzahl -1)
SENDBYTE (Combo_SAdresse.Text)          'Bus-Adresse des PCF8591 schreiben
SENDBYTE (64 + 1)                       'Kanal 0 einstellen
STAT = READBYTE                         'Status vom Modem Abfragen
TextBox_LESEN.Text = M_Stat(STAT)

If STAT = 192 Then
    'Befehl 128: READ
    'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
    
    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    Altwert = READBYTE                   'Altwert lesen und verwerfen

    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    TextBox_LWert_AIN1 = READBYTE        'Analogwert lesen
End If

End Sub 

Private Sub Command_LESE_AIN2_Click()
Dim Altwert, STAT

'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
SENDBYTE (64)                        'Befehl 64 = Multiwrite + (Anzahl-1)
SENDBYTE (Combo_SAdresse.Text)       'Bus-Adresse des PCF schreiben
SENDBYTE (64 + 2)                    'Kanal 0 einstellen
STAT = READBYTE                      'Status vom Modem Abfragen
TextBox_LESEN.Text = M_Stat(STAT)

If STAT = 192 Then
    'Befehl 128: READ
    'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
    
    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    Altwert = READBYTE                   'Altwert lesen und verwerfen

    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    TextBox_LWert_AIN2 = READBYTE        'Analogwert lesen
End If

End Sub 

Private Sub Command_LESE_AIN3_Click()
Dim Altwert, STAT

'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
SENDBYTE (64)                        'Befehl 64 = Multiwrite + (Anzahl-1)
SENDBYTE (Combo_SAdresse.Text)       'Bus-Adresse des PCF schreiben
SENDBYTE (64 + 3)                    'Kanal 0 einstellen
STAT = READBYTE                      'Status vom Modem Abfragen
TextBox_LESEN.Text = M_Stat(STAT)

If STAT = 192 Then
    'Befehl 128: READ
    'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
    
    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    Altwert = READBYTE                   'Altwert lesen und verwerfen

    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    TextBox_LWert_AIN3 = READBYTE        'Analogwert lesen
End If

End Sub 

Private Sub Command_LESE_ALLE_Click()
Dim Altwert, STAT

'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
SENDBYTE (64)                        '64 = Multiwrite + (Anzahl -1)
SENDBYTE (Combo_SAdresse.Text)       'Bus-Adresse des PCF8591 schreiben
SENDBYTE (64 + 4)                    'Kanal einstellen
STAT = READBYTE                      'Status vom Modem Abfragen
TextBox_LESEN.Text = M_Stat(STAT)

If STAT = 192 Then
    'Befehl 128: READ
    'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
    
    SENDBYTE (128)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    Altwert = READBYTE                   'Altwert lesen und verwerfen

    SENDBYTE (131)                       '128 = Multiread + (Anzahl -1)
    SENDBYTE (Combo_SAdresse.Text + 1)   'Bus-Adresse des PCF8591 schreiben
    TextBox_LESEN.Text = M_Stat(READBYTE)'Status vom Modem Abfragen
    TextBox_LWert_AIN0 = READBYTE        'Analogwert 1 lesen
    TextBox_LWert_AIN1 = READBYTE        'Analogwert 2 lesen
    TextBox_LWert_AIN2 = READBYTE        'Analogwert 3 lesen
    TextBox_LWert_AIN3 = READBYTE        'Analogwert 4 lesen
End If

End Sub 

Function M_Stat(Status_Byte) 'Status vom Modem abfragen
Dim A

Select Case Status_Byte
Case -1
    M_Stat = ""
Case 2
    M_Stat = "kein Slave an dieser Adresse"
Case 4
    M_Stat = "Slave hat Daten nicht quittiert"
Case 16
    M_Stat = "unbekanntes Modem-Kommando"
Case 192
    M_Stat = "OK"
Case Else
    M_Stat = "FEHLER " & Status_Byte
End Select

End Function 

Private Sub Command_OpenCom_Click()

If Command_OpenCom.Caption = "COM öffnen" Then
    'Serielle Schnittstelle öffnen
    If OPENCOM(Combo_Com.Text & ":" & "19200,n,8,1") = 0 Then
        MsgBox ("Fehler, kann " & Combo_Com.Text & " nicht öffnen")
    End If
    'Buttons einbelnden
    Command_OpenCom.Caption = "COM schließen"
    Command_IDENT.Visible = True
    Command_SPEED.Visible = True
    Command_VERSION.Visible = True
    Command_STATUS.Visible = True
    Command_SCHREIBEN.Visible = True
    Command_LESE_AIN0.Visible = True
    Command_LESE_AIN1.Visible = True
    Command_LESE_AIN2.Visible = True
    Command_LESE_AIN3.Visible = True
    Command_LESE_ALLE.Visible = True
    
Else
    'Serielle Schnittstelle schließen
    CLOSECOM
    'Buttons ausbelnden
    Command_OpenCom.Caption = "COM öffnen"
    Command_IDENT.Visible = False
    Command_SPEED.Visible = False
    Command_VERSION.Visible = False
    Command_STATUS.Visible = False
    Command_SCHREIBEN.Visible = False
    Command_LESE_AIN0.Visible = False
    Command_LESE_AIN1.Visible = False
    Command_LESE_AIN2.Visible = False
    Command_LESE_AIN3.Visible = False
    Command_LESE_ALLE.Visible = False

    TextBox_STATUS_SDA.BackColor = vbWhite
    TextBox_STATUS_SCL.BackColor = vbWhite
    TextBox_STATUS_INT.BackColor = vbWhite
    TextBox_VERSION.Text = "Version ?.?"
    TextBox_STATUS.Text = "Status ??"
End If

End Sub 

Private Function Bin2Dec(ByVal Bin As String) As Long
' Diese Funktion stammt von http://www.activevb.de - Danke :-)
' Von Binaer nach Dezimal umrechnen

Dim i As Long, lngLen As Long
lngLen = Len(Bin)       'Länge der Binärzahl
For i = lngLen To 1 Step -1  'Für jede Stelle die Schleife durchgehen
     Bin2Dec = Bin2Dec + IIf(Mid$(Bin, i, 1) = "1", 2 ^ (lngLen - i), 0)
                        'umrechnen in Dezimal (siehe Erklärung oben)
Next i
End Function 

Private Function Dec2Bin(ByVal Dec As Long) As String
' Diese Funktion stammt von http://www.activevb.de - Danke :-)
' Von Dezimal in Binaer

Dim Rest As Long
Do
      Rest = Dec Mod 2   'Den Rest bei einer Division durch 2 errechnen
      Dec2Bin = Rest & Dec2Bin 'Rest und bishereige Binaer Zahl zusammen
      Dec = Dec \ 2      'Dezimal Zahl durch 2 Teilen
Loop Until Dec = 0       'Solange bis Dezimal-Zahl = 0 ist
End Function 

 

Beispiele als Excel Makro
I2C-PM-Analog.zip und port.dll (90 kB)
Excel-Makro mit Beispielen zum Analogwert lesen und schreiben mit dem I2C-Modem
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.