Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » CRC Brerechnung » Themenansicht

Autor Thread - Seiten: -1-
000
20.12.2008, 22:29 Uhr
Klaus



Hallo,

ich weiß nicht, ob das die richtige Rubrik für meine Frage ist... sonst bitte verschieben ...

Wie kann ich eine einfache CRC-Berechnung machen?

Es geht darum:
Ich habe für mein NANOS (Assembler) und meinen PC (VB6) ein kleines Programm geschrieben, mit dem ich Daten vom bzw. zum NANOS-System über eine IFSS-Schnittstelle zu meinem PC sende bzw. empfange.
Dies funktioniert auch soweit ganz gut.
Nun möchte ich aber sicher gehen, dass die blockweise gesendeten bzw. empfangenen Daten auch 100%ig o.k. sind und dachte mir das dies mit einer Prüfsumme (CRC Berechnung eines Blockes - 128 Byte) doch eigentlich ganz gut gehen sollte.

Aber wie funktioniert so eine CRC-Berechnung?
Bei EPROM-Programmern wird dies ja meist eingesetzt.

Das ganze sollte natürlich nicht zu kompliziert sein und sinnlos Rechenzeit verbraten.

Die Prüfsumme würde mit jedem Block übertragen und mit der am anderen Ende errechneten verglichen. Sollte dann etwas nicht stimmen, wird der fehlerhafte Block einfach nochmal gesendet...

Anzumerken wäre noch, ... ich bin kein Profi Programmierer ....

Evtl. hat ja jemand eine einfache Routine für so eine CRC-Berechnung über einen 128 Byte Block. (Z80-Assembler, Visual Basic)
Im Web findet man zwar so einiges über CRC, aber das scheint alles ganz schön aufwändig zu sein :-(


Danke und viele Grüße,
Klaus

Dieser Beitrag wurde am 20.12.2008 um 22:31 Uhr von Klaus editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
20.12.2008, 22:48 Uhr
Rüdiger
Administrator
Avatar von Rüdiger

Lade Dir mal das Programm Winhex runter.
Das ist ein Hex-Editor, der auch eine Berechnungsfunktion für verschiedene Arten von Prüfsummen hat.
--
Kernel panic: Out of swap space.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
20.12.2008, 22:57 Uhr
Klaus



Danke für den Hinweis Rüdiger,

Winhex schau ich mir mal an....

... aber mir geht es eigentlich um ein paar Zeilen Code in Z80-Assembler für mein NANOS und auf der anderen Seite in Visual Basic für den PC, welchen ich dann in mein vorhandenes Programm reinfriemeln kann :-)

Gruß,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
21.12.2008, 05:23 Uhr
edbru



TITLE CRC16 - Cyclic Redundancy Checksum
;******************************************************************************
;* *
;* *
;* Improved CRC16 Routine *
;* *
;* *
;* This routine performs CRC16 cyclic redundancy checksum calculations. *
;* It makes use of an idea given in the IEEE Micro publication by Aram *
;* Perez, and represents a considerable improvement over some of the *
;* methods used previously. It receives a 16-bit CRC in BC and *
;* the next data byte in E. It returns the updated CRC in BC. *
;* *
;* The first step is to XOR the data byte into the right half of the *
;* the CRC. Let the result of this be denoted by: *
;* *
;* a b c d e f g h i j k l m n o p *
;* *
;* After the eight CRC16 steps, with the x^16+x^15+x^2+1 polynomial, this *
;* should become: *
;* *
;* X i j k l m n o p 0 0 0 0 0 0 X *
;* + + + + + + + + + + + + + + + + *
;* 0 X i j k l m n o p 0 0 0 0 0 0 *
;* + + + + + + + + + + + + + + + + *
;* 0 0 0 0 0 0 0 0 a b c d e f g h *
;* *
;* where X represents the parity of the 8 bits i,j,k,l,m,n,o,p, and *
;* where + represents the XOR of the respective columns. The code below *
;* carries out this process directly, making use of the 8080's parity flag *
;* for finding X. [Note that since the routine uses this parity flag *
;* after an XRA instruction, the routine will work properly even on a *
;* Z80 microprocessor.] *
;* *
;******************************************************************************
;* *
;* Entry: *
;* BC = old CRC16 *
;* E = next data byte *
;* *
;* CALL CRC16 *
;* *
;* Exit: *
;* BC = new CRC16 *
;* A, D, & E also affected *
;* *
;* *
;***************************************** R. Stafford - Aug. 9, 1983 ********
;
RSECT ROM
INTERN CRC16

