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.