Hallo,
schau mal hier: https://www.roboternetz.de/phpBB2/viewtopic.php?t=39120
Ich denke, das sollte die Meisten deiner Fragen beantworten.
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![]()
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.
Hallo,
schau mal hier: https://www.roboternetz.de/phpBB2/viewtopic.php?t=39120
Ich denke, das sollte die Meisten deiner Fragen beantworten.
Gruß, Stefan
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
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/in...xis#Receiver_2
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ich denke mal, es sind die Zeilen "Declare Sub Twi_init_slave" und "Call Twi_init_slave"?Damit die TWI-Hardware auch darauf reagiert, muß man das noch "enablen"
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
Im Prinzip möglich, ich kenne diese Sub's nicht, die sind ja, glaub ich, in der kostenpflichtigen extra-Library von Bascom...denke mal, es sind die Zeilen..
However: I2C und TWI sind dzt. tatsächlich identisch.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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.
Gruß, Stefan
Hi,
danke für die Hilfe!
ich glaube, ich habs endlich überissen.
Viele Grüße
ikarus_177
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)
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)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen