Forum: Mikrocontroller und Digitale Elektronik Parität Bits Prüfen


von Anta (Gast)


Lesenswert?

Hallo, ich lese Daten (EM Tags) in Bytes ein, wobei nach jedem vierten 
Bit ein Paritätsbit übertragen wird. Die Paritätbits speichere ich und 
mache anschließend die Prüfung.
Speichern
1
    if (data_bit_counter > 40 && data_bit_counter <= 45) {
2
      if(bit) {
3
        tagData[4] |= (1 << (data_bit_counter -41));
4
      }
5
      else {
6
        tagData[4] &= ~(1 << (data_bit_counter -41));
7
      }
8
    }
9
    else // Parity Check
10
    if (data_bit_counter == 45) {
11
      if (bit) {
12
        paritybits |= (1 << 1);
13
      }
14
    }
15
    else
16
    if (data_bit_counter > 45 && data_bit_counter <= 49) {
17
      if(bit) {
18
        tagData[4] |= (1 << (data_bit_counter -42));
19
      }
20
      else {
21
        tagData[4] &= ~(1 << (data_bit_counter -42));
22
      }
23
    }
24
    else // Parity Check
25
    if (data_bit_counter == 50) {
26
      if (bit) {
27
        paritybits |= (1 << 0);
28
      }
29
    }

Prüfen
1
    tag_nibble = ((tagData[4] & 0b11110000) >> 4);
2
      parity = 0;
3
      for (i = 0; i < 4; i++) {
4
        
5
        if (tag_nibble & 0x8) {
6
          parity += 1;
7
        }
8
        tag_nibble <<=  1;
9
      }
10
      if ((parity & 0x01) != ((paritybits) & 0x01)) {
11
        ParityErrorFlag = true;
12
      }
13
      //  parity second nibble
14
      tag_nibble = (tagData[4] & 0b00001111);
15
      parity = 0;
16
      for (i = 0; i < 4; i++) {
17
        
18
        if (tag_nibble & 0x8) {
19
          parity += 1;
20
        }
21
        tag_nibble <<=  1;
22
      }
23
      if ((parity & 0x01) != ((paritybits >> 1) & 0x01)) {
24
        ParityErrorFlag = true;
25
      }

Leider wird ParityErrorFlag  immer auf "true" gesetzt. Sieht jemand 
einen Denkfehler?

von Detlef K. (adenin)


Lesenswert?

>speichern:
> if(bit) {
bit ist nicht definiert, also kann hier nur einer mit 'ner Glaskugel 
helfen.

prüfen:
im ersten Nibble ergibt
>if (tag_nibble & 0x8) {
spätestens nach dem ersten Schleifenduchlauf immer false :P

im zweiten Nibble ergibt
>if (tag_nibble & 0x8) {
für den ersten Durchlauf immer false
und das LSB wird nie geprüft
und über paritybits kann man hier keine Aussage machen, weil das ja 
schon unbestimmbar ist, weil beim SPEICHERN Variable bit unbekanntes 
Verhalten hat.

: Bearbeitet durch User
von Anta (Gast)


Lesenswert?

Detlef Kunz schrieb:
>> if(bit) {
> bit ist nicht definiert, also kann hier nur einer mit 'ner Glaskugel
> helfen
bit hat den Wert 0 oder 1 und spiegelt den Zustand der Leitung. Also 
soweit in Ordnung.

Detlef Kunz schrieb:
> im zweiten Nibble ergibt
>>if (tag_nibble & 0x8) {
> für den ersten Durchlauf immer false
> und das LSB wird nie geprüft
> und über paritybits kann man hier keine Aussage machen
Hier habe ich nicht verstanden, was du meinst.

von Detlef K. (adenin)


Lesenswert?

Anta schrieb:
> Detlef Kunz schrieb:
> Detlef Kunz schrieb:
>> im zweiten Nibble ergibt
>>>if (tag_nibble & 0x8) {
>> für den ersten Durchlauf immer false
>> und das LSB wird nie geprüft
>> und über paritybits kann man hier keine Aussage machen
> Hier habe ich nicht verstanden, was du meinst.

Ups, mein Fehler.
Neu: für das zweite Nibble ist das ok,

 aber für das erste wird
1
        if (tag_nibble & 0x8) {
immer false ergeben.
Richtig wäre:
1
        if (tag_nibble & 0x80) {

von Anta (Gast)


Lesenswert?

Ich schiebe doch das Byte nach dem ersten nibble um vier Stellen nach 
rechts.

von Detlef K. (adenin)


Lesenswert?

Ah, ja, der Nebel lichtet sich, jetzt sieht eigentlich fast alles ok aus 
:)
Tust Du aber paritybits im ersten Teil auch irgendwann auf 0 setzen.
Ich seh nur das die Bits gesetzt werden.

von Detlef K. (adenin)


Lesenswert?

Und als nächstes:
Wird ParityErrorFlag irgendwann mal rückgesetzt?

von Anta (Gast)


Lesenswert?

Ja, die Sachen werden zurück gesetzt, sobald die schleife durchlaufen 
ist.

von Detlef K. (adenin)


Lesenswert?

Tja, dann musst Du da eben mal mit dem Debugger live den Daten auf die 
Finger sehen.
Vielleicht werden die Paritätsbits von Sender schon falsch gesetzt, oder 
die Auswertung am Schluß ist falsch. Erwartet wird da Even-Parity.
Also die Anzahl der Einsen (einschließlich des Paritätsbit) muss gerade 
sein.
Wenn ich das korrekt sehe.

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.