Forum: Mikrocontroller und Digitale Elektronik Max485 TX abschalten - RX erkennt dies


von Hendrik P. (endrik)


Lesenswert?

Hallo
Ich bin gerade am rumtesten von rs485 als Bus für ein paar teilnehmer

Mein testaufbau besteht gerade aus 2 MAX 485.

RX_seite:    RE/DE sind auf GND gezogen, RO geht an einen MAX232, 
welcher das ganze in RS232 umsetzt.

TX_seite:   DI geht an RX, RO an den TX von einem Mega8, !RE/DE gehen an 
TX_PIN(=PD2)

Als Datenrate ist 19200 8n1 gewählt, der Mega8 läuft mit externen 16Mhz 
als quarz. USART ist initialisiert und TX_PIN per TX_DDR |= (1<<TX_PIN); 
als Ausgang gesetzt. Ein altes Notebook hängt am Max232(oder umgekehrt).

Alle IC's sind mit 100nF Abblockkondensatoren versehen, die Schaltung an 
sich wird mit 5V versorgt. Verkabelt sind beide über Twisted Pair Cat5 
Kabel (paar Meter), welches an beiden Enden mit 120 Ohm terminiert ist.

Folgendes Szenario:
TX_PORT |= (1<<TX_PIN); //wir schalten den Max auf senden
while(1)
{
    _delay_ms(1000);
     putc(0xAA)
    _delay_ms(1000);
}

Am Computer (der am max hängt) kommen brav alle 2 sekunden ein 0xAA an.

Jetzt ändere ich den Code in:
while(1)
{
     TX_PORT |= (1<<TX_PIN); //max485 wieder auf senden schalten
    _delay_ms(1000);
     putc(0xAA)
    _delay_ms(1000);
    TX_PORT &= ~(1<<TX_PIN); //max485 auf empfang stellen
    _delay_ms(1000;
}

Nun kommt am PC auch erst ein 0xAA an, eine sekunde später (wenn der MAx 
vom bus genommen wird) kommt aber noch ein 0x00 hinterher.
An sich nix schlimmes, wenn ich nur senden wollte -  ich will aber auch 
mal einem Teilnehmer sagen können er darf senden und umschalten können 
ohne das bei den anderen Teilnehmer Mist ankommt.
Mit einem Multimeter hab ich mal die Spannung zwischen A und B gemessen.
wenn TX_PIN=1 (also senden) hab ich 2.3 Volt - nach dem Umschalten 32mV.

Jetzt wollte ich fragen ob ich beim Aufbau einen theoretischen fehler 
gemacht habe bezüglich rs485 -> max232 -> computer.

An sich würde ich gerne wissen wo diese 0x00 beim umschalten herkommt - 
Meine Idee wäre das der RX-max485 (laut Datenblatt seite 10) A-B 
kurzzeitig als "Input Open" erkennt und ne 1 an RO weiterreicht?

Vielleicht kennt jemand ja ein ähnliches Problem - Über Rückmeldung 
danke ich schon mal im vorraus.

Grüße
Hendrik

von Sascha W. (sascha_w)


Lesenswert?

am RS485-Bus sollte immer ein Treiber auf senden stehen, oder du musst 
den Bus auf einen definierten Pegel ziehen (A 470R +5V; B 470R GND). 
Ansonsten hast du einen ungütigen Pegel auf dem Bus und der Empfänger 
gibt schon mal eine Flanke am Ausgang raus - und schon hast du am UART 
ein 0-Byte.

Sascha

von Hendrik P. (endrik)


Lesenswert?

Danke für die Antwort - ich hatte auch mal getestet hab aber immer A auf 
GND gezogen gehabt und das gab nix.
Ich wusste bisher nicht das eigentlich immer einer auf senden stehen 
muss.

So ganz gefällt mir das mit den definierten Leveln nicht - Da ich aber 
ein Ping/Pong verfahren vorgesehen habe und nicht jeder client immer 
erreichbar sein wird muss ich mich wohl mit dieser "Zwischenloesung" 
zufrieden geben.

Inwiefern wird durch das B->Gnd A->Vcc die ich nenne es mal 
"Übertragungsstabilität" beiinflusst?

Hendrik

von Tim (Gast)


Lesenswert?

Hendrik P. schrieb:
> So ganz gefällt mir das mit den definierten Leveln nicht

Warum nicht? Es ist die Beste Lösung.

> Inwiefern wird durch das B->Gnd A->Vcc die ich nenne es mal
> "Übertragungsstabilität" beiinflusst?

Positiv, da der Bus immer einen definierten Zustand hat.
Eine Bus Terminierung am jeweiligen Ende mit
1
5V -(620Ohm)- A -(120Ohm)- B -(620Ohm)- GND
ist in der Industrie üblich.

Vergiss aber nicht die Übertragung noch per CRC abzusichern.
Die Errorflags vom UART (FE,..) sollte man auch auswerten.

von (prx) A. K. (prx)


Lesenswert?

NB: Wenn RE inaktiv ist, dann floatet der RX-Pin des Controllers und 
dessen Pegel ist undefiniert. Entweder RE aktiv lassen und mit dem Echo 
leben, oder den RX-Pin mit einem Pullup versehen.

von Spess53 (Gast)


Lesenswert?

Hi

www.national.com/an/AN/AN-1057.pdf

MfG Spess

von Hendrik P. (endrik)


Lesenswert?

Tim schrieb:
> Positiv, da der Bus immer einen definierten Zustand hat.
> Eine Bus Terminierung am jeweiligen Ende mit
>
1
> 5V -(620Ohm)- A -(120Ohm)- B -(620Ohm)- GND
2
>
> ist in der Industrie üblich.
Eingefuegt und es klappt, irgendwie stand ich was die R's an Vcc und GND 
angeht leicht aufm schlauch - zumal ich das eigentlich vorher schon 
gelesen hatte.
>
> Vergiss aber nicht die Übertragung noch per CRC abzusichern.
> Die Errorflags vom UART (FE,..) sollte man auch auswerten.
die Errorflags werden ausgewertet - bei "kritischen" werten will ich 
noch ein ack oder so was einbauen. CRC muesste ich ja in den clienten 
berechnen lassen?
An sich koennte ich auch noch die Paritätsprüfung anschalten bzw 
checken.

A. K. schrieb:
> NB: Wenn RE inaktiv ist, dann floatet der RX-Pin des Controllers und
> dessen Pegel ist undefiniert. Entweder RE aktiv lassen und mit dem Echo
> leben, oder den RX-Pin mit einem Pullup versehen.
Hm - nen Echo hab ich bisher noch nicht reinbekommen - aber es spricht 
nichts dagegen RXCIE0 zu disablen.

Hendrik

von (prx) A. K. (prx)


Lesenswert?

Hendrik P. schrieb:

> Hm - nen Echo hab ich bisher noch nicht reinbekommen

Das Echo kriegst du, wenn du, um ein floaten des Pins zu vermeiden, RE 
auch beim Senden aktiv lässt. Wenn der Pin floatet, dann ist ohne Pullup 
das Verhalten des Receivers beim Senden undefiniert. Das muss auch kein 
Problem sein, aber dann sollte man den Receiver höflicherweise beim 
Senden ganz abschalten.

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.