mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 Problem mit hoher Buslast


Autor: UART-Boy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: UART-Boy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peterguy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tajas R. (tony)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: peterguy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.