PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino: I²C-Adresse als slave?



Ford Prefect
15.06.2014, 15:00
hallo,
um den Arduino als I²C slave zu verwenden brauche ich seine I²C-Adresse - wie kriege ich die raus, vorzugsweise über ein sketch-Programm per USB?

Anschlussfrage: kann man die Pullups softwaremäßig dazuschalten oder muss man die extern dazuschalten (je 83k an SDL/SCA oder so)?

Ich habe ganz frisch ein Freeduino-Board von Franzis (Lernpaket für Anfänger, im Prinzip ein Uno/Diecimila mit ATmega 168PA-PU).

danke schon mal im Vorraus!
Helmut

BMS
15.06.2014, 15:23
Hallo,
hier gibt es ein Tutorial dafür: http://arduino.cc/en/Tutorial/MasterReader
Die I2C-Adresse kann in dem Fall beliebig in Software vergeben werden.
Pullups können von der Software dazu geschaltet werden. Allerdings sind die integrierten Pullups in der Regel relativ hochohmig. Bei zu langen Kabeln oder hohen Übertragungsgeschwindigkeiten können diese Probleme bereiten. Ich würde zu externen Pullup-Widerständen raten, in der Größenordnung 10kOhm und weniger. Ist ja wirklich kein großer Aufwand ;) Nach I2C-Spezifikation dürfen maximal 3mA durch die Pullups fließen.
Grüße, Bernhard

Ford Prefect
15.06.2014, 16:21
hallo,
danke für den Link.
Ich sehe darin allerdings keine einstellbare oder abfragbare i2c-Adresse, und ich will als Master auch einen Mindstorms NXT verwenden (der braucht ca. 47k-83k Pullups). Der sendet bzw. liest dann einen i2c message-string aus adress-byte (z.B. 0x04) und register- und value-bytes an den Arduino-slave (oder alternative devices, wie z.B PCF8574).
So ein Lego-NXC-i2c-Befehl hat z.B. die syntax

// vereinfacht:
i2cread(byte addr, byte reg, byte &msg[], byte len);

Um diese I2C Adresse 0x04 geht es - noch funktioniert mein NXC (Lego-)Programm nicht damit, vllt liegt es daran, dass sie anders ist, vllt liegt der Fehler auch ganz woanders.
Also muss ich zuerst nach der Arduino-i2c-Slave-Adresse scannen.

Kannst du mich vllt notfalls nochmal mit der Nase drauf stoßen? ;)

Rabenauge
15.06.2014, 17:04
Wire.begin(2); // join i2c bus with address #2
Mehr isses nicht...

http://arduino.cc/en/Reference/WireBegin das auch mal lesen....

Ford Prefect
15.06.2014, 18:08
aaaahhhh....!
danke :)