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!
Ich muss ja irgendwie auf meinen DAC zugreifen, aber wenn ich die Adresse nicht kenne, kann ich es ja nicht machen.
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?
Vorraussetzung ist natürlich, dass du an der Schnittstelle nach dem Device suchst, an der es auch hängt.
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
1 | #include <Wire.h> |
2 | void setup() |
3 | {
|
4 | Wire.begin(); |
5 | Wire1.begin(); |
6 | }
|
7 | |
8 | void loop() {} |
Unter C++ sollte sich doch die Lib für I2C_0 leicht nach I2C_1 portieren lassen.
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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
1 | #include <Wire.h> |
2 | |
3 | |
4 | void setVoltage(TwoWire & wire, const uint8_t address, const uint16_t output, const bool writeEEPROM ) |
5 | {
|
6 | const byte MCP4726_CMD_WRITEDAC = 0x40; // Writes data to the DAC |
7 | const byte MCP4726_CMD_WRITEDACEEPROM = 0x60; // Writes data to the DAC and the EEPROM (persisting the assigned value after reset) |
8 | wire.beginTransmission(address); |
9 | wire.write(writeEEPROM?MCP4726_CMD_WRITEDACEEPROM:MCP4726_CMD_WRITEDAC); |
10 | wire.write(output / 16); // Upper data bits (D11.D10.D9.D8.D7.D6.D5.D4) |
11 | wire.write((output % 16) << 4); // Lower data bits (D3.D2.D1.D0.x.x.x.x) |
12 | wire.endTransmission(); |
13 | }
|
14 | |
15 | void setup() |
16 | {
|
17 | Wire.begin(); |
18 | Wire.setClock(400000UL); |
19 | Wire1.begin(); |
20 | Wire1.setClock(400000UL); |
21 | analogWriteResolution(12); // DUE DAC |
22 | }
|
23 | |
24 | |
25 | void loop() |
26 | {
|
27 | // Saegezahn auf 6 DACs
|
28 | static int i = 0; |
29 | setVoltage(Wire, 0x62, i, false); // MCP4726 |
30 | setVoltage(Wire, 0x63, i, false); // MCP4726 |
31 | setVoltage(Wire1, 0x62, i, false); // MCP4726 |
32 | setVoltage(Wire1, 0x63, i, false); // MCP4726 |
33 | analogWrite(DAC0, i); // DUE DAC |
34 | analogWrite(DAC1, i); // DUE DAC |
35 | if( ++i > 4095) i = 0; |
36 | }
|
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
:
Bearbeitet durch User
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!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.