Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 Problem mit hoher Buslast


von UART-Boy (Gast)


Lesenswert?

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.

von Tony R. (tony)


Lesenswert?

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...

von UART-Boy (Gast)


Lesenswert?

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.

von Tony R. (tony)


Lesenswert?

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.

von peterguy (Gast)


Lesenswert?

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.

von Tony R. (tony)


Lesenswert?

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...

von peterguy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.