Go Down

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

milito

Hallo,

habe ein Frage bezüglich, der Ansteuerung von I2c /SPI devices über den Arduino Mega2560.
Und zwar muss man ja die Devices adressieren, die man ansteuern möchte, nun möchte ich aber es nicht jedesmal neu programmieren müssen, um ein anderes I²C/SPI device anzusteuern.

Kann man die Adressierung bzw. die Programmierung des Devices Variabel gestalten, z.b. dass ich über meine GUI die Device / Slave Adresse sende und mein Arduino diese empfängt und er damit diese ansteuern kann?

Megaionstorm

Beim SPI werden die Devices nicht über eine Adresse angesprochen, sondern über den Chip Select Pin wird gesteuert für welches Device die darauf folgenden Daten bestimmt sind.

Es gibt aber auch IC's welche über SPI gesteuert werden aber keinen Chip Select Pin haben, wie z.B. der TLC5940.

Siehe hier unter SS (Slave Select): http://arduino.cc/en/Reference/SPI


Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

uwefed

#2
Apr 28, 2013, 03:47 pm Last Edit: Apr 28, 2013, 03:49 pm by uwefed Reason: 1
Natürlich kannst Du die Adresse bzw Chip-Select Pin per Tastatur oder ein anderes Interface eingeben.
Du kannst auch die vorhandenen Adressen per I2C Scanner (http://playground.arduino.cc/Main/I2cScanner) bzw durch Auslesen eines Registers des SPI-Devices durch Scanning aller verfügbaren Pins des Arduinos erfahren und dann dementsprechend die Devices ansprechen.

Du mußt dann aber wissen was wo dranhängt und wie und mit welchen Daten es angesprochen werden muß.

Grüße Uwe

Megaionstorm

Bei I2C hingegen werden die Devices über eine Addresse angesprochen.

Code: [Select]
#include <Wire.h>

int DeviceAddress;

void setup(void) {
  Serial.begin(9600);
  DeviceAddress = 0x50;
  Wire.begin();
}

void loop(void) {
  Wire.beginTransmission(DeviceAddress);
  // Restlicher Code, Wire.send( ..... );
  Wire.endTransmission();
}


In deinem Fall müsstest Du die Addresse mit Serial.read als zwei Byte Werte einlesen und daraus den entsprechenden Integer Wert bilden.
Diesen dann im obigen Beispiel an die DeviceAddress Variabel übergeben.
Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

milito

Danke euch, werde es sobald es geht ausprobieren und euch berichten.


Eisebaer

hi,

bin nicht ganz sicher, ob Dir schon klar ist, daß I2C und SPI verschiedene dinge sind.

vor ein paar tagen gab's diesen thread dazu:
http://arduino.cc/forum/index.php/topic,162918.0.html

gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

milito

Hi :D, den Unterschied zwischen I2c und SPi verstehe ich, aber danke für den link, der ist echt hilfreich.
Mein Problem ist, in diesem MAXIM board gibt es ja mehrere Register z.b. register 0 für LEDStrom 1 usw.
Meine frage ist , wie mache ich es dass er den Befehl z.b. in dem richtigen Register schreibt bzw wie mache ich das wenn ich den Strom der LED-kette1 ändern möchte?
Gebe ich es als Zahl ein oder als Befehl?

pylon

Quote
in diesem MAXIM board gibt es ja mehrere Register


Welches MAXIM Board? Wo ist der Link zum Datasheet? Wie hast Du das Board an den Arduino angeschlossen? Wir haben nur die Information, die Du hier gepostet hast, mehr können wir nicht wissen, solange Uwe's Kristallkugel immer noch kapput ist.

milito

Hatte es oben geschrieben ,aber mache es nochmal :D.
Also das ist der MAXIM 16826 Led driver.
Dieser wird über I²C an dem Arduino angeschlossen.
Datasheet: http://www.maximintegrated.com/datasheet/index.mvp/id/5732

So die erste frage ist ,müsste ich eventuell auch den EN - Pin mit anschliessen? Wenn ja, könnte ich ja einen freien digitalen pin am arduino nehmen?

SO jetzt hast du die von dir benötigten Daten.
Würde mich über einige Tipps freuen , danke

pylon

Quote
Hatte es oben geschrieben ,aber mache es nochmal


Kann sein, dass Du das vorhattest, aber im ganzen vorangegangenen Thread kann ich weder "MAXIM" noch "16826" finden, also hast Du die relevanten Infos sicher noch nicht geschrieben.

Quote
Dieser wird über I²C an dem Arduino angeschlossen.


Wozu dann SPI in's Spiel bringen?

Post mal Dein Verdrahtungsschema oder mach ein entsprechendes Foto von Deiner Verdrahtung.

Quote
So die erste frage ist ,müsste ich eventuell auch den EN - Pin mit anschliessen?


Je nachdem, wie Du den Chip sonst verdrahtet hast. Evtl. kannst Du ihn auch einfach hochziehen (an Vcc anschliessen).

Quote
SO jetzt hast du die von dir benötigten Daten.


Beinahe. Du redest von einem Board. Das Datenblatt beschreibt aber nur einen Chip. Welches Board verwendest Du?

uwefed

War wohl im Gedanken des Schreibes mit http://arduino.cc/forum/index.php/topic,150595.0.html verlinkt.  ;) ;)
Grüße Uwe

milito

JA genau Uwe  ;).
Sorry

Also man könnte sich also auch hier auf dem thread beziehen. Würde mich auf eine Antwort freuen.

milito


War wohl im Gedanken des Schreibes mit http://arduino.cc/forum/index.php/topic,150595.0.html verlinkt.  ;) ;)
Grüße Uwe


Wäre über eine Antwort froh

pylon

Auch in jenem Thread ist das Board nicht verlinkt. Ich hole das deshalb hier nach: http://datasheets.maximintegrated.com/en/ds/MAX16826EVKIT.pdf. Falls Du nicht dieses Board hast, bist Du in der Pflicht, den richtigen Link nachzuliefern.

Wenn Du wirklich nur Vcc, GND, SDA und SCL verdrahtet hast, solltest Du EN an Vcc anschliessen. Und Pull-Ups für die beiden I2C-Leitungen solltest Du auch noch einsetzen.

milito


Auch in jenem Thread ist das Board nicht verlinkt. Ich hole das deshalb hier nach: http://datasheets.maximintegrated.com/en/ds/MAX16826EVKIT.pdf. Falls Du nicht dieses Board hast, bist Du in der Pflicht, den richtigen Link nachzuliefern.

Wenn Du wirklich nur Vcc, GND, SDA und SCL verdrahtet hast, solltest Du EN an Vcc anschliessen. Und Pull-Ups für die beiden I2C-Leitungen solltest Du auch noch einsetzen.


Hi pylon, da genau das ist das Board, habe allerdings den ControllerBoard abgetrennt und verwende nur den LED Driver Board.
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 ?

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

Danke dir :D

Go Up