Ich habe 12 Arduinos (Mega) und 12 Breakout-Boards (nach Kundenwunsch gebaut. Sie pumpen den Ausgang der digitalen Pins auf 12 V bei 120 mA) zur Steuerung von etwa 300 LEDs. Ich verwende eine Pseudo-PWM-Bibliothek, um die LEDs zu verblassen.
Dies hätte mit einem viel, viel billigeren Setup erreicht werden können. Offen für Vorschläge, aber die Zeit drängt.
Mein Dilemma besteht darin, all diese Mikrocontroller zu synchronisieren. Ich war noch nie an einem Projekt beteiligt, bei dem das Timing so wichtig war; Normalerweise würde ich die seriellen TX/RX-Pins verwenden, um nur Befehle weiterzuleiten, aber ich würde nachts besser schlafen, wenn es eine Art Herzschlag von einem Master zu 11 Slaves gäbe. Ist I2C in diesem Fall der richtige Weg, oder schaue ich nach Alternativen?
tl; dr Was ist der beste Weg, um 12 Arduinos synchron zu halten?
Verwenden Sie zwei Pins pro Chip, einen Eingang und einen Ausgang, und verketten Sie sie seriell. Lassen Sie den "Master" -Chip den Pin bei jedem "Frame" umschalten und alle Slaves bei Pin-Änderung unterbrechen, das Heartbeat-Ereignis registrieren und "synchronisieren", dann den Pin-Status an den nächsten Chip weitergeben und so weiter ... wenn Wenn Sie Lust haben, wickeln Sie den Ausgang des letzten Chips in der Kette zurück zum Master, damit der Master feststellen kann, ob die Nachricht empfangen wurde und wie die Latenz dieser Antwort war.
Dies ist ein netter, einfacher Ansatz, der keine große Softwareentwicklung oder große Sorge um elektrische Eigenschaften und Signalintegrität erfordert. Es gibt offensichtlich andere, komplexere und funktionsreichere Ansätze zur Lösung des von Ihnen gestellten Problems.
Das AVR-TWI kann so konfiguriert werden, dass es eine "allgemeine Anruf"-Übertragung akzeptiert, die im Wesentlichen ein I²C-Schreibvorgang an Adresse 0 ist. Alle Slaves können eine individuelle Slave-Adresse haben und auch auf Adresse 0 antworten (was einfach SLA+W bestätigen kann , Zum Beispiel).
Dies kann verwendet werden, um die Slaves zu synchronisieren. Daten an alle Slaves senden, dann SLA+W an die allgemeine Rufadresse senden. Alle Slaves erhalten diesen „Befehl“ und können mehr oder weniger gleichzeitig mit der Datenverarbeitung beginnen.
Das AVR TWI generiert einen Interrupt, wenn ein Stopp oder wiederholter Start auf dem Bus generiert wurde. Dies kann nur geschehen, wenn alle Slaves SCL freigegeben haben, sodass Sie sicher sein können, dass alle Slaves, die SLA+W bestätigt haben, auch den Befehl verarbeitet und SCL freigegeben haben.
Bei diesem "Protokoll" können Sie nicht sicher sein, dass alle 11 Slaves den Befehl bestätigt haben.
Das Timing hängt von dem anderen Code ab, der auf Ihren Slaves ausgeführt wird. Wenn kein anderer Interrupt aktiv ist, läuft es auf die Interrupt-Latenz hinaus, die ein paar Taktzyklen beträgt (ich bin zu faul, das jetzt nachzuschlagen).
Ich bin mir nicht sicher, ob Folgendes mit dem Hardware-TWI funktioniert: Es ist möglicherweise möglich, den allgemeinen Anruf in einen Lesetransfer umzuwandeln. Alle Slaves liefern 2 Bytes zurück und jeder Slave gibt an einer individuellen Stelle eine Null aus. Die verdrahtete UND-Funktionalität des I²C-Busses führt zu einer kombinierten Antwort aller Slaves. So könnte das Ergebnis aussehen 1111 1000 0000 0000
. Der Master kann nach allen erwarteten Nullen suchen und entsprechend handeln. Von hier aus könnte es kompliziert werden, wenn Sie eine "Abbruch"-Funktion hinzufügen möchten, die einsetzt, wenn nicht alle Slaves ihre Arbeit erledigt haben. Ich habe das nur einmal mit Bit-Banged I²C versucht.
Eine weitere Sache, die Sie anstelle eines allgemeinen Anruflesens versuchen sollten: Verwirren Sie mit dem Adressmaskenregister. Das TWI kann so konfiguriert werden, dass es eine einzelne Adresse akzeptiert, aber es kann auch eine Adressmaske anwenden, wenn es die Adresse prüft. Dies kann verwendet werden, um eine Nicht-Null-Adresse in eine benutzerdefinierte allgemeine Aufrufadresse umzuwandeln, die zum gleichzeitigen Lesen von Daten von allen Slaves verwendet werden kann.
Das auszuarbeiten, klingt nach einem coolen Projekt für sich ...
Und noch ein Edit: Ich habe mir das Datenblatt angesehen und bin zu dem Schluss gekommen, dass das Hardware-TWI nicht dazu gebracht werden kann, Adressen auf diese Weise zu akzeptieren. Sie können meinen ersten Vorschlag ausprobieren (einfach einen allgemeinen Anruf senden) oder einen etwas abgedroschenen I²C-Treiber schreiben, der alles tut, was Sie wollen. Oder versuchen Sie etwas ganz anderes, wie den Vorschlag von Vicatcu.
Gustavo Litowski
Gossamer
Rom
Oli Glaser
Rom