Forum: Mikrocontroller und Digitale Elektronik HDLC für RS485 nutzen?


von Florian T. (elore)


Lesenswert?

Hallo zusammen!

Als erster Beitrag gleich mal was sehr Spezielles:

In einem Projekt wird künftig, so geplant, ein RS485 Bus verwendet, 
welches einen Master (Hauptplatine) und 3 Slaves (unter anderem auch ein 
HMI) haben soll. RS485 wurde aufgrund der möglichen Kabellänge gewählt.

Ich habe mich jetzt den halben Tag in die Thematik eingelesen und würde 
es wohl folgendermaßes verschalten:

M4 Cortex von ST -> U(S)ART in asynchronen Modus -> RS232 auf RS485 
converter mit RX, TX und RTS verdrahtet -> Leitungen A und B ....

Das Einzige was ich nicht ganz einschätzen kann ist: Wenn ich HDLC zur 
Kommunikation einsetze, ist das dann overkill? Habe ich noch etwas 
vergessen, was in diesem Protokoll noch fehlt? Gibt es ein andere 
Protokoll, welches mehr Sinn macht? Mache ich mir zu viele Gedanken und 
sollte lieber anfange zu coden? ;)

Grüße und schon im Voraus vielen Dank an Alle, die sich die Mühe machen 
zu antworten!

von Georg (Gast)


Lesenswert?

Florian T. schrieb:
> Wenn ich HDLC zur
> Kommunikation einsetze

HDLC ist synchron, nicht asynchron. Normalerweise braucht man deshalb 
auch ein USART (mit S!), das HDLC kann.

Georg

von Florian T. (elore)


Lesenswert?

Hallo Georg!

Ich habe aber z.B. auf Wikipedia 
(https://en.wikipedia.org/wiki/High-Level_Data_Link_Control#Asynchronous_framing)

gesehen, dass beides gehen sollte.

von Georg (Gast)


Lesenswert?

Florian T. schrieb:
> dass beides gehen sollte.

Ich kenne aber kein IC, das asynchrones HDLC unterstützt - soll heissen, 
du musst alles, Frame Erkennung, Stuffing, CRC usw. zu Fuss erledigen, 
was ein USART in Hardware kann. Macht ja vielleicht Spass.

Georg

von Florian T. (elore)


Lesenswert?

Hallo Georg,

sorry, wenn ich doof nachfrage..was genau meinst du mit "IC"?
Ich habe converter (RS232 to RS485) gesehen die keine clock (CK) hatten, 
sondern ein ENABLE eingang (hieß z.B. TXE)
Wenn es Übertragungen im Synchronen Modus gibt, soll mir das Recht sein, 
Pins gibt es aktuell noch genug, bzw. ein ENABLE pin fällt dann auch 
wieder weg.

Was genau übernimmt der USART für Funktionen, die mir das Leben 
erleichern können? Gibt es da einen automatisch generierten CRC oder 
sowas? Ich hab da bisher nicht viel zu gefunden. Was genau passiert im 
converter? Wie gewärleiste ich, dass ein Frame korrekt übertragen wurde, 
auch nach dem Übergang ins RS485.

Ich hab mir zwar viel angelesen, habe aber dazu recht wenig gefunden. 
Ich hatte fest damit gerechnet, dass ich das HDLC selbst umsetzen 
muss...sooo schwer ist das ja auch nicht. Wenn ich mir das sparen kann, 
dann bin ich natürlich dafür. ;)

von Florian T. (elore)


Lesenswert?

Was mir auffällt..ich hatte noch nicht erwähnt, dass die Slaves allesamt 
auch von mir Entwickelt oder in Auftrag gegeben werden! Ich bin also 
noch völlig frei, was die Kommunikation angeht.

von Georg (Gast)


Lesenswert?

Florian T. schrieb:
> was genau meinst du mit "IC"?

Ein UART oder USART - egal ob als Einzel-IC oder in einem Controller.

Florian T. schrieb:
> Gibt es da einen automatisch generierten CRC oder
> sowas?

Um Frame Detektion, Bit Stuffing, CRC Generierung und Prüfung kümmert 
sich die Hardware. Man muss nur noch Interrupts abarbeiten (oder ev. 
DMA). Ganz so trivial wie du meinst ist HDLC fürchte ich nicht. Es ist 
auch ziemlich aus der Mode gekommen, daher wird es ja kaum noch 
unterstützt. Aber softwaremässig kannst du natürlich alles nachmachen, 
was früher mal die Hardware erledigt hat. Ist sicher eine interessante 
Aufgabe.

