32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers

distance |= bit; ist eine Kurzschreibweise für distance = distance | bit; // setze ein bit in distance
bit <<= 1; ist eine Kurzschreibweise für bit = bit << 1; // schiebe bit eins nach links

Das geht mit anderen Operatoren ( + , * , / usw.) auch, und wird oft direkt von der Hardware unterstützt.

Oh ja, mit "+" kenn ich das auch. aber "|=" war mir etwas zu kryptisch.

Ja, das stimmt. Mit 3 shiftIn Befehlen kriegst du 24 bit.

Hmm.... aber dann muss ich mich irgendwie drum kümmern, daß ich dann ins richtige der 3 Bytes schreibe, und daß ich die 3 Bytes am Ende dann zusammenfüge.
Oder denk ich da falsch?

Ich poste jetzt mal meinen Code. Ist vllt. etwas hölzern, aber geht.
Allerdings erkennt er nicht jedes Datenpaket :frowning: Manchmal verwirft er bis zu 4 Pakete, bis er eins dekodiert. Darum dachte ich zunächst, daß die Int-Routine "Takt()" zeitlich an der Grenze ist.
Das mit den millis() hab ich eingebaut , damit ich erkenne wann ein neues Paket startet. Wenn seit 20ms kein Takt mehr da ist, weiss ich daß ich in den 120ms Pause bin, und bei der nächsten Flanke ein neues Paket beginnt.

// Takteingang: PIN2
// Dateneingang: PIN3
// Länge Paket: 24Bit in ca. 10ms
// Anschliessend ca. 120ms Pause
// Das erste Bit des Datenpakets wird verworfen

const int data = 3;
boolean newdata = LOW;
int ctr;
unsigned long time;
long distance = 0;


void setup(){
  Serial.begin (57600);
  pinMode(data, INPUT);
  attachInterrupt(0, Takt, RISING);   //(UNO: Int0 = PIN 2)
}

void loop(){
  if (newdata) {
    time = millis();
  }
  newdata = LOW;
  
  if ((millis() - time) >= 20) {
    if (ctr >= 24) {
     distance = distance >>1;
     Serial.println (distance);
    } 
    ctr = 0;
  }
}

void Takt() {
  newdata = HIGH;
  bitWrite(distance, ctr, !digitalRead(data)); 
  ctr=ctr+1;
}