Forum: Mikrocontroller und Digitale Elektronik Richtig XORen


von Peter (Gast)


Lesenswert?

Hallo,

habe einen kleinen Hänger in der Birne.

Mein Problem ist folgendes, ein µC liest 4 Byte ein und soll ein 
Statusbyte ausgegeben.

Hier mal ein Beispiel:


Byte1 = 11111111  |  11111111  |  10011111
Byte2 = 11111111  |  11101111  |  11111111
Byte3 = 11111111  |  11111111  |  11011111
Byte4 = 11111111  |  11111111  |  11111101
        --------  |  --------  |  --------
Status= 11111111  |  11101111  |  10011101

Das Statusbyte soll also die Nullen in den 4 Einzelbytes finden, ist 
keine 0 vorhanden soll alles 1 sein.

Wie bekomme ich das mit logik umgesetzt?

Mein Ansatz war XOR, doch alle spielerein ergaben Müll.

MFG
Peter

von Helmut -. (dc3yc)


Lesenswert?

Ich würd's mit AND probieren!

von Peter (Gast)


Lesenswert?

Das Problem ist mit AND bekomme ich meine 0, jedoch nie wieder eine 1.
Was ich suche ist die Möglichkeit festzustellen ob ein Bit in den 4 
Eingangsbytes gekippt ist und wenn ja soll diese Bitposition im 
Staatusbyte getoggelt werden.

MFG Peter

von Christian G. (christian_g83)


Lesenswert?

Peter schrieb:

> ist keine 0 vorhanden soll alles 1 sein

Und genau das macht eine UND-Verknüpfung.

Christian

von Tobi (Gast)


Lesenswert?

1
status = byte1 & byte2 & byte3 & byte4;

würde genau das machen, was du oben in der Tabelle hast. Wenn du alle 
stellen, die in mindestens einem der vier Bytes 0 ist, nur toggeln und 
nicht auf 0 setzen willst, dann könntest du sowas machen:
1
status ^= ~(byte1 & byte2 & byte3 & byte4);

Allerdings bin ich auch der Meinung, dass ein einfaches AND genau das 
ist, was du suchst.

von Helmut -. (dc3yc)


Lesenswert?

Wenn AND nicht funktioniert, machst du was falsch oder es fehlen 
essentielle Angaben zu deinem Problem!

von Peter (Gast)


Lesenswert?

Ich versuch es nochmal genauer zu beschreiben.
Ich beschränke mich jetzt mal auf 2 Byte...

1.Fall das 6.Bit in Byte 1 ist 0 geworden.

Byte1  10111111
Byte2  11111111   mit AND lösbar
Status 10111111

2.Fall das 6.Bit in Byte 1 ist 1 geworden.

Byte1  111111111
Byte2  101111111  nicht mit AND lösbar
Status 111111111

Ich möchte sozusagen auswerten ob ein Bit 0 oder 1 wird und genauso soll 
das Bit im Statusbyte kippen.

MFG
Peter

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Ich versuch es nochmal genauer zu beschreiben.
> Ich beschränke mich jetzt mal auf 2 Byte...
>
> 1.Fall das 6.Bit in Byte 1 ist 0 geworden.
>
> Byte1  10111111
> Byte2  11111111   mit AND lösbar
> Status 10111111
>
> 2.Fall das 6.Bit in Byte 1 ist 1 geworden.
>
> Byte1  111111111
> Byte2  101111111  nicht mit AND lösbar
> Status 111111111

          ^   sei wann ergibt denn 1 AND 0 eine 1 im Ergebnis?


Entweder hast du jetzt ein schlechtes Beispiel gewählt oder du denkst am 
Problem vorbei oder du hast immer noch nicht richtig erklärt, was du 
eigentlich erreichen willst.

von Peter (Gast)


Lesenswert?

Darum steht dort ja auch nicht mit AND lösbar

von Michael K. (mmike)


Lesenswert?

Peter schrieb:
> Was ich suche ist die Möglichkeit festzustellen ob ein Bit in den 4
> Eingangsbytes gekippt ist und wenn ja soll diese Bitposition im
> Staatusbyte getoggelt werden.

Ich würds so machen:

1. Von jedem Status-Byte den letzten Zustand merken. Das ver-xoren 
ergibt dann die Änderung:

Byte1 ^ LastByte1 = ChangeByte1
LastByte1 = Byte1

2. Das für alle Statusbytes (1-4) durchführen und am Ende alle 
ChangeBytes verodern ...

Grüße,
Michael

von Tobi (Gast)


Lesenswert?

Also willst du im Statusbyte nur die Nullen aus Byte1 haben und nicht 
aus Byte2? Ich verstehe einfach nicht, warum in deinem zweiten Beispiel 
im zweiten Fall das Statusbyte komplett auf 1 sein soll.

von apr (Gast)


Lesenswert?

