mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC PIC12 PIC16 CRC16 CCITT Berechnung in Assembler


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
-------------------
       CBLOCK  0x20; RAM Bereich startet ab Adr 0x20
CRC16L ; die berechnete Prüfsumme
CRC16H
TEMP   ; Hilfsvariable
CTR    ; Zähler für Schleifendurchläufe
       ENDC  ; Ende der Variablendefinition
die Initialisierung:
        movlw  0xFF
        movwf  CRC16L ; CRC16 mit dem Startwert xFFFF initialisieren
        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:
        call   CALC_CRC16

Das Programm:
#define POLYNOM  0x1021 ; hier das Generatorpolynom eintragen

CALC_CRC16:
        movwf   TEMP ; übergebenes Datenbyte sichern
        movlw   8
        movwf   CTR
CRC16_LOOP:
        rlf     TEMP,F ; CRC16 += 1, wenn MSB=1
        ; CRC16 schieben
        rlf     CRC16L,F
        rlf     CRC16H,F
        ; MSB=1?
        btfss  STATUS,C
        goto  CRC16_1
        ; XOR mit Generatorpolynom
        movlw  LOW POLYNOM ; 0x21
        xorwf   CRC16L,F
        movlw   HIGH POLYNOM ; 0x10
        xorwf   CRC16H,F
        ;
CRC16_1:decfsz  CTR,F ; schon alle 8 Bits des Bytes aus W verarbeitet
        goto  CRC16_LOOP
        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

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Man kann so etwas mithilfe von Look-Up-Tables noch stark beschleunigen - 
mit einer cleveren Konstruktion geht das auch bei einer CRC-16 ohne eine 
2^16 große Tabelle. Der Verständlichkeit ist das aber nicht so 
zuträglich :-)

http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html

Autor: Thomas E. (picalic)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Man kann so etwas mithilfe von Look-Up-Tables noch stark beschleunigen

Kann man machen, wenn man es wirklich schneller braucht. Gerade bei den 
kleinen PICs ist es aber meistens eher der Speicherplatz, um den man 
sich Sorgen macht. Und wenn beides nicht zu knapp ist, ist ein 
übersichtlicher Algorithmus auch vorteilhaft.
Die Low- und Midrange PICs sind auch nicht gerade ein Musterbeispiel an 
Effizienz bei der Implementation von Lookup-Tabellen.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> Kann man machen, wenn man es wirklich schneller braucht.

Stefan schrieb:
> schnellen

Es war gefordert :-)

Thomas E. schrieb:
> Gerade bei den
> kleinen PICs ist es aber meistens eher der Speicherplatz, um den man
> sich Sorgen macht. Und wenn beides nicht zu knapp ist, ist ein
> übersichtlicher Algorithmus auch vorteilhaft.
> Die Low- und Midrange PICs sind auch nicht gerade ein Musterbeispiel an
> Effizienz bei der Implementation von Lookup-Tabellen.
Okay, das war mir nicht bewusst. Eine solche LUT wäre typischerweise 256 
Byte groß und würde den Code ca 8x beschleunigen, ist das schon zu viel?

Autor: Peter D. (peda)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Eine solche LUT wäre typischerweise 256
> Byte groß und würde den Code ca 8x beschleunigen, ist das schon zu viel?

Bei einem PIC12 mit 1kWords Flasch sind das schonmal 25% mit RETLW 
verballert. Und dabei auch noch das Überschreiten der Pagegrenzen 
beachten.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Peter D. schrieb:
> Bei einem PIC12 mit 1kWords Flasch sind das schonmal 25% mit RETLW
> verballert.
Oh, hat der kein LPM-Äquivalent? Das ist ja schlimm :-)

Man könnte auch eine 4-Bit-LUT nehmen o.ä., man müsste eine 
Versuchsreihe machen ob sich das lohnt.

Auf größeren Controllern wie Cortex-M ist die LUT ziemlich sinnvoll, da 
auch diese Controller solche Bitschnipseleien nicht wirklich besser 
können, und Flash meist genug da ist. Aber ok, darum ging's nicht

Autor: P.Loetmichel (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Bascom hätte gleich eine CRC8, CRC16 oder CRC32 mitgebracht.

Profis nehmen Bascom und sind schneller fertig.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.