[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