Go Down

Topic: Arduino steuert device über I²C und SPI an (Read 4 times) previous topic - next topic

milito

Bzw. diese Pull-ups gehen ja von SDA/SCL an VCC vom arduino oder an was?
Weil ich das MAXIM Board nicht über den Arduino versorge sondern mit einem extra netzteil:D

pylon

Quote
So jetzt die frage zu dem EN. Du sagtest ja ich sollte den EN-Pin an VCC setzen. So jetzt dachte ich mir, kann ich nicht einen Digitalen I/O am Arduino nehmen. Diese würde ich sicherheitshalber am Anfang auf LOW setzen und wenn ich das Brauche dann auf HIGH ?


Ja, das geht auch, wenn Du den GPIO dafür opfern willst.

Quote
Und zu den PULL-UPs. Die bräuchte ich doch eigentlich nicht oder täusche ich mich? Woher weißt du, dass ich PUll-ups brauche? Müssten doch schon integriert sein


Der Arduino hat nur sehr schwache Pull-Ups, die genügen in den meisten Fällen nicht. Wo müssten die integriert sein? Im MAXIM-Board? In Schema sind sie zumindest nicht aufgeführt, also muss ich davon ausgehen, dass es sie nicht gibt. Es ist auch nicht üblich, sie bei I2C auf einem Board zu integrieren, da es sie nur einmal pro Bus braucht.

Quote
Bzw. diese Pull-ups gehen ja von SDA/SCL an VCC vom arduino oder an was?
Weil ich das MAXIM Board nicht über den Arduino versorge sondern mit einem extra netzteil:D


Hast Du aber die Massen von beiden Boards verbunden?
Und ja, die Pull-Ups gehen an Vcc, ob Du die vom Arduino oder vom Board nehmen willst, spielt keine Rolle, aber es darf nicht Vin sein und ich sehe nicht, ob Vcc überhaupt vom Board rausgeführt wird. Die Arduino-Seite dürfte also einfacher sein. Nimm mal 3k3 oder 4k7, das sollte bei nicht allzu langen Verbindungen von SDA und SCL in etwa richtig kommen.

milito

Quote
Hast Du aber die Massen von beiden Boards verbunden?
Und ja, die Pull-Ups gehen an Vcc, ob Du die vom Arduino oder vom Board nehmen willst, spielt keine Rolle, aber es darf nicht Vin sein und ich sehe nicht, ob Vcc überhaupt vom Board rausgeführt wird. Die Arduino-Seite dürfte also einfacher sein. Nimm mal 3k3 oder 4k7, das sollte bei nicht allzu langen Verbindungen von SDA und SCL in etwa richtig kommen.



Also die beide Massepunkte habe ich ich miteinander verbunden und dann rausgeführt als anschluss für das Netzteil.
So jetzt würde ich es folgendermaßen machen ich würde von dem MAXIM board 2xmal 4l7 drauf und zu Vin  gehen. Wäre das ok?
Der Arduino hat doch welche Pullup.
Müssten doch die RN2B, RN2C sein?

Schaue schematic:
http://arduino.cc/en/uploads/Main/arduino-mega2560-schematic.pdf
Wie kommst du auf die Werte mit 4k7? Kannst du mir das rechnerisch erklären?

uwefed

Neiiiiiiiiin
Pullup Widerstände für I2C nicht auf Vin sondern auf 5V !!!

4,7 kOhm ist ein Standartwert. Kann runter bis 1,5kOhm gehen aber belastet dann unnötig die Treiber.

Grüße Uwe

milito

