PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C - Datenverkehr



ikarus_177
09.05.2008, 21:39
Hi,

da ich für meinen neuen Bot mehrere Atmegas verwenden will und diese auch untereinander kommunizieren müssen, hab ich mich mal ein wenig informiert, und bin auf den I²C - Bus gestoßen.

Nun, gibt es ja diese tolle Bascom Hilfe, die leider in Englisch ist, und da mein Englisch (noch) nicht das Beste ist, glaube ich, ich hab da was missverstanden.

So wie ich das sehe, werden im Code, der auf dem Master läuft, die Adressen der Slave - Controller definiert. Mit diesen Adressen kann ich dann mit I2CSEND irgendwelche Daten an den bestimmten Controller schicken.

Den entsprechenden Empfangs - Befehl für den Slave-Controller glaube ich in I2CRECEIVE gefunden zu haben. So weit so gut. Wenn ich nun Daten vom Master empfangen will, muss ich dann einfach diesen Befehl ausführen lassen, und er gibt mir die Daten in eine Variable? Wenn der Befehl ausgeführt wird, und es kommen keine Daten vom Master, bleibt das Programm dann an dieser Stelle stehen, bis der Master ein Signal sendet?

Die Rückmeldung erfolgt (meines Erachtens) ebenfalls über I2CSEND. In der Bascom-Hilfe steht aber dazu, dass dieser Befehl zum Senden von Daten an SLAVES gut sein soll. Oder muss ich dann nur die Adresse des Masters angeben?

Und wie wissen die Slaves und der Master, welche Adressen sie überhaupt haben? Werden die per Fusebits eingestellt?

Fragen über Fragen 8-[


Viele Grüße
ikarus_177


EDIT: ok, also das mit Senden und Empfangen hab ich jetzt hingekriegt, unklar ist mir aber weiterhin, wie die einzelnen AVR´s ihre eigenen Adressen mitgeteilt bekommen, das sie also wissen, dass sie angesprochen werden.

StevieL
10.05.2008, 12:49
Hallo,

schau mal hier: https://www.roboternetz.de/phpBB2/viewtopic.php?t=39120

Ich denke, das sollte die Meisten deiner Fragen beantworten.

ikarus_177
10.05.2008, 17:53
Hi,

danke für deine Antwort.

Also unterscheidet sich der Code am Slave bei den Definitionen nur um die Zeile "Const Slaveid = &H82" (oder irgeneine andere Adresse) vom Code des Masters?

Viele Grüße
ikarus_177

PicNick
11.05.2008, 09:20
Nicht nur. Damit legt man am Slave seine Adresse fest. Damit die TWI-Hardware auch darauf reagiert, muß man das noch "enablen"
--->
https://www.roboternetz.de/wissen/index.php/TWI_Praxis#Receiver_2

ikarus_177
11.05.2008, 09:32
Damit die TWI-Hardware auch darauf reagiert, muß man das noch "enablen"

Ich denke mal, es sind die Zeilen "Declare Sub Twi_init_slave" und "Call Twi_init_slave"?

Laut Bascom-Hilfe sind TWI und I²C ja ein und dasselbe. Das heißt, ich kann beide "Befehlsarten" vermischen (die I²C-Befehle mit den TWI-Befehlen)?


Viele Grüße
ikarus_177

PicNick
11.05.2008, 09:43
..denke mal, es sind die Zeilen..
Im Prinzip möglich, ich kenne diese Sub's nicht, die sind ja, glaub ich, in der kostenpflichtigen extra-Library von Bascom.

However: I2C und TWI sind dzt. tatsächlich identisch.

StevieL
11.05.2008, 11:22
Hallo ikarus_177,

der Master kann die Bascom-internen Funktionen verwenden (I2CSend u. s. w.). Wenn du einen Slave programmieren willst kannst du entweder die kostenpflichtige Library von Bascom verwenden oder du verwendest die TWI_Init_slave aus meinem Beispiel. Allerdings ist es damit noch nicht getan. Du musst in einer Endlosschleife abfragen, ob Bytes vom Master angekommen sind und die dann dementsprechend weiterverarbeiten. Ein Beispiel findest du auch in meinem Beispielcode (zwischen Do ... Loop). Aber beachte bitte, dass der Slave für das Beispiel die hardwareseitig festgelegten SDA- und SCL-Pins verwenden muss. Mein Beispiel beruht übrigens auch auf den Artikel aus der Roboternetz-Wiki.

ikarus_177
11.05.2008, 11:41
Hi,

danke für die Hilfe!

ich glaube, ich habs endlich überissen.

Viele Grüße
ikarus_177

Ceos
12.05.2008, 08:09
pass bitte auf das die SlaveIDs all gerade/ungerade sind (ich weis es grade nicht) denn das register was du beschreibst hat 8 bit und das niederwertigste bit stellt eine art flag dar ob broadcasts empfangen werden oder nicht leider weis ich grad nicht ob es 0 oder 1 sein soll, bzw. liess es nochmal im datenblatt deiner controller nach und stell dich darauf ein (PS die datenblätter der controller beinhalten immer eine SEHR ausführliche anleitung und auch programmbeispiele in basic/bascom und C)

PicNick
12.05.2008, 08:40
In der üblichen Darstellung sind die Adressen sind immer gerade.

Setzt man dann "SlaveId = adresse + 1", werden auch die GCA (Broadcasts) empfangen.

(Ein Broadcast ist eine Message mit Adresse = 0)