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