Florian T. schrieb:
> dass die Slaves allesamt
> auch von mir Entwickelt oder in Auftrag gegeben werden!

Das macht die Sache noch vieeel interessanter - du hast keine 
funktionsfähige Gegenstation, sondern musst beides parallel entwickeln 
und debuggen.

Georg

von Florian T. (elore)


Lesenswert?

Georg schrieb:
> Florian T. schrieb:
>> Gibt es da einen automatisch generierten CRC oder
>> sowas?
>
> Um Frame Detektion, Bit Stuffing, CRC Generierung und Prüfung kümmert
> sich die Hardware. Man muss nur noch Interrupts abarbeiten (oder ev.
> DMA). Ganz so trivial wie du meinst ist HDLC fürchte ich nicht. Es ist
> auch ziemlich aus der Mode gekommen, daher wird es ja kaum noch
> unterstützt. Aber softwaremässig kannst du natürlich alles nachmachen,
> was früher mal die Hardware erledigt hat. Ist sicher eine interessante
> Aufgabe.

Ich habe gerade nochmal die Doku des Cortex M4 gewälzt. Es gibt 
keinerlei Hinweise, dass die U(S)ARTs CRC checks von sich aus machen. Es 
werden aber ein paar Protokolle unterstützt wie z.B. LIN, IrDA, 
Smartcard und Multiprocessor Communication.
Mit Ausnahme einer Parität sehe ich da aber beim normalen U(S)ART 
Betrieb nichts was die Datensicherheit gewärleisten könnte. Vielleicht 
hab ich aber noch immer nicht richtig hingesehen (ich schaffe es auch 
mehrere Tage lang den Wald nicht vor Augen zu sehen..in diesem Fall 
bitte ich um Gedult mit mir ;))

Aus diesem Grund bin ich auch der Meinung, dass ich selbst dafür sorgen 
muss, dass meine Frames ankommen. Ich hatte schonmal etwas sehr 
ähnliches die HDLC implementiert, aus diesem Grund bin ich auch sicher, 
dass ich das hinkriegen kann. Wenn ich es aber nicht muss, dann bin ich 
damit auch zufrieden.

Was mir außerdem noch Gedanken bereitet ist der Übergang zu 
RS485...aktuell nehme ich an, dass dort auch nur die Bytes übertragen 
werden.

> Florian T. schrieb:
>> dass die Slaves allesamt
>> auch von mir Entwickelt oder in Auftrag gegeben werden!
>
> Das macht die Sache noch vieeel interessanter - du hast keine
> funktionsfähige Gegenstation, sondern musst beides parallel entwickeln
> und debuggen.
>
> Georg
Wobei eine Lib für ein Protokoll (vielleicht lasse ich auch einfach 
einen Teil weg), kann ja für jedes Gerät einfach verwendet werden. ;)

Bis hierhin schonmal vielen Dank!

von Georg (Gast)


Lesenswert?

Florian T. schrieb:
> der Übergang zu
> RS485...aktuell nehme ich an, dass dort auch nur die Bytes übertragen
> werden.

Das ist reine Pegel-Umsetzung, der RS485-Treiber kennt nur Hi und Lo, 
aber keine Bytes, nicht mal eine Baudrate. Interessant ist daran nur, 
dass nur ein Baustein am Bus senden darf, dafür ist eben der 
Enable-Eingang da. Durch das Protokoll muss immer klar sein, wer gerade 
senden darf. Daher ist eine Master-Slave-Struktur am einfachsten - der 
Master spricht einen Slave an, schaltet dann seinen Sender ab, der Slave 
schaltet Senden ein und antwortet. Und so immer weiter.

Georg

von Pandur S. (jetztnicht)


Lesenswert?

Ja, das ist richtig. Ein UART ist ein Schieberegister, das 8bit 
zeitgenau hinausschiebt und Start-, sowie Stopbit abnhaengt. Das Parity 
wird heute nicht mehr verwendet, weil es, glaubt man nichts bringt. Ja, 
Frames, mit Id, Laenge, Daten und CRC muss man selbst zusammenbauen. Das 
ist aber nicht schwierig.

