mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gerade Parität berechnen


Autor: Tobias Michaels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe ein eher kleines Problem! Ich möchte eine gerade Parität für
ein Byte berechnen. Vielleicht wirft jemand einen Blick auf den Code
und sagt mir, ob ich einen Denkfehler gemacht habe oder ob das so
hinhaut.

bitcount=0;
  for (j=7;j>0;j--)
    bitcount += byte>>j;
if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8))
    cbi(UCSR0B,TXB8);
  else
    sbi(UCSR0B,TXB8);

Danke

Tobi

Autor: Tobias Michaels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kleines Update: Ich habs noch ein bischen verändert:

bitcount=0;
  for (j=7;j>0;j--)
    if (byte>>j)
      bitcount++; 
if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8))
    cbi(UCSR0B,TXB8); //ParityBit löschen
  else
    sbi(UCSR0B,TXB8);//ParityBit setzen

Autor: René König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) Du mußt j mit 8 initialisieren. Du zählst eins zu wenig.
2) Es reicht, wenn Du das LSB von bitcount testest

Davon unabhängig habe ich das mal ein wenig umgestrickt:

bool IsOddParity(unsigned char byt)
{
  int bitcount;

    for(bitcount = 0; byt; byt >>= 1)
        if(byt & 1)
            ++bitcount;

  return(bitcount & 1);
}

bool IsEvenParity(unsigned char byt)
{
  return(!IsOddPar(byt));
}

.
.
.

if(IsEvenParity(byte))
    cbi(UCSR0B,TXB8); //ParityBit löschen
else
    sbi(UCSR0B,TXB8);//ParityBit setzen

Autor: Tobias Michaels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe den Code leider nicht wirklich. Und kompilieren tut er ihn
auch nicht, also werde ich erstmal meinen Code benutzen und j mit 8
initialisieren!

Danke

Tobi

Autor: Tobias Michaels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider funktioniert die Berechnung auchnicht, wenn ichj mit 8
initialisiere:
bitcount=0;//new parity routine
  for (j=8;j>0;j--)
    if ((byte>>j) & 1)
      bitcount++;
  while (bit_is_clear(UCSR0A,UDRE)) ;
  if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8)){
    cbi(UCSR0B,TXB8);
    sbi(PORTC,PC0);//switch LED off
  }else{
    sbi(UCSR0B,TXB8);
    cbi(PORTC,PC0);  //switch LED on
  }


Findet jemand den Fehler? Ich sehe ihn nämlich leider nicht!

Tobi

Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bitcount=0;//new parity routine
  for (j=8;j>0;j--)
    if ((byte>>j) & 1)
      bitcount++;
  while (bit_is_clear(UCSR0A,UDRE)) ;

in deiner Schleife werden Bit 8 bis 1 abgefragt anstatt 7 bis 0!
    for (j=7; j>=0;j--)

if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8)){

diese if-Abfrage geht ein wenig kürzer:
if (!(bitcount & 1))  /* bitcount gerade? */

    cbi(UCSR0B,TXB8);
    sbi(PORTC,PC0);//switch LED off
  }else{
    sbi(UCSR0B,TXB8);
    cbi(PORTC,PC0);  //switch LED on
  }

mfg
werner

Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
wollte noch dazuschreiben, daß es Bit8 natürlich nicht gibt
mfg
werner

Autor: Tobias Michaels (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! Es war wohl ein grundlegendes Verständnisproblem  :))
Du hast mir sehr geholfen!

Tobi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ungerade Parität ist einfach das XOR über alle Bits:

P=bit0^bit1^bit2^bit3^bit4^bit5^bit6^bit7


Für die gerade Parität invertiert man das ganze nochmal.

Als Kode kann das dann z.B. so aussehen:


unsigned char even_parity( unsigned char i )
{
  i ^= i >> 4;          // xor bit wise: 0=0^4, 1=1^5, 2=2^6, 3=3^7
  i ^= i >> 2;          // xor bit wise: 0=0^2, 1=1^3
  i ^= i >> 1;          // xor bit wise: 0=0^1
  return ~i & 1;        // return even: 1, odd: 0
}


Peter

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.