Forum: Projekte & Code Arduino HardwareSerial Bibiothek unterstützt jetzt RS485


von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Hier ist mein obligatorischer Freitagsbeitrag:

Mir ist zur Zeit leider noch nicht bekannt ob ähnliche Modifizierungen 
der HardwareSerial (HWS) Bibliothek mit RS485 Unterstützung schon 
existieren. Internet Recherchen brachten bis jetzt nur Beispiele mit 
SoftwareSerial. Die SoftwareSerial Bibliotheken sind mir etwas 
unbehaglich und stellen große Ansprüche an den gleichmäßigen 
Programablauf des uC. Mit UART ISRs hat man halt doch viel mehr 
Spielraum und Zuverlässigkeit. Da die HWS schon gepuffert ist, ist die 
HWS der ideale Platz für eine solche Erweiterung.

Ich habe die Arduino HardwareSerial Bibliothek für RS485 Betrieb mit 
Transceivern ähnlich wie MAX483 und SN75176  erweitert. Es ist zur Zeit 
im Probebetrieb auf einem Pro Mini. Es sollte auch auf Mega 2560 
funktionieren, muß ich aber erst testen. Ich habe bis jetzt nur 
9600-115200 Baud getestet. Auf der PC Seite verwende ich einen 
selbstgebauten FTDI232RL adapter mit RS485 Transceiver. Der FTDI232 RTS 
Ausgang steuert auch den Sendemodus des MAX483.

Die Dateien HardwareSerial.c und HardwareSerial.h sind von mir 
modifiziert und müssen dort die Original Dateien ersetzen:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\

Ich habe die Funktion "Serial.begin(...) um zwei optionale Parameter 
erweitert. Die normale Kurzform funktioniert natürlich in RS232 Mode 
noch wie gewohnt.

Original Arduino Beispiel: Serial.begin(9600);
Mit Erweiterung:

#define RS485_BAUD 9600
#define RS485_ENABLED 1
#define RS485_DISABLED 0
#define RS485_DIR_PIN 13

Serial.begin(RS485_BAUD, SERIAL_8N1, RS485_ENABLED, RS485_DIR_PIN );

wo:
RS485_ENABLED oder RS485_DISABLED,  1=ENABLED oder 0 (0=DISABLE)

RS485DIR ist die Standard Arduino Pin Bezeichnung. Z.B. D13 = 13 = PB5
Dieser Pin schaltet innerhalb von ein paar us auf HIGH und bleibt HIGH 
bis das letzte Byte aus dem udr Datenregister hinaus geshiftet worden 
ist.

Arduino UNO oder NANO/PRO-MINI Anschlüsse zum Testen:

MAX483 PIN 1 (RO) muß mit PIN D0 (RXI) verbunden werden(*)
MAX483 PIN 4 (DI) muß mit PIN D1 (TXO) verbunden werden
MAX483 PINS 2,3 müssen mit dem gewählten DIO Pin verbunden werden. Also 
in diesem Fall mit PIN D13.
1
RXI: ___ __...__ ________________________________________
2
        X__.X.__X
3
4
     _______________ ____ ____ ____ _..._ ____ __________
5
TXO:                X____X____X____X_.X._X____X
6
7
                    _________________...________
8
RS485_DIR_PIN:_____/                            \________
9
10
 ----------RX------|--------------TX------------|---RX---
(*) Ich empfehle eine 1N4148 Diode mit Cathode auf RO und Anode auf RXI 
einzuschleifen damit der USB Adapter noch funktioniert beim Bootloader 
Gebrauch und wenn man auch gleichzeitig den USB Serial Port verwenden 
möchte. Es empfielt sich auch durch einen entsprechend niedrigwertigen 
pull-down R oder andere Massnahmen sicher zu stellen, daß DIR beim uC 
Startup oder Fehlverhalten den DIR Pin nicht unbeabsichtigt durch ein 
HIGH auf Sendung schaltet und den BUS lahm legt.

Wie gesagt, dies ist nur ein Experiment von mir. Die beiden von mir 
modifizierten Bibliothek Dateien sind im Anhang. Da ich kaum mit C++ zu 
tun habe kann ich nicht beurteilen wieviel C++ Mist ich gebaut habe und 
geniale Verbesserungen sind bestimmt auch noch möglich.

