MCP2515 Grundlage Frage

Moin,

die Arduinos hängen aktuell nur am PC, damit ich über Serial.print schauen kann, was die so machen und was nicht.
Oder meintest Du die Modellbahnsteuerung? Da habe ich einen entsprechenden "Adapter" der auch in RocRail bereits eingebunden ist. Jedoch habe ich ihn aktuell nicht mit in meinen Probeaufbauten, bei dem ich nur "begreifen" will, wie ich den CAN-Bus nutzen kann.
Denn das Thema wollte ich nicht aufmachen, wie ich von einem Windoof Rechner mit einem Web-Programm auf ein Linux Rechner zugreife, um über diesen mit Geräten an einem CAN-Bus, Steuerungsarbeiten an meiner Modellbahn zu koordinieren.
Ich wollte mich in diesem Post nur auf den Aspekt des CAN-Busses beschränken.

Ich habe vor, mehrere Dutzend Ardus auf der Anlege "zu verteilen", die entsprechende Aufgaben bekommen. Und außerdem dutzende, die die Steuerungsbefehle dann geben können. Oder eben die Software. Wenn es halbwegs läuft, berichte ich mal unter "Eure Projekte".

Jedoch klappt das mit den Steuerungsbefehlen aktuell noch nicht so, wie ich es gern hätte und bräuchte.

Gruß
Harald

Bei einem Bus mit gleichberechtigten Teilnehmen wie dem CAN-BUS ist die Kollisionsvermeidung extrem wichtig. Ein einzelner MCP2515 sieht den Bus vermutlich als beschäftigt an, weshalb er seine eigenen Nachrichten nicht absetzen kann, was zu einer Zeitüberschreitung mit der Meldung TIMEOUT führt. Das erscheint mir logisch.

BUS bedeutet zwei oder mehr Teilnehmer. RS232 ist im Gegensatz dazu eine Punkt-zu-Punkt-Verbindung, RS485 kann man als BUS verwenden.

Ja, das mache ich auch mit einem Rechner und mehreren Fenstern der Arduino-IDE.

Da schließe ich mich Dir an :thinking:

MCP_8MHZ hast Du ja beachtet, eigentlich der klassische Fehler.

Zum Vergleich:

Sender
8:29:05.227 -> Entering Configuration Mode Successful!
18:29:05.227 -> Setting Baudrate Successful!
18:29:05.227 -> MCP2515 Initialized Successfully!
18:29:05.227 -> CAN_OK             
18:29:05.227 -> Message Sent Successfully!
18:29:06.211 -> CAN_OK             
18:29:06.211 -> Message Sent Successfully!
18:29:07.242 -> CAN_OK             
18:29:07.242 -> Message Sent Successfully!
18:29:08.227 -> CAN_OK             
Empfänger
8:29:04.805 -> Entering Configuration Mode Successful!
18:29:04.805 -> Setting Baudrate Successful!
18:29:04.805 -> MCP2515 Initialized Successfully!
18:29:04.805 -> MCP2515 Library Receive Example...
18:29:05.789 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
18:29:06.821 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
18:29:07.805 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
18:29:08.836 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07

... soll also später die Daten vom CAN-BUS erhalten, aha!

Wieso "nur"? Es sind maximal acht Datenbytes möglich.

Schicke ich acht, kommen acht an, schicke ich aber sieben, kommen sieben an:

19:06:23.637 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
19:06:24.668 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
19:06:27.668 -> Standard ID: 0x100       DLC: 7  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06
19:06:28.634 -> Standard ID: 0x100       DLC: 7  Data: 0x00 0x01 0x02 0x03 0x04 0x05 0x06

Moin,

kurzer Nachtrag.

Jetzt bin ich noch verwirrter.
Ich habe die Fehlermeldung wegbekommen, in dem ich die Datenlänge auf 7 reduziert habe also aus : byte sndStat = CAN0.sendMsgBuf(0x100, 0, 8, data);
habe ich: byte sndStat = CAN0.sendMsgBuf(0x100, 0, 7, data);
gemacht und nun kommen keine Fehler mehr und es läuft einwandfrei mit CAN==OK durch. Jedoch werden nun nur 7 Datenbyts übertragen.
???? Ich bin verwirrt????

Gruß
Harald

Moin,

So, ich habe jetzt alles, was mir einfiel ausprobiert, aber ich habe es nicht geschafft, daß er 8 Bytes sendet ohne, daß diese Fehlermeldung kommt. 7 und weniger Bytes sind kein Problem. Aber mit 8 kommt immer die Fehlermeldung.

Hat jemand eine Idee, wie das kommen kann?

Gruß
Harald

Das ist jetzt der typische Fall "ich habe alles richtig gemacht", aber dennoch funktioniert es nicht. Eventuell hat

  • das Programm
  • die Schaltung
  • die Hardware

einen Fehler. Alles erscheint mir unwahrscheinlich, dennoch muß irgendwo da der Wurm drinstecken.

Ich habe zwei UNOs, zwei MCP2515 fertig verkabelt hier liegen, mehr kann ich Dir nicht anbieten.

Zeige doch mal den Code.

Moin,
der Code:

