Forum: Mikrocontroller und Digitale Elektronik RS485 am RaspBerry Pi 2 Model B (Stern, Tilde)


von ArduStemmi (Gast)


Lesenswert?

Guten Tag,

 ich habe ein recht aufwendiges Lampenprojekt realisiert, welches ich 
jetzt noch mit einem anspruchsvollen Bedienteil ausrüsten möchte. Da 
bietet sich natürlich heute ein TFT-Touch-Display an. Diese lassen sich 
nur sehr sehr aufwendig grafisch anspruchsvoll ansteuern, wenn man das 
mit einem Mikrocontroller machen möchte. Sehr viel leichter sollte das 
in einer Windows- oder Linux-Umgebung sein, weil dort ja bereits 
Dateisystem und Grafik-Datei-Formate bekannt sind (und ich also 
Bilddateien verwenden kann). Aus diesem Grund möchte ich mein Bedienteil 
mit RaspBerry Pi 2 Model B, einem noch zu findenden TFT-Touch-Display 
und einer Schnittstelle zum schon bestehenden RS485 Netzwerk ausrüsten.
 Da ich mich mit Linux nicht wirklich auskenne, dafür aber schon Jahre 
lang VB programmiere, möchte ich die Programmierung des Raspberry mit 
Windows VS (VB oder C) realiseren. Daher sollte auf dem Raspberry Win10 
ToT laufen.
 Jetzt endlich meine Frage: Wie kann ich am RaspBerry das RS485 Netz 
anschließen? Verfügt der Prozessor auf dem RaspBerry über die 
UART-Schnittstelle, oder muss ich das UART Protokoll selber 
implementieren? Wenn ich das selbst mache, dann handelt es sich ja um 
eine zeitkritische Anwendung, kann man dem Win10 auf dem RaspBerry 
sagen, dass er den Prozeß des Zeichensendens über die eigene 
UART-Schnittstelle nicht unterbrechen darf?

 Danke für Eure Hilfe!

von Pete K. (pete77)


Lesenswert?

MAX485 vielleicht?

von Pepe (Gast)


Lesenswert?

Irgendwie versteh ich Deine Frage nicht.

Eine UART-Schnittstelle ist letztlich (fast) nichts anderes als ein 
Schieberegister. Du schreibst ein Byte ins Ausgaberegister und das Byte 
wird aus der UART rausgeschoben. Wenn Du das meinst, dies läuft komplett 
in Hardware. Also innerhalb eines Zeichens ohne Unterbrechung.

Ansonsten versteh ich Dein "zeitkritisch" nicht.

Übrigens bei RS485 musst Du noch bedenken, dass es "Vollduplex" und 
"Halbduplex" gibt. Halbduplex wird bei RS485 sehr gern verwendet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zwar kannst Du einen RS485-Treiber an der UART des Raspberry Pi 
anschließen, dann aber musst Du Dich immer noch um die 
Sender-/Empfänger-Umschaltung kümmern. Das ist insbesondere bei knappem 
Timing auf dem RS485-Bus alles andere als trivial; Du willst nicht zu 
früh umschalten (bevor der Pi sein Telegramm komplett abgeschickt hat), 
aber auch auf keinen Fall zu spät (nachdem ein anderer Busteilnehmer 
begonnen hat, zu antworten).

Einfacher bist Du mit einem USB-RS485-Adapter, sofern dieser z.B. mit 
einem FT232 und der RS485-Beschaltung nach dessen Datenblatt aufgebaut 
ist. Das übernimmt die Sender-/Empfänger-Umschaltung nämlich selbst, und 
Du musst Dich mit Deiner Software nicht mehr darum kümmern.

von Pepe (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Einfacher bist Du mit einem USB-RS485-Adapter

Und unter Windows sprichst Du den USB-RS485 dann einfach als COM an, 
oder?

von ArduStemmi (Gast)


Lesenswert?

Ich geb's zu, es ist ziemlich schwierig zu verstehen, ich habe versucht 
weit auszuholen um zu verstehen worauf ich hinaus will.

Ich möchte mein Bedienteil über RS485 mit den Lampen verbinden. Den 
MAX485 werde ich an den Mikrocontrollern an TxD und RxD anschließen und 
mittels UART ansteuern. Beim RaspBerry gibt es meines Wissens keine 
UART-Hardware, dass heißt, ich muss das über Software machen. UART ist 
zeitkritisch weil es eine asynchrone Schnittstelle ist. Dass heißt: wenn 
ich Daten sende, darf Windows auf dem Raspberry nicht gerade anfangen, 
das Dateisystem aufzuräumen und erstmal 10 sec. lang meinen Prozess 
stören.
Bei einem Mikrocontroller keine Frage, bei einem Windows-basierten 
System ein Riesen-Problem!

von ArduStemmi (Gast)


Lesenswert?

Danke an rufus und Pepe! Natürlich hat der USB! Damit kann ich das über 
USB realisieren. Danke!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Pepe schrieb:
> Und unter Windows sprichst Du den USB-RS485 dann einfach als COM an,
> oder?

Sofern es einen Devicetreiber gibt: Ja, natürlich.


Allerdings ist zu prüfen, ob es überhaupt passende Devicetreiber für auf 
ARM laufende Windows-Versionen gibt.

Explizit erwähnt wird es von FTDI nicht, was kein gutes Zeichen ist.

von Pepe (Gast)


Lesenswert?

ArduStemmi schrieb:
> Beim RaspBerry gibt es meines Wissens keine
> UART-Hardware, dass heißt, ich muss das über Software machen.

UART wäre aber auch beim RaspBerry vorhanden: Auf dem GPIO Stecker. Pin 
8 & 10.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Hardware-UART des Pi hat aber keine Hardwareunterstützung für die 
von mir angesprochene Sender-/Empfänger-Umschaltung des RS485-Treibers - 
und damit wird die Sache ziemlich unpraktisch.

Im übrigen scheint es mit dem Treibersupport für diese Hardware-UART 
auch nicht besonders gut auszusehen:

https://www.raspberrypi.org/forums/viewtopic.php?f=105&t=109047

von Pepe (Gast)


Lesenswert?

Schön ist was anders. Richtig. Aber wenn der RS485-Treiber nur auf TX 
geschalten wird, wenn ich was rausschicken möchte und in der anderen 
Zeit auf RX, müsste es doch funktionieren. Ok, ohne 
Hardware-Unterstützung ist es natürlich nicht ganz einfach "rechtzeitig" 
auf RX zu schalten.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ob es funktioniert, hängt davon ab, wie knapp das Timing ist, das die 
anderen Busteilnehmer verwenden.

Und nicht jede UART liefert die Information, daß das 
Sende-Schieberegister leer ist (daß also das Senden tatsächlich 
abgeschlossen ist), in so einem Fall muss man mit einem Timer arbeiten, 
der beim Beschreiben des UART-Datenregisters mit dem letzten Byte 
aufgezogen wird und im Timerinterrupt nach Ablauf die 
Sender-/Empfänger-Umschaltung "von Hand" durchführen. Unter Windows kann 
das aber schon zu spät sein (Für niedrige Interruptlatenzen ist das 
nicht berühmt, und an einen echten Timerinterrupt kommt man unter 
Windows eh' nicht ran, da steckt viel Betriebssystemoverhead 
dazwischen).

Wenn man Glück hat, geht's trotzdem, klar.

von ArduStemmi (Gast)


Lesenswert?

Genau in diese Richtung ging meine ursprüngliche Frage: Ist Windows in 
der Lage, einen "Stream" über UART ungestört ohne es zu unterbrechen zu 
senden, oder kann es sein, dass es durch eigene Prozesse daran gehindert 
wird.
Die Frage des Timing bei Senden und Empfangen ist bei mir unkritisch, 
ich werde es halten wie beim Funken auf See! Jeder kriegt seine Zeit, 
die liegen ausreichend weit auseinander. Die Sendezeiten dienen zugleich 
der "Synchronisation". Damit gibt es kein: Ich habe gesendet und jetzt 
aber flott um die Antwort nicht zu verpassen. Also zum Beispiel sendet 
der Sender bei -5ms (Das Ende der Sendung ist T=0!). Empfänger 1 sendet 
nach 10 ms, Empfänger 2 sendet bei 20 ms und so weiter!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Prinzipiell ist Windows in der Lage, einen "Stream" unterbrechungsfrei 
zu senden (sofern die verwendete Baudrate in einem vernünftigen Rahmen 
liegt, d.h. bei 1 MBaud kann das anders aussehen).

Das bekommt der Gerätetreiberunterbau und auch die API hin, sofern nicht 
für jedes einzelne zu sendende Byte ein separates WriteFile 
durchgeführt wird.

Problematisch wird es erst dann, wenn sehr kleine Häppchen im 
Ping-Pong-Verfahren ausgetauscht werden sollen.

Wie das ganze auf einem eher leistungsschwachen ARM aussieht, entzieht 
sich meiner Kenntnis.

> Also zum Beispiel sendet der Sender bei -5ms (Das Ende der Sendung ist
> T=0!). Empfänger 1 sendet nach 10 ms, Empfänger 2 sendet bei 20 ms und
> so weiter!

Das ist schon recht knapp -- jedenfalls in Abhängigkeit von Baudrate und 
Paketgröße. Angenommen, Du würdest mit "nur" 9600 Baud arbeiten, dürfte 
eine Antwort der Empfänger keine 10 Zeichen lang sein.

Ob die softwaremäßige Sender-/Empfänger-Umschaltung (durch Wackeln an 
einem I/O-Pin) ausreichend schnell ist, um binnen 10 msec garantiert 
umzuschalten, hängt von der Schedulergranularität des Windows-Kerns ab, 
und davon, wie die effektive Erkennung des Übertragungsendes erfolgt. 
Wenn Du mit der Windows-API mit der seriellen Schnittstelle 
kommunizierst, gibt es keine exakte Signalisierung für "übertragung 
abgeschlossen, letztes Byte gesendet", Du wirst also mit einer 
Timerfunktion (Callback oder wie auch immer) beim Start der Übertragung 
für Paketlänge * Zeichendauer warten müssen und nach Ablauf des Timers 
die Sender-/Empfängerumschaltung durchführen.

Da all' diese Dinge mit Taskwechseln einhergehen, kommt hier die bereits 
erwähnte Schedulergranularität ins Spiel - auf normalen 
x86-Windows-Systemen beträgt diese üblicherweise 10 msec, d.h. Du 
kannst, ohne weitere Maßnahmen zu ergreifen, effektiv nur in ganzen 
10msec-Intervallen auf etwas warten.

Das "normale" Windows bietet die Möglichkeit, diese Granularität auf 
1msec zu reduzieren. Alles, was knapperes Timing erfordert, muss auf 
Devicetreiberebene erfordern, was man aufgrund der Komplexität der 
Programmierung sich sehr gut überlegen sollte.

Wie das bei Windows 10/ARM aussieht, weiß ich nicht, aber ohne 
vorhandene Treiberunterstützung für USB-Seriell-Bridges oder die 
Onboard-UART des Raspberry Pi ist es auch eher müßig, sich darüber 
Gedanken zu machen.

Und was auf jeden Fall komplett ausscheidet, ist jede Überlegung, per 
"Bit-Banging" die UART-Funktionalität in Software nachzubilden. Das ist 
ganz erheblich zu langsam, wenn es unter einem Betriebssystem läuft und 
jeder I/O-Zugriff durch diverse Treiber- und Taskwechselschichten 
hindurch muss.

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.