mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Parity berechnen ? BASCOM


Autor: Stefan J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits !!



Ich muss von ein paar empfangenen Daten die Parity prüfen.
Also es werden 6 Bit übertragen und das 7. ist das Prüfbit.

Nun muss ich ja errechnen ob die Summe der gesetzten Bits gerade oder
ungerade ist und das dann mit dem Prüfbit vergleichen.
Irgendwie sind alle Wege die ich mir so vorstelle um das
zu Berechnen total kompliziert. g
Zumal ich den µC auch beibringen muss was "gerade" oder "ungerade"
ist ?!?!

Hat da einer eine elegant einfache Lösung zur Prüfung der Parity?

Thanks !

Stefan

Autor: harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

mit dem modulo-operator (gibt's in den meisten wenn nicht gar in allen
programmiersprachen).
der gibt den rest einer division aus, isser 1 isses ungerade, isser 0
isses gerade.

gruss, harry

Autor: harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh sorry, steht ja im header - BASCOM

da geht's so: x = y mod 2

wenn x = 1 dann ist y ungerade, ansonsten gerade

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ansonsten mach ne und verknüpfung mit 1. kommt aufs gleiche raus und
geht auf jeden fall immer! und ich denk mal auch schneller...

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Harry, das ist keine Parity, damit wird nur ermittelt ob die Zahl
ungerade oder gerade ist.

Es gibt 3 unterschiedliche Algorithmen:

1.) Lookuptabelle: zB. für 8Bit Werte wird eine Lookuptabelle zu jedem
der 256 möglichen Werte gespeichert, Dies Tabelle enthält dann zu jedem
dieser Werte die Anzahl der gesetzten Bits. Ist diese Anzahl ungerade so
wäre Parity = 1. Man kann nun diese Tabelle schrittweise verkürzen. Denn
alle Werte von 0 bis 127 haben die negierte Parity zu allen Werten von
128 bis 255. Logisch da Werte >= 128 immer ein Bit mehr haben als deren
Parallelwerte zwischen 0 bis 127. Natürlich kann man dies weitertreiben
und wiederum die Tabelle halbieren auf 64 Einträge, usw. usw. Herraus
käme Algorithmus 2.)

2.) in einer Schleife wird der Wert solange durch 2 dividiert bis er 0
ist. Vor jeder Division durch 2 == rechtsshift wird überprüft ob der
Wert ungerade ist, und falls ja der Parity-Zähler inkrementiert. Man
zählt also die 1 Bits in dem Wert. Parity = BitAnzahl and 1.

3.)

 A = 8 Bit Input
 A = (A div 2^4) xor (A and 2^4 -1)
 A = (A div 2^2) xor (A and 2^2 -1)
 A = (A div 2^1) xor (A and 2^1 -1)
 A = Parity

in C

 A = (A >> 4) ^ (A & 0x0F)
 A = (A >> 2) ^ (A & 0x03)
 A = (A >> 1) ^ (A & 0x01)


Gruß Hagen

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> A = (A >> 4) ^ (A & 0x0F)
> A = (A >> 2) ^ (A & 0x03)
> A = (A >> 1) ^ (A & 0x01)

besser, die "unds" kannst du sparen:
A ^= A >> 4;
A ^= A >> 2;
A ^= A >> 1;
parity = A & 1;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.