Ein spezielles Feature des HDLC ist das Escapen des Commands. Dies 
ermoeglicht, dass die Empfangsstatemachine in Fehlerfall schon beim 
naechsten Frame wieder lockt, waehrend, wenn man das nicht macht, ein 
paar Frames verliert.

Ich mach das Escapen jeweils nicht. Das erlaubt mir dafuer das Frame auf 
dem Scope anzuschauen und visuell zu decodieren.

Die Funktionalitaet eines UARTs im empfangsfall ist das Oversampling, 
bis zu 8fach, und doublebuffern der empfangenen Bytes. Es gibt bei jedem 
byte einen neuen interrupt.

Standalone Uarts koennen bis zu 64 byte Rx&Tx Buffer haben, und erlauben 
auch bei sehr hohen Baudraten ein entspannteres Timing fuer die CPU.

Wenn man die zwingende 3 leiter Funktionalitaet nicht benoetigt, und 
sich auch 5 Leiter goennen kann, empfehl ich RS422. Das sind die selben 
Treiber, man kann dank eines zusaetlichen Leiterpaares und je einem 
zusaetzlichen Treiber Vollduplex erlauben. Die moegliche Leitungslaenge 
bleibt auch gleich.

Das Empfangen, resp, die Feldzuweisung beim Empfangen macht man 
ueberigens mit Statemachines, das sind Software konstrukte.

von Florian T. (elore)


Lesenswert?

Georg schrieb:
> Florian T. schrieb:
>> der Übergang zu
>> RS485...aktuell nehme ich an, dass dort auch nur die Bytes übertragen
>> werden.
>
> Das ist reine Pegel-Umsetzung, der RS485-Treiber kennt nur Hi und Lo,
> aber keine Bytes, nicht mal eine Baudrate. Interessant ist daran nur,
> dass nur ein Baustein am Bus senden darf, dafür ist eben der
> Enable-Eingang da. Durch das Protokoll muss immer klar sein, wer gerade
> senden darf. Daher ist eine Master-Slave-Struktur am einfachsten - der
> Master spricht einen Slave an, schaltet dann seinen Sender ab, der Slave
> schaltet Senden ein und antwortet. Und so immer weiter.
>
> Georg
Vielen Dank für die Info!
Das mit dem Master / Slave hatte ich mir schon angelesen. Dass es nur 
ein Pegelumsetzer ist, war mir nicht bewußt. :)

@jetztnicht
Viele der Infos hatte ich ebenfalls bereits (ich hab eben ein 
gefährliches Halbwissen). Heißt das im Klartext: Jup..es MACHT Sinn, 
wenn ich HDLC nutze (auch wegen der Adressierung etc.).
Ich habe einen freien Treiber dafür gefunden, den man evtl. nutzen 
könnte. Falls der nicht geht, finde ich es jetzt auch nicht sooo 
komplex. Das excapen würde ich vermutlich so oder so machen. ;)
CRC sollte der Controller von sich aus können, ansonsten ist auch das 
machbar (habe ich vor langer Zeit auch mal gemacht).

Unterm Strich: Würdet ihr es genau so oder ähnlich machen?

von Georg (Gast)


Lesenswert?

Florian T. schrieb:
> Das excapen würde ich vermutlich so oder so machen.

Die Frage ist, was willst du denn übertragen? Im Lauf eines langen 
Programmiererlebens bin ich zu der Erkenntnis gekommen, alles in 
Klartext zu übertragen, nicht binär, also nicht 2 Bytes für einen 
15bit-Wert, sondern ASCII-Ziffern. Für das Protokoll verwende ich die 
vorgesehenen ASCII-Codes wie STX,ETX,CR usw. Da die im Text nicht 
vorkommen, muss man keine Sonderregelungen wie Escapes treffen, und der 
andere grosse Vorteil ist, dass man zum Debuggen mitlesen kann, ohne 
hexadezimal kopfrechnen zu müssen.

Da Internet macht es auch so, beruht fast alles auf ASCII-Text. Dass 
mehr zu übertragen ist fällt nur selten ins Gewicht. Ein typisches 
Protokoll könnte also aufgebaut sein:

STX Adresse Länge Daten CRC ETX

Georg

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.