ich bastele gelegentlich für meine Modellbahn mit Arduinos herum. Ich habe schon eine Drehscheibe mit Bedienpult gebaut, welche über den CAN-BUS kommuniziert.
Nun wollte ich Weichensteuerungen über den CAN-BUS bauen und verzweifle ein wenig.
Ich möchte dazu den CAN-BUS verstehen und nicht einfach nur, wie ich es bei der Drehscheibe gemacht habe, kopieren. Bei der Drehscheibe hatte ich zwei Megas, die miteinander kommuniziert haben. Nun brauche ich Nanos
Nun zu meiner Frage:
Ich habe ein Nano(NoName) mit einem fertigen MCP2515 Modul verbunden.
Ich habe von der Lib das BeispielSketch CAN_Senden genommen, den CS_Pin angepaßt und übertragen.
Leider hältst du geheim welche Library du nutzt.
Welcher Error genau auftritt
Den Code welchen du verwendest.
Ob die Abschlusswiderstände montiert/aktiv sind.
Bisher habe ich da noch nicht explizit drauf geachtet, aber ich denke schon. Möglicherweise ist nicht nur eine Gegenstelle, sondern auch ein quittierender Empfänger der Nachricht notwendig. Eventuell haben auch die Filter Einfluß.
Moin, danke für die Einschätzung, jedoch verstehe ich nicht, welche Gegenstelle sich denn dann meldet, wenn sie keine angeschlossene für die Daten interessiert. Es gibt im CAN-BUS doch keinen Master, der alles regelt. Also müßte dies ja irgend einer übernehmen. Und woher weiß derjenige, daß er es tun soll? Oder machen es Alle? Wenn ich 100 Anschlüsse haben, explodiert doch die Leitung nur wegen der Quittung.
Sorry, ich verstehe es nicht.
Die Fehlermeldung habe ich bereits gepostet.:
Error Sending Message...
Die kommt aus dem Code. Und bedeutet, Nachricht konnte nicht gesendet werden. Wenn ich den Code richtig verstanden habe.
Als ich meinen Text schrieb, kamen mir auch Zweifel wegen der mehreren Empfänger, die möglich sind. Aber diese Fehlermeldung habe ich auch schon gelesen.
Der jeweilige Master kann allerdings einfordern, dass sein Paket mit einem ACK bestätigt wird.
Beispiel:
KFZ Bremslicht, da ist eine Bestätigung von Nöten.
Die beiden Abschlusswiderstände sind nötig, sonst ist es kein Bus.
Soviel steht fest!
Wie auch immer, ich bin jetzt hiermit auch an meinem Ende angekommen.
Meine Erfahrung:
Bisher haben meine CAN Installationen sofort geklappt.
Ausnahme: Hatte Module mit 8MHz Quarz und welche mit 16MHz
Hat ein bisschen gedauert, bis ich das begriffen hatte. Es der Lib mitgegeben, dann liefen die auch zusammen, ohne Probleme.
danke erst einmal für die viele Hilfe.
"Ich" werte nur das aus, was in dem Beispielcode programmiert wurde. Ich habe dies ausgewählt, um zu begreifen, was wie läuft. Und ja, es interessiert mich, warum etwas nicht geht, deshalb frug ich hier.
Ich habe nun das abgeänderten Code gestartet und erst kommt 3 mal die Meldung:
CAN_SENDMSGTIMEOUT
Error Sending Message...
und anschließend:
CAN_GETTXBFTIMEOUT
Error Sending Message...
Also wenn die Letztere kommt, wenn keine Gegenstelle da ist, bedeutet es wohl, daß er keine "Antwort" erhält. Aber was bedeutet die erste Meldung?
"ich muß erst warm werden"
oder was?
Ich müßte also als Erstes min einen weiteren MCP2515 am Bus haben und beim Senden Abfragen, ob die Nachricht rausgegangen ist.
Gruß
Harald
PS. Meine Module haben alle 8MHz. Aber das wußte ich vor dem ersten Projekt und hatte seit dem immer darauf geachtet, daß der Wert richtig angegeben wurde.
Im Datenblatt zum MCP2515 gibt es ein Kapitel "ERROR DETECTION", das zu lesen sich lohnen könnte. Dazu kannst Du in die Bibliothek schauen, wie dort die Fehlermeldungen mit den Codes des MCP2515 zusammenhängen.
Weil die Bibliotheksbeispiele nur CAN_OK auswerten, führt mich das zu der Annahme, die anderen Zustände zu unterscheiden ist nicht von Wert.
Du schickst also so lange eine Nachricht, bis CAN_OK kommt, dann wartest Du auf die Antwort des Empfängers als Quittung.
Du könntest auch mal mit anderen Bibliotheken vergleichen, ob es dort andere Meldungen gibt. ESP32 und Teensy haben eigene Hardware für CAN-BUS eingebaut, die haben andere Register, also eventuell auch andere Meldungen.
mit diesen Datenblättern komme ich irgendwie nicht klar. Meistens auch nur auf englisch, wo ich sofort aussteige.
Ich probiere es dann lieber aus, jedoch muß es für mich irgendwie nachvollziehbar sein.
Bei meiner Drehscheibe habe ich die Kommunikation selbst überlegt und die funktioniert. Ich kann sogar weitere Bedienpulte bauen und anschließen und das sollte laufen. Aber der CAN-Bus lief von Anfang an ohne Probleme, was nun nicht der Fall war.
Okay, bei der Drehscheibe hatte ich einen CAN-USB oder CAN-Ethernet Adapter dran. Der hat dann wohl die Meldungen erzeugt, die mir jetzt fehlen. Was der genau gemacht hat, weiß ich nicht. Der gab mir nur die Daten für den Bus vor und machte den Bus RocRail tauglich. Aber aktuell habe ich keinen mehr davon. Damals hatte ich ihn, weil über den die 12V Spannungsversorgung kam, über die ich fast alles betrieben habe. Nun habe ich eine andere Stromversorgung und diesen Adapter nicht dran.
Ich werde es mal probieren min einen zusätzlichen MCP2515 in den Bus zu klemmen. Mal sehen was dann passiert.
okay, kannte ich noch nicht. Aber leider funktioniert das irgendwie nicht.
ABER, bevor hier nun eine Diskussion draus wird, wie die Seite funktioniert, habe ich mir eine andere Seite gesucht und gefunden, die es gemacht hat.
Nun habe ich einiges zu lesen. Ich probiere weiter und werde berichten.
Ich habe den Eindruck, irgendwo lauert ein Mißverständnis.
Für mich liest sich dieser Satz, als würdest Du versuchen, nur mit einem MCP2515 einen Bus aufzubauen, was natürlich nicht geht. Da Du das weißt frage ich mich, ob es noch einen dritten Teilnehmer gibt, den nur Du kennst? Oder hast Du nur den Satz unglücklich formuliert?
Was Du da zu RocRail und dergleichen schreibst, ist mir leider gänzlich unklar.
Da mein CAN-BUS tut, was er soll, brauchst Du nur zu antworten, wenn Du noch weiter Hilfe von mir in Anspruch nehmen möchtest.
Jain,
Ich war der Annahme, daß man keinen BUS an sich braucht, um eine Kommunikation aufzubauen und zu testen. Ich brauche ja auch keine Räder an einem Auto um zu sehen ob sich der Motor und dann die Räder drehen würden um zu fahren.
ABER:
kurzer Zwischenbericht.
Ich habe nun einen BUS, wie Du es nennst, aufgebaut. Also ZWEI MCP2515 mit je einem Arduino. Allerdings an einem Rechner.
Der eine hat den Senden-Code und der andere den etwas veränderten Receive-Code.
Der Sender meldet weiterhin die Fehler, aber der Empfänger empfängt alle Sendungen vollständig.
Nun bin ich mehr als verwirrt.
Was sagen die Fehlermeldungen: "CAN_SENDMSGTIMEOUT" und "CAN_SENDMSGTIMEOUT" denn nun wirklich aus? Darüber habe ich noch nirgends etwas gefunden. Was mache ich falsch?
Ich nehme doch die Beispiel-Sketche.
Gruß
Harald
PS: RocRail ist ein Steuerungsprogramm für Modellbahnen. Und die Signale auf den CAN, sollen in den PC kommen, damit dieses Programm damit etwas anfangen kann und Steuerungen vornehmen kann.