Arduino als I2C Slave Daten auswerten, 8 Bit in 8 Werte umwandeln?

Guten Tag, ich arbeite momentan An einer "Leitungs-Prüfbox" zum Feststellen von den Verbindungen von x1 zu x2. (wobei ich auf X1 jeden Pin einzeln mit Negativer Logik ansteure und auf X2 dann alle Auslese)
Der Aufbau funktioniert soweit eigentlich warte momentan nur noch auf die Platine.
in eine andere Box wo ein Arduino UNO (2) und ein LCD Display drin sitzt sollen jetzt die Daten die der Arduino UNO (1) in der Leitungsprüfbox ermittelt von X1/X2 mittels I2C übertragen werden.

Leitungs-Prüfbox:
Ich benutze je 1 PCA9505 für X1 und X2, damit ich Kabelstränge/Kabelbäume mit bis zu 40 Pins testen kann. Wie beim I/O Expander üblich sende ich ihm die zu schreibenden Daten von X1 im 8 BIT und lese diese von X2. die ersten 12 Pins werden mir auf einer LED "Matrix" (jede LED wird einzeln über 5 weitere PCA9505 I/O Expander angesteuert)
angezeigt.

Beispiel:
Ich sende über X1 Ich empfange an X2
11111110 11110110
11111101 11111101
11111011 10111111
... ...
jetzt ist X1_1 mit X2_1 & X2_4 verbunden.
x1_2 mit x2_2 und x1_3 mit x2_7

I2C Problem:

Wie lese ich die Daten richtig um diese auszuwerten?
wie stelle ich es an da die richtige Reihenfolge zu haben?

ich dachte an ein Initialisierung Bit vor jedem Status von X1 & X2
so ungefähr hab ich mir das vorgestellt

Arduino (1) sender
00000000 // Initialisierung byte
11111110 // X1 Out
11110110 // X2 In

I2C

Arduino (2) Empfangen
00000000 // Initialisierung byte
11111110 = x1.1 // X1 Out
11110110 = x2 // X2 In

Arduino 2
11111110 XOR = 00000001 //X1
11110110 XOR = 00001001 //X2

Wie werte ich jetzt x2 Aus?
man kann zwar eine Menge if, if else abfragen machen (256 st.) aber das ist ja keine schöne Lösung und ziemlich viel Schreiberei.
Kann man irgendwie ein Byte in 8 Variablen ausgeben damit ich jede zahl einzeln auswerten kann?

am Ende soll da stehen das:
x1_1 = x2_1, x2_4
und dann das gleiche für alle andern 40 Pins

ich hoffe ich hab mein Vorhaben ausführlich genug erklärt damit man es nachvollziehen kann

finde leider nix im Netz dazu aber wahrscheinlich hab ich es auch einfach nur übersehen.

Danke für Hilfe

Wenn du statt so einer Ausgabe

11111110          ->           11110110

lieber das invertierte siehst

00000001          ->           00001001

oder sowas

76543210   -> 76543210
       x          x  x

dann schreib dir eine Routine, die eine Schleife enthält und arbeite alle Bits ab.

am Ende soll da stehen das:
x1_1 = x2_1, x2_4

Wenn das wirklich besser lesbar ist, kannst du das natürlich auch machen. Viel Spaß :wink:

Um einzelne Bits eines bytes oder einer long Varariable ( 32 bit ) zu bearbeiten, gibt es bitRead usw.
( 40 bit ist etwas viel für eine einzelne Variable, da passen besser byte arrays )

Welcher Arduino ist der I2C-Master, welcher der Slave?

Vorschlag zur Datenstruktur:

byte tranfer[6];
transfer[0] // Nummer der Messung 1-40
transfer[1] // erstes Bitmuster Ergebnis
transfer[2] //
transfer[3] //
transfer[4] //
transfer[5] // fünftes Bitmuster Ergebnis

Bin mir aber nicht sicher, ob ich Dich richtig verstanden habe.

Hallo,

@ micha:
ich glaube er hat kein Problem mit invertieren, er hat ein grundsätzliches Empfangsproblem, er empfängt nicht das was er gesendet hat.

Vorschlag. Rahme das zu übertragende Kommando oder was auch immer ein. Voran ein Startzeichen und hinten ein Endezeichen. Die fragst Du beide beim empfangen und einlesen ab usw. Dann hast Du immer einen gesicherten Anfang und Ende. Wenn die Zeichenlänge immer konstant ist, kannste noch die empfange Gesamtlänge prüfen damit mehr Sicherheit reinkommt. Falls sie variiert, ermittelst Du vorm senden die Länge und hängst das mit ran vorm Endezeichen oder am Anfang. Nach dem Empfang ziehste Dir den Wert raus und prüfst die Länge. Gibt da viele Möglichkeiten.