i2C Multiplexer

Hallo alle miteinander,

seit kurzem beschäftige ich mich mit dem Multiplexer ADG728 von Analog Devices.
Diesen möchte ich dazu verwenden 8 Sensoren mittels dem UNO einzulesen.

Laut Datenblatt werden die unterschiedlichen Schalterpositionen mittels eines 8-Bit Wortes geschalten. Beispiel: 10000000 für Pos#8 00000001 für Pos#1 etc.
welche ich in einem Array verpackt habe.

Es sollen nun alle der Reihe nach durchgeschalten und dannach die Sensorwerte eingelesen werden.

Aber: Es wird nicht durchgeschalten, sondern immer nur das erste Byte im array verwendet.

Vielleicht sieht jemand den Fehler im nachfolgenden Code ?
Damit wäre mir sehr geholfen.

//Use the ADG 728 Multiplexer for sensing up to 8 Sensors


#include <Wire.h>    // include the wire library for i2c communication
//#define MUX_Adress 0x4C // AGD728 MUX Adress

//int analogPin = A1;                        // Pin for reading the sensor values with the integrated 10 bit ADC , 4.9mV resolution @ 5 Volt, integer values between 0 and 1023
//int sensorwert = 0;                        // variable to store the value read
//byte myswitch[8] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80}; // hex for selecting the different switch position
byte myswitch[] = {
                   0b10000000, //#8
                   0b01000000, //#7
                   0b00100000, //#6
                   0b00010000, //#5
                   0b00001000, //#4
                   0b00000100, //#3
                   0b00000010, //#2
                   0b00000001,  //#1
                   };                      // Binarys for selecting the different switch position

void setup(){
  Serial.begin(9600);                      //  setup serial
  Wire.begin();                            // join i2c bus (address optional for master)
             }
             
void loop() {
  
Wire.beginTransmission(0x4C);           // initialize transmission with to ADG728
for ( int i = 0; i < 8; ++i){           //loop through each channel of the mux
Wire.write(myswitch[i]);
Wire.endTransmission(); 
int sensorwert = analogRead(A1);
 delay(500);
                         
 Serial.print("Sensor");                // debug value
 Serial.print(i);                       // debug value
 Serial.print(":");                     // debug value
 Serial.println(sensorwert);            // debug value
 Serial.print("Einheit");               // debug value
 Serial.println(myswitch[i], BIN);      // debug value
  delay(1000);
                             }
           }

Mfg S.

(deleted)

Ste_Trat:
Es sollen nun alle der Reihe nach durchgeschalten und dannach die Sensorwerte eingelesen werden.

Aber: Es wird nicht durchgeschalten, sondern immer nur das erste Byte im array verwendet.

Vielleicht sieht jemand den Fehler im nachfolgenden Code ?

Wenn Du den Code vorher mit STRG-T formatiert hättest, wäre das einfacher gewesen.

void loop()
  {
  Wire.beginTransmission(0x4C);           // initialize transmission with to ADG728
  for (int i = 0; i < 8; ++i)             //loop through each channel of the mux
    {
    Wire.write(myswitch[i]);
    Wire.endTransmission(); 
    int sensorwert = analogRead(A1);
    delay(500);
    Serial.print("Sensor");                // debug value
    Serial.print(i);                       // debug value
    Serial.print(":");                     // debug value
    Serial.println(sensorwert);            // debug value
    Serial.print("Einheit");               // debug value
    Serial.println(myswitch[i], BIN);      // debug value
    delay(1000);
    }
  }

Dein Fehler ist, das Du mit
Wire.endTransmission();
nach der ersten Übertragung alles weitere verhinderst.

Zwei Möglichkeiten:
A) Wire.beginTransmission(0x4C);
das muss vor
Wire.write(myswitch*);*
B) Wire.endTransmission();
das muss nach

  • delay(1000);*
  • }*
    Ich favorisiere die Variante B) A) :wink:

Wire.endTransmission();

Rückgabe auswerten!

B) Wire.endTransmission();
das muss nach
delay(1000);
}

Ich favorisiere die Variante B)

Vielleicht noch mal drüber nachdenken....

for ( int i = 0; i < 8; ++i)           //loop through each channel of the mux
{
  Wire.beginTransmission(0x4C);           // initialize transmission with to ADG728
  Wire.write(myswitch[i]);
  Wire.endTransmission();

combie:
Rückgabe auswerten!

Vielleicht noch mal drüber nachdenken....

Gemacht.
Danke.

Gemacht.

Und?
Erfolg gehabt dabei?

my_xy_projekt:
Dein Fehler ist, das Du mit
Wire.endTransmission();
nach der ersten Übertragung alles weitere verhinderst.

Danke dir !
Jetzt seh ichs auch...
:smiley:

combie:
Und?
Erfolg gehabt dabei?

Eingeprägt, das nach beginTransmission alles mit write in eine Warteschlange geht und erst endTransmission die Übertragung anstösst.
Das wird sich zeigen, wenn ich es tatsächlich einsetzen muss.