Archiv verlassen und diese Seite im Standarddesign anzeigen : i2c, master slave, twi_lib oder nicht - bin total verwirrt
m@rkus33
23.03.2007, 12:18
Hallo zusammen,
ich steige gerade in die I2C Thematik ein und bin durch das viele Lesen jetzt total verwirrt.
Ich habe 2 x Mega8 und 1 x Mega 32 die miteinander Daten austauschen sollen. Von den beiden Mega8 werden Werte für den Mega32 bereitgestellt.
So nun bin ich total verwirrt bezüglich i2C, habe hier schon viel gelesen.
Der Mega32 soll in bestimmten Abständen bei beiden Mega8 bestimmte Werte über i2C abrufen. Dann müssen die beiden Mega8 als Slave arbeiten, der Mega32 als Master. Richtig?
Wenn das so richtig ist, dann brauche ich die berühmte i2C_TWI.LBX von Bascom um aus den beiden Mega8 Slave I2C Teilchen zu machen. Auch wenn ich die Hardware TWI nutzen will. Richtig?
Mir wäre aber sowas lieber:
Ginge auch ein "Multimaster- System"? Bei dem der Mega32 erst eine Aufforderung an die 8er sendet die nach erhalt der Aufforderung die Werte zurückgeben? Kann ich mir dann die i2c_TWI.LBX sparen?
Würde mir das so vorstellen:
M32-> Sendeaufforderung M8 Nr.1-> Daten senden M8 Nr.1 an M32-> M32 Sendeaufforderung M8 Nr.2 -> Daten senden M8 Nr.2 an M32
Ich denke mir, das so die Daten schön der Reihe nach und zu definierten Zeiten ausgetauscht werden können und der Bus immer frei ist.
Helft mir mal bitte auf die Sprünge.
merci
markus
linux_80
23.03.2007, 19:43
Hallo,
am I2C-Bus gibts immer mind. einen Master und einen Slave, der Master ist der Aktive, und der Slave macht nur mit, je nachdem was der Master so will.
Die Lib die Du angegeben hast, ist dazu da, den Master unter Bascom die TWI-Hardware benutzen zu lassen, ansonsten wird das per Software geregelt.
Für den Slave brauchst du dann auch noch etwas, entweder die Slave-Lib bei MCS (Bascom) kaufen, oder hier im Forum suchen und selber anpassen. Kommt auch darauf an wie gut Du Programmiertechnisch drauf bist.
Warst du schon im Wiki und dort bei TWI usw. ?
Da gibts dann u.a. einen Link zum Forum mit Beispiel-Slave.
m@rkus33
23.03.2007, 19:56
so jetzt raucht mir der Kopf aber der Groschen ist endlich gefallen.
wie die kommunikation abläuft habe ich mit einem Byte kapiert.
Was muss ich aber verändern um den Array zu übertragen? Ich kapiers net... :( Ich muss doch irgendwo reinschreiben das es insgesamt 4 Bytes Datenbytes sind. Aber wie?
Diesen Code aus WiKi:
Master Receiver:
$regfile = "M8def.dat"
$crystal = 12000000
$baud = 9600
Declare Function Twi_read_byte(byval Slave As Byte) As Byte
Config Lcd = 20 * 4
Config Lcdpin = Pin , E = Portd.3 , Rs = Portd.2 , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4
Dim Twi_control As Byte '
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim B As Byte
Dim Ch1 As Long
Dim Ch1counter(4) As Byte At Ch1 Overlay
Dim Error As Byte
Twcr = &B00000100
Twsr = 0
Twbr = 72
Ch1 = 0
Ch1counter = 0
Cls
Locate 1 , 1
Lcd "TWI Master Receiver"
Do
Ch1counter = Twi_read_byte(&H40)
Locate 2 , 1
Lcd "CH1:" ; Ch1
Locate 4 , 1
Lcd " Error : " ; Err
Waitms 25
Loop
End
'--------------------------------------------------------------------------------
Function Twi_read_byte(slave As Byte) As Byte
Error = 0
Twi_read_byte = 0
Twcr = &B10100100
Gosub Twi_wait_int
If Twi_status = &H08 Or Twi_status = &H10 Then
Twdr = Slave Or &H01
Twcr = &B10000100
Gosub Twi_wait_int
If Twi_status = &H40 Then
Twcr = &B10000100
Gosub Twi_wait_int
If Twi_status = &H58 Or Twi_status = &H50 Then
Twi_read_byte = Twdr
Error = 0
Else
Error = Twi_status
End If
Else
Error = Twi_status
End If
Twcr = &B10010100
Else
Twcr = &B10000100
Error = Twi_status
End If
End Function
Twi_wait_int:
Do
Twi_control = Twcr And &H80
Loop Until Twi_control = &H80
Twi_status = Twsr And &HF8
Return
Und der Slave Transmitter:
$regfile = "m8def.dat"
$crystal = 7372800
' $baud = 9600
Config Pinc.0 = Output
'------------- I2C Variablen ----------------------
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim Ch1 As Long
Dim Ch1counter(4)As Byte at Ch1 Overlay
Declare Sub Twi_init_slave
Ch1 = 0
Ch1counter = 0
Twi_data = 0
Call Twi_init_slave ' TWI aktivieren
Do
Portc.0 = 1
Incr Ch1
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Ch1counter(4)
Portc.0 = 0
End If
Twcr = &B11000100
End If
Loop
End
'------- Unterprogramme--------------
'Mega8 als I2C Slave setzen
Sub Twi_init_slave
Twsr = 0
Twdr = &HFF
Twar = &H40
Twcr = &B01000100
End Sub
m@rkus33
23.03.2007, 20:00
danke Linux_80
warst schneller. Ich habe mir jetzt stundenlang wiki reingezogen. Das thema habe ich zumindest für ein Byte geschnallt. Auch ohne Lib.
Programmiertechnisch bin ich ehrlich gesagt net so gut drauf, mache das ganze noch net lang. mit i2c habe ich gerade angefangen mich zu beschäftigen.
Bin für jede Hilfestellung dankbar!!
linux_80
23.03.2007, 20:13
Etwas aufgebohrtes Slave-Beispiel:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=246777#246777
Für den Master würde ich aber trotzdem die Bascom eingebauten Befehle verwenden, und die I2C-TWI-Lib, denn damit schaut das Programm etwas übersichtlicher aus.
Also so wie in diesem Beispiel
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.