ver-ODERn läuft schief

Hallo,

so, leider ist das nicht so logisch wie ich dachte bzw. wie es aussieht. Zumindestens für mich. Die Reihenfolge beim zusammensetzen wird umgedreht. Bei einem Array ist Index 0 ganz links das erste und die höchste Indexnummer ganz rechts, die letzte. Nun dachte ich genau wie beim Array werden die 4 Einzelbytes in ein long zusammengesetzt. Jetzt ist aber bei union die Indexreihenfolge oder wie man das nennt vertauscht. Also wieder in Binärlogik. MSR links, LSB rechts. Wieder ganz schön tricky. :wink:

Ist das so richtig? Es muß sichergestellt sein dass vom AD-IC das MSR wirklich links eingesetzt wird und das LSB rechts in der long Variable. Sollte eigentlich passen, bin mir aber nicht mehr sicher nachdem durcheinander. :wink:

unsigned long MCP3550 ()  
{
  unsigned long value = 0;      // zugleich 50ns Zwangspause CS High to Low
  digitalWrite(CS, LOW);        // starte AD Convertion
  delay(80);                    // 80ms typische Conversion Time (MCP3550-50)
  while(digitalRead(MISO) == HIGH)       // warten bis SDO/RDY mit LOW Ready signalisiert
    {
     digitalWrite(CS, HIGH);             // wenn nicht Ready, toggle CS erneut High zu Low
     delay(1);  
     digitalWrite(CS, LOW); 
    }  
  NOP;                            // 20ns Zwangspause
  union {
         unsigned long ADraw;
         byte b[4];
        } data;  
  data.b[3] = 0;                  // Byte mit Nullen füllen, D32 ...D25 nicht vorhanden
  data.b[2] = SPI.transfer(0);    // Byte einlesen, D24 ... D16
  data.b[1] = SPI.transfer(0);    // Byte einlesen, D15 ... D 8
  data.b[0] = SPI.transfer(0);    // Byte einlesen, D 7 ... D 0
  
  digitalWrite(CS, HIGH);
  Serial.print(data.b[3], BIN); Serial.print(" "); Serial.print(data.b[2], BIN); Serial.print(" "); Serial.print(data.b[1], BIN);Serial.print(" "); Serial.println(data.b[0], BIN);
  return data.ADraw;
}

Kann man auch die Variable ADraw immer bei der Definition Nullen und muß dann nicht die höchste Stelle mit data.b[3] = 0; extra Nullen? Sollte doch vom Ergebnis gleich sein? Sollte auch sicherer sein in Unterfunktionen wie ich vor einer Weile erst hier gelernt habe.

union {
         unsigned long ADraw = 0;
         byte b[4];
        } data;                   // data ist der union Name
  data.b[2] = SPI.transfer(0);    // Byte einlesen, D24 ... D16
  data.b[1] = SPI.transfer(0);    // Byte einlesen, D15 ... D 8
  data.b[0] = SPI.transfer(0);    // Byte einlesen, D 7 ... D 0