PDA

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