Forum: Mikrocontroller und Digitale Elektronik Robuste Datenverbindung


von Tüftler (Gast)


Lesenswert?

Hallo Forum!

Ich möchte eine Datenübertragung zwischen zwei Platinen (beide mit 
AVR-Mikrocontroller) realisieren. Die Entfernung zwischen den beiden 
beträgt ca. 2m, beide sind auf einem Fahrzeug angebracht, wobei sich 
eine Platine draussen, die andere in einer Fahrerkabine befindet. Der 
Prozessor drinnen hat eine Art Master-Funktion und sendet Befehle an den 
draußen befindlichen Prozessor, der Prozessor draußen quittiert den 
Empfang der Daten. Also Kommunikation in beide Richtungen. Wichtig für 
mich ist die Robustheit und Konsistenz der Daten. Die Datenmengen sind 
gering, dafür ist die Korrektheit aber wichtig. Ich habe mir bereits ein 
paar Möglichkeiten überlegt, weiss aber nicht so recht, was die beste 
Lösung ist. Funk kommt nicht in Frage. Grundsätzlich denke ich, dass das 
Signal kabelgebunden und differentiell übertragen werden soll.

RS232 mit UART:
Einfach zu realisieren. TX und RX physisch getrennt. Realiserung mit 
Differential-Übertragung kein Problem. Aber ist die Übertragung ohne 
Takt und das Fehlen von Datensicherung in Hardware nicht ein großer 
Nachteil?
(Bei einem Paritätsbit kann man nicht wirklich von Datensicherung 
sprechen)

SPI:
Hmm...Ein solches Bussystem ist nicht so geeignet(?)
bzgl. Signalpegel oder differential. Datensicherung findet auch nicht 
statt, d.h. ich müsste die Daten selbst mittels CRC o.ä. prüfen.
Vielleicht übersehe ich ja auch ein paar Vorteile.

CAN:
Ist der Industrie-Standard für solche Anwendungen. Übernimmt OSI Schicht 
1+2. Allerdings habe ich mit CAN bisher noch nichts gemacht. Ich kann 
den Aufwand mich da einzuarbeiten schlecht abschätzen. Sieht laut 
Wikipedia aber nicht so kompliziert aus, wenn zwischen zwei Teilnehmern 
kleine Pakete hin und her geschickt werden...

Bitte um Kommentare zu den Möglichkeiten. Kennt noch jemand 
Alternativen?

Viele Grüße
Tüftler

von Falk B. (falk)


Lesenswert?

@Tüftler (Gast)

>RS232 mit UART:
>Einfach zu realisieren. TX und RX physisch getrennt. Realiserung mit
>Differential-Übertragung kein Problem.

Dann hiest es aber RS422 ;-)

> Aber ist die Übertragung ohne
>Takt und das Fehlen von Datensicherung in Hardware nicht ein großer
>Nachteil?

Nein.

>(Bei einem Paritätsbit kann man nicht wirklich von Datensicherung
>sprechen)

Dazu nimmt man eine CRC.

>SPI:
>Hmm...Ein solches Bussystem ist nicht so geeignet(?)

Nicht sinnvoll, wenn gleich machbar. Braucht aber mehr Leitungen und 
auch eine zusätzliche CRC. Der Geschwindigkeitsvorteil wird nicht 
benötigt.

>CAN:
>Ist der Industrie-Standard für solche Anwendungen. Übernimmt OSI Schicht
>1+2.

Ja, da ist viel Zeug drin, CRC und Mehrfachübertragung etc. Die Treiber 
sind sehr robust.

> Allerdings habe ich mit CAN bisher noch nichts gemacht. Ich kann
>den Aufwand mich da einzuarbeiten schlecht abschätzen.

Keine Ahnung.

MfG
Falk

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Tüftler schrieb:
> RS232 mit UART:
> Einfach zu realisieren. TX und RX physisch getrennt. Realiserung mit
> Differential-Übertragung kein Problem. Aber ist die Übertragung ohne
> Takt und das Fehlen von Datensicherung in Hardware nicht ein großer
> Nachteil?
> (Bei einem Paritätsbit kann man nicht wirklich von Datensicherung
> sprechen)

Es hält dich niemand davon ab, im Controller mehr Aufwand zur 
Sicherstellung der Datenkorrektheit zu betreiben. Gängig sind 
Checksummen zur Feststellung von Fehlern (von einfachen 
XOR-Verknüpfungen bis hin zu CRC-Checksummen und einigem mehr) oder der 
Einsatz fehlerkorrigierender Codes. Bei deiner Anwendung würde ich aber 
einfach vorschlagen, die Daten differentiell per RS422 zu übertragen und 
über eine Checksumme abzusichern - das dürfte reichen.

> CAN:
> Ist der Industrie-Standard für solche Anwendungen. Übernimmt OSI Schicht
> 1+2. Allerdings habe ich mit CAN bisher noch nichts gemacht. Ich kann
> den Aufwand mich da einzuarbeiten schlecht abschätzen. Sieht laut
> Wikipedia aber nicht so kompliziert aus, wenn zwischen zwei Teilnehmern
> kleine Pakete hin und her geschickt werden...

Kann man machen, ist aber definitiv mehr Aufwand als RS422 und für die 
Anwendung nicht nötig.

von Thomas E. (thomase)


Lesenswert?

Tüftler schrieb:
> RS232 mit UART:
>
> Einfach zu realisieren. TX und RX physisch getrennt

