Forum: Mikrocontroller und Digitale Elektronik broadcast auf RS485 bus(Abfrage alle Slave adresse)


von Jonas Henrich (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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

von Jonas Henrich (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jonas (Gast)


Lesenswert?

Hat keiner eine Idee?

von holger (Gast)


Lesenswert?

>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,

von Jonas (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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.

von gast (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>sozusagen plug&play

plugn&pray

von Jonas (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jonas (Gast)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

>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

von Tobi W. (todward)


Lesenswert?

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

von gast (Gast)


Lesenswert?

warum unnötigen kram mitziehen
wenn was aufm bus passiert erfahren es doch eh alle teilnehmer
weil dort bits wackeln

von Tobi W. (todward)


Lesenswert?

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

von gast (Gast)


Lesenswert?

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

von BEN (Gast)


Lesenswert?

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ß

von Jonas (Gast)


Lesenswert?

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

von burny (Gast)


Lesenswert?

>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

von Tobias (Gast)


Lesenswert?

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

von burny (Gast)


Lesenswert?

< 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

von busfreak (Gast)


Lesenswert?

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.

von Tobi W. (todward)


Lesenswert?

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

von busfreak (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.