Forum: Haus & Smart Home RS485 Problem


von Karlheinz D. (kdruschel)


Angehängte Dateien:

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

von Rolf E. (Firma: Appsys ProAudio) (roffez)


Lesenswert?

- DDR's richtig gesetzt?
  DDRE |= (1<<PE2);
  DDRB |= (1<<PB0);

Sonst ist RE offen, je nach Logik kann das als High gelten.

von Rolf E. (Firma: Appsys ProAudio) (roffez)


Lesenswert?

Sorry, meinte natürlich DE offen.

von Karlheinz D. (kdruschel)


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

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


Lesenswert?

Karlheinz Druschel wrote:

> Warum eigentlich muss bei
> einer Vierdrahtverbindung der Empfänger abgeschaltet werden wenn ich
> sende ?

Muss er nicht.

von Karlheinz D. (kdruschel)


Lesenswert?

Ok, also müßte es doch gehen, wenn ich im
SIG_UART1_TRANS Interrupt den Sender abschalte...

von Mati (Gast)


Lesenswert?

Terminierung an beiden Enden vom Bus?
  1-nen Abschlusswiderstand sehe ich ...
Pullup-Widerstände?
  Fehlen die Pullups oder sind sie nicht aufgezeichnet ?


Gruß aus Köln

Mati

von Karlheinz D. (kdruschel)


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.........

von Rolf E. (Firma: Appsys ProAudio) (roffez)


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.

von Karlheinz D. (kdruschel)


Lesenswert?

1000Dank für die Hinweise,
aber wie erwähnt konnte es ja kein Hardwareproblem sein, da eine andere 
Software einwandfrei läuft.
Anyway, das Problem hat sich gelöst, es waren einfach Probleme mit 
meiner fehlerhaften Ansteuerung von DE.....


Greets
Karlheinz

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.