I2C-Bus am PC

Für Experimente, versuche und Test´s mit dem I2C-Bus hab ich mal ne kleine Adapterschaltung für den PC verwirklicht. Die Schaltung ist nicht neu, ich hab Sie nur an unseren Standard angepaßt und durch Serienfertigung der Platine etwas handlicher gemacht.
Die Ansteuersoftware hab ich in Visual Basic realisiert und auch im Quelltext beigelegt. Ist insbesondere für Lern- und Testzwecke recht gut geeignet.

Somit lassen sich nun nahezu alle I2C-Board und Komponenten auch am PC anschließen.






Bauanleitung und ausführlichere Beschreibung wie immer im Download Bereich, hier: http://www.roboternetz.de/phpBB2/dlo...le&file_id=187

Hier der Quellcode des Beispielprogrammes:



Code:
'I2C-Bus realisiert an der PC RS232-Schnittstelle
'
'Über einen einfachen Adpater RN_PC->I2CBUS (siehe robotikhardware.de)
'können I2C-Bus LCD´s, Boards, Chips, Roboternetz-Baords jetzt
'auch über den PC angesteuert werden. Der Adapter wird einfach in
'den seriellen Port gesteckt. Wie üblich, können zahlreiche Busteilnehmer
'angeschlossen werden. Der I2C-Bus ist Steckerkompatibel zum üblichen
'Roboternetz-Standard
'Der I2C Bus Treiber liegt hier im Visual Basic Quellcode vor
'Wichtig sind die Funktionen:
'sub i2c_init()
'sub i2c_start()
'sub i2c_stop()
'subi2c_SendByte(wert As Byte)
'Function i2c_EmpfangeByte() As Byte
'
'Die Funktionen können ähnlich wie in Bascom verwendet werden:
'Beispielübertragung:
' i2c_init
' i2c_start
' i2c_sendebyte(slaveid)
' i2c_sendebyte(wert1)
' i2c_sendebyte(wert2)
' i2c_stop
'
'Dieses Programm demonstriert die Anwendung und stellt die Funktionen
'für eigene Anwendungen bereit
'Passenden Adapter gibts als Bausatz oder nur Platine übe robotikhardware.de
'Autor: Frank
' ---------------------------------------------------------------------------

Option Explicit


Private Sub buttInit_Click()
  LabelHinweis.Visible = True
  i2c_init
  ZeigePegel
End Sub

Private Sub buttReadbytes_Click()
Dim i As Integer
    Debug.Print "Empfange:";
    buttReadbytes.Enabled = False
    If slaveid.Text = "" Then
        MsgBox "Eine Slave ID braucht man schon"
        Exit Sub
    End If
    If Val(txtAnzahl) > 5 Then
        MsgBox "Es klappt im Demo nur mit 5 Zahlen"
        Exit Sub
    End If
    
    For i = 0 To 4
       txtEWert(i) = ""
    Next
    
    i2c_start
    i2c_SendByte (slaveid)
    delay
    For i = 0 To txtAnzahl - 1
       txtEWert(i) = i2c_EmpfangeByte
       delay
       If i < (txtAnzahl - 1) Then
            i2c_ack (True): Debug.Print "ack"
        Else
            i2c_ack (False): Debug.Print "no ack"
        End If
        delay
    Next i
    i2c_stop
    buttReadbytes.Enabled = True
End Sub

Private Sub buttSCL_Click()
Dim status As Boolean
    status = MSComm1.CTSHolding 'SCL Eingang
    set_scl (Not status)  'SCL Ausgang
    ZeigePegel

End Sub

Private Sub buttSDA_Click()
Dim status As Boolean
    status = MSComm1.DSRHolding 'SDA Eingang
     set_sda (Not status)  'SDA Ausgang
    ZeigePegel
End Sub



