Hi,
ich habe meine DAC (MCP4725) von Adafruit an meinen Arduino Due
(Anschluss SDA1 und SCL1) angeschlossen und versuche vergebens die
Adresse von dem DAC herauszufinden. Wenn ich meinen DAC an SDA und SCL
anschließe, weiß ich die Adresse(0x62), aber wie kann ich die an SCL1
und SDA1 herausfinden?
I2C Scanner funktioniert leider nicht?
Frank schrieb:> aber wie kann ich die an SCL1> und SDA1 herausfinden?
Meinst du die Adresse vom Master? Wozu brauchst du die?
Der Master adressiert seine Slaves und schreibt auf die oder liest von
denen. Deren Adresse steht im Datenblatt. Der Master hat keine Adresse!
Die I²C-Adresse des DAC bleibt gleich, den dem DAC ist es völlig egal an
welchem I²C-Bus er hängt.
Du musst deiner Arduino-SW sagen über welchen Bus sie kommunizieren
soll.
Alex schrieb:> Die I²C-Adresse des DAC bleibt gleich, den dem DAC ist es völlig> egal an> welchem I²C-Bus er hängt.> Du musst deiner Arduino-SW sagen über welchen Bus sie kommunizieren> soll.
Achso und wie kann ich es ihm sagen?
Frank schrieb:> Achso und wie kann ich es ihm sagen?
Ich kenn die Libs vom Arduino nicht, aber da gibt es sicher was für I2c
und in der Doku dazu steht, wie man die Adresse eines Slaves angibt. Die
weißt du ja:
Frank schrieb:> weiß ich die Adresse(0x62)
Die meisten Arduino Libs für I2C Bausteine nutzen die Wire Klasse.
Frank schrieb:> (Anschluss SDA1 und SCL1)
Hier ist dann Wire1 das Objekt der Begierde.
Frank schrieb:> Achso und wie kann ich es ihm sagen?
Nutze Wire1.
Evtl/meist muss der vorhandene Code/Lib umgeschrieben werden.
Dass es mehrere I2C Busse an einem µC geben kann, ist noch nicht
flächendeckend in der Codebasis angekommen.
Wenn Du auf dem Arduino das I2C Scanner Beispiel startest, muss der
Baustein gefunden werden, sonst stimmt was mit dem Anschluss nicht.
Manchmal haben die Bausteine eine zusätzliche CS-Leitung, die man
konfigurieren muss ( auch im Scanner ).
Außerdem unterscheidet sich die Herstelleradresse von der Lib-Adresse um
den Faktor 2.
Marcus schrieb:> Wenn Du auf dem Arduino das I2C Scanner Beispiel startest, muss der> Baustein gefunden werden, sonst stimmt was mit dem Anschluss nicht.
Wie gesagt:
Der Scanner wird wohl auf Wire1 umgeschrieben werden müssen.
Marcus schrieb:> Wenn Du auf dem Arduino das I2C Scanner Beispiel startest, muss der> Baustein gefunden werden, sonst stimmt was mit dem Anschluss nicht.
Das I2C-Scanner Beispiel scannt afaik nur mit dem "Wire" Objekt. SDA1
und SCL1 werden aber mit "Wire1" angesprochen.
Ergo: Das Scanner scannt den falschen Bus -> Umschreiben
Edit: ufuf war schneller ;)
Wo kann man denn wire1 herunterladen? Ich finde es irgenwie nirgends!
Der Scanner auf:
https://playground.arduino.cc/Main/I2cScanner
funktioniert leider nur beim UNO, 2009 und MEGA, deswegen geht es nicht.
Habe es nämlich auch beim SDA und SCL ausprobiert. Ich kann es nicht
hochladen weil 1000 fehler kommen
Sorry habe gerade gesehen, dass ich wire gar nicht benutze, sondern:
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
.....
.....
dac.setVoltage(ergebnis, false);
Ich fasse mein Problem noch mal zusammen:
Wenn ich meinen DAC(A0 lasse ich offen) mit meinen Due (SDA, SCL)
verbinde, funktioniert alles ohne Probleme.
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
void setup(void) {
Serial.begin(9600);
dac.begin(0x62); //Wenn A0 am DAC offen bleibt, wenn ich A0 mit VDD
verbinde, muss ich 0x63 verwenden
}
void loop(){
...........
dac.setVoltage(ergebnis, false); //Ich bekomme den gewünschten Wert
raus
}
Wenn ich nun anstatt SDA und SCL, SDA1 und SCL1 benutzen möchte, geht es
nicht weil ich ja jetzt die Adresse nicht weiß. 0x62 bzw 0x63
funktioniert dann nicht mehr
Aber es muss doch auch mit SDA1 und SCL1 funktionieren. Die Frage ist
nur, wie?
Frank schrieb:> Sorry habe gerade gesehen, dass ich wire gar nicht benutze, sondern:>> #include <Adafruit_MCP4725.h>
Der Adafruit Code nutzt Wire.
(versuchte ich das nicht schon zu sagen?)
Frank schrieb:> Wenn ich nun anstatt SDA und SCL, SDA1 und SCL1 benutzen möchte, geht es> nicht weil ich ja jetzt die Adresse nicht weiß. 0x62 bzw 0x63> funktioniert dann nicht mehr>> Aber es muss doch auch mit SDA1 und SCL1 funktionieren. Die Frage ist> nur, wie?
Nochmal: das Softwaremodul aus der Arduinolib, welches du benutzt,
spricht die falschen Ports am Prozessor des Arduinos an!
Das hat mit der DAC-Adresse nichts zu tun! Und mit A0 am DAC kannst du
die Adresse, auf die er hört, umstellen - nicht aber die Prozessorports.
So kann man einfachst am gleichen I2C-Bus zwei dieser DACs ansprechen.
Frank schrieb:> Wenn ich nun anstatt SDA und SCL, SDA1 und SCL1 benutzen möchte, geht es> nicht weil ich ja jetzt die Adresse nicht weiß.
Die Adresse von deinem ADC ist nur abhängig vom Pegel an A0. Es ist
vollkommen egal, wo du den anschliesst. Werfe bitte auch einen Blick ins
Datenblatt. Da stehen alle (möglichen) Adressen.
Bei Problemen bietet es sich evtl. an A0 auf einen deffinierten Pegel zu
ziehen.
Achso, ok ich wusste nicht das die Adafruit Bibliothek, Wire nutzt.
Das kann man wahrscheinlich auch nicht ändern auf Wire1 ?
Wire1 kennt mein Arduino nicht. Wo kann man die Bibliothek
herunterladen?
Frank schrieb:> Wire1 kennt mein Arduino nicht. Wo kann man die Bibliothek> herunterladen?
Das glaube ich dir nicht!
Da muss nix runter geladen werden.
Dieser Code kompiliert sauber durch, für den DUE
Peter D. schrieb:> Unter C++ sollte sich doch die Lib für I2C_0 leicht nach I2C_1> portieren> lassen.
Nicht "leicht", zumindest nicht, wenn man es richtig machen möchte.
Wenn man die Lib nicht kopieren möchte, ist eigentlich ein Umbau auf ein
Klassen Template nötig. Da leider nicht alle "Wire" Implementierungen
die gleiche Basisklasse nutzen. Ins Besondere TinyWire und die ESP Wire
fallen da aus dem Rahmen.
Achso, ich bin so ne Pfeiffe.
#include <Wire.h> reicht ja
Ich wollt gar nicht wissen wie lange ich gebraucht habe den Code zu
schrieben. Wenn ich es jetzt mit Wire1 den Code schreiben möchte, kann
ich ja nicht mehr
dac.setVoltage(ergebnis, false);
benutzen.
Habs mit Wire1.write(ergebnis);
versucht. Geht leider nicht.
Jemand ein Tipp?
Frank schrieb:> Jemand ein Tipp?
ja, schreib den Code neu oder gib einen Link zur adafuit LIB
schliesslich kannst du ja immer das *.cpp öffnen alle Vorkommnisse von
wire & co auf wire1 ändern und als neue LIB 1 speichern.
Danke das war eine gute idee, Wire durch Wire1 zu setzen. Geht es auch
beide Bibliotheken zu verwendet? Also einen für Wire und einen anderen
für Wire1 Ich habe es versucht, allerdings ohne Erfolg. Mir wird unter
Sketch - Bibliotheken einbinden - nur eine Bibliothek angezeigt
Joachim B. schrieb:> und als neue LIB 1 speichern.
Überlesen?
Leider kann ich dir nicht sagen, was du falsch machst, da ich von hier
aus nicht auf deinen Monitor schauen kann.
Ist doch irgendwie logisch, oder?
Arduino F. schrieb:> Joachim B. schrieb:>> und als neue LIB 1 speichern.> Überlesen?>> Leider kann ich dir nicht sagen, was du falsch machst, da ich von hier> aus nicht auf deinen Monitor schauen kann.>> Ist doch irgendwie logisch, oder?
So dumm bin dann auch net. Hab natürlich alles geändert. Meine Frage
war, ob es überhaupt möglich ist? Es gibt ja noch andere Dateien wie zum
Beispiel library.properties die es vielleicht verhindern
Frank schrieb:> Meine Frage> war, ob es überhaupt möglich ist?
Gähn...
Ja sicher, sonst würde es ja nicht soooo viele verscheidene Libs in der
Arduino Welt geben.
Frank schrieb:> Es gibt ja noch andere Dateien wie zum> Beispiel library.properties die es vielleicht verhindern
Keinen Texteditor zur Hand, um da mal eben rein zu schauen?
IDE mal neu gestartet?
Die Bib heißt Adafruit MCP4725. Irgendwo muss man doch den Namen ändern
können. Ich ändere den Namen der Zip Datei, den Ordner der drinne ist,
den Name der cpp & h Datei. Den gesamten Inhalt der cpp & h Datei und
trotzdem wird der Bib. Name "Adafruit MCP4725" nicht verändert
Arduino F. schrieb:> Frank schrieb:>> Meine Frage>> war, ob es überhaupt möglich ist?>> Gähn...> Ja sicher, sonst würde es ja nicht soooo viele verscheidene Libs in der> Arduino Welt geben.>> Frank schrieb:>> Es gibt ja noch andere Dateien wie zum>> Beispiel library.properties die es vielleicht verhindern>> Keinen Texteditor zur Hand, um da mal eben rein zu schauen?>> IDE mal neu gestartet?
Doch klar hab reingeschaut. Wenn ich was ändere, wird die Bib. nicht
geladen
Frank schrieb:> Wenn ich meinen DAC(A0 lasse ich offen) mit meinen Due (SDA, SCL)> verbinde, funktioniert alles ohne Probleme.
A0 offen ergibt ein zufallsbedingtes Verhalten, der gehört definiert an
GND oder VCC. Das habe ich vor ein paar Wochen in einem anderen Thread
beschrieben, weil ich an der Stelle Ärger hatte.
InFo schrieb:> Die Adresse von deinem ADC ist nur abhängig vom Pegel an A0. Es ist> vollkommen egal, wo du den anschliesst. Werfe bitte auch einen Blick ins> Datenblatt.
"Ein Blick ins Datenblatt" ist der einzig sinnvolle Teil Deiner Aussage!
"Nur abhängig vom Pegel an A0" ist Quark, hier würde ein Blick ins
Datenblatt helfen: Es gibt Varianten des 4725 mit unterschiedlichen
Basisadressen, A0 ändert diese lediglich um eins.
Als Bastler ist mir das egal, beim Schlitzauge kaufen, I2C-Scanner
drüber und gut, sind eh nur Einzelstücke. Für eine Serie müsste ich
gucken, welchen genauen Typ des 4725 ich bekomme.
Wie kommst du drauf, dass es Probleme gibt, wenn ich A0 offen lasse?
Auf der Seite wird das so beschrieben:
https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/wiring
Auf deinen Bild sehe ich einen anderen Hersteller.
Dieses ADDR finde ich auf meiner Platine gar nicht
Frank schrieb:> Wie kommst du drauf, dass es Probleme gibt, wenn ich A0 offen lasse?
Wenn man den Chip MCP4725 alleine betrachtet, muss man A0 beschalten.
Auf den Adafruit-Board sind neben dem MCP4725 aber noch 3 Widerstände
und ein Kondensator eingebaut. Dabei ist der Widerstand R3 (10kOhm) ein
Ziehwiderstand an A0 nach GND.
Daher ist es richtig:
- beim MCP4725 darf man A0 nicht offen lassen
- beim MCP4725-Board von Adafruit darf man A0 offen lassen. Dann ist
A0=0.
Frank schrieb:> Ich habe es hingekriegt.
Diese Antwort wird natürlich jedem, der auch das Problem hat, prima
helfen.
Bloß nicht selber was zum Forum beitragen.
Peter D. schrieb:> Frank schrieb:>> Ich habe es hingekriegt.>> Diese Antwort wird natürlich jedem, der auch das Problem hat, prima> helfen.> Bloß nicht selber was zum Forum beitragen.
Ach...
Dass muss man hier nicht so Ernst nehmen.
Dieses finde ich viel interessanter:
Frank schrieb:> Auf deinen Bild sehe ich einen anderen Hersteller.> Dieses ADDR finde ich auf meiner Platine gar nicht
Aus meiner bescheidenen Betrachtungsweise, hat der TE mitzuteilen,
welches Board verwendet wird.
Alles in allem, sind das Zeichen dafür, dass die Sozialisierungsphase
noch nicht abgeschlossen ist, oder irgendwie in die Irre gelaufen ist.
Leider habe ich weder einen DUE, noch den DAC im Zugriff..
Hier also eine völlig ungeprüfte Variante.
Der Code stammt aus der Adafruit Lib, nur grob zurechtgestutzt, damit er
in dieses Korsett passt.
Sechs DACs am Arduino DUE
2 davon stecken im µC selber
Arduino F. schrieb:> Hier also eine völlig ungeprüfte Variante.> Der Code stammt aus der Adafruit Lib, nur grob zurechtgestutzt, damit er> in dieses Korsett passt.
ging es nicht um die Verwendung von wire1?
gehört nicht überall wire1 geschrieben?
Arduino F. schrieb:> #include <Wire.h>>> void setVoltage(TwoWire & wire, const uint8_t address, const uint16_t> output, const bool writeEEPROM )> {> const byte MCP4726_CMD_WRITEDAC = 0x40; // Writes data to the> DAC> const byte MCP4726_CMD_WRITEDACEEPROM = 0x60; // Writes data to the> DAC and the EEPROM (persisting the assigned value after reset)> wire.beginTransmission(address);> wire.write(writeEEPROM?MCP4726_CMD_WRITEDACEEPROM:MCP4726_CMD_WRITEDAC);> wire.write(output / 16); // Upper data bits> (D11.D10.D9.D8.D7.D6.D5.D4)> wire.write((output % 16) << 4); // Lower data bits> (D3.D2.D1.D0.x.x.x.x)> wire.endTransmission();> }
Joachim B. schrieb:> ging es nicht um die Verwendung von wire1?>> gehört nicht überall wire1 geschrieben?
Arduino stellt Wire und Wire1 bereit, in der Funktion wird wire
verwendet.
(beachte klein/groß Schreibung)
Das Wire, oder Wire1 Objekt wird der Funktion als Referenz/Parameter
übergeben.
Der Programmierer kann also frei wählen welches Wire er verwenden
möchte...
Das sollte so mit allen SAM und AVR Mega Arduinos funktionieren.
Mit Tinys allerdings immer noch nicht, da dort eine andere Basisklasse
verwendet wird.
Arduino F. schrieb:> Arduino stellt Wire und Wire1 bereit, in der Funktion wird wire> verwendet.
das weiss ich doch,
der TO fragt wie er auf wire1 umstellt und du bringst ein Beispiel mit
wire
DAS meinte ich, aber egal er hat es ja gelöst, also sinnlos hier weiter
zu diskutieren
Joachim B. schrieb:> DAS meinte ich, aber egal ...
Nee, die kleine Denkhürde schaffst du!
Kneifen gilt nicht!
Habe vertrauen, lese im Schritttempo.
Joachim B. schrieb:> der TO fragt wie er auf wire1 umstellt
Nein!
Der TO möchte Wire UND Wire1 verwenden.
Von wire oder wire1 war nie die Rede
Joachim B. schrieb:> und du bringst ein Beispiel mit wire
Ja!
Aber vielleicht ist das alles zu wirr für dich?
;-) ;-) ;-)
Arduino F. schrieb:> Nein!> Der TO möchte Wire und Wire1 verwenden.> Von wire oder wire1 war nie die Rede
oh doch (wenn man den Wire & Wire1 nimmt)
Dein Beispiel ist für Wire1 nicht nutzbar mangels 1
Arduino F. schrieb:> #include <Wire.h>>> void setVoltage(TwoWire & wire, const uint8_t address, const uint16_t> output, const bool writeEEPROM )> {> const byte MCP4726_CMD_WRITEDAC = 0x40; // Writes data to the> DAC> const byte MCP4726_CMD_WRITEDACEEPROM = 0x60; // Writes data to the> DAC and the EEPROM (persisting the assigned value after reset)> wire.beginTransmission(address);> wire.write(writeEEPROM?MCP4726_CMD_WRITEDACEEPROM:MCP4726_CMD_WRITEDAC);> wire.write(output / 16); // Upper data bits> (D11.D10.D9.D8.D7.D6.D5.D4)> wire.write((output % 16) << 4); // Lower data bits> (D3.D2.D1.D0.x.x.x.x)> wire.endTransmission();> }
:P
Joachim B. schrieb:> Dein Beispiel ist für Wire1 nicht nutzbar mangels 1
Da steckst du ganz tief in einem Irrtum.
Und dein, an dieser konkreten Stelle deplatziertes, Selbstvertrauen
steht der Erkenntnis im Wege.
Auch wenn du nicht zwischen wire und Wire unterscheiden willst, der
Kompiler tut das.
Der Kompiler gehorcht mir.
Arduino F. schrieb:> Wie gesagt:> Der Scanner wird wohl auf Wire1 umgeschrieben werden müssen.Arduino F. schrieb:> Der Kompiler gehorcht mir
aber nicht wenn du Wire1 ansprechen willst und nur Wire in deinem
Beispiel schreibst :P
so wird das nix auch nicht als Arduino Fan
Joachim B. schrieb:> aber nicht wenn du Wire1 ansprechen willst und nur Wire in deinem> Beispiel schreibst :P
Ich habe in meiner Funktion wire geschrieben, und nicht Wire.
Joachim B. schrieb:> so wird das nix auch nicht als Arduino Fan
:-)
Achte drauf, das geht ganz fürchterlich nach hinten los.
Du wirst zu Kreuze kriechen, und mich um Verzeihung bitten.
Freiwillig.
Tipp:
Schaue dir den ersten Parameter der Funktion an.
Schaue ihn dir ganz genau an.
Einmal bitte bei der Funktionsdefinition, und auch da, wo sie aufgerufen
wird.
Auf Fachchinesisch heißt das Verfahren "Dependency Injection", wenn ich
mich nicht irre.
Nachtrag:
Ich versuchs mal noch klarer zu sagen....
Das ursprüngliche Problem war, dass die Adafruit Lib fest an Wire
gekoppelt war/ist.
Diese feste Koppelung habe ich gelöst, in dem ich eine Referenz auf die
konkret genutzte I2C Schnittstelle, in die Funktion injiziere.
Lose Koppelung, vs. starre Koppelung.
Arduino F. schrieb:> Diese feste Koppelung habe ich gelöst,
ah OK
DAS ist mir entgangen, du trägst deinen stolzen Namen zu Recht, ich
verneige mich, Hauptsache bleibt Arduino wird hier nicht verteufelt, ich
mag die kleinen Biester echt.
Arduino F. schrieb:> setVoltage(Wire, 0x62, i, false); // MCP4726> setVoltage(Wire, 0x63, i, false); // MCP4726> setVoltage(Wire1, 0x62, i, false); // MCP4726> setVoltage(Wire1, 0x63, i, false); // MCP4726
Tja, und jetzt noch den genauen Typ des Käfers - Anhang!