Pages: 1 2 [3] 4   Go Down
Author Topic: Arduino steuert device über I²C und SPI an  (Read 2506 times)
0 Members and 1 Guest are viewing this topic.
Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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?

Jein. Vergiss in diesem Zusammenhang (nur in diesem!) Master und Slave, es geht um den Bus zwischen diesen. Damit ein Bus möglich wird, an dem sowohl 3V3- als auch 5V-Geräte teilnehmen können, wurde das Konzept ersonnen, dass ein Gerät zur Signalübertragung nur eine Busleitung nach Masse ziehen darf, der HIGH-Pegel aber passiv durch die Pull-Ups erzeugt wird. Die Pull-Ups stellen also den High-Pegel ein (passiver Zustand) und sollten so gewählt werden, dass dieser Pegel in vernünftiger Zeit erreicht wird (was von der Bus-Kapazität abhängt) und gleichzeitig die Bus-Treiber (die den Strom "ertragen" müssen) nicht überfordert werden.

Quote
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?

Möglich, wenn sie die Bus-Kapazität dadurch ändert. Wenn Du aber die Signalleitungs-Längen nicht änderst und die Widerstände schon vernünftig gewählt hast (z.B. 3k3), sollte keine Änderung notwendig werden.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok pylon,

danke dir, habe es denke ich verstanden, d.h. also die Massnahme istz dafür da, dass an dem Buss auch geräte mit 3v3 teilnehmen können, denn sonst wenn ich die maßnahme mit den Widerständen nicht nehme, dann könnte das Device, dass nur 3v3 verträgt , aber auf 5v im i2c angeschlossen ist auch zerstört werden.

Ich habe jetzt auch rausbekommen, mann kann das auch mit Z-Dioden realisieren.
D.h. hänge in reihe zu den 2 pull-ups (10k) vom Arduino jeweils eine 3v3 z-diode an die an masse geht. Was hältst du von der idee?
Normalerweise sollte aber auch das MAxim Board ohne diese Maßnahme im i2c bus funktionieren.
Aus dem Datenblatt konnte ich folgendes entnehmen: I2c -> Input high voltage = min. 1,5V , Input low voltage= max.0.5V und es hat eine Vcc= 4,75 to 24 V.
Also ist diese Maßnahme eher eine Sicherheitsmaßnahme oder?
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der MAXIM-Chip ist 5V-tolerant, Du kannst ihn also direkt an den Bus hängen, der kann auch direkt mit 5V betrieben werden. Somit kannst Du für das MAXIM-Board einfach die bestehenden Pull-Ups verwenden und das Board direkt mit dem Arduino verbinden. Wenn Du etwas steilere Flanken erreichen willst, hängst Du noch 4k7-Widerstände parallel zu den bestehenden 10k-Pull-Ups.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

AH ok, aber er würde auch fuinktionieren, wenn ich das Sicherheitsmaßnahme realisieren würde?
Was hältst du von der Idee mit den z-Diode, die ich im vorherigem Thread angesprochen habe?
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vorerst auch danke an alle. Die eigneliche frage, wie ich das jetzt ansteuere habe ich immern och nicht raus.
Wie sende ich ihm den Befehl z.b dass ich den Strom ändere bzw. die Spannung?
Es soll ja irgendiwe ein Parameter sein, damit ich es ansteuern kann. Da hängt nämlich eine LED-Kette dran und ich möchte es anhand meiner GUI dem Arduino Steuerparameter senden. Nur habe ich noch nicht raus wie ich das realisiere .
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Was hältst du von der Idee mit den z-Diode, die ich im vorherigem Thread angesprochen habe?

Ich sehe keinen Grund für eine solche Massnahme und sehe keine Vorteile. Ich habe aber zuwenig Erfahrung mit Zener-Dioden, um die Auswirkungen auf die Schaltung beurteilen zu können.

Quote
Wie sende ich ihm den Befehl z.b dass ich den Strom ändere bzw. die Spannung?

Vereinfacht ungefähr so:

Code:
Wire.beginTransmission(MAX16826_ADDRESS);
Wire.write(0x00); // register number to write into
Wire.write(0x80); // set LED output 1 to half power
Wire.endTransmission();

Wenn Dir das nicht genügt, bzw. Deine Frage nicht beantwortet, solltest Du nochmals genau formulieren, was Dein Problem ist. Und poste den bestehenden Code, auch wenn der vielleicht gewisse Features, die Du gerne hättest, noch nicht enthält.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

HI also ich möchte über meine GUI die Steuerparameter (register und data-byte) an dem Arduino senden, um dieses Device (Maxim led driver) anzusteuern.
So nun wenn der Arduino die Daten erhält, soll er sie in die SD karte abspeichern. Der Arduino soll diese dateien auslesen und mit denen das MAxim Board ansteuern.
Das ist, was ich erreichen möchte.
Erste Frage: Der Master(Arduino) soll ja dem Slave(Maxim) mitteilen, ob er schreiben oder lesen möchte, damit wäre meine Adresse 8 bit lang(7bit slave adresse+ 1R/w-Bit) habe aber in der Arudino Library gelesen, dass er mit der 7 Bit Adresse arbeitet? wie mache ich das?
Siehe link: http://arduino.cc/en/Reference/Wire

Zweite frage ist= wie kommst du auf die 0x80 für die halbe power?

Danke dir pylon smiley-grin
« Last Edit: May 06, 2013, 10:06:56 am by milito » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bzw auf welchem Stromwert bezieht sich die 0x80?
Nach meiner Rechnung müssten es 50mA sein , oder täusche ich mich?

meinen i2c code werde ich posten, halt der grobe code ;D
« Last Edit: May 06, 2013, 10:16:07 am by milito » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also der grobe Code aufbau ist folgendermaßen:

Code:
#include "Wire.h"
#define MAXIM_adr 58h;  // Ist 7-Bit adresse vom LED Driver MAXIM
void setup()
{
   Wire.begin();
   Serial.begin(9600);
}
void loop()
{
Wire.beginTransmission(MAXIM_adr);

//sende Register
Wire.write(0x00); // Reg 0-> Strom für led string 1

//sende Stromwert
Wire.write(0x64) // Stromwert für 54,09mA anhand von fomrel vcs berechnet
Wire.endTransmission();
}

Frage ist jetzt bei mir so ich habe ja oben die MAXIM adresse definiert, doch der MAXIM baustein muss ja wissen, ob mein Arduino schreiben oder lesen möchte und somit müsste ich ja das R/W - Bit mitsenden und die Adresse wäre somit 8-bit lang.

Doch die Wire-library arbeitet nur mit den 7-bit.

Wie mache ich das, dass er weiß ob er schrieben oder lesen muss?
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wie mache ich das, dass er weiß ob er schrieben oder lesen muss?
Frag doch Maxim:
http://datasheets.maximintegrated.com/en/ds/MAX16826.pdf ab S. 19 ist die I2C Beschreibung:
Der Arduino fängt auf jeden Fall mit dem Schreiben ( eines Kommando(Register)-Bytes ) an...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ja danke für die info smiley-grin, aber es geht bezüglich der wire-library , die ich dafür verwende. Mein frage war, wie ich dem slave anhand der wire library mitteile, dass ich schrieben oder lesen möchte(das wäre die 8 bit adresse), da die wire library nur 7 bit adresse liest
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das erledigt die Library für dich ...

Oder wühl dich durch bis  libraries\Wire\utility\twi.c Zeile 142, dort wird die Adresse und das R bit zusammengemuschelt.

Der Library sagst du, dass du 1 byte schreiben, dann 1 byte lesen möchtest. 
Wire.requestFrom(addr, 1);
( denk ich, ohne Gewähr ... ) smiley-wink 
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab die stelle gefunden:

Code:
twi_slarw = TE_read;
twi_slarw |= address << 1;

d.h. ich kann ihm von meiner gui aus die 8 bit adresse senden und die librariy shiftet es um 1 nach links d.h. ^damit habe ich dann die 7 bit adresse? Also kann sorgeblos die 8 bit adresse fürs write /read senden?

Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
d.h. ich kann ihm von meiner gui aus die 8 bit adresse senden und die librariy shiftet es um 1 nach links d.h. ^damit habe ich dann die 7 bit adresse? Also kann sorgeblos die 8 bit adresse fürs write /read senden?

Genau anders rum. Du übergibst die 7-Bit-Adresse und die Bibliothek macht durch den Shift eine 8-Bit-Adresse draus, welche dann, um das Schreib-/Lese-Bit ergänzt auf den Bus geschickt wird.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

HI pylon, das verstehe ich nicht sorry so meine 7 bit adresse ist 58 h siehe datasheet S.17.
so jetzt meine verständins frage-> wie soll dann der slave wissen, ob er senden oder empfangen muss vom master, wenn ich nur die 7-bit adresse sende?
kannst ud es mir bitte erklären? Wird es anhand der befehle gemacht?
Also die Read adresse(8bit) laut datenblatt wäre: B1h und write B0h.

Bitte um eine Erklärung danke smiley-grin
Logged

Pages: 1 2 [3] 4   Go Up
Jump to: