Hallo alle ich möchte gern wissen ob es möglich / und wie es machbar ist ein Broadcast auf einem Bus zu machen . Ziel der Sache ist, die auf dem Bus befindlichen Slaven, adresse abzufragen und die zu speichern. kurz: jeder Slave meldet sich durch seine Adresse an und der Master speichern diese für die weitere Kommunikation. Der Master sendet eine Frame mit adresse 0x00, daraus spricht er zum beispiel alle Slave an. diese soll dann anworten. Aber wie geschieht es ohne das´s es zu einer Kollision führt. Vielleicht hat jemand sowas schon gemacht. Eín kleines Beispielcode wäre sehr hilfreich. danke für Jeden Beitrag(es wäre mir sehr Wert) Jonas
das muss natürlich in den slaves verankert werden Collision detect !!! es antworten alle slaves die slaves erkennen das einer am antworten ist und ziehen ihre antwort solange zurück bis sie dran sind bzw die leitung frei ist die slaves versuchen es nach einer gewissen ablaufzeit einfach erneut zeit am besten als rand() definieren dann antwortet jeder der slaves zu unterschiedlichen zeiten irgendwann sind eben alle slaves durch und der master hat alle adressen alternative : alle adressen einzeln durchlaufen wenn dein gewählter bereich durch is weißste auch welche geräte da sind und welche nicht alternative : bei anschluss eines slaves sendet dieser irgend einen breakcode master weiß nun .. da is was neues
sehr schöne alternative . Wie der Slave eine colision detectieren ist mir noch ein rätzel. aber ich würde das gern einsetzen , wenn ich nur wustte wie es gehen kann. >alternative : >alle adressen einzeln durchlaufen >wenn dein gewählter bereich durch is weißste auch welche geräte da sind >und welche nicht Es ist auch eine Möglichkeit diese kann ich nur begrenzt einsetzen, da die Adresse 7Bits sind und ich weiß überhaupt nicht welcher Adressbereicht die Slave haben. Und bis ich die 2^7 Möglichkeiten durchgelaufen habe ist schon viel Init_zeit abgelaufen. Aber wenn du eine Idee hat wie ich bei den Slaven die Colision detectieren kann wäre sehr nett Jonas
Jonas Henrich schrieb: > Es ist auch eine Möglichkeit diese kann ich nur begrenzt einsetzen, da > die Adresse 7Bits sind und ich weiß überhaupt nicht welcher > Adressbereicht die Slave haben. Mit 7 Bit gibt es 127 verschiedene Möglichkeiten. So viele sind das nicht. > Und bis ich die 2^7 Möglichkeiten > durchgelaufen habe ist schon viel Init_zeit abgelaufen. Das Problem sind nicht die Adressen, auf denen ein Client existiert. Das Problem sind die Adressen an denen es keinen Client gibt. Da musst du einen vernünftigen Timeout vorsehen. So viel Zeit ist das nicht. > Aber wenn du eine Idee hat wie ich bei den Slaven die Colision > detectieren kann wäre sehr nett Dazu muss der Client die Leitung direkt beobachten.
>Hat keiner eine Idee? >kurz: jeder Slave meldet sich durch seine Adresse an und der Master >speichern diese für die weitere Kommunikation. Ein Slave hält solange die Fresse bis er gefragt wird? Wenn alle durcheinander sabbeln kommt da nix gutes bei raus,
Holger schrieb:
>Wenn alle durcheinander sabbeln kommt da nix gutes bei raus,
ja Holger das weiß ich schon deswegen, bitte ich um eine
Möglichkeit wie ich das am besten collisionfrei realisieren kann.
Kann sein dass eine im Forum schon sowas gemacht hat oder eine guten
Konzept darüber sich schon gedacht habe.
mein Kopf brennt schon mit der sache.
Danke
Jonas
Wenn du nicht direkt die Leitung beobachten kannst oder willst, dann gehts nur so: Jeder hält die Fresse, bis vom Master die Anfrage kommt: Device 67, bist du da? Woraufhin das Device 67 zurückschreit: Ja, Meister! Kommt innerhalb von (hausnummer) 10ms keine Antwort, dann weiß der Master, dass es keinen Client mit dieser Adresse gibt. Bei 127 möglichen Clients ist das noch gangbar. Ansonsten: Jeder Client beobachtet die gemeinsame Sendeleitung. Ist die eine zeitlang inaktiv, dann sendet er einfach auf gut Glück: Huhu, Meister, ich bin da! und der Meister antwortet: Sehr schön 67, und jetzt halte die Klappe. Kriegt der Client keine Antwort, dann geht er davon aus, dass seine Hier-Meldung nicht durchgekommen ist und er probiert es nach einer zufälligen Zeitdauer wieder. Irgendwann haben sich alle Clients angemeldet.
>Jeder Client beobachtet die gemeinsame Sendeleitung. Ist die eine >zeitlang inaktiv, dann sendet er einfach auf gut Glück: Huhu, Meister, >ich bin da! und der Meister antwortet: Sehr schön 67, und jetzt halte >die Klappe. Das könnte man auch umdrehen. Der Master fragt in gewissen Zeitabständen die Slaves ab. Wenn einer nicht mehr antwortet kann er ihn aus der Liste streichen.
das eine ist Herzschlag-methode einfach stochastisch die clients abfragen ... das andere ist dagegen recht effizient was oben erwähnt wurde : >Jeder Client beobachtet die gemeinsame Sendeleitung. Ist die eine >zeitlang inaktiv, dann sendet er einfach auf gut Glück: Huhu, Meister, >ich bin da! und der Meister antwortet: Sehr schön 67, und jetzt halte >die Klappe. >Kriegt der Client keine Antwort, dann geht er davon aus, dass seine >Hier-Meldung nicht durchgekommen ist und er probiert es nach einer >zufälligen Zeitdauer wieder. >Irgendwann haben sich alle Clients angemeldet. der slave hat so einen pseudoslavemodus wo er erstmal auf den bus plärrt wenn der master ihn erkannt hat geht er in den richtigen slavemodus über bei dieser methode kann man beliebig slaves an und abstöpseln und das bei aktivem bus sozusagen plug&play
lieber Profis
ich bin leider keine großer Erfahrene was die Programmierung angeht
bezüglich die Programmierung einer Kommunikation sogar aber schlage mich
trotzdem topfer.
die Alternative von
>Karl heinz Buchegger
ist zwar gut , kann diese auch fast gut theoretisch verstehen, aber
ich kriege das nicht in C-Code gepackt. (Pseudoslavemodus , Slavemodus,
Leitung beobachten ).
könnte mir jemand nur ein kleines C-Code zeigen , womit ich mich
orientieren kann? Wäre sehr dankbar.
Jonas
Dann würde ich vorschlagen, dass du zunächst mal die plug&play Flausen aussen vor lässt und das ganze ganz konventionell angehst. Sprich: Der Programmierer legt im Programm fest, welcher Client an welcher Adresse liegt. Damit kannst du erst mal dein Programm hochziehen. Und wenn du dann etwas mehr Erfahrung hast, dann gehst du nochmal die Automatik an. Eins nach dem Anderen. Wenn du mit Kommunikation keine Erfahrung hast, dann musst du dir die erst aneignen. Auch Rom wurde nicht an einem Tag erbaut.
Hi leute ich bin nicht weiter gekommen mit dem ding, und es wird mir langsam eng. >Jeder Client beobachtet die gemeinsame Sendeleitung. Ist die eine >zeitlang inaktiv, dann sendet er einfach auf gut Glück: Huhu, Meister, >ich bin da! und der Meister antwortet: Sehr schön 67, und jetzt halte >die Klappe. Es ist mir nicht gelungen eine Algorithm zu finden, wie die Slave die Leitung beobachten können. veilleicht bei CAN könnte möglich sein . ich weiß auch nicht. ch habe mir was anderes ausgedacht: Gibt es eine algorithm wie ich die Slave beim Start eine Adresse zu verpassen? danke.
>Es ist mir nicht gelungen eine Algorithm zu finden, wie die Slave die >Leitung beobachten können. veilleicht bei CAN könnte möglich sein . >ich weiß auch nicht. mach dich mal über RS485 schau !! ALLE geräte am bus stehen IMMER auf empfang wenn ein gerät was zu sagen hat schaltet es den treiber auf senden um danach sofort auf empfang der µC guck einfach im empfangsbuffer nach ob was gekommen ist was ihn interessiert
Wie wäre es mit einer weiteren Leitung die als busy-Leitung fungiert. Ist die Leitung von irgenteinem busteilnehmer auf high, dann sind alle solange ruhig bis die wieder auf low gezogen wurde. Somit musst du nur die eine Leitung auf High oder low überprüfen. ein Timeout wäre aber auch ganz nett. Gruß Tobi
warum unnötigen kram mitziehen wenn was aufm bus passiert erfahren es doch eh alle teilnehmer weil dort bits wackeln
gast schrieb: > warum unnötigen kram mitziehen > wenn was aufm bus passiert erfahren es doch eh alle teilnehmer > weil dort bits wackeln Also mir wäre es die eine weitere Leitung wert, wenn ich dadurch viele zeilen code sparen kann. So brauche ich nur eine If abfrage und das wars. Gruß Tobi
dann machs .. die selbe if() kommt zum einsaz auch ohne dem draht du hast das prinzip hinter halbduplex schon nicht verstanden und das prinzip von RS485 schon garnicht , ebenso wenig master-slave von den slaves plaudert doch keiner solange er nicht aufgefordert wurde wenn der master den slave mit adresse xx anspricht is der rest sowieso ruhig !! lass das plug&play erstmal weg .. alles festverdrahtet mit festen adressen
Nun, bei Half-Duplex macht eine Mastersteuerung Sinn. Ist es keine Zeitkritische Anwendung so sollte der Master alles abfragen. Hier mein Tipp: Master liest und speichert diese in einer Datenbank. Durch die regelmäßige Kommunikation, entscheidet der Master anhand der ACKs ob er einen Slave wieder streicht. Durch ein "Zwischenduchscann" in einer passiven Zeitphase - kann der Master die Liste wieder vervollständigen, gegebenfalls sogar eine autm. Leitungsanpassung durchführen und so das Timming korrigieren, falls ACKs nicht zurückkommen, oder Nachrichten nicht vollständig ausgelesen werden können. Ein Zwischendurchplaudern der Slaves, kann funktionieren, ist aber reine Glückssache und je nach Anwendung höchst beeinträchtigend, um es mal so zu formulieren. Gruß
hallo community Das broatcast-thema ist mir noch nicht los. ich bin noch am Versuchen. ausserdem habe ich nebenbei eine Frage. der RS485 braucht auf dem Bus die 120 Ohm-Widerstände. ich sehe gewöhnlich , dass diese am Anfang und Ende angebracht sind. könnte es auch funktionieren wenn ich an jedem Transceiver ich 120 Ohm anbringe ? Weil jeder Teilnehmer als letzte sein kann bei der plug-and play-system. danke Jonny
>könnte es auch funktionieren wenn ich an jedem Transceiver ich 120 Ohm >anbringe ? ich denke nicht , dass es geht . die Wid müssen immer am anfang und ende sein meiner Meinung nach, um die Reflektion zu vermeiden. lg Burny
Ich hatte ein aehnliches Problem: Ziel: Slaves, die eine eindeutige alphanumerische Bezeichnung tragen, am laufenden Bus erkennen und ihnen eine 8Bit Adresse zuweisen. Ich hab dann dem Master ein spezielles Frame begebracht, das noch nicht angemeldeten Slaves einen kurzen Zeitschlitz gibt um ihre ID auf den Bus zu geben. Dazu haben sie so 20-30 Bitzeiten um ein bischen Zufall auf Basis ihrer eindeutigen ID einzubringen. Die Slaves haben einen pin change interrupt auf die rx-Leitung und bekommen so frueh mit, dass schon was auf dem Bus passiert. Dann warten sie bis zum naechsten mal. Bekommt der Master eine valide Antwort weist er dem Slave eine Adresse zu und der ist von da ab gluecklich und passiv. Der Master sendet diese Frames periodisch auf dem Bus aus. Beim Start ein bischen oefter, im Betrieb seltener. Dabei treten natuerlich eine Menge Kollisionen auf, die sind aber nicht weiter stoerend. Irgendwann ist schon jeder mal an die Reihe gekommen und der kleine Timeout, bei 115kBit keine ms, ist ebenfalls fuer einen Hausbus kein Problem. Das praktische: Ich habe keine Probleme mit doppelt vergebenen Adressen und sehe anhand der IDs auch gleich was fuer Geraete ich da am Bus habe. Gruss, Tobias
< tobias schrieb: >Ich hab dann dem Master ein spezielles Frame begebracht, das noch nicht >angemeldeten Slaves einen kurzen Zeitschlitz gibt um ihre ID auf den Bus >zu geben. hallo tobias könntest du mir ein Codeabschnitt zeigen, wo du den Master mit dem spezieller Frame beibringst. danke Jony
Karl heinz Buchegger schrieb: >Jeder Client beobachtet die gemeinsame Sendeleitung. Ist die eine >zeitlang inaktiv, dann sendet er einfach auf gut Glück: Huhu, Meister, >ich bin da! und der Meister antwortet: Sehr schön 67, und jetzt halte >die Klappe. es wird sowieso nicht gehen , das es um ein MASTER-Slaver-prinzip. was du da bescreibt Karl ist nicht korrekt. der Slave kann nur auf aufforderung der Master was auf dem Bus schicken,d.h. dieses selbständiges "Huhu ich bin da" wird auf keinen Fall funktionieren. Jonas hat sein Vorhaben genau beschrieben, und ich denke nicht das es was einfaches das man auf hopla! lösen kann , wenn diese nur Softwaremässig bei seinem Bus-physiologie zu realisieren ist. Veilleicht fällt mir später spontan was ein.
busfreak schrieb: > was du da bescreibt Karl ist nicht korrekt. der Slave kann nur auf > aufforderung der Master was auf dem Bus schicken,d.h. dieses > selbständiges "Huhu ich bin da" wird auf keinen Fall funktionieren. Wieso sollte das nicht gehen? Der Bus ist doch mehr oder weniger per software implementiert. Ok er nutzt die HW Uart. Ich kann doch einfach dem programm verklickern, wenn es noch keine id hat, dass es einfach bei inaktivem bus beim master anfragt. Wo liegt das problem? Gruß Tobi
so weit ich weiß , ist es bei RS485 kein definierter Pegel vorgegeben. das heißt der inaktiven Zustand der Bus zu bestimmen/erkennen ist machbar. Oder wenn wenn du mir sagen kann wie du dieses erkennst, wäre mal gespannt. Sonst wäre bei diese Übertragungsart die Buscollision möglich. was in der realität nicht machbar ist/ nicht zu shafen ist. lg
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.