CAN-Bus und UART

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • CAN-Bus und UART

      Hallo Leute

      Ich habe da mal ne Frage zu CAN-Bus.
      Ich habe mir das Protokoll von CAN_Bus mal angesehen, welche Bits welche Bedeutung haben. Hinzu kommt das Bit-Stuffing, was im Protokoll verwendet wird.
      Auf der anderen Seit hat CAN-Bus Vorteile für dezentrale Steuerung, Hausautomation etc.

      Jetzt stellt sich mir die Frage, wenn man jetzt einen einfachen CAN-Bus Transceiver nimmt und den mit der UART-Schnittstelle verbindet, sollte es doch möglich sein, Geräte zu einem Netzwerk zu verbinden.
      Mit ist klar, dass UART und CAN-Bus-Protokoll nicht funktioniert bzw. nicht kompatibel ist.
      Aber mit einem eigenen Protokoll sollte man doch per UART ein Netzwerk im Multimaster-Betrieb aufbauen können.

      Liege ich da richtig?
    • Pluto25 schrieb:

      Klar, es muß nur jeder wissen wann er was sagen
      Bei 485-Bus stimme ich dir zu. Da muss das über Master-Slave-Betrieb ablaufen.

      Bei Can-Bus können alle gleichzeitig senden, wobei halt einer nur durchkommt und das Senden einstellt, wenn ein anderer Busteilnehmer eine dominante Adresse hat.
      Das ist mit den Can-Bus-Treibern möglich. Es gibt also keine Signal-Kollision.

      Pluto25 schrieb:

      Da ist es egal (bei 485-Bus) ob einer fehlt, eine 232 Kette würde dann versagen hätte jedoch den Vorteil das der Sender sofort weiß wenn seine Nachricht kaputt gegangen ist.
      Ich dachte nicht an eine Kette (Ringtopologie) sondern an eine Bus-Topologie, genauso wie bei 485-Bus oder Can-Bus.
      Wenn ein Teilnehmer tot ist, wird er nicht auf Anfragen reagieren, und er wird auch nicht senden. Der Rest läuft aber normal weiter.

      Also ich entnehme deinem Beitrag, dass es geht.
      So vermute ich das auch.

      Die Busarbitierung wird auch funktionieren, wenn mit TxD als erstes die Zieladresse übermittelt wird, die ja durch den CAN-Treiber wieder im RxD-Register landet.
      Durch Vergleich der ausgegebenen Adresse und dem Wert, der dann um UDR-Register steht lässt sich feststellen, ob das korrekt ausgegeben wurde.
      Wenn ja, hat man den Bus und kann weiter senden, wenn nicht, muss man weiter am Bus lauschen, bis eine andere Übertragung abgeschlossen ist.

      Deswegen können Busteilnehmer auch Master und Slave gleichzeitig sein und jederzeit unter der genannten Premisse senden.
      Ich denke auch, das sollte funktionieren.

      Damit könnte man eine Hausautomation mit eigenen Komponenten realisieren, aber auch etwas steuern, das Räumlich verteilt ist. Oder man kann auch eine Kommunikation zw. AVR's machen, um Daten auszutauschen.

      Danke für deine Antwort.
    • Das geht. Jedoch haben manche Treiber eine Tx-low Kontrolle. Heißt es darf nicht zu langsam werden.
      z.B. der Mcp2551 würde bei einer 0x00 unter 9600Baud aussteigen. (>1,25ms Low).
      Das wird ein Problem bei Längen von mehreren Kilometern. a_448_c66dc889
      Bis 40m geht ein Mbaud, 125 kBaud reichen für 500m (Wiki-Info - nie versucht)

      Es ist fast wie 485 ohne Empfänger Umschaltung. Man bekommt sofort den gesendeten Pegel zurück.
      Ein SW Uard könnte nach dem ersten Bit wissen ob eine Kollision vorliegt, der HW nach einem Byte.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pluto25 ()

    • Pluto25 schrieb:

      Das geht. Jedoch haben manche Treiber eine Tx-low Kontrolle. Heißt es darf nicht zu langsam werden.
      z.B. der Mcp2551 würde bei einer 0x00 unter 9600Baud aussteigen. (>1,25ms Low)
      Das war mir jetzt neu. Aber gut zu wissen.
      Aus dem Bauch raus hätte ich jetzt sowieso eine vernünftige Baudrate genommen, also mehr als 9600 und weniger als 115kBaud.

      Pluto25 schrieb:

      Es ist fast wie 485 ohne Empfänger Umschaltung.
      Genau, und jeder Teilnehmer kann selber senden, wenn es etwas zu melden gibt und muss nicht warten, bis der Master anfragt.

      Pluto25 schrieb:

      Man bekommt sofort den gesendeten Pegel zurück.
      Ein SW Uard könnte nach dem ersten Bit wissen ob eine Kollision vorliegt, der HW nach einem Byte.
      Richtig.
      Ich würde den Soft-Uart aber nicht verwenden wollen, da eine Hardware den Bus quasi im Hintergrund bedienen sollte.
      I.d.R. hat die Hardware noch mehr zu erledigen, als nur am BUS zu lauschen.
      Die Bitrate sollte nicht aus dem Takt kommen, sonst können das die anderen Bus-Teilnehmer nicht richtig lesen.
      Von daher wäre der Hardware-Uart vermutlich besser geeignet.

      Das erste Byte, das ein Teilnehmer auf den Bus legt, sollte wie im CAN-Protokoll auch die "Adresse" sein. Wobei Adresse hier nicht ganz korrekt ist. Gruppe könnte man das auch nennen. Der Rest kann man selbst individuell gestalten.

      Nur mal so als Idee.

      Für ein Netzwerk würden mir jetzt 3 Ansätze einfallen.
      Im Grunde gibt es ja Sensoren und Aktoren.

      Der erste Ansatz wäre, dass alle Sensoren ihre Ereignisse an eine zentrale Steuereinheit senden, und diese gibt dann die Anweisungen an die Aktoren weiter.
      Vorteil wäre, dass Sensoren und Aktoren relativ dumm sein können. Sensoren senden nur an die Steuereinheit und Aktoren bekommen nur von dieser Steueranweisungen.
      Die Steuereinheit übernimmt die intelligent. Sie merkt dann auch, wenn ein Teilnehmer nicht funktioniert. So etwa ist es auch in KFZ gehandhabt.

      Der zweite Ansatz wäre ohne die die zentrale Steuereinheit.
      D.h. die Intelligenz wird mehr in die Sensoren, Aktoren verlagert. Wenn ein Sensor sendet, sendet er eine Kennung mit. Alle Teilnehmer lauschen am Bus, und dann gibt es ein oder mehrere Aktoren, die auf diese Kennung (Gruppen) reagieren und das ausführen. Würde man Adressen nehmen, musste man mehrere Aktoren nacheinander ansteuern. So könnten aber unterschiedliche Gruppen auf dem selben Bus nebeneinander kooperieren.

      Oder man kann beides kombinieren, dass Gruppen und Direktadressierung mit Zentrale erlaubt ist.
    • Mitch64 schrieb:

      und weniger als 115kBaud.


      Oder man kann beides kombinieren
      darf viel schneller sein (125K ist Low Speed, 1Mbaud wäre High Speed)

      So ähnlich hab ich das hier. Die die keine Fremddaten brauchen reagieren nur wenn sie angesprochen werden und werten nichts aus was sie nicht betrifft, fragen auch nie.
      Die was benötigen hören mit und picken sich die passenden Daten aus. Sollte keiner fragen (Zentrale aus) fragen sie selbst.
      Das Protokoll ist recht einfach gehalten (Klartextfan)
      Sendung: Idnummer, pre-Anweisung, Anweisung und bei Bedarf Daten
      Antwort: Idnummer, Anweisung, Daten
      Die Antwort kann dann jeder auswerten der sie haben möchte z.B. "id1 time 17:22:23"