PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Berechnung CRC8 Prüfsumme für RNSchrittmotor in C



b112enno
11.11.2011, 13:02
Hallo zusammen

ich bin gerade dabei eine Ansteuerung für das Board RNSchrittmotor zu programmieren. Wegen der Fehlererkennung möchte ich den CRC-Modus nutzen. Aus Gründen die ich hier nicht weiterausführen möchte, programmiere ich in C. Im Datenblatt des Boards ist jedoch nur ein Beispielcode in VB abgedruckt. Ich hab ihn mal versucht zu übersetzen, allerdings bekomme ich ein falsches Ergebnis zurück. Google und Wikipedia habe ich schon gequält, habe aber nichts gefunden, was mir weiter geholfen hat.
Hier mal der Code aus dem Datenblatt:



Function BerechneCRC(s as String) as Byte
Dim j as Byte
Dim k as Byte
Dim crc8 as Byte
Dim m as Byte
Dim x as Integer

crc8 = 0


For m = 1 To Len(s)

x = Asc(Mid(s, m, 1))

For k = 0 To 7


j = 1 And (x Xor crc8)


crc8 = Fix(crc8 / 2) And &HFF


x = Fix(x / 2) And &HFF


If j <> 0 Then



crc8 = crc8 Xor &H8C


End If

Next k
Next

Docrc8 = crc8
End Function


Hier mal meine Gedanken zum Code:
Die Zeilen

For m = 1 To Len(s)

x = Asc(Mid(s, m, 1))
Next

dienen meiner Meinung nach dazu durch den übergebenen String zu gehen und ein Byte nach dem anderen in die Variable x zu kopieren. Nach dem Einlesen, wird die CRC für dieses Byte berechnet und anschließend das nächste Byte eingelesen.

Die zweite For-Schleife wird dazu dienen, die einzelnen Bits des eingelesenen Bytes zu betrachten


j = 1 And (x Xor crc8)
Hier wird ein Exklusiv-Oder von x und crc8 gebildet. Mittels der Anweisung 1 And werden alle Bits außer dem LSB auf '0' maskiert. Die Variable j kann somit nur den Wert '0' oder '1' haben.

Die folgenden beiden Zeilen sind mir etwas unklar. Wenn ich mich richtig erinnere entspricht ja einer Division durch 2 ein Schieben um ein Bit nach rechts. Warum brauche ich hier aber die Funktion Fix? Und wieso wird das Ergebnis mit 0xFF maskiert. Die And-Verknüpfung hat meiner Meinung nach überhaupt keine Änderung des Ergebnisses zur Folge.

Die folgende if-Anweisung wirft auch ein paar Fragen auf. Wieso wird hier das Xor gebildet, wenn j ungleich 0 ist? Muss dieses Xor nicht gebildet werden, nachdem das letzte Bit des Bytes bearbeitet wurde?

Was folgende Anweisung bewirken soll habe ich leider auch keinen blassen Schimmer.

Docrc8 = crc8
Handelt es sich bei der Variablen Docrc8 um den Rückgabewert der Funktion?

Ich habe mal das ganze versucht in C zu übersetzen. Hier ist mein Ergebnis:


unsigned char crc8(char* string, unsigned char len)
{

unsigned char crc=0;

unsigned char j=0, k=0, m=0, x=0;

for (m=0; m< len; m++)

{


x = (unsigned char) string[m];


for (k=0; k<8; k++)


{



j = 1 & (x ^ crc);



crc >>= 1;



x >>= 1;



if (j != 0)



{




crc = crc ^ 0x8C;



}


}

}

return crc;
}


Leider halten sich meine VB-Kenntnisse sehr in Grenzen. Liege ich mit meinen Überlegungen und Übersetzungsversuchen weingstens einigermaßen richtig oder bin ich total auf dem Holzweg? Wäre super, wenn mir jemand helfen könnte. Falls es etwas zur Sache tut, ich arbeite mit AVR Studio 5 und AVR-gcc.

Gruß
b112enno