RS485 Problem

#1111271
Lesenswert?

Hi Leuts,

vielleicht bin ich hier im falschen Forum, aber ich dachte hier ist ein 
RS485 Problem am ehesten angebracht.
Ich habe folgende Hardware: ATMega128 mit 16 MHz, UART1 kann sowohl als 
RS232 als auch als RS422/485 genutzt werden. Für das Board habe ich eine 
Software, die funktioniert, es liegt also definitiv kein Hardwareproblem 
des Boards vor. Allerdings wurde die Software fremd entwickelt, ich habe 
keine Quellcodes.
Nun muss ich eine eigene Software stricken, und habe dabei Probleme mit 
der RS485 Kommunikation (4 Draht).
Was man im Schaltplan nicht sieht, ist folgendes: RE#-->PE2, DE --> PB0. 
Beide Signale haben also eine eigene Portleitung.
Zum Testaufbau habe ich 2 Slaves an einen PC gehängt, wo Hyperterminal 
läuft (115200,n,8,1).

#define RS485_RECEIVER_ON (PORTE &= ~(1<<PE2))
#define RS485_RECEIVER_OFF (PORTE |= (1<<PE2))
#define RS485_DRIVER_ON (PORTB |= (1<<PB0))
#define RS485_DRIVER_OFF (PORTB &= ~(1<<PB0))

Wenn nun UART1 als RS232C nutze, dann schalte ich einmalig bei der 
Initialisierung
   RS485_DRIVER_OFF;
   RS485_RECEIVER_OFF;
Dies funktioniert einwandfrei.

Nun habe ich Probleme beim RS485 Betrieb. Solange ich nur einen Slave
betreibe, habe ich keine Probleme. Wenn ich den 2. Slave anklemme, aber 
nicht einschalte, läuft ebenfalls alles einwandfrei. Nur wenn der 2. 
Slave eingeschaltet ist, dann empfängt der PC nichts mehr (die Slaves 
empfangen vom PC, habe ich per Debug rausgefunden).
Also habe ich ein Problem mit dem Schalten von DE und RE vermutet.
Um dies nun zu testen, setze ich beim Initialiseren
   RS485_DRIVER_OFF;
   RS485_RECEIVER_OFF;
Nach meinem Verständnis dürfte der Slave jetzt keine Daten senden 
können.
Aber beim PC kömmen die Daten an..............
Hat jemand dafür eine Erklärung ?

Greets
Karlheinz
Angehängte Dateien:
#1111308
Lesenswert?

OK, das Schalten von RE# und DE habe ich jetzt im Griff, fehlerhafte 
Initialisierung (ich Depp hatte RE als Eingang initialisiert).
Aber wie ist es nun mit DE....
Anscheinend gibts ein physikalisches Problem wenn bei mehr als einem 
Slave der RS485 Sender im Treiberbaustein gesetzt ist. Leuchtet mir ja 
noch ein.
Aber es müsste doch dann genügen, wenn ich vor dem Senden von 
Zeichenketten den Sender aktiviere und danach wieder deaktiviere, oder ?
Oder muss ich nach jedem Byte umschalten ? Warum eigentlich muss bei 
einer Vierdrahtverbindung der Empfänger abgeschaltet werden wenn ich 
sende ?

Da die Slaves nur auf Anfragen des Masters antworten (und nur immer 
einer, da jeder ja eine Adresse hat), kann doch eigentlich der Empfänger 
immer eingeschaltet bleiben, und der Sender muss nicht nach jedem Byte 
umgescaltet werden, oder ?


Greets Karlheinz
#1111311
Lesenswert?

Karlheinz Druschel wrote:

> Aber es müsste doch dann genügen, wenn ich vor dem Senden von
> Zeichenketten den Sender aktiviere und danach wieder deaktiviere, oder ?

Ja, aber erst nachdem das letzte Stopbit vom letzten Byte raus ist. 
Nicht schon nachdem das letzte Byte im Puffer landete.
#1111441
Lesenswert?

Ne, die sind von extern aufgesteckt.
Aber wie bereits erwähnt: Da eine andere Software läuft, aknn es sich 
nur um ein reines Softwareproblem handeln.
Mittlerweile scheint es auch so, dass es am Abschalten des DE hängt.
Wenn ich beim hochfahren DE deaktiviere, und beim Senden einschalte, 
dann läufts.
Wenn ich ihn im SIG_UART1_TRANS wieder abschalte, dann gibts Probleme. 
Die am PC ankommenden Zeichen verzerren.
Ich würde vermuten, dass der Sender zu früh abschaltet und deshalb (wie 
von A. K. schon erwähnt) nicht alle Bits sauber übertragen werden.
Aber wann soll ich denn sonst abschalten ? Ich dachte, SIG_UART1_TRANS 
wird aufgerufen wenn auch das letzte Byte gesendet wurde.........
(Firma: Appsys ProAudio) #1112429
Lesenswert?

In dem Moment, wo DE abgeschaltet wird, sind die Busleitungen floating. 
Damit das nicht passiert, sind Pullups nötig....riecht hier ein bisschen 
danach wie wenn diese nicht korrekt wären.

Prüf nochmal, ob wirklich:
1. 620R als Pullup von Leitung "A" nach VCC
2. 620R als Pullup von Leitung "B" nach GND
einmal pro RS485-Päärchen vorhanden ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren