Forum: Mikrocontroller und Digitale Elektronik RS485 senden und empfangen


von Tino E. (tinolino)


Lesenswert?

Hallo Forengemeinde

ich beschäftige mich seit Wochen mit den RS485 Bus (mehrer Slaves an 
einem Master(PC) ).

Ich habe die Hardware für einen RS485 (Halfduplex) soweit auf Lochraster 
zusammengelötet. ( MAX232 auf MAX487 (RE* und DE an Rts) -> Bus -> RS487 
auf Atmega8 (PortD.2 auf MAX487 RE* und DE)) Bus ist terminiert mit 120 
Ohm.

Das Senden vom PC, sowie das Empfangen vom Controller am Pc funktioniert 
soweit ganz gut.

Momentan schalte ich dabei den PC und Controller über RTS auf senden 
oder empfangen. Wie habt Ihr das in der Praxisgelöst? Ich möchte über 
VB2010 eine Software schreiben, mit der ich senden und empfangen kann. 
Mein Problem ist woher weiß ich wenn ich vom PC senden möchte, ob nicht 
gerade der Slave sendet. Und wie realisiere ich das Softwareseitig.

Weiterhin habe ich noch ein Problem. Ich programmieren den 
Mikrocontroller (Atmega8) in Bascom. Hier ein Beispieltest-Code:


$regfile = "m8def.dat"
$crystal = 3686400
$swstack = 10

Open "COMD.0:1200,8,N,1" For Input As #1
Open "COMD.1:1200,8,N,1" For Output As #2

Dim E As String * 10

Config Portd.2 = Output

Portd.2 = 0


Do

  Input #1 , E
  Portd.2 = 1
  Print #2 , E
  Portd.2 = 0

  Print #2 , "Test"

Loop

End

Ich möchte ersteinmal nur sehen ob mit der Mikrocontroller das Print 
"Test" dauerhaft zurück gibt.

Das funktioniert aber nicht!
Erst wenn ich "Input #1, E" auskommentiere funktioniert es!
Warum kann ich Input und Print nicht in einem Zug ausgeben und 
zurückschreiben?

Das Programm dient nur zum Testen im Terminal!

Danke schon mal vor ab für Eure Antworten! Ich komme hier jetzt nicht 
weiter!

Gruß Tino

von Frank K. (fchk)


Angehängte Dateien:

Lesenswert?

1. Setze RE* dauerhaft auf aktiv. Damit ist der Empfänger dauerhaft an, 
und jedes Zeichen, das Du sendest, empfängst Du auch wieder. Wenn Du 
etwas anderes empfängst als Du gesendet hast (oder gar nichts oder nur 
Müll), dann weißt Du, dass neben Dir noch jemand anderes auf der Leitung 
ist und schaltest Deine Sendeleitung sofort ab. Die andere Station 
sollte das gleiche machen. Nach einer zufälligen oder von der 
Stationsadresse abhängigen Zeit versuchst Du es erneut.

2. Arbeite nicht zeichenorientiert, sondern blockorientiert. Definiere 
Dir eine feste Blockstruktur mit Absender, Empfänger, Länge, Prüfsumme 
und Datenfeld, in die Du alle zu sendenen Daten strukturierst. Da ein 
Bus erstmal fehleranfälliger ist als eine Punkt-zu-Punkt-Verbindung, 
hast Du so die Möglichkeit, Übertragungsfehler zu erkennen. Schau Dir 
mal an, wie eine CRC berechnet wird.

3. Die Steuerung des Transmit Enables des RS485 Transceivers mittels RTS 
ist Standard bei den üblichen RS232-485 Adaptern. Leider hat das ganze 
einen Haken! Die PC-UARTs haben 16 Byte Sende- und Empfangs-FIFOs. Der 
PC kann jetzt nicht feststellen, wann das letzte Bit tatsächlich auf der 
Leitung gelandet ist, damit er seinen Transmitter abschalten kann. Du 
solltest also den Sende-FIFO abschalten, um auf der sicheren Seite zu 
sein. Einige USB-Seriell Adapter (z.B. die von FTDI) können die 
Steuerung des RS485-Transceivers automatisch durchführen, wenn man die 
im internen EEPROM auf RS485 einstellt.

4. Eventuell möchtest Du auch CAN verwenden. Das ist ein anderer 
serieller Bus, bei dem die Controller etliches an Arbeit übernehmen, was 
Du bei RS485 erst selber programmieren musst. Leider gibt es keine 
lochrastergeeigneten AVRs mit CAN, hier müsstest Du zu einem PIC18 oder 
PIC24 greifen (da gibts eine große Auswahl), oder einen Zusatzchip 
anschließen (der die Sache leider eher verkompliziert und bremst). Wird 
in der Automobilindustrie und der Automatisierung ganz gerne verwendet.

fchk

von Tino (Gast)


Lesenswert?

Danke für die schnelle und ausführliche Antwort! Ich bin erst am Anfang 
meiner Versuche zur Datenübertragung mit dem RS485 Bus. Ich habe erst 
einmal versucht einen String von Master und Slave zu versenden un zu 
empfangen. Die Sende und Empfangssteuerung habe ich manuell betätigt. 
(HTTERM RTS enabled). Nun wollte ich nach jedem Sendevorgang vom PC eine 
Rückmeldung vom Slave erhalten, was aber nicht funktioniert. Das mit RE* 
dauerhaft auf aktiv werde ich morgen mal probieren. Ich denke aber dass 
diese Methode nur zum Testen ist! Die Fifo's werde ich ach mal 
aktivieren. Über ein strukturiertes  Protokoll mache ich mir schon 
Gedanken, nur wie setze ich das um? (Softwarseitig). Ich möchte über den 
Bus meine Modellbahn steuern. Da fließen nicht all zu viele Daten über 
den Bus.Nein der CAN kommt für mich erst mal nicht in Frage.

Gruss Tino

von Rumpel, der Stilz ist grad nicht da. (Gast)


Lesenswert?

Lass dich nicht von den CAN Fans beschwafeln. CAN ist fuer Autos. Die 
Meldungslaenge ist ausserordentlich kurz, um nicht zu sagen unbrauchbar 
kurz.
Also RS485. Wioe schon ge4sagt muss man blockorientiert denken. Also ein 
Protokoll aufsetzen mit Header(preable, Length, Source, Destination, 
Command), Data[..] & CRC. Jeder hoehrt mit und weiss daher wann die 
Meldung fertig ist, und wer nachher kommt.
Dabei ist die Arbeit vereinfacht wenn die logische Struktur Master-Slave 
ist, im Gegensatz zu Multimaster. Im Falle von Master-Slave duerfen die 
Slaves nur antworten, und muessen daher nur mitbekommen wann der Master 
sendet.

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.