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.
Ich möchte nur auf Dip Gehäuse bleiben. Also keine SMD Bauteile. Das hätte ich vielleicht erwähnen sollen. Michael
> - 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.
Ist auch egal. Solange die Huette geheizt wird, spart man ja auch Oel..
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
Sry noch was hab ich vergessen, gibt es den gute Alternativen zum ADm489? 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
Hi Ergänzung: .... Also war BASCOM schon immer so weit. Nur die meisten Nutzer nicht. 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.
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.