Frank
08.11.2004, 20:37
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.
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_foto300.gif
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_bestueckung.gif
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_screen.gif
Bauanleitung und ausführlichere Beschreibung wie immer im Download Bereich, hier: https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=187
Hier der Quellcode des Beispielprogrammes:
'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
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.
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_foto300.gif
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_bestueckung.gif
http://www.robotikhardware.de/bilder/rnpci2c/rnipc2c_screen.gif
Bauanleitung und ausführlichere Beschreibung wie immer im Download Bereich, hier: https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=187
Hier der Quellcode des Beispielprogrammes:
'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