Ein paar Fragen zu RS485 - Master / Slave Anwendung

Gast #2780475
Lesenswert?

Hey Leute,

ich hoffe mich Köpft hier niemand, weil ich ein neues Thema zu RS485 Bus 
auf mache.

Aber bevor ich zu meinen Fragen komme erstmal hier die vorhandene 
Hardware:

- Als Master möchte ich ein ATMega644P nehmen (Weil dieser 2 Uarts hat, 
erkläre später warum)
- Als Slaves würde ich gern die Attiny2313 nehmen
- Die Adressierung der Slaves soll über einfache Dip Schalter gemacht 
werden
- Als Bustreiber würde ich den "SN75176" nehmen
- die Slaves bekommen jeweils ein DS18B20 Temperatursensor. Möchte aber 
noch Möglichkeit offen halten, andere Sensoren zu ergänzen, daher den 
Tiny2313
- Der Master bekommt ein LCD Display, ein RTC Chip, 2 Tasten um im 
Display zu Scrollen, 2 Weitere Tasten um ins Menü zu kommen, bzw 
Einstellungen zu verändern (Hintergrundbeleuchtung, Kontrast), 1 
externen Quarz die sind ja genauer als die internen.
- Die Slaves und der Master bekommen einen Spannungsregler (5V)
- Als Versorgungsspannung will ich 9 oder 12V nehmen
- Master und Slaves sollen über ein Netzwerkkabel verbunden werden, also 
die Busleitungen und die Versorgungsspannung soll auch drüber gehen. 
Sowie auch die RS232 - Schnittstelle zum PC
- Gesamtlänge des Bus System wird etwa 40-60m sein. Und jede Unit (Egal 
ob Master oder Slave soll entweder Per Dip Schalter oder Jumper die 
Abschlusswiderstände Aktiverien bzw. Dekativeren können, da diese ja nur 
an den Enden sein müssen und so kann ich eine Anzahl von X Units bauen, 
die Identisch sind (Slaves versteht sich)

Ich hoffe das ist alles, was ich an Hardware verarbeiten möchte. 
Vielleicht könnte jemand sich schon mal so äußern, ob das im Groben eine 
gute Wahl ist? Verständlich Widerstände und Co kommen noch dazu, wollte 
ich nicht seperat aufzählen.


Als Programmiersprache möchte ich Bascom nutzen, da ich damit schon 
bischen Erfahrung sammeln konnte.


Nun zu meinen Fragen:
=====================
- Wie kann ich dem Master Controller Mitteilen, welche Uart - 
Schnittstelle er nutzen soll? Da der Master ja 2 hat. Eine Uart soll per 
RS232 über ein Max232 mit einem PC verbunden sein, die andere Uart ist 
für den Bus.
- Im allgemeinen funktioniert das, wenn ichs richtig verstanden habe mit 
dem RS485 Bus folgendermaßen, wenn 1 Master und x Slaves vorhanden sind:

1. Master sendet Adresse vom Slave in Bus
2. Slaves Kontrollieren eingehende Nachricht ob sie gemeint sind
3. entsprechender Slave Sendet ein "hier bin da" damit der Master weiß, 
das er "gehört" wurde
4. Master sendet an Slave was er von ihm will
5. Slave sendet Master angeforderten Daten

- Kommunikation in den Bus führe ich in Bascom mit den Befehlen "Print" 
und "Input" oder gibt es bessere Befehle für diese Aufgabe?

Stimmt das soweit? Auch wenn es nur ein "minimum" an Kommunikation ist?

- Wie berechne ich die Abschlusswiderstände? Oder gibt es feste Größen?



Michael

PS: Ich hoffe alles wichtige steht drin, sonst notfalls nachfragen 
bitte.


Und zur Info, was ich vorab gelesen habe hier die Links:

http://www.wiki.elektronik-projekt.de/mikrocontroller/rs485_bus

dazu habe ich noch folgendes überflogen:

http://www.roboternetz.de/community/threads/827-Der-RS-485-Bus
Gast #2780516
Lesenswert?

> - Wie kann ich dem Master Controller Mitteilen, welche Uart -

Es sind halt 2 von einander unabhängige Hardware einheiten.
Wie du Das Bascom erklären willst... Keine Ahnung Ich verwende C.

>Im allgemeinen funktioniert das, wenn ichs richtig verstanden habe mit
>[...]

Das ist eher I2C
Bau dir ein Packetformat mit Absenderadresse, Empfängeradresse,
Nutzdaten und CRC. Dein Master schickt dann ein Päckchen und der Slave
hat x ms Zeit zu antworten.

> - Als Slaves würde ich gern die Attiny2313 nehmen

Nimm Mega8

> - Als Bustreiber würde ich den "SN75176" nehmen

LT 1785 Halbwegs Modern und Robust.

> - Der Master [...] 1 externen Quarz die sind ja genauer als die internen.

Gibt es nicht. Die internen sind RC Schwingkreise.

>- Die Slaves und der Master bekommen einen Spannungsregler (5V)
>- Als Versorgungsspannung will ich 9 oder 12V nehmen

60m mit 9V kannst du kicken.
Dein 5V brauch ja schon 2V für sich.
12V müsste man mal ausrechnen...

Bus Abschluss am Master:
+5V -- 620R -- Bus A -- 120R -- Bus B -- 620R -- GND
Bei den Slaves reichen 120Ohm + Jumper.
Gast #2780529
Lesenswert?

Nur eine kleine Frage, was spricht den gegen den Tiny2313? Wie gesagt, 
er soll nur Messdaten ermitteln und weiterleiten. Also von der 
Rechenleistung her sollte es doch reichen oder?

Und das mit dem Extern und Intern meinte ich so wie es geschrieben hast, 
kam scheinbar anders rüber.

Und gut, wegen der Übertragungsklamotte, kann ich ja auch so zusammen 
packen und der Empfänger ermittelt die ersten x Anzahl von Zeichen, 
welche die Zieladresse enthalten. Der Slave der sich angesprochen fühlt, 
zerlegt dann das Paket weiter und teilt es auf und Antwortet 
entsprechend, auf die Anfrage vom Master.

Aber stimmt, das könnte echt besser sein, als das hin und her. Geht 
schneller und der Bus ist wieder eher frei.

Aber wie ich das Paket zusammen setze, ist mir ja überlassen. Hauptsache 
ist, ich einige mich auf ein Schema.


Michael
Gast #2780531
Lesenswert?

Sry, dass ich seperat noch mal Antworte. Aber im allgemeinen ist es doch 
Relativ egal, welchen Treiber ich nehme oder?

Weil den mir genannt hast, soll pro Stück bei Conrad um die 5€ pro Stück 
kosten. Wohingegen mein Typ bei Ebay 5 Stück zu 1,40€ zu haben sind. Es 
wäre ja auch erstmal zu versuchszwecken, ob ich das hin bekomme, was ich 
vor habe. Von daher sollte es kein "Millionengrab" werden.


Michael
Gast #2780618
Lesenswert?

Eine Frage ergab sich noch im Schlaf. Da die Slaves in meinem Fall nicht 
mit einander Kommunizieren sollen, könnte ich doch auch auf die 4 Draht 
Technologie zurück greifen oder? Weil in den Infoblättern, Stand da was 
in der Richtung, dass die Slaves nur höhren, wenn etwas vom Master 
gesendet wird und Ignorieren Slave Sendungen?


Welche Treiber benötigt man den für diese Art von Anwendung dann?


Michael
Gast #2780637
Lesenswert?

Les doch mal über RS422 / RS485 nach.

RS485 mit 4 Drähten geht auch, die Slaves-TX brauchen dort genauso 
Tri-State-Treiber, wie oben schon erwähnt. Nur der Master-TX und die 
Slave RX könnten mit einfachernen Treibern aufgebaut werden. Bringt aber 
insgesamt nicht so die Vorteile.

2-Draht RS485 hat halt 2 Drähte weniger, was Du beim Verdrahten der 
vielen Einheiten am Bus zu schätzen lernen wirst.

Der Typ des Treibers entscheidet über die Stromaufnahme, beim 
Einzelstück nicht so arg wichtig, bei vielen Einheiten am Bus aber 
entscheidend.
Gast #2780660
Lesenswert?

Ja ich habs mir durchgelesen gehabt, und ich hatte es so verstanden, 
dass bei der 4-Darht Lösungen, die Slaves sich "ignorieren" und 
weiterarbeiten und erst auf Master Anfragen reagieren. Weil soweit ich 
es verstanden habe, kann im 2-Draht System jeder mit jedem 
kommunizieren, wenn das richtig eingestellt ist.

Und aus dem Grund dachte ich, beim 4-Draht Bus benötige ich andere 
Treiber als beim 2-Draht Bus, weil so wüsste ich erstmal nicht, an 
welchen Pin ich die weiteren 2 Bus Leitungen montieren sollte.

Und mein System soll lediglich 1 Master und 8-10 Slaves haben. Von daher 
wäre es nicht soooo schlimm, wenn ich dort auch 2 Drähte je mehr 
verarbeiten müsste.

Aber was spricht den eigentlich so gegen den Tiny2313? Wie gesagt die 
Slaves arbeiten weniger.

Und zum RS232, könnte das bei der Gesamtlänge klappen oder müsste ich 
ein Booster einsetzen, der das Signal verstärkt und weiterleitet?



Michael
Gast #2780818
Lesenswert?

Ich verwende auch RS422. Ein Master Slave System mit 4 signalleitungen 
plus GND. Der vorteil ist, dass die Umschalterei zwischen Senden und 
empfangen entfaellt. Der Master darf immer senden, und die Slaves 
duerfen nur antworten, wenn sie per Adresse angesprochen worden sind. 
Als Treiber verwende ich ADm489 oder aehnlich. Der Stromverbrauch der 
Treiber ist wesentlich wenn das system dauernd laeuft und stromsparend 
sein soll. Denn die Speisung muss man erst bereitstellen, dann 
uebertragen, und vielleicht sogar kuehlen. Wenn es nur um ein langsames 
Messystem geht, sollte man mit 1mA pro Station durchkommen. Dh 
Controller, Sensor plus Treiber. Vorausgesetzt eine Messung oder so pro 
Sekunde sind genuegend.
Gast #2780838
Lesenswert?

Hi

>Ein Master Slave System mit 4 signalleitungen
>plus GND. Der vorteil ist, dass die Umschalterei zwischen Senden und
>empfangen entfaellt.

Die entfällt auch, wenn man CAN-Treiber anstelle der RS422/485-Treiber 
benutzt.

Für die Kommunikation zwischen einem Master und mehreren Slaves bietet 
sich bei AVRs der Multiprozessor-Mode der UARTs an. Der Vorteil ist, das 
die Slaves nicht mehr ständig den Bus mithören müssen. Die werden nur 
alarmiert, wenn eine Slaveadresse gesendet wird.

MfG Spess
Gast #2780869
Lesenswert?

Aber wäre den für die Slaves den normal auch der Tiny2313 ausreichend?

Die Messungen sollen nur zwischen allen 5 und 10 Minuten durchgeführt 
werden. Soll ja nur als Zentrale Temperaturanzeige und Überwachung 
funktionieren.

Evtl kommt an einem Slave noch ein oder 2 Sensoren dazu, aber das sollte 
ja nicht weiter ins Gewicht fallen.

Wegen dem ADm489 werde ich mal gucken. Kannst du "Purzel" mich mal per 
Email anschreiben? Emailadresse ist michael@freewareecke.de alternativ 
ICQ 245-961-673 adden. Scheinbar hast du ja schon etwas mehr mit dem 
gemacht?


Michael
Gast #2780990
Lesenswert?

> Ja ich habs mir durchgelesen gehabt, und ich hatte es so verstanden,
> dass bei der 4-Darht Lösungen, die Slaves sich "ignorieren" und
> weiterarbeiten und erst auf Master Anfragen reagieren.

RS422 kennt nur EINEN sender und ja, die Slaves können sich nicht
selbst höhren. Bei einer Punkt zu Punkt verbindung entfällt die 
Umschaltung zwischen Senden / Empfangen.
Da du aber auf der Rückleitung (Salve->Master) 8-10 Sender hast
und zumindest den Sendebetrieb ein/aus schalten solltest kannst
du auch gleich RS485 nehmen. Spart Treiber, Schutzdioden,
Abschlusswiderstände, Jumper, Strom, viel Arbeit,......

> Weil soweit ich
> es verstanden habe, kann im 2-Draht System jeder mit jedem
> kommunizieren, wenn das richtig eingestellt ist.

Ja ist erlaubt, musst du aber nicht.
RS485 definiert ja NUR die elektrischen parameter, beim Rest kannst
du machen was du willst...
Die Treiber haben ja 4 Pins richtung AVR: TX, RX, Senden Ein und
Empfangen Aus. Die beiden Letzten muss der AVR dann passend
umschalten (1 Pin reicht).
Oder du schaltet nur den Sender ein/aus. Dann kann der Slave sich
selbst höhren.

> Und aus dem Grund dachte ich, beim 4-Draht Bus benötige ich andere
> Treiber als beim 2-Draht Bus, weil so wüsste ich erstmal nicht, an
> welchen Pin ich die weiteren 2 Bus Leitungen montieren sollte.

Du brauchst für RS422 2 Treiber.....

> Und mein System soll lediglich 1 Master und 8-10 Slaves haben. Von daher
> wäre es nicht soooo schlimm, wenn ich dort auch 2 Drähte je mehr
> verarbeiten müsste.

Kabel mit 6 Dräten sind selten. 4 Adriges Telefonkabel ist billig
und völlig ausreichend. Habe ich hier >2 Jahre im einsatz mit 5 Slaves,
Buslänge ca 100m.

> Aber was spricht den eigentlich so gegen den Tiny2313? Wie gesagt die
> Slaves arbeiten weniger.

Erstmal nichts, aber bei mir kamen im laufe der Zeit mehr Anforderungen
(CRC, Klartext Protokoll, Sensoren ausser DS18x20,...) und ich musste
mich dann nicht über einen zu kleinen Controller ärgern :-)

