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
- DDR's richtig gesetzt? DDRE |= (1<<PE2); DDRB |= (1<<PB0); Sonst ist RE offen, je nach Logik kann das als High gelten.
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
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.
Karlheinz Druschel wrote: > Warum eigentlich muss bei > einer Vierdrahtverbindung der Empfänger abgeschaltet werden wenn ich > sende ? Muss er nicht.
Ok, also müßte es doch gehen, wenn ich im SIG_UART1_TRANS Interrupt den Sender abschalte...
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
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.........
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.
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
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.