2m sind auch mit RS232 kein Problem.
Wenn man kein Geschwindigkeitsfanatiker ist, kann man damit sogar 
wesentlich längere Strecken überbrücken. Und ein paar Byte mit XOR 
abzusichern ist völlig OK.

mfg.

von Lehrmann M. (ubimbo)


Lesenswert?

Tüftler schrieb:
> CAN:
> Ist der Industrie-Standard für solche Anwendungen. Übernimmt OSI Schicht
> 1+2. Allerdings habe ich mit CAN bisher noch nichts gemacht. Ich kann
> den Aufwand mich da einzuarbeiten schlecht abschätzen. Sieht laut
> Wikipedia aber nicht so kompliziert aus, wenn zwischen zwei Teilnehmern
> kleine Pakete hin und her geschickt werden...

Servus,

CAN ist nicht sonderlich komplizierter als UART oder I2C.

Mein Tipp: Nimm den MCP2515 (CAN-Controller) und den MCP2551 
(CAN-Treiber). Kosten je ca. 1-2€
Hab dir mal aus dem CAN:Artikel was rauskopiert:

MCP2515
    * SPI Schnittstelle
    * 2 Empfangs- und 3 Sendepuffer jeweils individuell konfigurierbar 
(ID, Masken/Filter etc.)
    * ein gemeinsamer Interruptpin (RX)
    * ein Interruptpin pro Empfangspuffer, umkonfigurierbar als GPO
    * ein Triggerpin pro Sendepuffer, umkonfigurierbar als GPI
    * Stromsparmodus
    * auch für 3,3V-Betrieb geeignet.
    * Diverse C- und Assembler Beispielcodes verfügbar (z. B. bei 
microchip.com und kvaser, Assembler meist für PICs). Auch Software für 
Direktanschluss an die parallele Schnittstelle eines PC verfügbar 
("bit-bang Interface").
    * erhältlich z. B. bei Reichelt (ca. 2€)

Es gibt genügend Projekte mit AVRs die sich mit dem MCP2515 
beschäftigen.
Der MCP2551 ist nur der Treiber (ähnlich dem MAX232 für RS232 halt in 
diesem Fall für CAN).

von Tüftler (Gast)


Lesenswert?

Hi,
danke schonmal für die Antworten!


Habe noch zwei Fragen:

@Falk Brunner
* Das asynchrone Senden ist deiner Aussage nach kein Nachteil. Macht es 
Sinn, eine Präambel à la 0x55 0x55 wie bei Ethernet zu senden, damit 
sich der Empfänger synchronisieren kann?

@all
* Wie sieht es denn aus, wenn noch ein dritter Slave ins Spiel kommen 
soll? Würdet ihr dann zwei getrennte RS422-Verbindungen nehmen, oder 
eine gemeinsame RS485-Verbindung? Oder ist dann ein CAN-Bus die bessere 
Wahl?

Gruß
Tüftler

von Falk B. (falk)


Lesenswert?

@  Tüftler (Gast)

>* Das asynchrone Senden ist deiner Aussage nach kein Nachteil.

Das ist auch so ;-)

> Macht es
>Sinn, eine Präambel à la 0x55 0x55 wie bei Ethernet zu senden, damit
>sich der Empfänger synchronisieren kann?

Nein, ist ja RS232 und kein Ethernet. Der Empänger funktioniert anders.

http://www.mikrocontroller.net/articles/UART#Siehe_auch
Beitrag "Unnachvollziehbares Verhalten von AVR mit UART"
Beitrag "Woran erkennt ein UART eigentlich das Startbit?"

>* Wie sieht es denn aus, wenn noch ein dritter Slave ins Spiel kommen
>soll? Würdet ihr dann zwei getrennte RS422-Verbindungen nehmen,

Kan man machen.

> oder eine gemeinsame RS485-Verbindung?

Geht auch, dann braucht man aber ein kleines Protokoll.

> Oder ist dann ein CAN-Bus die bessere Wahl?

Ja, denn dort ist das alles schon fix und fertig drin.

MFG
Falk

von Uwe .. (uwegw)


Lesenswert?

Tüftler schrieb:
> * Das asynchrone Senden ist deiner Aussage nach kein Nachteil. Macht es
> Sinn, eine Präambel à la 0x55 0x55 wie bei Ethernet zu senden, damit
> sich der Empfänger synchronisieren kann?

Nein, weil RS232 rein byte-orientiert ist. Die Synchronisation erfolgt 
bei jedem neuen Byte anhand des Startbits.

von Tüftler (Gast)


Lesenswert?

Uwe ... schrieb:
> Nein, weil RS232 rein byte-orientiert ist. Die Synchronisation erfolgt
> bei jedem neuen Byte anhand des Startbits.

Stimmt, Denkfehler von mir.

Falk Brunner schrieb:
> Nein, ist ja RS232 und kein Ethernet. Der Empänger funktioniert anders.
>
> http://www.mikrocontroller.net/articles/UART#Siehe_auch
> Beitrag "Unnachvollziehbares Verhalten von AVR mit UART"
> Beitrag "Woran erkennt ein UART eigentlich das Startbit?"

Gute links, sehr informativ! Plesiochrone Systeme, da war mal was im 
Studium ;-)

Also wird die Wahl auf den CAN-Bus fallen, da ich mir die Möglichkeit 
vorbehalten will, einen dritten Teilnehmer mit ins Boot zu nehmen.

Die Frage für mich ist jetzt, ob ich einen AT90CANxx nehme, oder den von 
Michael Lehrmann vorgeschlagenen MCP2515 (+ Atmega). Hat da jemand 
Erfahrung?

Grüße
Tüftler

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.