Hallo, ich mache grade erste Gehversuche mit Arduino und möchte eine 16bit-Zahl über den I2C-Port von einem Arduino Nano Board (als Master) zu einem anderen Arduino Nano Board (als Slave) übertragen. Weiß jemand, welche Lib man dafür gut verwenden kann? Beim Suchen stößt man auf viele I2C-Libs für Displays, Tastaturen usw., habe aber bisher nichts gefunden, womit man zwei Boards verbinden kann. Auch unter "TWI" nicht.
such einmal mit Google nach: arduino i2c vernetzen Erste Treffer: https://starthardware.org/mehrere-arduinos-verbinden-so-klappt-es/ https://hikro.de/integer-zwischen-zwei-arduinos-via-i2c-uebertragen-tutorial lg
Fabian schrieb: > Weiß jemand, welche Lib man dafür gut verwenden kann? Für I²C Kommunikation ist die Wire.h zuständig. https://www.arduino.cc/en/Reference/Wire Und da gibt es sogar ein Beispiel: https://www.arduino.cc/en/Tutorial/LibraryExamples/MasterWriter Da du allerdings keine Bytes sondern 16bit Werte übertragen willst, nutzt du anstelle von Wire.write() am besten Wire.send(): uint16_t i=12345; Wire.send(&i,2);
Fabian schrieb: > Beim Suchen stößt man auf viele I2C-Libs für Displays, Tastaturen usw., > habe aber bisher nichts gefunden, womit man zwei Boards verbinden kann. > Auch unter "TWI" nicht. Das macht man eher selten, da Slave-Mode komplizierter ist als Master. Für Slave muß man schon ISR benutzen, sonst wird Controller die ganze Zeit nur TWI überprüfen und sonst nichts machen.
Maxim B. schrieb: > Für Slave muß man schon ISR benutzen, sonst wird Controller die ganze > Zeit nur TWI überprüfen und sonst nichts machen. Genau das macht Arduino ja. Die Daten werden in einen Puffer empfangen und danach wird eine callback-Funktion aufgerufen. 32 Bytes (die Adresse nicht mit gezählt) ist dort übrigens das Limit für I²C Transaktionen.
Das ist nicht zu schwer. Es geht praktisch nur um switch-case in ISR. Aber man macht das selten, schwer zu sagen, warum.
Maxim B. schrieb: > Das ist nicht zu schwer. Es geht praktisch nur um switch-case in > ISR.Aber man macht das selten, schwer zu sagen, warum. Mit der ISR verwirrst du ihn bloß. Fabian, schau dir das Beispiel von Arduino an, dann siehst du wie es geht.
Stefan ⛄ F. schrieb: > 32 Bytes (die Adresse nicht mit gezählt) ist dort übrigens das Limit für > I²C Transaktionen. Ich sehe, du hast dich kundig gemacht! Stefan ⛄ F. schrieb: > Wire.send(&i,2); Nur das ... Das ist auch write. Also Wire.write(&i,2) Außer bei so manchen ATTiny FremdLibs.
Super, vielen Dank für die Antworten! :))) Ich probiere erst mal das hier durch: https://www.arduino.cc/en/Tutorial/LibraryExamples/MasterWriter Stefan ⛄ F. schrieb: > Da du allerdings keine Bytes sondern 16bit Werte übertragen willst, > nutzt du anstelle von Wire.write() am besten Wire.send(): > > uint16_t i=12345; > Wire.send(&i,2); Danke für den Tipp!
Prinzipiell möglich ist es, einfach nur 2 Bytes rauszurotzen. Meistens will man aber mehr Komfort, d.h. ein Protokoll, mit dem man mehrere Parameter auswählen und lesen/schreiben kann. Zum besseren Debuggen nimmt man vorzugsweise ein Textprotokoll. Ein 2Byte Wert wird dann als 4 Hex-Ziffern oder Dezimalzahl übertragen. Auch ein Firmwareupdate kann man damit übertragen (Bootloader). Die Hauptfrage ist aber erstmal, braucht man überhaupt 2 MCs oder kann nicht alles bequemer von einem erledigt werden.
Stefan ⛄ F. schrieb: > Mit der ISR verwirrst du ihn bloß. Wie machst du Slave ohne ISR? Das ist nur eine Frage, ohne Hintergrund. Einfach interessant: wie kann man Slave machen, ohne ISR und ohne alles Andere zu blockieren?
:
Bearbeitet durch User
Maxim B. schrieb: > Wie machst du Slave ohne ISR? Die ISR ist in der Arduino Wire-Klasse enthalten und wird aktiv sobald eine Instanz der Klasse angelegt wurde.
Peter D. schrieb: > Ein 2Byte Wert wird > dann als 4 Hex-Ziffern oder Dezimalzahl übertragen. Bei UART hätte ich dir zugestimmt, aber doch nicht bei I²C.
Maxim B. schrieb: > Wie machst du Slave ohne ISR? Ich habe nicht geschrieben, dass es ohne ISR läuft. Ganz im Gegenteil: Stefan ⛄ F. schrieb: >> Für Slave muß man schon ISR benutzen > Genau das macht Arduino ja. Die Daten werden in einen Puffer empfangen > und danach wird eine callback-Funktion aufgerufen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.