Schreib doch mal exakt auf, was du möchtest bisher sehe ich folgende 
Funktion:
1
Byte1 | Byte2 | x
2
------+-------+-----
3
    0 |     0 | dont care
4
    0 |     1 | 0
5
    1 |     0 | 1
6
    1 |     1 | dont care
7
8
--> x = Byte1

von Martin (Gast)


Lesenswert?

Peter schrieb:
> Das Statusbyte soll also die Nullen in den 4 Einzelbytes finden, ist
> keine 0 vorhanden soll alles 1 sein.

Hier schreibst du, dass wenn keine 0 ist, dann soll alles 1 sein.

Peter schrieb:
> 2.Fall das 6.Bit in Byte 1 ist 1 geworden.
>
> Byte1  111111111
> Byte2  101111111  nicht mit AND lösbar
> Status 111111111

Hier macht du ein beispiel, wo trotz 0 alles 1 ist. Also irgendwie ist 
da noch ein hänger drin.

von High Performer (Gast)


Lesenswert?

So wie ich dich verstanden habe, möchtest du Veränderungen im 
Eingangszustand feststellen. Dazu benötigst Du auf jeden Fall 
Zwischenspeicher, musst also irgend welchen vorausgegangenen Zustände 
speichern (sonst lässt sich ja keine Veränderung feststellen).

OK, so weit so gut. Wir können das Problem ja einfach auf eine Bitfolge 
reduzieren (entspricht einer Bitspalte in Deinen Darstellungen).

Wenn ich jetzt Deine Anforderungen richtig verstanden habe, soll, falls 
ein beliebiges Bit 0 wird, das Statusbit auch 0 werden. Wenn noch 
zusätzliche Bits 0 werden, soll das Statusbit 0 bleiben. Wenn hingegen 
irgend ein Bit seinen Zustand auf 1 wechselt, soll das Statusbit 
ebenfalls 1 werden.

So lange keine Änderungen im Eingangszustand auftreten, soll der Status 
ebenfalls unverändert bleiben.

Habe ich die Aufgabe so richtig verstanden?

Was machst Du dann, wenn ein Bit von 0 auf 1 wechselt, ein anderes dafür 
jedoch von 1 nach 0?

Das wäre noch zu klären.

von Peter (Gast)


Lesenswert?

Mhh es gibt 32 Eingänge diese sind in 4 Gruppen a 8 Inputs aufgeteilt.

Byte1 = 1. Gruppe
Byte2 = 2. Gruppe
Byte3 = 3. Gruppe
Byte4 = 4. Gruppe

Diese 32 Inputs sollen 8 Ausgänge schalten. Dabei soll die Funktion 
ähnlich eines Stromstossrelais sein.
Da die 4 Gruppen sich untereinander nicht unterhalten können, muss der 
µC die Zustände synchronisieren.

Die Schalter besitzen eine eigene Elektronik und liefern die Zustände 
zurück, die sie seit dem letzten Auslesen gespeichert haben.

Jetzt sollen alle 4 Gruppen auf einen Stand gebracht werden.
Der µC liest alle 4 Gruppen aus und soll die Änderungen seit dem letzten 
auslesen feststellen. Daraus soll der aktuellen Stand ermittelt werden, 
diesen Zustand schickt er dann an die 4 Gruppen zurück, da diese die 
Zustände visualisieren.

von apr (Gast)


Lesenswert?

Wenn mich nicht alles täuscht möchtest du die Flanken erkennen und den 
Status entsprechend der Richtung setzen, falls eine aufgetreten ist.
Wenn ich mich nicht vertan habe:
1
status = (byte1 & status) | (~old_byte1 & ~byte1 & status) | (~old_byte1 & byte1 & ~status);
2
old_byte1 = byte1;
3
status = (byte2 & status) | (~old_byte2 & ~byte2 & status) | (~old_byte2 & byte2 & ~status);
4
old_byte2 = byte2;
5
...

bzw.
1
edge1 = old_byte1 ^ byte1;
2
status &= ~(edge1); // clear all edges
3
status |= (edge1 & byte1); // set all positive edges
4
old_byte1 = byte1;
5
6
edge2 = old_byte2 ^ byte2;
7
status &= ~(edge2); // clear all edges
8
status |= (edge2 & byte2); // set all positive edges
9
old_byte2 = byte2;
10
...

von Kurt (Gast)


Lesenswert?

Wenn du nur 1-en übertragen willst und auf
fehlerhafte o-en prüfen musst, dann ist das doch
Quatsch. Erzeuge die 1-en doch gleich im Empfänger.

Normalerweise prüft man nicht, ob aus einer 1 mal
eine 0 geworden ist, sondern, ob sich Bits geändert
haben.

Das hat man mal mit Quer- und Längsparität gemacht,
heute wird CRC bevorzugt.

Wenn bei dir aber 0 & 1 nicht das gleiche Ergebnis
hat, wie 1 & 0, dann ist da ein Problem auf der
Platine,  ... oder es sitzt davor.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.