Forum: Mikrocontroller und Digitale Elektronik CAN-Error zählen


von Johannes (Gast)


Lesenswert?

Hallo,
ich habe noch einmal eine Frage zum CAN.
Wenn ich eine Anfrage auf mein Controller schicke, lasse ich mir die 
Anzahl der Sende-Errors, sowie der Empfangs-Errors ausgeben. Ist es 
möglich ein Empfang-Error zu simulieren? beim Senden-Error habe ihc 
einfach das can-kabel abgezogen.
Meine Frage bezieht sich auch auf das Abrufen der Errors.
Wenn ich die Sende-Errors abfrage, bekomme ich einen Wert (z.B. 0x69) 
jetzt frage ich den Wert noch einmal ab und bekomme dann den wert 0x68. 
Dann lasse ich andere nachrichten drüber laufen. Für jede nachricht 
(Senden und empfangen), geht der Wert runter. Woran liegt das?
Ich benutze

(C1EC & 0x00FF) für die Empfangs-Errors und
(C1EC & 0xFF00) >> 8 für die Errors, die beim Senden entstanden sind.

Johannes

von Rolf M. (rmagnus)


Lesenswert?

Johannes schrieb:
> Wenn ich die Sende-Errors abfrage, bekomme ich einen Wert (z.B. 0x69)
> jetzt frage ich den Wert noch einmal ab und bekomme dann den wert 0x68.
> Dann lasse ich andere nachrichten drüber laufen. Für jede nachricht
> (Senden und empfangen), geht der Wert runter. Woran liegt das?

Die Error-Counters zeigen nicht die Anzahl der Fehler an, sondern werden 
nach bestimmten Regeln erhöht oder verringert. Siehe Kapitel 3.2:
http://documentation.renesas.com/doc/products/mpumcu/apn/rej05b0804_m16cap.pdf

: Bearbeitet durch User
von Johannes (Gast)


Lesenswert?

mh, wieso können die nicht einfach hochzählen?
naja, werden wohl ihre gründe dafür haben. das muss ich mir erst noch 
zwei, drei mal durchlesen, bis ich das richtig verstanden habe.
aber danke dir

von Rolf M. (rmagnus)


Lesenswert?

Johannes schrieb:
> mh, wieso können die nicht einfach hochzählen?

Weil sie eben nicht einfach dazu da sind, Fehler zu zählen. Sie gehören 
zur automatischen schrittweisen Abkopplung des Controllers vom CAN im 
Fehlerfall. Wenn der Fehler aber behoben ist, sollen nicht irgendwelche 
uralten Fehler von vor Tagen noch eine Rolle spielen, nur weil die noch 
im Counter stehen.
Sieh dir mal die Zustände "error active", "error passive" und "bus off" 
an. Die stehen im Zusammenhang mit diesen Zählern.

von Johannes (Gast)


Lesenswert?

Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe 
z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten 
erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen 
Fehlerstand von null.

Die andere Frage, wozu ich eigentlich die anzahl der Fehler haben 
möchte. Ist es überhaupt möglich, die anzahl der einzelnen Fehler 
(Acknowledge-Fehler, Form-Fehler und Bit-Fehler) zu ermitteln? Laut 
datenblatt

The CAN module will detect the following transmission errors:
• Acknowledge Error
• Form Error
• Bit Error
These transmission errors will not necessarily generate an interrupt but 
are indicated by the transmission error counter. However, each of these 
errors  will cause the transmission error counter to be incremented by 
one. Once the value of the error counter exceeds the value of 96, the 
ERRIF (CiINTF<5>) and the TXWAR bit (CiINTF<10>) are set. Once the value 
of the error counter exceeds the value of 96 an interrupt is generated 
and the TXWAR bit in the error flag register is set.

Das heisst ja soviel wie, dass die art des fehlers nicht unterschieden 
werden kann. Ich kann ja 8x einen Form-Fehler haben (der Transmission 
error counter wird je um eins erhöht) oder einmal einen Fehler haben, 
der den error counter um 8 erhöht. Auch unter sich (Acknowledge-, Form-, 
Bit-Fehler lassen sich nciht unterscheiden)