> Und zum RS232, könnte das bei der Gesamtlänge klappen oder müsste ich
> ein Booster einsetzen, der das Signal verstärkt und weiterleitet?

232 über 60m? geht mit 9600Baud und gutem Kabel.
Gast #2781164
Lesenswert?

Zum ersten, sry das ich Korrigieren muss, nur ich habe nicht 8-10 
"SENDER" Sondern diese Anzahl als Slaves. Nur mal vorweg.

Und gut viel erweitern wollte ich eigentlich nicht. Höchstens an manchen 
Slaves ein oder paar weiteren Sensor packen, aber diese sollen ja nur 
abgefragt werden.

Und so kann ich es ja dann Planen, dass ich notfalls, wenn eine seperate 
Unit mehr brauch eine Unit austauschen und nich vorweg alle 
"überdimensionieren" aber ich denke, das ist meinem Geschmack frei 
gestellt.

Und das Kabel was ich nehmen möchte, ist eine einfaches Netzwerkkabel 
mit Cat.5 also von daher sollte in dem Fall das mit RS232 klappen oder 
sollte ich vll doch überlegen ein Booster rein zu packen?

Die Adern sollen wie folgt aufgeteilt werden:

1.Paar Spannungsversorgung 12V DC
2.Paar RS232 Aderpaar
3.Paar RS485 - Bus
4.Paar noch Frei, vll nehme ich die als GND für RS232 oder nutze diese 
als zusätzliches Paar für Spannungsversorgung. aber mal gucken.