Jedenfalls braucht man mit dieser Methode nirgendwo im Programm viele 
DIO Befehle zur Umschaltung geben und man braucht nicht Pollen um 
festzustellen wenn udr fertig mit dem Senden ist.

mfg,
Gerhard

P.S. Falls das Experiment in die Hose gehen sollte, dann bitte ich es zu 
vergessen.

: Verschoben durch User
von Gerhard O. (gerhard_)


Lesenswert?

Mein Originalbeitrag wurde leider von mir im falschen Thread deponiert. 
Vielleicht könnte ein Moderator meinen Beitrag auf hier verschieben. 
Vielen Dank.

Beitrag "Arduino HardwareSerial Bibiothek unterstützt jetzt RS485"

In der Zwischenzeit fügte ich noch einen Funktions Parameter hinzu um 
die Schaltpolarität der RS485 Sendesteuerung wählen zu können. Im 
Augenblick ist das nur für mich wichtig. Ich werde allerdings erst einen 
Update posten wenn ich die modifizierten Bibliotheken mit einigen 
zusätzlichen uC testen konnte. Die fraglichen uC sind:

ATMEGA 644P, 1284P, 2560, 328PB, und 128/1280.

Allen diesen Typen ist gemeinsam, mehr als ein USART zur Verfügung zu 
haben. Das ist günstig weil dann der Bootloader Port nicht 
berücksichtigt werden muß und in üblicher Weise weiter verwendet werden 
kann.

von Frank (Gast)


Lesenswert?

Gerhard O. schrieb:
> In der Zwischenzeit fügte ich noch einen Funktions Parameter hinzu um
> die Schaltpolarität der RS485 Sendesteuerung wählen zu können.

Wenn du die digitalWrite nochmal kapselst, musst du zukünftig nur an 
einer Stelle was ändern.
Kann ja inline sein.

von Gerhard O. (gerhard_)


Lesenswert?

Frank schrieb:
> Gerhard O. schrieb:
>> In der Zwischenzeit fügte ich noch einen Funktions Parameter hinzu um
>> die Schaltpolarität der RS485 Sendesteuerung wählen zu können.
>
> Wenn du die digitalWrite nochmal kapselst, musst du zukünftig nur an
> einer Stelle was ändern.
> Kann ja inline sein.

Oh, danke für den Hinweis. Werde es ausprobieren. Leider ist C++ nicht 
meine Stärke.

von Gerhard O. (gerhard_)


Lesenswert?

Gerhard O. schrieb:
> Vielleicht könnte ein Moderator meinen Beitrag auf hier verschieben.

Vielen Dank für die Verschiebung.

Gruss,
Gerhard

von Gerhard O. (gerhard_)


Lesenswert?

Hier ist noch ein Link auf die neueste Version mit Test Programm:

https://github.com/emrtech/Arduino_Resources

von Gerhard O. (gerhard_)


Lesenswert?

Noch ein Hinweis:

Wenn man den chinesisch hergestellten MAX485 Adapter so wie von mir 
beschrieben betreibt (mit Diode zwischen RO und RXI) und anschließt, muß 
man aufpassen, daß der Adapter RS485 Bus seitig immer angeschlossen 
bleibt. Das ist nur beim Betrieb des USB Adapters von Bedeutung weil der 
RS485 Adapter bei offener Busleitung den RO Pin auf LOW zieht und somit 
die empfangen USB Serial Daten blockiert. Bei angeschloßenem Bus kann 
man natürlich entweder Daten über USB Serial übertragen oder über RS485. 
Besser ist es natürlich immerhin für RS485 einen AVR mit mehr als einem 
USART zu wählen. Z.B. Atmega328PB, 1284P, 644P, 128(0), 2560.

Elektrisch hat der USB Adapter Priorität was nur für Programmierung des 
FLASH wichtig ist und normalerweise abgesteckt bleibt. Serial Debugging 
praktiziert man dann natürlich zweckmäßigerweise besser über RS485.

Beitrag #6318884 wurde vom Autor gelöscht.
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.