Hinterher wollte ich eigentlich, dass bei eingehender NAchricht die 
Anzahl der einzelnen Fehler raussende.

von Rolf M. (rmagnus)


Lesenswert?

Johannes schrieb:
> Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe
> z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten
> erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen
> Fehlerstand von null.

Ja, und genau das ist Sinn der Sache. Sieh den Error-Counter nicht als 
Anzahl der in der Vergangenheit aufgetretenen Fehler, sondern als ein 
Indiz, wie hoch die Wahrscheinlichkeit ist, daß der Bus aktuell 
fehlerhaft ist.

> Ist es überhaupt möglich, die anzahl der einzelnen Fehler
> (Acknowledge-Fehler, Form-Fehler und Bit-Fehler) zu ermitteln?

Das hängt vom CAN-Controller ab. Ich habe bisher nur den SJA-1000 
benutzt, und der kann das. Welchen Controller du hast, hast du nicht 
verraten.

> These transmission errors will not necessarily generate an interrupt

Ist nur die Frage, was "not necessarily" bedeutet. Ist das eine 
Konfigurationssache oder wird einfach kein Interrupt ausgelöst?

: Bearbeitet durch User
von Johannes (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ja, und genau das ist Sinn der Sache. Sieh den Error-Counter nicht als
> Anzahl der in der Vergangenheit aufgetretenen Fehler, sondern als ein
> Indiz, wie hoch die Wahrscheinlichkeit ist, daß der Bus aktuell
> fehlerhaft ist.

Ahso, ja dann macht die zählerei auch für mich sinn.

Ich benutze für mein CAN je einen PIC aus der daPIC30F-Familie. Als 
CAN-Transceiver benutze ich je einen MCP2551.

Rolf Magnus schrieb:
> Ist nur die Frage, was "not necessarily" bedeutet

Ich verstehe es so, dass zwar ein Interrupt ausgelöst wird, aber halt 
nur ein error-interrupt und nicht unterschieden wird, wieso.

von Steffen R. (steffen_rose)


Lesenswert?

Johannes schrieb:
> Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe
> z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten
> erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen
> Fehlerstand von null.

Sinn des ganzen ist eine möglichst hohe Verfügbarkeit des Busses auch im 
Fehlerfall. Wenn dein Gerät der Störer ist, wird dieses durch das 
schnelle hochzählen der Counter schnell "abgekoppelt" (TX Counter, wenn 
er fehlerhaft sendet, RX Counter, wenn er fehlerhafterweise Fehler 
erkennt, wo es keine gibt). Danach haben die verbleibenden Geräte durch 
das langsame runterzählen "viel" Zeit ihre normale Kommunikation 
durchzuführen, bis der Bus wieder kurzzeitig gestört ist.

(arg vereinfacht dargestellt)

> Die andere Frage, wozu ich eigentlich die anzahl der Fehler haben
> möchte.

???

> These transmission errors will not necessarily generate an interrupt but
> are indicated by the transmission error counter.

Dann kann dieser CAN Controller nicht bei jeder fehlerhaften Übertragung 
einen Interrupt generieren. Wird auch nur selten benötigt, da die 
Interruptlast im Fehlerfall schon extrem sein kann (Bit Fehler aller 11 
bitzeiten im Error Active - so als Extremfall)

> Das heisst ja soviel wie, dass die art des fehlers nicht unterschieden
> werden kann. Ich kann ja 8x einen Form-Fehler haben (der Transmission
> error counter wird je um eins erhöht) oder einmal einen Fehler haben,
> der den error counter um 8 erhöht. Auch unter sich (Acknowledge-, Form-,
> Bit-Fehler lassen sich nciht unterscheiden)

Zur Busanalyze scheint dieser CAN Controller nicht geeignet.

> Hinterher wollte ich eigentlich, dass bei eingehender NAchricht die
> Anzahl der einzelnen Fehler raussende.

Wozu? Darauf bist du nicht eingegangen.
Dieses Detail wird nur selten gebraucht. Vielleicht gibt es ja für dein 
spezielles Problem eine andere Lösung.

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.