Und ich dachte, beim RS485 benötige ich auch Abschlusswiderstände. Und 
dann werde ich mal die obengenannte Hardware beziehehn, also die 
Treiber, µCs (Für Master und Slave entsprechenden Teilchen und so).

Abschlusswiderstände sind aber auch wie beim RS422 120 Ohm oder kann man 
auch 150 Ohm nehmen? Oder was nimmt Ihr?



Michael
#2781261
Lesenswert?

Was Bacom angeht kannst Du die Methode Input und Print getrost der "fast 
& dirty" fraktion zurechnen.
Dumm bei den Befehlen ist, der Programmablauf bleibt an der Stelle 
hängen, bis zum St. Nimmerleinstag.

Verwende die Interrupts und schreib Dir eigene Sende- Empfangsroutinen. 
Ist nicht so schwer, keine Sorge.
Knifflig bei den 485-Bausteinen ist immer die Umschaltung der 
Senderichtung, damit die letzten Bytes nicht jeweils abgeschnitten 
werden ... dafür gibts den TXC - Interrupt bzw. Flag.
9-Bit kann Bascom in highlevelbefehlen nicht, da ist der Registerzugriff 
eh notwendig.
Ringpuffer als array und CRC8 sind Deine Freunde.

hier mal meine Bascom-Empfangsroutine als (schlechtes) Beispiel :)

       Zeichenempfang:
             If St_protokoll_timeout_flag > 5 Then
                  Rx_pointer = 0
             End If

             If Rx_pointer < 17 Then
                   If Ucsr0a.4 = 1 Or Ucsr0a.3 = 1 Then
                         Incr Uart0_fe_counter
                         Udr_dummybyte = Udr
                   Else
                         Incr Rx_pointer
                         If Rx_pointer > 2 Then Set Led_rot
                         Rx_data(rx_pointer) = Udr
                         If Rx_data(rx_pointer) = 123 Or 
Rx_data(rx_pointer) = 124 Then
                               Incr 123_counter
                               If 123_counter > 10 Then
                                      Start Watchdog
                                      Do
                                      Loop
                               End If
                         Else
                              123_counter = 0
                         End If
                   End If
             End If
             Udr_dummybyte = Udr

             St_protokoll_timeout_flag = 0

             If Uart0_fe_counter > 20 Then
                  Disable Urxc
             End If
       Return
Gast #2781285
Lesenswert?

Ja gut, wie ichs genau löse werde.

Ich hab mal im Netz eine eher naja vielleicht unsaubere Lösung gesehen, 
aber vielleicht nehme ich diese.

Da ich ja noch 2 Adern im Kabel frei habe, werde ich vll von der 
MasterUnit ein Signal auf diese geben, die Slaves bekommen dieses Signal 
per Transistorschalte oder so mit und zwar auf Ihrem Interrupt.

Und erst dann lauschen die die Slaves auf dem Bus, vorher gehen die 
Ihrer Arbeit nach.

Ist vielleicht nicht die Schönste Lösung, wäre aber eine einfach 
umzusetzende oder?



Michael
Gast #2781329
Lesenswert?

Ja gut, ich werde es mal durch denken und Testen.

Aber die Slaves sollen ja nur Daten ermitteln und bereit Stellen. Mehr 
bekommen sie nicht zu tun.

