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: https://www.roboternetz.de/phpBB2/dl...le&file_id=187
Hier der Quellcode des Beispielprogrammes:
Gruß frankCode:'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
Lesezeichen