bin auf der Suche nach einem einfachen Sketch, bei dem ein Client autark Zeichen an einen Master sendet, ohne dass dieser diese Zeichen vom Client zuvor angefortert haben muss.
Ich mag nicht ausschließen, dass ich das i2c-Protokoll noch nicht richtig verstanden habe.
Reicht es in diesem Fall z.B. nur Wire.available() zu verwenden ohne vorher zu "requesten"?
Vielleicht hat mir Einer von Euch einen hilfreichen Link.
Der Slave aktiviert eine Meldeleitung, woraufhin der Master die Daten anfordert. Das funktioniert.
Der Slave agiert als Master und sendet Daten an den Master, der dann als Slave agiert. Theoretisch geht das. Hier besteht die Gefahr von Konflikten. Dazu habe ich aber keine praktische Erfahrungen.
Der Slave aktiviert eine Meldeleitung, woraufhin der Master die Daten anfordert. Das funktioniert.
Der Slave agiert als Master und sendet Daten an den Master, der dann als Slave agiert. Theoretisch geht das. Hier besteht die Gefahr von Konflikten. Dazu habe ich aber keine praktische Erfahrungen.
Hi,
ja, ich meine mit Client den Slave. Sorry.
Wie funktioniert das mit der Meldeleitung? Ist das das hier?
Chris72622:
Wie funktioniert das mit der Meldeleitung? Ist das das hier?
Nein, das ist die Grundschaltung für die Verbindung von I2C Master und Slave.
Zusätzlich kannst Du noch eine Interrupt- oder Meldeleitung nutzen. Beim Slave als Ausgang, beim Master als Eingang.
Interrupt: Der Slave löst an einem Interrupteingang einen Interrupt aus. So kann es der MCP23017 machen, wenn sich ein Eingangszustand verändert hat. Häufig ist die Nutzung von Interrupts aber ohne Vorteil.
Meldeleitung: Der Slave legt einen Ausgang auf aktiv, der Master liest das Signal und fordert Daten an, der Slave sendet die Daten und setzt den Ausgang auf inaktiv. Das typische Handschütteln eben.
Bin nun soweit, einen Pin des ATtiny85 auf HIGH zu schalten, wenn dieser beschäftigt ist, da ich keinen MCP23017 einsetzen möchte.
Es sind zwar absolute Basics, aber es ist doch richtig, diesen Ausgang auf dem Weg per 10kOhm Widerstand gegen Masse zu ziehen (Pulldown), bevor es in einen Eingang des "Master-Arduinos" geht, damit dieser den Status des ATtinys erkennen kann, oder?
Du meinst mit beschäftigt, dass er keine neuen Daten übernehmen kann?
Dann würde ich es so schalten, dass er für den Master auch als "beschäftigt" ankommt, wenn die Leitung zum Tiny nicht gesteckt ist oder der Tiny aus ist.
Tommy56:
Du meinst mit beschäftigt, dass er keine neuen Daten übernehmen kann?
Dann würde ich es so schalten, dass er für den Master auch als "beschäftigt" ankommt, wenn die Leitung zum Tiny nicht gesteckt ist oder der Tiny aus ist.
Das wäre dann pullup.
Gruß Tommy
Ja, genau.
Meinst Du Folgendes:
ATtiny Pin -----O----> Master-Arduino Pin
I
4,7kOhm Widerstand
I
5V
Chris72622:
bin auf der Suche nach einem einfachen Sketch, bei dem ein Client autark Zeichen an einen Master sendet, ohne dass dieser diese Zeichen vom Client zuvor angefortert haben muss.
Jede Station am I2C Bus kann Daten senden, der Bus ist multi-master fähig.
Wenn Du Dir die Beispiele zu I2C anschaust, erfolgt das Senden und Empfangen auf unterschiedlichen Wegen. Ein Master sendet seine Anforderungen und Daten direkt los, ein Slave reagiert darauf in den onRequest() und onReceive() Interrupt-Handlern.
Du mußt also für jede Station, die Daten empfangen soll, onReceive() implementieren (was soll sie mit den empfangenen Daten machen), und ihr in Wire.begin() eine Adresse zuweisen. Dann kann jede andere Station jederzeit Daten an diese Adresse schicken.
Mit ATtiny habe ich allerdings keine Erfahrungen, ob dessen abgespeckte Hardware irgendwelche Probleme machen könnte. Da hilft nur ausprobieren.
DrDiettrich:
Jede Station am I2C Bus kann Daten senden, der Bus ist multi-master fähig.
Das hatte ich in #1 Punkt 2 bereits vorgeschlagen. Meine Experimente mit zwei Mastern, die ich mit einem UNO und einem Mega2560 zu einem anderen Thema unternommen hatte, waren aber nicht von Erfolg gekrönt, warum auch immer. Theoretisch stimme ich Dir zu, praktisch bin ich derzeit etwas skeptisch.
Der ATtiny85 kann sowohl als Master wie als Slave fungieren, wobei ich TinyWireM und TinyWireS verwendet habe. Bei Multimaster müßten beide Bibliotheken zusammenarbeiten oder eine andere Bibliothek verwendet werden. Dazu habe ich keinerlei praktische Erkenntnisse.
Die Meldeleitung habe ich demgegenüber im praktischen Einsatz, weshalb ich dazu neige, diese zu empfehlen. Da kann ich mit dem Brustton der Überzeugung sagen, daß das bei mir funktioniert und bei Bedarf auch, wie ich es implementiert habe.
Ob man die Meldeleitung busfähig auslegt, hängt von der Notwendigkeit bei mehrern Slaves ab. Bei nur einem Slave muß man es ja nicht unnötig verkomplizieren, finde ich
Ein Slave kann auf Anforderung auch nichts übertragen, wenn er gerade keine Daten zur Verfügung hat. Damit könnte man auf eine Meldeleitung verzichten. Es macht ja zeitmäßig keinen großen Unterschied, ob der Controller ständig eine Meldeleitung pollt, oder prüft, ob der Slave auf Anfrage Daten schickt.
DrDiettrich:
Es macht ja zeitmäßig keinen großen Unterschied, ob der Controller ständig eine Meldeleitung pollt, oder prüft, ob der Slave auf Anfrage Daten schickt.
Ich stimme Dir vollkommen zu, aber das Thema lautet "ohne Masterrequest", was Deinen Vorschlag leider ausschließt. Inwieweit das für das Projekt sinnhaft ist, entzieht sich mangels detailierterer Informationen meiner Einschätzung.