Ja aber auf dem LEd Driver Board habe ich keine 5V :(.
Hat der Arduino keine Pullups für i2C?
Wenn doch wozu brauche ich die? muss ichsie dann irgendwie ausstellen

milito

also muss ich das am arduino machen mit den Pullups?

zeichnerisch wäre es vllt besser zum verstehen.
Wäre das möglich?

pylon

Quote
So jetzt würde ich es folgendermaßen machen ich würde von dem MAXIM board 2xmal 4l7 drauf und zu Vin  gehen.


Ich habe explizit geschrieben, dass Du Vin nicht verwenden sollst.

Quote
Der Arduino hat doch welche Pullup.
Müssten doch die RN2B, RN2C sein?


Du hast Recht, auch wenn sie im Schema mit RN1B und RN1C benannt sind, aber hier scheint wirklich ein nicht dokumentierter Unterschied von einem Mega2560 zu einem UNO zu bestehen. Beim UNO sind nur die prozessor-internen Widerstände einschaltbar, beim Mega2560 sind externe 10k Widerstände fest montiert. Bei der Verwendung als I2C-Bus mag das ganz sinnvoll sein, aber wenn die Pins als GPIOs verwendet werden, könnte das für Probleme sorgen.

Quote
also muss ich das am arduino machen mit den Pullups?


Du musst nicht, aber es dürfte dort einfacher sein. Also je 4k7 oder 3k3 nach 5V.

Quote
Wenn doch wozu brauche ich die? muss ichsie dann irgendwie ausstellen


Der I2C-Bus is aktiv-LOW, d.h. im passiven Zustand (wenn nichts läuft) sind die Bus-Leitungen auf 5V-Level. Will ein Gerät etwas daran ändern (also etwas übertragen), dann zieht es die entsprechende Leitung nach Masse. Der Vorteil dieser Vorgehensweise liegt darin, dass auch an einem 5V-Master ein 3V3-Slave angeschlossen werden kann, ohne Level-Konverter einsetzen zu müssen (die Pull-Ups gehen dann einfach an 3V3 und nicht an 5V und trotzdem ist mit 3V3 ein HIGH am Eingang anliegend.

uwefed

Am DatenPin des I2C Bus hängen die Eingänge und Ausgänge aller ICs. Damit die Ausgänge sich nicht gegenseitig kaputtmachen haben sie nicht 2 Transistoren, einen der HIGH schaltet und einen der LOW schaltet, sondern nur einen der LOW schaltet. Der HIGH Pegel kommt vom Pullup-Widerstand. Bei einer gewissen Länge der Leitung und Anazahl der ICs hat man eine gewisse Kapazität die mittels des Widerstands geladen und durch die Ausgänge entladen wird. Wenn nun die Leitungs-Kapazität so groß ist, daß zwishen 2 LOW Impulsen nicht mehr auf High geladen wird, dann funktioniert der I2C Bus nicht mehr. In diesem Fall muß man einen kleineren Widerstand wählen damit durch diesen mehr Strom zum Laden der Leitungs-Kapazität fließen kann. Also 4,7k oder 3,3kOhm-Widerstände Als Pullup wählen.

Grüße Uwe

milito

Hi danke für eure Antworten :D.
So stimmt es sind 10k.
So jetzt bin ich allerdings etwas verwirrt und zwar, kan ich jedes belibige I²C device direkt am arduino anschliessen oder muss ich unbedingt die Widerstände auf 4k7 umstellen? und Warum? -> der Grund is mir nicht ganz klar :(
Sorry will es aber verstehen
Wenn ich die 4k7 einsetze, muss ich die 10k entlöten und an deren Stelle die 4k7 dranlöten?


uwefed

Nicht jedes beliebige  I²C device sonden die die 5V auf dem I2C BUS vertragen.

Ja, Du kannst die 4,7kOhm Widerstände einfach paralell auf/zu die 10kOhm Widerstände löten.

Dei Pullupwiderstände mußt Du verringen, da die längeren Verbindungskabel die Kapazität von SCL bzw SCK erhöhen.

Grüße Uwe

milito

Hmm ok, dachte ich brauche nur zwei?
Ja also würde ich das i2c device direkt anschliessen würde es nicht funktionieren?
Bzw ich will ja auch andere i2c devices anschliessen.

Sorry bin jetzt verwirrt :(

uwefed


milito

Danke für deine Mühe.
D.h. wenn ich es direkt anschliesse, hätte ich ein nicht sehr sauberes Signal?
Aber warum haben die beim Arduino 10k pull ups gemacht?
WO ist der Sinn dabei?
Wie mache ich es also , wenn ich mal ein anderes I2c device ansteuern möchte?
ich dachte man würde dies direkt an den SDA, SCL vom arduino Anschliessen, ohne weiteres.

also könnte ich es auch direkt anschliessen?

pylon

Quote
Aber warum haben die beim Arduino 10k pull ups gemacht?


Gute Frage, vor allem, weil's die nur beim Mega2560 gibt. Beim UNO hast Du keine Pull-Ups auf dem Board.

Quote
Wie mache ich es also , wenn ich mal ein anderes I2c device ansteuern möchte?


Anderes Device? Was ist damit gemeint? Einfach ein weiteres oder eines mit CMOS-Level (3V3)?

Quote
ich dachte man würde dies direkt an den SDA, SCL vom arduino Anschliessen, ohne weiteres.


Das geht in vielen Fällen nicht oder nur sehr schlecht. Meist sind externe Pull-Ups nötig.
Aber das hängt stark vom Device und der Länge und Beschaffenheit der Verbindung ab.

Quote
also könnte ich es auch direkt anschliessen?


Können schon, ob es funktioniert steht aber auf einem anderen Papier.

milito

Hi also , ich hoffe ich habs richtig verstanden.
D.h. ich muss diese pullups dazutun, damit ich die pegelanpassung des slave devices am master habe. bzw. damit ich vermeide, dass ich am master zb. 5v habe und an dem slave 3v3 oder verkehrt herum?


Was ich meinte mit dem anderen I2c -device ist, was ist wenn ich zb anstatt dem MAXIM board ein anderes I²C Slave anschliesse? Muss ich da die widerstände anpassen?

Go Up