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?
Stellt man das nicht über den Identifier ein? ober habe ich dein problem falsch verstanden?
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.
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?
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
o.k. das verstehe ich. Steht auch so im MCP2515 Datenblatt. Müssen immer Filter und Maske gesetzt werden?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.