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. ![]()
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. ![]()
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