Hallo,
auch nach langer Suche im Internet, bin ich nicht auf einen
schnellen, richtig rechnenden und verständlichen Quellecode
zur Berechnung einer CRC16 Prüfsumme in Assembler für kleine PICs
gestoßen.
Nach dem Studium eines Artikels zur CRC16 Berechnung mit PIC18xxx
bin ich auf die Lösung gekommen und möchte diese hier einfach einmal
verewigen.
benötigte Variablen:
-------------------
1 | CBLOCK 0x20; RAM Bereich startet ab Adr 0x20
|
2 | CRC16L ; die berechnete Prüfsumme
|
3 | CRC16H
|
4 | TEMP ; Hilfsvariable
|
5 | CTR ; Zähler für Schleifendurchläufe
|
6 | ENDC ; Ende der Variablendefinition
|
die Initialisierung:
1 | movlw 0xFF
|
2 | movwf CRC16L ; CRC16 mit dem Startwert xFFFF initialisieren
|
3 | movwf CRC16H ; ein anderer Startwert ist möglich
|
Benutzung:
Es werden der Reihe nach alle Datenbytes ins W Register kopiert
und jeweils die Berechnungsroutine aufgerufen mit:
Das Programm:
1 | #define POLYNOM 0x1021 ; hier das Generatorpolynom eintragen
|
2 |
|
3 | CALC_CRC16:
|
4 | movwf TEMP ; übergebenes Datenbyte sichern
|
5 | movlw 8
|
6 | movwf CTR
|
7 | CRC16_LOOP:
|
8 | rlf TEMP,F ; CRC16 += 1, wenn MSB=1
|
9 | ; CRC16 schieben
|
10 | rlf CRC16L,F
|
11 | rlf CRC16H,F
|
12 | ; MSB=1?
|
13 | btfss STATUS,C
|
14 | goto CRC16_1
|
15 | ; XOR mit Generatorpolynom
|
16 | movlw LOW POLYNOM ; 0x21
|
17 | xorwf CRC16L,F
|
18 | movlw HIGH POLYNOM ; 0x10
|
19 | xorwf CRC16H,F
|
20 | ;
|
21 | CRC16_1:decfsz CTR,F ; schon alle 8 Bits des Bytes aus W verarbeitet
|
22 | goto CRC16_LOOP
|
23 | RETURN
|
Nach dem die Prüfsumme für alle Bytes berechnet wurde,
steht das Ergebnis in der Variable CRC16H,CRC16L bereit.
Der Code ist getestet.
Grüße
Stefan