Vielleicht löse ich es auch so, sende mit der Main Adresse (Basisadresse 
an alle Slaves) ein Kommando, dass diese ihre Daten abfragen und dann 
nach einem Moment rufe ich einfach alle Slaves nach einander ab und der 
Master wertet die Daten aus und gibt sie auf dem LCD aus.

Ich weiß es ist vielleicht nicht ganz im Sinne des erfinders, aber denke 
fürn einstieg eine Möglichkeit, die klappen könnte.

Und kann ja die Software immer noch Updaten und verbessern. Spricht ja 
nix gegen.


Michael
#2781920
Lesenswert?

Max232 ... würde heut gleich nen FT232 drauf machen und an USB gehen.

Du hast 2 UART, jeweils für beide URXC UTXC, das bisschen messen und 
Protokoll macht der Controller im Schlaf, kann nebenher noch Kaffee 
kochen und La Paloma pfeifen. Macht Sinn das Ding in Sleepmode zu 
schicken und Strom sparen bei der langen Stromversorgungsleitung.

Doof wirds nur, wenn Dein Programmablauf so ist, dass der nicht 
permanent empfangen kann, sondern irgendwelche Rechenoperationen macht 
und erst nach denen wieder in Empfangsbereitschaft vom Input ist. Dann 
geht Dein Aufruf ins leere, daher besser, den Empfang in Interrupt 
legen, und n Flag setzen bei Empfang und in der Mainloop dann abarbeiten 
und, so der Programmablauf timingunkritisch ist, auch dort versenden der 
Antwort.
#2781989
Lesenswert?

