PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Finde RS485 fehler nicht



demmy
30.06.2015, 19:17
Hallo zusammen,

ich habe ein kleines RS485 Problem. Und zwar habe ich folgende Schaltung mit einem MAX485 an einem Atmega aufgebaut.

30380

Beim überprüfen aller Signale ist mir aufgefallen das der A-Kanal des MAX nicht richtig funktioniert. Ich bekomme folgendes Bild am Oszilloskop (Messung A-Gnd / B-Gnd / Differenz der beiden Signale) :

30381

Wieso habe ich auf dem A Kanal nur solche Peaks?? Ich habe schon alles abgesucht, habt Ihr noch eine Idee.

Wenn ich mir die UART Seite des MAX anschaue dann sieht alles normal aus:

30382

Das einzige was mir aufgefallen ist, ist eine leichte "Reflektion" auf der RXD Leitung wenn die TXD sendet. Ich weiß nicht ob die von belang ist, bzw. wie die zustande kommen kann?

30383


Ich hoffe Ihr habt noch eine Idee und könnt mir helfen? Ich wäre euch sehr dankbar!

Viele Grüße

Peter(TOO)
01.07.2015, 07:09
Hallo,

ich habe ein kleines RS485 Problem. Und zwar habe ich folgende Schaltung mit einem MAX485 an einem Atmega aufgebaut.


Das kleine Problem ist, dass du nicht wirklich richtig sendest.

Beim Senden, schaltet TxD immer zwischen Senden und Empfangen um!

Wenn TxD auf 1 liegt, das ist der Grundzustand, ist der Empfänger aktiv und es wird normal empfangen.

TxD ist ein invertiertes Signal.
Wenn du also eine 0 sendest, wird der Sender aktiv.
Sendest du aber eine 0 ist der Sender deaktiviert und die Leitung wird hochohmig. Welche Pegel dann auf den Leitungen liegen und wie lange, hangt dann von den Kabelkapazitäten und den Abschlusswiderständen ab.

Das geht so nicht!

RE/ und DE müssen für die ganze Übertragungszeit eines Bytes aktiv sein und nicht nur für ein Bit.

MfG Peter(TOO)

demmy
01.07.2015, 12:13
Mhh ok, das habe ich mir schon fast gedacht.

Gibt es eine saubere Möglichkeit die Richtungsumschaltung per Hardware zu realisieren?

PICture
01.07.2015, 12:44
Hallo!

Ja, siehe bitte Figure 22 auf 14. Seite vom Datenblatt (DB): http://www.datasheetcatalog.com/datasheets_pdf/M/A/X/4/MAX485.shtml . ;)

sast
01.07.2015, 15:39
such mal nach SN74LVC1G123

https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0CDIQFjAF&url=https%3A%2F%2Fe2e.ti.com%2Fcfs-file%2F__key%2Ftelligent-evolution-components-attachments%2F00-142-01-00-00-56-17-35%2FRS232-to-RS485-Converter.pdf&ei=Vv2TVbfNMMelsgHXl4uIDg&usg=AFQjCNFsFyI6wAP5F-O7K5UnY5iRb_rZbA&bvm=bv.96952980,d.bGg

sast

Klebwax
01.07.2015, 17:51
Ich würde erstmal fragen: warum eigentlich halbduplex RS485 und nicht vollduplex RS422? Da muß man nichts umschalten. Mangelt es an den zwei zusätzlichen Adern im Kabel? Die weitergehende Frage wäre: muß es überhaupt differentiell sein oder tun es nicht einfach TTL Signale. Die brauchen nur eine Leitung, mit zweien, wie bei RS485, ist vollduplex möglich.


Gibt es eine saubere Möglichkeit die Richtungsumschaltung per Hardware zu realisieren?

Eigentlich nicht. Man kann da etwas mit einem Monoflop basteln, das knabbert aber das Startbit etwas an und das Timing ist immer ein Kompromiss. Eine saubere Lösung verlangt nach einem extra Portbit.

MfG Klebwax

demmy
01.07.2015, 19:01
Hi zusammen,

vielen Dank für die zahlreichen Antworten. Ich denke aber Ihr habt recht. evtl. sollte ich über eine andere Übertragungsmethode oder einen weiteren Portpin nachdenken.

Viele Grüße

seite5
01.07.2015, 19:07
hi,
eigentlich ist Deine Schaltung garnicht so verkehrt (man kann die Steuerpins auch bitweise ansteuern).
Im Ruhezustand (TxD inaktiv) ist TxD high, damit ist der Receiver des MAX enabled, der Transmitter
disabled - korrekt. Dein Oszillogramm sieht so schlecht auch nicht aus (die spikes auf A entstehen, weil
Deine Transistorschaltung nicht schnell genug den Steurpin deaktiviert. Da alle UARTs heutzutage
mehrfach abtasten, sollte das nich stören. Was passiert wenn Du einen Abschlusswiderstand zwischen A
und B bringst ?
Eleganter ist es natürlich einen IO-Port vom Mega als Steuer-Pin zu nehmen, H vorm Senden,
auf Low setzen, wenn TXC-flag gesetzt wurde, sonst schaltet der Mega den Sender aus, bevor das
Byte rausgeshiftet wurde.
Hast Du mal probiert, mit einem anderen MAX/Mega zu kommunizieren ? (Pull-Up an A nicht vergessen,
sonst sehen beide Receiver undefinierte Zustände.)
mfg
Achim

demmy
01.07.2015, 19:55
Hallo Achim,

ich habe aktuell insgesamt 3 Atmegas am Bus hängen. Ich habe jetzt mal die Umschaltung bei allen Atmegas auf einen µC-Pin umgelegt.
Die A und B Pegel sehen jetzt so aus:

30384

Schalte ich jetzt am Anfang und am Ende einen 120R Widerstand zwischen A und B dann verändern sich plötzlich die Pegel und die Kommunikation bricht nach 3 Telegrammen zusammen. Das ganze sieht dann so aus:

30385

Kann es sein, dass da jetzt die Widerstände nicht passen?

Viele Grüße

demmy
02.07.2015, 19:49
Hi,

Hat keiner mehr eine Idee, was das nun noch mit den Abschlusswiderständen sein könnte?

Viele Grüße

PICture
02.07.2015, 19:59
Kann es sein, dass da jetzt die Widerstände nicht passen?

Früher hast du den Achim gefragt und erst jetzt kann ich antworten: JA. ;)

Peter(TOO)
02.07.2015, 20:10
Hallo,

Hat keiner mehr eine Idee, was das nun noch mit den Abschlusswiderständen sein könnte?

Wie, Was Wo hast du denn jetzt gemacht?

ICH KENNE MINDESTENS 3 RICHTIGE Methoden, wie man die Abschlusswiderstände verschalten kann!

Der Unterschied liegt darin, dass du mit den Widerständen einen definierten Pegel hast, wenn der Sender hochohmig ist. Ohne widerstände bleibt der letzte Pegel, auf Grund der Leitungskapazitäten, "kleben"

Dies habe ich mehrfach verwendet um zu erkennen ob ein Erweiterungsmodul vorhanden ist oder nicht. Bedingung ist allerdings, dass das Modul eine Pul Up (oder Pulldown) Widerstand am Eingang hat.

Port-Pin als Ausgang schalten und eine 0 ausgeben.
Dann den Pin als Eingang schalten und einlesen.
ohne Pull Up bleibt die 0 noch einige µs b1s einige 10 µs stehen, mit Pull Up hat man sofort eine 1.
Funktioniert bei einigen Seriengeräten Fehlerfrei.

MfG Peter(TOO)

PICture
02.07.2015, 20:18
Wie, Was Wo hast du denn jetzt gemacht?

Eben, ohne kompletten Schaltplan des Busses ist keine konstruktive Hilfe möglich. :confused:

demmy
02.07.2015, 20:34
Nein nein, die Frage war natürlich an alle gerichtet! ;)

Ich hoffe Ihr habt die Oszillogramme gesehen mit und ohne Widerstand (Eintrag #9) !?

Also der Bus besteht aktuell aus einer Platine auf der die Teilnehmer aufgesteckt sind und die so aufgebaut ist:

30391

Die einzelnen Teilnehmer sehen dann so aus, wobei nur bei dem ersten und letzten der R4 vorhanden sind. R8 und R9 sind aktuell gar nicht bestückt.

30392

Die einzelnen Abstände zwischen den Teilnehmern sind nur wenige cm und komplett über Leiterbahnen.

Peter(TOO)
02.07.2015, 20:52
Hallo,

Und wie erfolgt nun die Umschaltung zwischen Senden und Empfangen?
Hier braucht man aber auch die Software dazu.
Deine erste Variante konnte ja nicht funktionieren.

Das praktisch Problem ist folgendes:
Das UART besteht aus zwei Registern, dem Datenregister und dem Schieberegister.
Das Datenregister ist per Software zugänglich, das Schieberegister leider nicht.
Deine Software schreibt nun in das Datenregister. Wenn das Schieberegister leer ist, werden die Daten aus dem Datenregister in das Schieberegister kopiert und gesendet.
Gleichzeitig wird das Transmit Register Empty Bit (TE) gesetzt und ein Interrupt ausgelöst, wenn freigegeben.
Nun ist aber das UART dann noch dabei, die Daten im Schieberegister zu senden.
Wenn also das TE-Bit aktiviert wird, musst du noch warten, bis alle Daten raus sind, bevor du deinen Treiber auf Empfang umschaltest.
Wie lange du warten musst, hängt von der verwendeten Baudrate und dem Datenformat ab. Da müssen ja Start und Stopp-Bit raus. Das Stopp-Bit kann 1 oder 2 Bit lang sein. Dann die Daten, meist sind 5, 7 oder 8 Bit einstellbar. Dann noch das Parity-Bit, wenn vorhanden. Manche UARTS beherrschen noch ein zusätzliches Master/Slave Bit.
Die Übertragung kann also zwischen 7 und 13 Bit dauern.

MfG Peter(TOO)

demmy
02.07.2015, 21:39
Also die Umschaltung mache ich jetzt über einen µC-Pin. Vor dem Senden den Max auf senden schalten, dann über das UDRE Interrupt die Daten ins UDR Register schieben und wenn zum Schluss alles raus ist, dann über das TXC Interrupt den Max wieder auf empfangen schalten. Ich habe alle Pins und das Timing am Oszi überprüft, das passt so einwandfrei. Das TXC Interrupt kommt erst dann, wenn auch wirklich das letzte Bit raus ist.

Die Pegel sehen auch sehr gut aus, also so lange man eben keine Widerstände gesteckt hat. ;)

ich habe eben nochmal im Datenblatt des Max485 nachgeschaut, die haben da aber auch nur einen 120R zwischen A und B eingezeichnet?
Ist vielleicht 120R nicht der richtige Wellenwiderstand? Ich hab mal gelesen, wenn man den falschen Abschlusswiderstand hat ist das schlimmer als gar keinen zu haben?

PICture
02.07.2015, 23:02
... ich habe aktuell insgesamt 3 Atmegas am Bus hängen.

Weil ich bisher keinen aktuellen Schaltplan gesehen habe, könnte ich nur vermuten, dass die drei MAX485 nicht synchron mit gleichem Signal umgeschaltet werden. :confused:

Peter(TOO)
02.07.2015, 23:38
Die Pegel sehen auch sehr gut aus, also so lange man eben keine Widerstände gesteckt hat. ;)

ich habe eben nochmal im Datenblatt des Max485 nachgeschaut, die haben da aber auch nur einen 120R zwischen A und B eingezeichnet?
Ist vielleicht 120R nicht der richtige Wellenwiderstand? Ich hab mal gelesen, wenn man den falschen Abschlusswiderstand hat ist das schlimmer als gar keinen zu haben?

Der Abschlusswiderstand muss an die Leitung angepasst sein.
Normales verdrilltest Telefonkabel hat um die 100 Ohm.

Bei dir sollte eine Fehlanpassung keine Rolle spielen!
Des Hauptproblem sind die Reflektionen, bei richtigem Abschluss gibt es kaum welche.
Allerdings hast du nur eine kurze Leitung. Bei den 10cm und einer Wellengeschwindigkeit von etwa c/2 kommt die Reflektion innerhalb von ns.
Anders sieht das aus, wenn die Leitung 1km lang ist. Dann stört die Reflektion das nächste Bit.

Anzumerken ist noch, dass der Empfänger bei RS485 nicht auf die Pegel reagiert, sondern auf die Differenz der beiden Signale. Etwas vereinfacht schaut der nur, welche Leitung positiver als die andere ist. Praktisch ist da noch eine Hysterese von ein paar 100mV ()Die genauen Werte stehen im Datenblatt, bin aber gerade zu faul zum nachsehen).

MfG Peter(TOO)

seite5
03.07.2015, 05:49
Hi,
für kurze Entfernungen (<1m) kannst Du den Widerstand zwischen A und B ganz raus lassen, ebenso den nach ground, der zwischen
A und VCC sollte etwas kleiner dimensioniert sein (4k7..10k). Alle Receiver sollten im IDLE-Zustand ein H am Eingang "sehen".
mfg
Achim