// CAN Send Example
//

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

void setup()
{
  Serial.begin(9600);

  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_125KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");

  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
}

byte data[12] = {0x00, 0x01, 0xFF, 0x03, 0x04, 0x05, 0x06, 0x07, 97,00,00,00};

void loop()
{
  data[2]++;
  // send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  byte sndStat = CAN0.sendMsgBuf(0x100, 0, 7, data);
  if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");
  }
  meldung(sndStat);
  delay(10000);   // send data per 100ms
}

void meldung(const byte stat)
{
  switch (stat)
  {
    case 0: Serial.print(F("CAN_OK             ")); break;
    case 1: Serial.print(F("CAN_FAILINIT       ")); break;
    case 2: Serial.print(F("CAN_FAILTX         ")); break;
    case 3: Serial.print(F("CAN_MSGAVAIL       ")); break;
    case 4: Serial.print(F("CAN_NOMSG          ")); break;
    case 5: Serial.print(F("CAN_CTRLERROR      ")); break;
    case 6: Serial.print(F("CAN_GETTXBFTIMEOUT ")); break;
    case 7: Serial.print(F("CAN_SENDMSGTIMEOUT ")); break;
    case 0xff: Serial.print(F("CAN_FAIL       (0xff")); break;
  }
  Serial.println();
}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Das ist im Prinzip der Beispielcode aus der Lib.

Da es mit 7 und weniger Bytes funktioniert, kann ich irgendwie nicht an ein Verkabelungsfehler glauben.

Achso, um Mißverständnisse auszuschließen. An kommen immer alle Bytes. Also auch bei 8 kommen 8 an. Der Sender gibt die Meldung raus.
Gruß
Harald

Moin,
sorry, war ein Tippfehler. Nur 7 sollte es heißen. Und es kommen auch die 8 an, wenn ich sie sende, jedoch meldet der Sender dann den Fehler.

Gruß
Harald

Sender:

19:09:01.195 -> Message Sent Successfully!
19:09:01.242 -> CAN_OK             
...
19:09:47.036 -> Message Sent Successfully!
19:09:47.036 -> CAN_OK             

Empfänger:

19:09:01.195 -> Standard ID: 0x100       DLC: 7  Data: 0x00 0x01 0x09 0x03 0x04 0x05 0x06
...
19:09:47.036 -> Standard ID: 0x100       DLC: 8  Data: 0x00 0x01 0x01 0x03 0x04 0x05 0x06 0x07

Wüßte ich was Schlaues zu schreiben, würde ich es tun :thinking:

Moin,
danke. Tja, dann weiß ich auch nicht.

ich habe auch schon Sender und Empfänger gewechselt, aber bei mir immer das Gleiche.
Wenn ich auf 8 Bytes senden wechsle, kommt:
Error Sending Message...
CAN_SENDMSGTIMEOUT
Beim Empfänger auch:
Standard ID: 0x100 DLC: 8 Data: 0x00 0x01 0x01 0x03 0x04 0x05 0x06 0x07
alle 10 Sekunden.

Kann es daran liegen, daß ich Nanos benutze?

Gruß
Harald

TIMEOUTVALUE

Nachtrag:

/* In Microseconds, May need changed depending on application and baud rate */

Setze mal den Speed hoch

Moin,

welchen Speed meinst Du? Die kbps des CAN-Busses?
Das geht nicht, weil ich die wegen der Leitungslängen benötige.
Ich würde gern sogar noch langsamer werden, jedoch der Adapter für RocRail arbeitet mit den Einstellungen.

Gruß
Harald

Nö, UNO und Nano haben denselben Prozessor ATmega328P.

Hast Du den Bus-Widerstand J1 aktiv?

Meine Kristallkugel schreit seit einiger Zeit:
Du hast Timeouts, weil du die Baudrate runter gesetzt hast.

Moin,

okay, ich habe es ausprobiert. Wenn ich die kbps des CAN-Busses auf 250 setze, tritt der Fehler nicht mehr auf.

Kann man dann in der Geschw. keine 8Byte übertragen?
Oder muß man dazu etwas anderes einstellen?
Wenn Ja, Wie und was?

Gruß
Harald

Welche Leitungslänge hast Du derzeit zwischen den MCP2515 und was ist mit J1?

Moin,

ich habe weiter herumexperimentiert, obwohl ich von alle dem keine Ahnung habe, aber ich habe die Fehlermeldung nun nicht mehr.

Ich habe die Datei: mcp_can_dfs.h in dem Ordner: c:\Users\Sensi\Documents\Arduino\libraries\MCP_CAN_lib-master
geöffnet mit Nodepad++
Dann den Eintrag "TIMEOUTVALUE" gesucht und den Wert von 50 auf 90 geändert. Nun kommt der Fehler nicht mehr.

noch einmal Danke für Eure Hilfe.
Gruß
Harald

Dann möchte ich hoffen, das bleibt so. Dank an @combie!

Leider macht mich die Tatsache, daß es bei mir ohne Deine Änderung über eine Stunde ohne einen Fehler durchgelaufen ist, etwas skeptisch. Zusammen mit RocRail wird das nochmal spannend :slightly_smiling_face: