Forum: Mikrocontroller und Digitale Elektronik RS-485 lahm?


von Marko (Gast)


Lesenswert?

Hallöchen,

ich habe den LTC485 jeweils einmal an Atmel Mega32 und Mega8 gehängt
(beide TQFP) einfach RX und TX jeweils drauf und n zusätzlicher
Pin für die Flusssteuerung. Soweit so prima,
Die Daten laufen auch schön von A nach B und andersrum, nur
wenn ich Daten von A nach B nach A senden will, also im Pingpong
muß ich bei der umstellung der LTC von Lesen nach schreiben
und zurück jeweils ein delay von mindestens 20 ms einbauen,
da ohne die Pause die Daten verloren gehen ... irgendwo
hängt der Bus da im Nirvana (ist nur 20cm Draht).

Hat da schonmal jemand ähnliche Probleme gelöst und evtl. n
Tip für mich? oder idealerweise evtl. n Schaltungsbeispiel
über n laufenden LTC485?

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Marko,

ich bekenne hier eine Peinlichkeit, die zu ähnlichen Symptomen führte.
Abhilfe: Die Senderoutine fragt nach Sendung das UCSRnA ab auf TXCn.
Erst dann darf es den LTC485 wieder auf Empfang schalten.

Ciao
Wolfgang Horn

von A.K. (Gast)


Lesenswert?

Wobei es bei mir erst funktionierte, also ich zu TXC noch ein Bit oder
so drauflegte. Meine Vermutung ist, dass die AVRs TXC schon während des
Stopbits anzeigen, was beim Empfänger zum framing error führt.

von Marko (Gast)


Lesenswert?

zum TXC noch n Bit zu?
Sorry, aber das ist mir ziemlich hoch,
was meinste damit?

also wenn ichs richtig verstanden hab
hol ich mir das UCSRB und kontrolliere
das 7te Bit auf ja nein für den TXC,
richtig?
halt, nee, UCSRA Bit 6, stimmts?

von A.K. (Gast)


Lesenswert?

Auf TXC warten, und den Transmitter erst 1-2 Bitzeiten später
abschalten.

Ebenso sollte der angesprochene Slave noch etwas mehr Bitzeiten
abwarten, bevor er nach empfangender Botschaft selber seinen
Transmitter einschaltet. Bei UARTs gibt es prinzipbedingt ein Risiko,
dass der Receiver bereits während des einlaufenden Stopbits das
empfangende Byte anzeigt. Wenn ein Slave dann sofort mit der
Übertragung loslegt, hat er exzellente Chancen, gegen den Rest vom
Stopbit des Masters zu kämpfen, also Transmitter gegen Transmitter zu
schalten.

von Marko (Gast)


Lesenswert?

Du meinst also
einfach 2-3-mal
noop
für ebensoviele wartezyklen?

von A.K. (Gast)


Lesenswert?

Tja, was ist auf der seriellen wohl eine Bitzeit?

Bei 9600bps ungefähr 100µs.

von thkais (Gast)


Lesenswert?

Nehmt den 82C250, der ist zwar ursprünglich für CAN, kann aber auch für
RS-485 eingesetzt werden. Umschalten nicht notwendig, man bekommt eben
immer ein Echo seiner Daten und das wiederum kann zum Detektieren von
Kollisionen genutzt werden. Der 82C250 ist übrigens auch
"Kollisionsfest", da sich 0-Pegel durchsetzt - bei den üblichen
RS-485 Bausteinen gibts in diesem Fall einen Crash.

Gruß
Thomas

von Marko (Gast)


Lesenswert?

das mit dem 82C250 ist n prima Tip,
Super! Werd ich im nächsten Layout beherzigen.

Im Übrigen ist wer der Suche benutzen kann klar im
Vorteil ich Depp!!

Hab n Codescchnipsel für meine verwendete Hochsprache
gebuunden, das vom kompilieren her läuft.
Für alle die mal ähnliche Probleme schieben
und die Suche verwenden hier mal:

$regfile = "m8def.dat"

$crystal = 1000000

$baud = 1200


Do

Do                                                          ' Warten
bis das TXC Bit gesetzt ist.
loop until UCSRA.TXC = 1

Set UCSRA.TXC     ' zum zurücksetzen von TXC muss 1 geschrieben
werden
                  ' gemäss Datenblatt
Set PortB.1            ' Umschalten von Senden auf Empfangen am RS485


Loop

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.