Private Sub buttSendByte_Click()
Dim i As Integer
    buttSendByte.Enabled = False
    
    i2c_start
    i2c_SendByte (txtwert(0))
    For i = 1 To 5
        If txtwert(i) = "" Then Exit For
        i2c_SendByte txtwert(i)
        delay
    Next i
    i2c_stop
    
    ZeigePegel
    buttSendByte.Enabled = True
End Sub


Private Sub Form_Load()

  MSComm1.PortOpen = True
  i2c_init
  ZeigePegel
End Sub







'*********************************************************
'                  I2C-Funktionen

'Initialisiert I2C Bus
'Muss nur einmal im Programm aufgerufen werdne
Sub i2c_init()
    i2c_stop
    delay
End Sub

Sub i2c_start()
    Do:
      DoEvents
    Loop Until (get_scl() = True) And (get_sda() = True) 'Warte bis Bus frei
    set_sda (0)
    delay
    set_scl (0)
    delay
    
End Sub

Sub i2c_stop()
    set_sda (0)
    set_scl (1)
stopa:
    If get_scl() = 0 Then GoTo stopa
    set_sda (1)
End Sub

Sub i2c_ack(ack As Boolean)
    If ack = True Then
      set_sda (0)
      pulse
    Else
      set_sda (1)
      pulse
      delay
    End If
End Sub

Sub i2c_SendByte(wert As Byte)
Dim i As Integer
Dim bitmask As Byte
 
 bitmask = 128
 For i = 1 To 8
    set_sda (0)
    If (wert And bitmask) > 0 Then
        set_sda (1)
    Else
        set_sda (0)
    End If
    bitmask = bitmask / 2
    delay
    pulse
 Next i
 delay
 pulse
 delay
End Sub

'Liest ein Byte vom I2C-Port
Function i2c_EmpfangeByte() As Byte
Dim i As Integer
Dim bitmask As Byte
 
 set_sda (1)
 
 i2c_EmpfangeByte = 0
 bitmask = 128
 For i = 1 To 8

    set_scl (1)
empanga:
    If get_scl() = 0 Then GoTo empanga
    If get_sda() = True Then
        i2c_EmpfangeByte = i2c_EmpfangeByte Or bitmask
    End If
    bitmask = bitmask / 2
    set_scl (0)
    delay
 Next i
End Function



'Funktionen um Pegel bei SDA und SCL zu setzen oder zu lesen

Sub set_sda(zustand As Boolean)
    MSComm1.DTREnable = zustand
End Sub

Sub set_scl(zustand As Boolean)
    MSComm1.RTSEnable = zustand
End Sub

Function get_scl() As Boolean
    get_scl = MSComm1.CTSHolding
End Function

Function get_sda() As Boolean
    get_sda = MSComm1.DSRHolding
End Function

Sub pulse()
 set_scl (1)   'Clock High bedeutet Datenbyte liegt an
pulse1:
 If get_scl() = 0 Then GoTo pulse1
 set_scl (0)   'Nur bei Null darf Datenbit auf Datenleitung gelegt werden
End Sub

'Kurze Pause, je nach Busgeschwindigkeit
Sub delay()
Dim i
    For i = 1 To 255
    Next i
End Sub

'Funktion zeigt Pegel visuell in dem Fenster an
Sub ZeigePegel()
  If get_sda = True Then 'Ist SDA High?
    LabelSDAPegel = "High"
    ShapeSDA.FillColor = QBColor(10)
  Else
    LabelSDAPegel = "Low"
    ShapeSDA.FillColor = QBColor(2)
  End If
  
  If get_scl() = True Then 'Ist SDA High?
    LabelSCLPegel = "High"
    ShapeSCL.FillColor = QBColor(10)
  Else
    LabelSCLPegel = "Low"
    ShapeSCL.FillColor = QBColor(2)
  End If
End Sub






Private Sub Form_Unload(Cancel As Integer)
    set_sda (1)
    set_scl (1)
    
End Sub
Gruß frank