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-Modem


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
 
Bausätze können Sie günstig in unserem Onlineshop in der Rubrik
"I2C-Komponenten" bestellen.