Forum: Compiler & IDEs Erfahrung bei der Adressierung eines CAN Bus


von Daniel D. (duesentrieb)


Lesenswert?

Hallo zusammen,

ich habe mir einen CAN Bus mit mehreren Knoten auf Basis Mega8-MCP2515 
augebaut.
Die Übertragung auf dem Bus funktioniert auch ohne weiteres.
Allerdings habe ich Probleme was die Adressierung angeht.
Meine Daten werden z.Zt. von jedem Knoten angenommen was so nicht sein 
soll.
Mittels Filter und Maske kann man festlegen dass nur bestimmte 
Nachrichten beim Knoten verarbeitet werden.
Leider komme ich damit nicht zurecht.

Wer hat Erfahrung in der Programmierung von Filter und/oder Masken?

von Der Braten (Gast)


Lesenswert?

Stellt man das nicht über den Identifier ein?

ober habe ich dein problem falsch verstanden?

von Helmut -. (dc3yc)


Lesenswert?

Hallo Düsentrieb,

der CAN-Bus ist messageorientiert, das heisst eine Adressierung im 
herkömmlichen Sinne gibt es nicht. Jeder Knoten empfängt alle Telegramme 
des Busses, überprüft sie auf Korrektheit und bestätigt diese am Schluss 
des Telegramms. Kann ein Knoten ein Telegramm nicht richtig decodieren, 
sendet er ein sog. Errorframe und das Telegramm wird wiederholt. Siehe 
auch unter http://www.can-cia.org/

Was du nun bei deinem Controller einstellen kannst, sind die 
Messagefilter. Jede Message wird mit einem von dir gewählten Identifier 
gesendet. Damit kann man z.b. Prioritäten steuern (niedrige IDs werden 
zuerst gesendet), falls mehrere Knoten gleichzeitig senden wollen. Jeder 
Identifier sollte nur von einem Knoten gesendet werden. Mit diesen 
Filtern kannst du nun auswählen, welcher ID vom CAN-Controller zum 
Prozessor durchgelassen wird. Damit kannst du eine gewisse Vorauswahl 
treffen, welche IDs verarbeitet werden sollen. Du kannst aber auch die 
Auswahl der Software überlassen und alle ankommenden Messages empfangen.
Weiterhin gibt es Controller, die objektorientiert arbeiten. Das heisst, 
du musst dem Controller vorher sagen, welche IDs er weiterleiten soll. 
Dazu hat er eine gewisse Anzahl von Objektregistern, in die man 
verschiedene IDs reinschreiben kann.
Die CIA-Homepage beinhaltet sehr viel Interessantes, die solltest du dir 
dringend mal anschauen!

Servus,
Helmut.

von Daniel D. (duesentrieb)


Lesenswert?

Hallo Helmut,

vielen Dank für deine Ausführungen. Ich denke mein Problem ist sehr 
Prozessorspezifisch. Ich versuche es mal zu erklären.

In der Beschreibung des CAN Controllers MCP2515 werden sowohl Masken als 
auch Filter beschrieben.
Ich denke dass ich das Prinzip grundsätzlich verstanden habe.

Mein Problem besteht darin, dass ich eine Nachrich mit einer ID sende, 
die dann aber nicht durch den Filter des Controllers gelangt.
Ein Beispiel aus meinem, in Bascom Basic geschribenen Programm

Gesendet wird unter der ID 33. Die ID wird auf die Standartregister des 
Senders wie folgt aufgeteilt:

Mcp2515_write_register Txb0sidh , &B00000001
Mcp2515_write_register Txb0sidl , &B00100000
Daran schließt sich die eigentliche Nachricht an.

Nach der Controllerbeschreibung müsste diese empfangene Nachricht nun 
mit dem folgenden Filter vom Controller in die Buffer geladen werden

Mcp2515_write_register Rxm0sidh , &B00000001
Mcp2515_write_register Rxm0sidl , &B00100000
Mcp2515_write_register Rxm0eid8 , 0
Mcp2515_write_register Rxm0eid0 , 0
Mcp2515_write_register Rxm1sidh , &B00000001
Mcp2515_write_register Rxm1sidl , &B00100000
Mcp2515_write_register Rxm1eid8 , 0
Mcp2515_write_register Rxm1eid0 , 0

Leider tut sie das aber nicht!
Erst wenn ich den Filter ausschalte, kommt die Nachricht durch. Und das 
verstehe ich nicht.

Da in der Beschreibung auch von der erweiterten Kennung gesprochen wird, 
und ich diese nicht berücksichtige, könnte das Problem daher kommen.

Kannst du dazu etwas sagen?

von Meister E. (edson)


Lesenswert?

Hallo DD,

schau dir mal das pdf an. Du hast die Wirkung der Masken falsch 
interpretiert.
Der Auszug stammt vom PIC 18F4680, das ECAN-Modul ist aber prinzipiell 
wie in den MCP25xx aufgebaut.

>Erst wenn ich den Filter ausschalte, kommt die Nachricht durch. Und das
>verstehe ich nicht.

In der Tabelle siehst du warum, mit Filterbits==0 wird gar nichts 
gefiltert.

>Da in der Beschreibung auch von der erweiterten Kennung gesprochen wird,
>und ich diese nicht berücksichtige, könnte das Problem daher kommen.

Das ist nicht das Problem, wenn das EXIDEN-bit im RXBxSIDL nicht gesetzt 
ist wird Base Frame Format unterstützt.

Gruss,
Edson

von Meister E. (edson)


Angehängte Dateien:

Lesenswert?

Hier das PDF

von Daniel D. (duesentrieb)


Lesenswert?

o.k. das verstehe ich. Steht auch so im MCP2515 Datenblatt.

Müssen immer Filter und Maske gesetzt werden?

von Meister E. (edson)


Lesenswert?

Zusammenfassend kann man sagen:

Eine 'ungesetzte' Maske (RXMxSIDH+RXMxSIDL == 0) macht die Filterung 
unwirksam, alle eingehenden Identifier werden akzeptiert.

Wenn alle Masken-bits gesetzt sind (RXMxSIDH+RXMxSIDH == FFFFh) kommen 
nur die Identifier durch die Arbitrierung, die mit den 
Acceptance-Filtern identisch sind.

Gruss,
Edson

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.