Hallo, auf einem CAN-BUS habe ich die angehängte Sequenz mitgeschnitten. Mein Problem ist es nun die CRC Berechnung nachzuvollziehen. Ich habe mich heute zum ersten Mal mit der CRC Berechnung auseinander gesetzt und an meiner Sequenz auch einige Berechnungen durchgeführt. Leider habe ich andauernd einen anderen CRC raus als der vorgegebene. Bisher habe ich versucht das Generatorpolynom mit den 15 niedrigsten Bits der beiden Daten-Bytes zu bilden. Dann habe ich die Bits von SOF bis Data-Byte 1 genommen, 14 Nullen dran gehängt und durch das Generatorpolynom geteilt. So habe ich es zumindest mithilfe der CAN-BUS Spec, wikipedia und einigen Foren-Beiträgen verstanden. Kann sein, dass ich da grad irgendwie ein Brett vorm Kopf habe und ich irgendwas nicht richtige verstehe. Würde mich jedenfalls freuen wen mir jemand auf die Sprünge helfen könnte. Danke! Gruß Nils
Nils M. schrieb: > Kann sein, dass ich da grad irgendwie ein Brett vorm Kopf habe und ich > irgendwas nicht richtige verstehe. Würde mich jedenfalls freuen wen mir > jemand auf die Sprünge helfen könnte. Danke! Mit dem CAN-Bus hatte ich mal zu tun, aber das ist schon etwas her, stecke da im Augenblick nicht mehr so tief drin. In deinem Dateianhang sehe ich Sequenzen, die mehr als 5 gleiche Bits haben. Und ich erinnere mich noch daran, daß es nicht vorkommen darf, im Datenstrom 5 gleiche Bits zu haben. Dann wird per Hardware das 5. Bit gekippt. War da nicht noch was mit so genannten Stub-Bits??? Wenn ich mich irre, betrachte meinen Beitrag als gegenstandslos. Aber es fiel mir als allererstes sofort auf.
Hallo, der CRC-Berechnungsalgorithmus ist auf Seite 13 beschrieben: http://www.bosch-semiconductors.de/media/pdf/canliteratur/can2spec.pdf Gruß Anja
Hallo, danke für die bisherigen Antworten. Habe mich heute nochmal damit beschäftigt aber leider zu keinem Ergebnis gekommen. @Anja: Den Link kannte ich schon. Habe die Beschreibung aber anscheinend leider nicht richtig verstanden. Weißt du wie der Algorithmus richtig funktioniert? Bin über jede Hilfe weiterhin dankbar! Gruß Nils
Babe, wenn ich ja riechen koennte, wo Dein Problem liegt, koennte man Dir ggf. helfen. Vermutlich habe ich nun hier Deine Uebungsaufgabe geloest. Naja... Das sind die einzelnen Reduktionsschritte: (0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0) (1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0) (0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0) (0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0) (1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0) (0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0) (0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0) (1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0) (0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0) (0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0) (1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0) (0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1) (0 0 0 0 1 0 0 0 0 1 0 1 1 0 1) -Balu
Und eigentlich hat man als Anwender gar nichts mit der CRC zu tun. Wird doch vom CAN-Controller erledigt, sowohl sender- als auch empfängerseitig. Es sei denn, es geht tatsächlich um die Schule/Ausbildung :-) Oder man will sich einen CAN-Controller selbst in Software giessen.
Hallo, danke für eure Antworten. Eine Aufgabe für die Schule bzw. Ausbildung ist es nicht. Es handelt sich um ein privates Projekt in dem ich über einen vorhandenen CAN-Bus Daten schicken möchte. Als Hardware verwende ich einen MCP2551 und einen PIC uC. Einen extra CAN-Controller wollte ich nicht verwenden. Also möchte ich einen CAN-Controller selbst mit Assembler schreiben. @Balu: Danke für die einzelnen Reduktionsschritte! Ich habe jetzt meinen (eigentlich ziemlich dummen Fehler) erkannt. Mein Fehler war, dass ich eine 1 im Generatorpolynom vergessen habe und somit ein Bit weniger hatte. Dadurch waren natürlich alle meine Rechnungen falsch. Hätte ich meine Ausführung hier gepostet, hätte man meinen Fehler wahrscheinlich früher erkannt und du hättest dir nicht soviel Arbeit machen müssen. Bei meinem nächsten Problem (was ich hoffentlich nicht so schnell haben werde) werde ich dran denken. Jedenfalls nochmal vielen Dank! :-) Gruß Nils
>Als Hardware verwende ich einen MCP2551 und einen PIC uC. Einen extra >CAN-Controller wollte ich nicht verwenden. Es gibt doch haufenweise PICs mit eingebautem CAN Controller;)
Stimmt, es gibt soweit ich weiß ab der 18er Serie einige PICs mit CAN-Controller. Ich habe aber noch jede Menge 16er PICs zuhause rumliegen, die ich endlich mal sinnvoll einsetzen will. Die haben alle leider keinen CAN-Controller.
>Ich habe aber noch jede Menge 16er PICs zuhause rumliegen, die ich >endlich mal sinnvoll einsetzen will. Dann bau dir ein Mobile daraus. Als CAN Controller taugen die nicht. Nichts für ungut, ich mach gelegentlich auch noch was mit den 16F, aber ich glaube da rennst du mit an die Wand.
Hmm, jetzt bin ich schon zumindest dabei es zu versuchen. Mit einem 16F kommt man schnell an seine Grenzen. Ist mir auch schon paar mal passiert. Die geschickteste Lösung ist der wirklich nicht. Ich glaube aber für das was ich vorhab dürfte er noch gerade ausreichen. Es sollen nicht viele Daten über den CAN-Bus gelesen oder gesendet. Falls ich es echt gegen die Wand rennen sollte, hast du mich jedenfalls gewarnt. :-)
Nils M. schrieb: > Also möchte ich einen CAN-Controller selbst mit Assembler schreiben. Das würde ich mir reiflich überlegen! Wieviel BPS (Bit pro Sekunde) soll der denn dann in Software können? 100 oder 1000? Und zwar sah ich bei meinen eigenen Geschichten mit CAN schon mal Prototypenaufbauten aus der Anfangszeit von CAN mit vielen hochintegrierten Einzelbausteinen und Controllern. Das war für mich im wahrsten Sinne des Wortes das MERKwürdigste über die Komplexität. Und flößte mir gleich etwas Respekt ein. Eine Platine 20x20cm voll mit hochintegrierter Hardware. Und das Ergebnis, steckt heute in einem winzigen CAN-Controller drinne. Eine Menge Hardware, wie auch die CRC-Berechnung, und die Stub-Bits, die ich schon nannte, einige Dinge zur Betriebssicherheit des CAN. Da bei CAN ist einiges vieles in Hardware gelöst, da kommst du auch mit dem schnellsten µC in Assembler nicht dran.
mal im ernst... mach dir doch nicht die absolut sinnfreie arbeit das in software selbe rzu machen.. nimm einen controller mit eingebautem can controller...sparrt zeit und ärger..
Eigentlich schade um die Zeit... Du wirst nicht nur Timingprobleme bekommen, sondern sehr wahrscheinlich schnell auch an RAM- und ROM-Grenzen stossen. Selbst wenn du es schaffst - wo ist der Nutzen? Ein externer CAN-Controller kostet 1€, und in 2h Programmierzeit läuft das Ding.
Ich kann eure Bedenken natürlich verstehen und bin euch auch für eure Warnungen dankbar. Aber die Anforderungen die ich an meinen CAN-Controller habe sind sehr sehr gering. Im besten Fall muss er einmal am Tag, wenn überhaupt, einen kompletten Frame schicken. Im schlechtesten Fall muss er zwei Frames schicken und einen als Antwort empfangen. Die zu empfangenen Daten sind sogar vorraussehbar und die Datenrate relativ gering. Der PIC wird sich meiner Meinung nach eher damit langweilen was ich von ihm erwarte. Kann sein, dass es alles wunderbar klappt (wovon ich grad ausgehe) oder ich werde echt meine Zeit vebraten und gegen die Wand laufen. Dann habe ich halt Pech gehabt... Aber immerhin werde ich dann drauß gelernt haben. Die CAN-CRC Berechnung war bereits das erste was ich nun richtig verstanden habe.
Nils, wie sieht's mit der Fehlerbehandlung aus? Kann das dein selbergestrickter Controller auch? Denn das ist ein ganz wichtiger Aspekt des CAN-Busses. Und wenn er das nicht kann, dann nenne ihn bitte nicht CAN-Controller :-(
Das sehe ich ähnlich wie Nils. Natürlich gibt es preiswerte IC-Lösungen und die Implementierung einer CAN-FSM ist nicht ohne. Aber zum wirklich tiefgründigen Lernen/Gewinnen von Erfahrung am Bus ist das sicherlich eine sehr gute Idee (wenn nicht sogar die beste). Wenn das Ding läuft - die Geschwindigkeit ist wohl nicht so entscheidend; dann läuft er halt nur mit 100 Bit/s - dann kann er von sich behaupten: "Ja - ich verstehe jetzt CAN" :-) Auf jeden Fall finde ich das besser als den 100en Motorcontroller zu bauen. Versuchen? Auf jeden Fall! Schaffen? Ich drücke die Daumen - einfach wird es nicht. Chris D. CAN-Fan - aber manchmal wird es zur Hassliebe ;-)
Helmut -dc3yc schrieb: > Nils, wie sieht's mit der Fehlerbehandlung aus? Kann das dein > selbergestrickter Controller auch? Denn das ist ein ganz wichtiger > Aspekt des CAN-Busses. Und wenn er das nicht kann, dann nenne ihn bitte > nicht CAN-Controller :-( Lass ihn doch einfach mal machen - ich denke, er ist froh, wenn der Controller überhaupt erstmal Daten überträgt. :-) Chris D.
@Balu: Könntest du mir bitte die Abfolge etwas genauer erklären. Ich sehe du schiebst so lange nach links bis die 1 vorne steht was einer Division durch 32 entspricht, was passiert im nächsten Schritt? Ich verstehe nicht wo jetzt die neue Zeichenfolge herkommt? X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1 heißt das x hoch 15 + x hoch 14....wofür steht hier x für die Sequenz vom Startbit bis zum letzten Datenbit? Wäre dir sehr dankbar wenn du das nochmal ausführlicher erklären würdest, ich würde dann auch einen Artikel dazu schreiben, da an dieser CAN-CRC Berechnung sehr viel Interesse besteht, auch wenns normal der CAN-Controller übernimmt.
Chris D. schrieb: > Lass ihn doch einfach mal machen Es ist ein hoher Aufwand, die nicht-triviale CAN-Physik nachzuprogrammieren. Die vorgesehene PIC-Hardware wird das aller Voraussicht nach nur auf sehr niedrigen Bitraten schaffen, die Verwendbarkeit in real existierenden CAN-Bus-Systemen ist also fraglich. Auf der anderen Seite sind uCs mit integriertem CAN-Interface für wenige Euro zu kaufen. Der Plan ist also ungefähr so sinnvoll wie das Abschreiben der Tageszeitung. Der Lerneffekt (Verständnis von CAN) kann auch auf andere Weise erreicht werden, und zwar schneller und mit mehr Nutzen. Unterm Strich ist es nichts als eine Vergeudung von Zeit, und da Lebenszeit keine unendliche Resource ist, kann man von "lasst ihn doch machen" in diesem Fall eigentlich nur abraten, was ich hiermit tue. Gruß, willibald
>Wäre dir sehr dankbar wenn du das nochmal ausführlicher erklären >würdest, ich würde dann auch einen Artikel dazu schreiben, da an dieser >CAN-CRC Berechnung sehr viel Interesse besteht, auch wenns normal der >CAN-Controller übernimmt. Der de.wikipedia.org Artikel ueber CRC ist zu empfehlen, dann gibt es unter mikrocontroller.net noch diverse CRC-Threads. Hier gibt es an gewissen Stellen Analogien zu einer regulaeren Division, welche mehr oder weniger gut passen. Bereits diese Analogien sind einigen mathematisch formaler orientierten Personen aufgestossen, will heissen: Stelle Dich bei Deinem Artikel auf viele falsche Aussagen und reges "Feedback" ein ;-) Mal grad so erklaeren wuerde einiges an abstrakter Algebra, GF(2) und Ringen erfordern ;-) Fuer tiefere Einsichten waere aber "Error Correction Coding", T.K. Moon zu empfehlen; selbiger Autor verwendet das Buch in einem 2 Semester Kurs), die CRC-Aufgaben samt den Grundlagen umfassen etwa 3 Labs (== 3 Wochen Schufterei). Zum operativen Teil(s.o): steht vorne eine 0 -> shiften steht vorne eine 1 -> mit dem Polynom reduzieren(exor), dann steht zwingend wieder eine 0 da. Viel Erfolg, Balu
>und am Ende kommt es auf den Rest an wie oft geshiftet wird ist ohne >Belang Bei einer Nachricht m bestehend aus Bytes und der (Byte-)Laenge m_l der Nachricht m wird m_l * 8 mal geshiftet. VG, Balu
ich bin nun auch dahinter gekommen hatte ein einzelnes Bit falsch aus dem ersten Bild übernommen. Nun Ich habe einen kleinen Wiki-Artikel erstellt vielleicht könnt ihr ja mal drüber schauen damit ich nichts falsches verbreite. Werde mich demnächst an einen ASM Routine dazu machen und diese dem Artikel hinzufügen. Und danke Nils für die Bereitstellung deines Bildes http://www.mikrocontroller.net/wikisoftware/index.php?title=CAN_CRC_Berechnung&redirect=no
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.