www.mikrocontroller.net

Forum: Haus & Smart Home RS485 Problem


Autor: Karlheinz Druschel (kdruschel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf E. (Firma: Appsys ProAudio) (roffez)
Datum:

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

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

Autor: Rolf E. (Firma: Appsys ProAudio) (roffez)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, meinte natürlich DE offen.

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karlheinz Druschel wrote:

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

Muss er nicht.

Autor: Karlheinz Druschel (kdruschel)
Datum:

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

Autor: Mati (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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.........

Autor: Rolf E. (Firma: Appsys ProAudio) (roffez)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.