Michael_N. schrieb:
> Zum ersten, sry das ich Korrigieren muss, nur ich habe nicht 8-10
> "SENDER" Sondern diese Anzahl als Slaves. Nur mal vorweg.

Da solltest Du Deine Begriffe aber klären:
- Master und Slave ist eine Sache; das bezieht sich auf das Protokoll 
und den Ablauf der Kommunikation, hier: Master-Slave-Protokoll = 
Aufruf-Antwort-Sequenz und wer von den Teilnehmern was tun darf bzw. 
muss.
- Sender und Empfänger ist eine andere Sache; das bezieht sich auf die 
Physik der Übertragung, hier: RS485. Beide (Mater und Slave) müssen 
senden und empfangen können.

Gruß Dietrich
Gast #2782179
Lesenswert?

Danke für Eure Hilfe bislang.

Nur die eine oder andere Information wollte ich noch geben. Ich möchte 
gern bei RS232 Bleiben also für die Kommunikation mit dem PC. Zum einen 
diese ist Kurzschlussfest und zum anderen würde so mein PC Programm neu 
geschrieben werden müssen (von mir).

Den ich habs nun endlich soweit gut raus, wie ich in VisualBasic eine 
Kommunikation mit der Seriellen Schnittstelle hin bekomme.

Also nur zu dieser Information.

Ich bin zum Teil zu überlegen den Slaves ein Inkey zu verpassen, also 
dass der Master einfach eine Adresse sendet. Alle prüfen nach ob es Ihre 
ist und verlassen den Inkey-Bereich, wenn es nicht Ihre Adresse war. Und 
wenn doch arbeitet er den entsprechenden Bereich ab.

Ich hoffe Ihr versteht was ich meine?

Michael
Gast #2782199
Lesenswert?

Ja. die Message ist adressiert. Wie auch immer man das nennt.

Ein USB-to-Serial erscheint auch als Serialport gegenueber der Software. 
Ich wuerd's auch bei Serial seinlassen, denn die Kabellaenge fuer USB 
ist auf 5m beschraenkt, waehred die bei RS232 nicht der Fall ist.
Gast #2782399
Lesenswert?

Eine Frage, vielleicht eine doofe, aber naja.

Sollte man die Slave µC mit einem externen Quarz ausstatten oder ist das 
in Verbindung mit dem RS485 Bus nicht unbedingt notwendig? Weil beim 
RS232 sollte man ein Quarz nehmen.




Michael
Gast #2782430
Lesenswert?

Der RS232, wie auch das RS485 basieren auf dem Uart, muessen daher auf 
besser als 2% genau sein. Und daher, ja. Auch mit quarz.
Es gibt allerdings eine Appnote von Atmel, wie man den internen RC 
Oszillator auf das UART synchronisieren kann. Wenn man sich das fuer die 
geringe Ersparnis antun will ... Fuer einen Quarz bezahlt man um die 20 
cents.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren