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
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
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
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
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
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
Nachtrag: wollte noch dazuschreiben, daß es Bit8 natürlich nicht gibt mfg werner
Vielen Dank! Es war wohl ein grundlegendes Verständnisproblem :)) Du hast mir sehr geholfen! Tobi
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.