Wed Jun 23 2004 15:04, Vladislav Baliasov wrote to Vladimir Vassilevsky:
DO>>> HÅÔ, ÎÅ ÐÒÁ×ÄÁ. PIC ×ÙÐÏÌÎÑÅÔ ËÏÍÁÎÄÕ ÚÁ 4 ÔÁËÔÁ ÇÅÎÅÒÁÔÏÒÁ. VV>> üÔÏ ÎÅÄÏËÏÍÁÎÄÙ. ôÁË ÞÔÏ × ~10 ÒÁÚ ÍÅÄÌÅÎÎÅÅ, ÞÅÍ AVR - ÒÅÁÌØÎÁÑ VV>> ÏÃÅÎËÁ. VB> HÅÔ, ÎÉËÏÉÍ ÏÂÒÁÚÏÍ. üÆÆÅËÔÉ×ÎÏÓÔØ ËÏÄÁ - ÔÏÇÏ ÖÅ ÐÏÒÑÄËÁ.
éÔÁË, ÃÅÌÏÞÉÓÌÅÎÎÁÑ ÚÁÄÁÞÁ ËÏÒÒÅËÃÉÑ BCH-ËÏÄÁ ÍÅÔÏÄÏÍ íÅÇÇÉÔÁ (ÓÍ. ËÏÄ.) ATMega16, IAR 2.28A, ÏÐÔÉÍÉÚÁÃÉÑ ÎÁ ÓËÏÒÏÓÔØ. úÁÎÉÍÁÅÔ ÐÒÉ bchword = 0x06 ~ 9670 ÔÁËÔÏ×. ëÏÄ ×ÍÅÓÔÅ Ó ÓÔÁÒÔÁÐÏÍ, ÔÁÂÌÉÃÅÊ ÐÒÅÒÙ×ÁÎÉÊ É ÐÒ. ~ 630 ÂÁÊÔÏ×. éÎÔÅÒÅÓÎÏ ÂÙÌÏ ÂÙ ÐÏÓÍÏÔÒÅÔØ ÄÌÑ PIC, x51 É ÄÒÕÇÉÈ ÓÅÍÅÊÓÔ×.
void main(void) { unsigned long bchword;
bchword = 0x06;
CorrectBCH(&bchword); } /* Extended code BCH 32.21 correction using Meggit theorem C source code (c)VLV The BCH 32.21 codeword is treated as unsigned long int The function corrects up to 2 errors and detects at least 3 errors. The return value is amount of errors (0,1,2). If the error is not correctable, return value is 0xFF and the codeword is not changed.
*/
void InvertBit(unsigned long int *bchword,unsigned char bit) { (*bchword)^=1lu<<bit; return; }
//----------- The correction function -------------------
unsigned char CorrectBCH(unsigned long int * bchword) {
static unsigned int syndtable[31] = {
0x200,0x300,0x280,0x240,0x220,0x210,0x208,0x204,
0x202,0x201,0x1b4,0x3da,0x2ed,0x1c2,0x3e1,0x144,
0x3a2,0x2d1,0x1dc,0x3ee,0x2f7,0x1cf,0x053,0x09d,
0x0fa,0x37d,0x10a,0x385,0x176,0x3bb,0x169 };
unsigned char ci,cj,parity; unsigned int syndrome; unsigned long int dataword;
// delete parity bit
dataword=(*bchword)&0xfffffffelu;
// Calculate the syndrome
for(ci=0;ci<31;ci++) { if(dataword&0x80000000lu) dataword^=0xed200000lu; dataword<<=1; }
// Right align
syndrome=(unsigned int)(dataword>>22);
// Calculate parity
dataword=*bchword; parity=0;
while(dataword) { parity^=dataword&1; dataword>>=1; }
// Zero syndrome - no errors or error in parity bit
if(!syndrome) { if(!parity) return 0; // No errors (*bchword)^=1; // Correct parity return 1; };
// Nonzero syndrome - Iterative search of errors
for(ci=31;ci!=0;ci--) // Cycle for all bits except parity { for(cj=0;cj<ci;cj++) // Table search { if(syndrome==syndtable[cj]) // Error position found { if(!cj) // Single error? { InvertBit(bchword,ci); if(parity==1) return 1; // no error in parity (*bchword)^=1; // Correct parity return 2; } if(parity) return 0xff; // More then 2 errors - uncorrectable InvertBit(bchword,ci); //Correct double error InvertBit(bchword,ci-cj); return 2; } } syndrome<<=1; // Recalculate the syndrome for next iteration if(syndrome&0x400) syndrome^=0x369; syndrome&=0x3ff; } return 0xFF; // Error position not found - uncorrectable }
"There is no business other then show business " (c)