Forum: Mikrocontroller und Digitale Elektronik Zahl von einem Arduino Nano zum andern Arduino Nano mit I2C übertragen


von Fabian (Gast)


Lesenswert?

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.

von Robert B. (crolexx)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

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);

von Maxim B. (max182)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Maxim B. (max182)


Lesenswert?

Das ist nicht zu schwer. Es geht praktisch nur um switch-case in ISR. 
Aber man macht das selten, schwer zu sagen, warum.

von Stefan F. (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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.

von Maxim B. (max182)


Lesenswert?

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
von Wire Weia (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.