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
Vergiss den DS75176, der zieht zuviel Strom (35mA). Nimm den ADm483
(350uA) oder so. Und dann eine AC Terminierung, also 1uF+100 Ohm, die
zieht keinen DC Strom.
Die Master Firmware wird schon wissen welcher UART wohin fuehrt.
> - 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.
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
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
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
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.
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
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.
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
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
spess53 schrieb:> Für die Kommunikation zwischen einem Master und mehreren Slaves bietet> sich bei AVRs der Multiprozessor-Mode der UARTs an.
Ist BASCOM schon soweit?
Ju
Hi
>Ist BASCOM schon soweit?
Bin zwar kein BASCOM-Nutzer, aber man kann auf alle IO-Register der AVRs
zugreifen. Also war BASCOM schon immer so weit.
MfG Spess
> 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.
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
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
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
sauber? Nö, Dein Bus hängt sich regelmäßig auf weil irgendwo der
Netzbrumm einkoppelt und den INT auslöst ... außerdem nix gewonnen, ob
URXC Interrupt oder INT0 bleibt sich gleich, der normale Programmablauf
(Mainloop) wird bis zur Abarbeitung unterbrochen.
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
Was ich noch vergass, Betreff der RS232 Verbindung zwischen dem Master
und dem PC ist noch ein Max 232 zwischen geschalten.
Hätte ich vielleicht eher verraten sollen. Sry.
Michael
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.
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
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
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.
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
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.