www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

izračun CRC

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 723
Aktiv.: 3.04
Kraj: Severna primorska

PrispevekObjavljeno: Ned Sep 12, 2010 9:44 pm    Naslov sporočila:   Odgovori s citatom

Trenutno malo tipam "C okolje" (malo pod vplivom najaktualnejših tem zadnjih nekaj dni).
Mučim se v codevisionovem cvavrju.
Skušam napisati izračun CRC-ja, pa nekako ne izpljune pričakovanega rezultata Pray
Tisti, ki ste počeli že kaj podobnega... se tole zdi vsaj približno uredu:
Koda:


int myCRC(int cnt, int DATA[10]);
 
 int Rez,Podatki[10];

while (1)
      {
 
 
     
      delay_ms(500);
      Podatki[0]=0;
      Podatki[1]=1;
      Podatki[2]=2;
      Podatki[3]=3;
      Podatki[4]=4;
      Podatki[5]=5;
      Podatki[6]=6;
      Podatki[7]=7;
      Podatki[8]=8;
      Podatki[9]=9;
      printf("\n");
      printf("CRC je: %x",myCRC(1,Podatki));
       
   
}

}


int myCRC(int cnt, int DATA[10]){
//koda za racunat CRC
//Polynomial: x16 + x15 + x2 + 1
//Start Value: 0xFFFF


int CRC_POLYNOM = 0x8005;
int CRC_PRESET = 0xFFFF;
int crc,i,j;

crc = CRC_PRESET;
for (i = 0; i < cnt; i++) /* cnt = number of protocol bytes without CRC */
{
crc ^= DATA[i];
for (j = 0; j < 8; j++)
{
if (crc & 0x0001)
crc = (crc >> 1) ^ CRC_POLYNOM;
else
crc = (crc >> 1);
}
}
return crc;
}



Kopiral sem le ključne dele kode.
Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70645.70

PrispevekObjavljeno: Ned Sep 12, 2010 10:54 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Gklemen
Član
Član



Pridružen-a: Sob 29 Nov 2008 0:06
Prispevkov: 112
Aktiv.: 0.55
Kraj: Rogatec

PrispevekObjavljeno: Pon Sep 13, 2010 12:05 am    Naslov sporočila:   Odgovori s citatom

eddie: Nisem glih podrobni gledal kode, samo prva napaka je da kličeš funkcijo myCRC(1, Podatki) namesto myCRC(10, Podatki)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 723
Aktiv.: 3.04
Kraj: Severna primorska

PrispevekObjavljeno: Pon Sep 13, 2010 8:11 am    Naslov sporočila:   Odgovori s citatom

@GKlemen: tisto je že prav - v testne namene, naj bi se CRC izračunal samo nad prvim znakom podatkov - lažje na roko preračunati.

@Mare69: ja tudi to možnost preko tabele sem že zasledil, menda je bolj hitra, je pa tabela verjetno samo za en polinom?? Pa tudi nekaj prostora vzame v pomnilniku.

No tole z int je pa za preverit, bi pa znalo biti kaj na tem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pon Sep 13, 2010 9:10 am    Naslov sporočila:   Odgovori s citatom

Evo moj primer izračuna CRC8ja za SHT11. Tudi jaz uporabljam tabele kot Mare. Se mi zdi najlažje.
Koda:
/* tabela za izracun CRCja 8 */
static const char CRC_tab[256]={
0, 49, 98, 83, 196, 245, 166, 151, 185, 136, 219, 234, 125, 76, 31, 46, 67, 114, 33, 16,
135, 182, 229, 212, 250, 203, 152, 169, 62, 15, 92, 109, 134, 183, 228, 213, 66, 115, 32,
17, 63, 14, 93, 108, 251, 202, 153, 168, 197, 244, 167, 150, 1, 48, 99, 82, 124, 77, 30,
47, 184, 137, 218, 235, 61, 12, 95, 110, 249, 200, 155, 170, 132, 181, 230, 215, 64, 113,
34, 19, 126, 79, 28, 45, 186, 139, 216, 233, 199, 246, 165, 148, 3, 50, 97, 80, 187, 138,
217, 232, 127, 78, 29, 44, 2, 51, 96, 81, 198, 247, 164, 149, 248, 201, 154, 171, 60, 13,
94, 111, 65, 112, 35, 18, 133, 180, 231, 214, 122, 75, 24, 41, 190, 143, 220, 237, 195,
242, 161, 144, 7, 54, 101, 84, 57, 8, 91, 106, 253, 204, 159, 174, 128, 177, 226, 211,
68, 117, 38, 23, 252, 205, 158, 175, 56, 9, 90, 107, 69, 116, 39, 22, 129, 176, 227, 210,
191, 142, 221, 236, 123, 74, 25, 40, 6, 55, 100, 85, 194, 243, 160, 145, 71, 118, 37, 20,
131, 178, 225, 208, 254, 207, 156, 173, 58, 11, 88, 105, 4, 53, 102, 87, 192, 241, 162,
147, 189, 140, 223, 238, 121, 72, 27, 42, 193, 240, 163, 146, 5, 52, 103, 86, 120, 73, 26,
43, 188, 141, 222, 239, 130, 179, 224, 209, 70, 119, 36, 21, 59, 10, 89, 104, 255, 206, 157,
172};

Koda:
//----------------------------------------------------------------------------------
void SHT_crc(unsigned char ukaz,unsigned char msb,unsigned char lsb,unsigned char crc)
//----------------------------------------------------------------------------------
// izracun CRCja
{
   unsigned char c,b,a=0;
   a= a^ukaz;
   a= CRC_tab[a];
   a= a^msb;
   a= CRC_tab[a];
   a= a^lsb;
   a= CRC_tab[a];
    for(b = c = 0; c < 8; c++)       //obrnemo vrednost rezultata bit7=bit0, bit6=bit1,...
      {
        b = (b << 1) + (a & 1);
        a >>= 1;
       }
   if (!(b == crc)) sht.napaka =1;      //vrne napako ob napacnem CRCju
}

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Gklemen
Član
Član



Pridružen-a: Sob 29 Nov 2008 0:06
Prispevkov: 112
Aktiv.: 0.55
Kraj: Rogatec

PrispevekObjavljeno: Pon Sep 13, 2010 11:35 am    Naslov sporočila:   Odgovori s citatom

Moj primer izračuna CRC za modbus protokol.. če ti bo kaj pomagalo

Koda:
//---------------------------------------------------------------------------------------------------funkcija za izračun crc - modbus
//sprejme dolžino paketa, crc izračuna iz polja in_modbus
void crc_funkcija(int length)
{
bit lsb;
        //izračunaj crc
        crc_calc = 0xFFFF;
       
        for (j = 0; j < length; j++)
        {               
                crc_calc ^= in_modbus[j];  //XOR
               
                for (i = 0; i < 8; i++) //ponavljamo 8x - bayt
                {                                                                                     
                        lsb = crc_calc & 0x0001;
                       
                        if (lsb)
                        {
                                crc_calc >>= 1;  //shiftamo za en bit v levo
                                crc_calc &= 0x7FFF;
                                crc_calc ^= 0xA001;     // crc polinom = 0xA001                                 
                        }
                        else
                        {
                                crc_calc >>= 1;  //shiftamo za en bit v levo
                                crc_calc &= 0x7FFF;     
                        }
                }
        }       
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
eddie
Član
Član



Pridružen-a: Sre 10 Dec 2003 21:02
Prispevkov: 723
Aktiv.: 3.04
Kraj: Severna primorska

PrispevekObjavljeno: Pon Sep 13, 2010 11:56 am    Naslov sporočila:   Odgovori s citatom

Bo gotovo pomagalo!
Bom zvečer stestiral zadevo da vidim kakšni bojo rezultati.
Saj možno da je samo nekaj z uporabo napačnega polinoma....

Poročam ugotovitve.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.61
Kraj: Kranj - struževo

PrispevekObjavljeno: Pon Sep 13, 2010 6:43 pm    Naslov sporočila:   Odgovori s citatom

Takole je pa v Delphiju za 1-wire termometer:
Koda:
  crc8 : byte;


  crc8 := 0;
  for i := 0 to 7 do docrc8 (data[i]);
  if ((crc8 <> 0) then ... napaka


//--------------------------------------------------------------------------
// Calculate the CRC8 of the byte value provided with the current
// global 'crc8' value.
// Result := s current global crc8 value
//
function docrc8(value : byte) : byte;
const
   dscrc_table : array[0..255] of Byte = (
        0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
      157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
       35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
      190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
       70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
      219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
      101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
      248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
      140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
       17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
      175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
       50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
      202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
       87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
      233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
      116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53);

begin
   // See Application Note 27
   crc8 := dscrc_table[crc8 XOR value];
   Result :=  crc8;
end;

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 7 dni


Powered by phpBB © 2001, 2005 phpBB Group