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
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
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.