CRC Berechnung mit LUT

Gast #7115472
Lesenswert?

Ich möchte eine CRC16 mithilfe einer LUT berechnen.

Die CRC von nur einem Byte ist einfach. Für das Byte 0xFF schaue ich 
einfach im 256. Eintrag der LUT das wäre dann CRC 0x1EF0

So wenn ich jetzt aber 2x 0xFF sende und davon die CRC haben möchte wie 
komme ich jetzt darauf ? Der richtige Wert währe hier 0x1D0F

Ich finde hier einfach keinen Weg wie ich da weiterrechne..
#7116631
Lesenswert?

Gee schrieb:
> mit 2x 0xFF funktionierts, aber mit 0x31 0x32 nicht... wo liegt der
> Fehler? Muss ich am Ende immer mit 0xF000 maskieren?

Am Ende wird gar nix maskiert. Bestenfalls wird die CRC mit einem Wert 
ungleich 0x00 initialisiert. Das hängt aber von der Anwendung ab. Ich 
wiederhole mich. Siehe CRC bzw. der Klassiker.

http://www.ross.net/crc/download/crc_v3.txt

Eine praktische Anwendung einer 8 Bit CRC in Assembler gibt es u.a. hier

Beitrag "Re: Onewire + DS18x20 Library"
Gast #7116644
Lesenswert?

CRC = lut[(CRC >> 8) ^ val]^crc<<8
CRC = 0x5e36 byte=0x20
High byte von CRC XOR byte
0x5e XOR 0x20 = 0x7e = 126 DEC
Lut 126 = 0x23f5 Fantasiewert
Low byte vom alten CRC 8x links shiften und XOR
Also 0x23f5 XOR 0x3600 = 0x15f5
Gast #7116700
Lesenswert?

habe das 8x nach links shiften oben bei den 2x FF vergessen und das 
Ergebniss hat zufällig trotzdem gestimmt. Versuche jetzt das 
linksshiften mit einzubauen, aber mir raucht gerade der Kopf vom ganzen 
umrechnen und 0 und 1 en geschubse. Mach kurz pause und setz mich dann 
nochmal ran vielen Dank für eure Gedult ^^
Gast #7116739
Lesenswert?

Du sollst das High-Byte mit dem val (0xFF) xoren, in der LUT nachschauen 
und das High-Byte des Tabellenzugriffs mit dem Low-Byte xoren.

CRC ist in C was anderes als crc (case sensitiv).

Shiften braucht man hier gar nicht. Das schreibt man in C, um auf das 
Low- oder Highbyte zugreifen zu können.
Zeig mal deinen Code und die Parameter (Startwert (Seed), Polynom, 
Tabelle etc.)
Ich denke, du machst es dir zu kompliziert. Lookup-CRC sind nur ein paar 
(5?) Befehle.

Falls danach z.B. nochmal invertiert oder geschoben wird, hat das den 
Grund, dass offensichtliche Übertragungsfehler (0x00 oder 0xFF) erkannt 
werden, was bei reiner CRC nicht möglich wäre.
Gast #7116795
Lesenswert?

Chris schrieb:
> CRC = lut[(CRC >> 8) ^ val]^crc<<8
> CRC = 0x5e36 byte=0x20
> High byte von CRC XOR byte
> 0x5e XOR 0x20 = 0x7e = 126 DEC
> Lut 126 = 0x23f5 Fantasiewert
> Low byte vom alten CRC 8x links shiften und XOR
> Also 0x23f5 XOR 0x3600 = 0x15f5

Yess. Macht Sinn und funktioniert. Vielen Dank an alle. Bin bei neuen 
Sachen immer schwer von Begriff
Gast #7116832
Lesenswert?

Hier meine funktionierende routine

jetzt muss ich das ganze noch für CRC7 machen
1
calc_CRC_16:
2
    mov      CRC_16,W0      // crc in High und Low Byte unterteilen
3
    mov      W0,WORD
4
    call    SPLIT
5
       
6
    mov      DATA,W0
7
    xor      H_BYTE      // xor mit neuem Byte
8
        
9
    mov      #0,W0
10
    mov      W0,TBLPAG
11
        
12
    mov      #2,W0
13
    MUL      H_BYTE          
14
          
15
    mov      W2,TBL_INDEX
16
    
17
    mov      #0x7850,W0
18
    add      TBL_INDEX      
19
    
20
    MOV      TBL_INDEX,W0 
21
    
22
    TBLRDL  [W0],W4     
23
    mov      W4,CRC_16      // CRC aus Tabelle lesen 
24
    
25
    repeat  #8-1
26
    rlnc    L_BYTE  // altes Low CRC nach links shiften    
27
    
28
    mov      L_BYTE,W0
29
    xor      CRC_16
30
    
31
    return

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren