Hallo, ich habe mit einem AT90CAN128 einen CAN-Logger gebaut. Solange ich einzellene Filter konfiguriere funktioniert er einwandfrei. Ich habe jetzt aber mal versucht den kompleten Bus (KFZ, 500K) mit zu loggen. Beim Vergleich mit einem "richtigen" CAN-Loggger ist mir aufgefallen, das einige Botschaften fehlen. Ich habe nun versucht mein Programm zu optimieren und bin zum Schluss gekommen, dass der Flaschenhals bereits die CAN-Interruptroutine ist. Wenn ich in der Routine nur die ID auslese und in einen Buffer speicher, der anschließend auf eine SD-Karte gespeichert wird, sind noch alle Botschaften vorhanden. Wenn ich jedoch nun auch die Daten der Botschaft in den Buffer übertrage, fehlen einige Botschaften. Hat jemand eine Idee, ob ich noch was optimieren könnte oder ob ich einfach was übersehe. Oder ist der At90can128 einfach damit überlastet und es muss was schnelleres her, wenn ja was für alternativen gibt es.
Ich kenne mich jetzt mit CAN zwar nicht aus, aber bei 500K hast 16µs je Byte und ich behaupte frecherweise mal, dass da die speicherkarte nicht nachkommt. Bei derart hohen Datenraten wird es schwer alle Daten die am Eingang sind mit der selben bzw, einer noch höheren Geschwindigkeit an das Ziel zu geben... Da müsstest du vermutlich schon USB benutzen und ne kleine Software schreiben...
Die Speicherkarte ist gar nicht das Problem. ich kopiere jeweils immer nur die ID der Botschaften auf die SD-Karte. Erst wenn ich in der Interrupt-Routine die Daten der Botschaft und ein Zeitstempel in einen Zwischenpuffer speichere (ohne diese auf die SD-Karte zu speichern) gehen Daten verloren. Meine Vermutung ist also, dass sie Interrupt-Routine zu lange dauert, aber da lässt sich ja leider nichts mehr optimieren, irgendwo müssen ja die Register ausgelesen werden.
Wie gesagt: 16µs je Byte.. Ganz egal, was Du mit den Daten anstellen willst, Du hast 16µs je Byte Zeit dafür... Alles was länger dauert führt zu Datenverlust.
Also ersteinmal liegt die durchschnittliche Auslastung von realen CAN Bussen eigentlich nie über 50%. Kenne den AT90CAN128 jetzt nicht, aber ich würde vermuten daß er prinzipiell der Aufgabe gewachsen sein müsste. Ich würde dir vorschlagen, die Dauer der Interruptroutine auszumessen. Die einfachste Methode dafür ist beim Eintritt einen freien Pin auf High zu schalten und beim Austritt wieder auf Low. Dann mit nem Oszi dran und sehen wie lange die ISR pro Aufruf benötigt.
Unabhängig von der Buslast: Wenn mal ein paar Bytes am Stück versendet werden, dann beläuft es sich auf die 16µs... Ob man das wahrhaben will ist eine andere Frage...
Ich würde es so ausdrücken: Ein CAN Frame bei 500kBit hat eine Zeitliche Länge von etwas unter 300µs. Also sollten die CAN ISR + Handling der Daten nicht länger als 300µs dauern um auch in "Stoßzeiten" alle Daten sicher wegspeichern zu können. Natürlich immer davon ausgehend, daß der Controller mehrere Mailboxen/Messagebuffer zum Zwischenspeichern der empfangenen Daten anbietet und diese auch genutzt werden. Ansonsten fällt mir noch ein, daß die Controller normalerweise mitbekommen wenn Mailboxen/Messagebuffer überschrieben wurden, ohne daß diese vorher von dem µC ausgelesen wurden. Schau mal ob es da nicht ein Info-Register o.ä. zu gibt.
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.