CRC16: EQU $
; Assume the current 16 bit CRC is in BC and the next data byte in E.
MOV A,E
XRA C ;A now has [i j k l m n o p] & parity flag has X
MOV C,B ;Put [a b c d e f g h] in C
MOV D,A ;Put [i j k l m n o p] in D
JPE CRCJ ;The parity flag has X (even on a Z80)
XRI 2 ;XOR X into A in bit 1
CRCJ XRA D ;A now has [0 0 0 0 0 0 X 0]
MOV E,A ;Now E = [0 0 0 0 0 0 X 0]
RAR
RAR ;Move X into carry flag
MOV A,D ;Put [i j k l m n o p] back into A
RAR
MOV D,A ;Shift it to [X i j k l m n o] in D
MOV A,E ;Get [0 0 0 0 0 0 X 0] from E
RAR ;This sets carry to zero
MOV E,A ;Put [p 0 0 0 0 0 0 X] back into E
MOV A,D ;Now proceed with yet another shift
RAR ;Get [0 X i j k l m n] in A
MOV B,A ;Save it in B
MOV A,E ;Then get [p 0 0 0 0 0 0 X]
RAR ;Shift it to [o p 0 0 0 0 0 0]
XRA E ;Then XOR in [p 0 0 0 0 0 0 X]
XRA C ;Finally XOR in [a b c d e f g h]
MOV C,A ;Establish this as the low byte of new CRC
MOV A,D ;Now get [X i j k l m n o]
XRA B ;XOR it with [0 X i j k l m n]
MOV B,A ;This constitutes the upper byte of new CRC
RET ;Return with updated CRC in BC

; End of CRC16
--
ich brauch es nicht, so sprach der Rabe.
Es ist nur schön wenn ich es habe.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
21.12.2008, 08:32 Uhr
Gerhard



Oder Du nimmst einfach die Routine, die der MC80.22 für genau denselben Zweck verwendet. Die ist schön kurz, ich kann Dir gern Hexdump und disassembliertes Listing schicken (ich schlage mich derzeit in etwas anderem Zusammenhang mit dem gleichen Problem herum).

Gruß
Gerhard
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
21.12.2008, 08:47 Uhr
Klaus



Hallo,

vielen Dank edbru,

... das ist schon mal nicht schlecht.


vielen Dank Gerhard,

... ja Gerhard, die Routine vom MC80 würde mich natürlich auch interessieren. Meine Adresse hast Du Ja :-)


Viele Grüße,
Klaus

Dieser Beitrag wurde am 21.12.2008 um 08:47 Uhr von Klaus editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
21.12.2008, 10:14 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

vom Z9001-EPROMMer

;------------------------------------------------------------------------------
; CRC berechnen ab DE, Länge in BC, Ergebnis in HL
;------------------------------------------------------------------------------

crc: ld hl, 0FFFFh
crc1: ld a, (de)
xor h
ld h, a
rrca
rrca
rrca
rrca
and 0Fh
xor h
ld h, a
rrca
rrca
rrca
push af
and 1Fh
xor l
ld l, a
pop af
push af
rrca
and 0F0h
xor l
ld l, a
pop af
and 0E0h
xor h
ld h, l
ld l, a
inc de
dec bc
ld a, b
or c
jr nz, crc1
ret
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 21.12.2008 um 10:15 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
21.12.2008, 10:21 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

und so sieht das (ohne Optimierung und Tabellen) in VB aus:

Public Function CRC16A(Buffer() As Byte) As Long
Dim I As Long
Dim Temp As Long
Dim CRC As Long
Dim J As Integer
For I = 0 To UBound(Buffer) - 1
Temp = Buffer(I) * &H100&
CRC = CRC Xor Temp
For J = 0 To 7
If (CRC And &H8000&) Then
CRC = ((CRC * 2) Xor &H1021&) And &HFFFF&
Else
CRC = (CRC * 2) And &HFFFF&
End If
Next J
Next I
CRC16A = CRC And &HFFFF
End Function
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
21.12.2008, 11:59 Uhr
Klaus



Tausend Dank an die hilfsbereite Hobbygemeinde.

Prima Volker, dass Du gleich noch den VB Code reingeschrieben hast.

Ich denke mal, dass ich mit den nun vorhanden Infos weiterkomme.

Nochmals vielen Dank an alle!

Einen schönen 4.Advent und viele Grüße,
Klaus
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek