[elektro] C kerdes
Fuzesi Arnold
arnold.fuzesi.lista at gmail.com
Wed Jun 10 10:17:49 CEST 2009
jogos:
/******************************************************************************/
short fcscheck(){ //computes the fcs
uchar i,k,bt,inbyte, fcslo, fcshi,status;
fcslo=fcshi=0xFF; //intialize FCS values
for (i = 0;i<(numbyte-2);i++){ //calculate the FCS for all except
the last two bytes
inbyte = bte[i];
for(k=0;k<8;k++){ //perform this procedure for each bit in the byte
bt = inbyte & 0x01;
uint fcs=fcshi<<8 + fcslo;
if(fcs&0x0001) status=0x01;
else status=0;
fcs>>=1;
fcshi=fcs>>8;
fcslo=fcs&0x00ff;
// #asm //embedded assembly language route to do a 16 bit rotate
// BCF 03,0
// RRF fcshi,F
// RRF fcslo,F
// #endasm
if (((status & 0x01)^(bt)) ==0x01){
fcshi = fcshi^0x84;
fcslo = fcslo^0x08;
} //end of if
//rotate_right(&inbyte,1); //set up to do the next bit
if(inbyte&0x01) status=1;
else status=0;
inbyte>>=1; //set up to do the next bit
// if(status)inbyte|=0x80;
} //end of for
}
fcslo = fcslo^0xff;
fcshi = fcshi^0xff;
if ((bte[numbyte-1] == fcshi) && (bte[numbyte-2] == fcslo)) {
return 1;
}
else return 0; //if the computed values equal the last two
data bytes
} //return a 1, otherwise return a 0
/******************************************************************************/
16 bites regiszterbe azert raktam össze szedtem szet mert nem sima shift:
// #asm //embedded assembly language route to do a 16 bit rotate
// BCF 03,0
// RRF fcshi,F
// RRF fcslo,F
// #endasm
if (((status & 0x01)^(bt)) ==0x01){
fcshi-ba beforgatja a 0 carry-t.
majd az fcslo-ba fentrol beforgatja az fcshi-bol kieső carry-t.
Aztan az fcslo-bol kieső carry-t a kov sorban vizsgálja hogy 1-e.
Oké hogy lehetne szebben is, de mereshez kellett igy adta ki ejszaka az eszem
hirtelen :)
Jogos, az inbyte-ra tényleg nincs többet szukseg...
Mondjuk ugy sem mukodik ha csak shiftelem :(
Viszont a Te kodod megy... Köszi!!!!!!!!!!!!!
(már csak azt nem értem mit bénáztam el... )
On 2009. 06. 10. 9:35, Palasik Sandor wrote:
>> short, int helyett unsigned char lett mindenhol
>>
>> asm betet helyett:
>>
>
> Mi lenne, ha a kész kódot írnád le és nem a kiindulópontot szerkesztési
> utasításokkal? :-)
>
> Amúgy ez egy sima CRC-nek látszik, és ha az összes bájtra elvégzed, azaz az
> utolsó kettőt is beleszámolod, akkor konstanst kell kapnod.
>
> Mindazonáltal én inkább így csinálnám:
>
> fcslo=fcshi=0xFF;
> for (i=0; i<numbyte-2; i++) {
> inbyte = bte[i];
> for (k=0; k<8; k++) {
> status = inbyte^fcslo;
> inbyte >>= 1;
> fcslo >>= 1;
> if (fcshi & 1)
> fcslo |= 0x80;
> fcshi >>= 1;
> if (status & 1) {
> fcshi ^= 0x84;
> fcslo ^= 0x08;
> }
> }
> }
>
> Pl. semmi szükség az inbyte rotálására, elég a shift is, nem kellenek
> többször a bitek. Szintén fölösleges összerakni és szétszedni egy "16 bites
> regisztert" egy amúgy 8 bites processzoron egy sima shift kedvéért.
>
> Érdemes áramkörként elképzelni, végül is ez nem más, csak egy rakás D
> flipflop és XOR kapu.
>
>
> Palasik Sándor
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list