PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS485 - Automatische Addressierung



Piconet
08.08.2005, 14:11
Hallo! hat jemand Erfarung mit dem Bussystem. Also Ein Master und mehrere Slave mit 2 Leitungen also RS485, die Slaves sollen selbst adressiert werden. Ich habe mir so gedacht, dass ich per SW ein zufallsgenerator zu schreiben, der ein zufällige Zahl zum Master schickt, und Master nimmt diese Zahl und gibt eine Addresse zurück so in dieser Richtung,hat jemand anderen Vorschlag? oder hat jemand so was gemacht? (Erläuterung: ich habe mehere Slave, sie sind alle gleich, und ich möchte nicht einzeln adressieren, also der Master übernimmt automatische Addressierung ) :-$

Thorsten
08.08.2005, 15:14
Hi,

Ich versteh nicht ganz wofür du die Zufallszahl
brauchst.

Ich würd einfach einen bestimmten Befehl definieren, der vom slave an den Master gesendet wird und der Master sendet dann eine Adresse an den Slave. Der Master muss sich dann nur merken, welche adressen er ergeben hat. Er sollte dann hin und wieder überprüfen ob der Slave noch da ist, und wenn nicht die Adresse wieder als frei markieren.

Das wär so meine Vorgehensweise, aber ich hab noch nie was mit rs485 gemacht, wiess nicht ob es da noch andere Probleme gibt.


mfg
Thorsten

Piconet
08.08.2005, 15:34
Hi Thorsten!
das Problem liegt darin, dass 2 oder mehrere Slaves auf keinen Fall zusammen gleiche Adresse haben zu dürfen, (Bus konflikt), und 2 slaves dürfen nicht gleichzeitig aktiv werden (kurzschluss gefahr).

Thorsten
08.08.2005, 16:29
Hi Piconet,

Das zwei Slaves die gleiche Adresse bekommen, kannst du verhindern indem der Master sich die vergebenen Adressen merkt.
Verhindern dass zwei Slaves niemals zur gleichen Zeit senden ist schon schwieriger. Werden alle Slaves zur gleichen Zeit eingeschaltet?
Dann kannst du per zufallsgenerator jeden zu einer anderen Zeit die Anfrage schicken lassen. Aber 100% sicher ist das auch nicht.

mfg
Thorsten

Piconet
09.08.2005, 11:33
Hi!
also mehr Erläuterung! Ich habe n Module, stellen wir vor sie sind alle geleich.
und sie sind alle an einen RS485 angeschlossen. Jedes Modul besitzt
einen Mikrokontroller ATmega128. so dann geht jetzt los, man schliesst
der PC durch RS232 an einer von n Module. Dieser wird als Master definiert.
Dieses Modul (als Master) fragt erstmal nach adresse der Slaves.
Die Slaves schicken eine beliebige Adresse, diese Adresse wird im Master gespeichert,
und Master schick eine gültige Adresse zum Slave, diese Adresse gilt als gültige
Adresse. und läuft weiter bis alle Slave adressiert werden.
-
1- wenn man als Master befehl schickt und fordert, dass die Slave
eine beliebige Zahl(adresse) schicken soll, welcher von Slaves muss als erstes aktiv und welche
inaktiv werden müssen.(Maßnahme gegen zusammenaktivierung der Slaves) ](*,)

Thorsten
09.08.2005, 12:49
Hi,
wenn alles Slaves gleich sind werden auch alle zur gleichen Zeit antworten :-). Bei Ethernet wird IMO aus der MAC eine Zeit berechnet. Nach einer Kollision warten alle beteiligten ihre Zeit ab und antworten erst dann. Da jede mac weltweit nur einmal vergeben wurde kommt es dann zu keiner kollision.
Aber wenn du erst unterschiedliche macs in die Slaves programmieren musst kannst du auch gleich Slave Adressen Programmieren ](*,)

Ich würde die Slaves einfach eine zufällige Zeit warten lassen bis sie an den Master antworten. Wenn in dieser Zeit ein anderer Slave aktiv wird muss der mit der längeren Zeit halt warten.

Allerdings kannn dabei auch eine kollision auftreten wenn zufällig zwei Slaves die gleiche Zeit wählen ( passiert genau dann wenn du das Ding deinem Chef vorführst).

Darf bei rs485 keine Kollision auftreten weil dann Bus kaputt, oder nur weil dann Daten kaputt? Im zweiten Fall müsste man nur die Kollision erkennen, und die Slaves wieder eine zufällige Zeit warten lassen. Der schnellere gewinnt dann. Werd mir mal bei Gelegenheit den Bus anschauen, das Projekt wird mitlerweile Recht interessant (Auch für andere Protokolle wie I²C).

mfg
Thorsten

SprinterSB
11.08.2005, 00:34
Für I²C hätt ich eine Idee, vielleicht kann man die ja aufs RS485 übertragen?

Der Master (Chef) sendet einen General Call (GCALL).
Der Chef wird zum Slave.
Nach dem GCALL bestimmt jeder Slave eine Zufallszahl Z (zB aus uninitialisiertem RAM-Inhalt).
Der Slave wird zum Master und versucht, Z an den Chef zu senden.
Verliert er die Arbitration, wartet er bis der Bus frei ist und geht zurück zu 4.
Kommt der Slave (momentan ein Master) zum Chef (momentan Slave) durch, bekommt er eine Adresse A vom Master zugewiesen.
Wenn alle Slaves zum Master durchgekommen sind, ist man fertig.
Falls sich scheinbar weniger als die vorhandenen N Slaves (Chef muß N kennen) gemeldet haben, dann haben 2 oder mehr Slaves genau das selbe Z geschickt, ohne daß einer die Arbitration verloren hat.
Das ist möglich, wenn beide (oder mehrere) zur gleichen Zeit die gleichen Daten mit der selben Geschwindigkeit schicken.
Durch Vergrößern von Z kann man die Wahrscheinlichkeit dafür aber beliebig klein machen. Tritt dieser Fall auf (kann man wohl nur über einen Timeout erkennen), dann startet das ganze von vorne bei 1.

Piconet
11.08.2005, 13:04
Hallo Thorsten!
ich habe eine Lösung gefunden:
1- nehme ich ATmega128 mit 2 USART
2- überprufe ob ein Signel gekommen ist
3- von welcher Seite ( RS232 oder RS485)
4 -Wenn von RS232 gekommen ist dann:
4.1- Wird als Master erkannt
4.2- setze Umschalter RS485 vomMaster auf 1, d.h. SENDEN
4.2- Abfrage nach der Slaves-Adresse
4.3- Anwort?
4.4- nein, warte auf die Antwort
4.4-ja, die Zahl wird gespeichert, und vergliechen
4.5- die Zahl vorhanden
4.6- ja, Zahl löschen, springr zu 4.2
4.6- nein schicke bestätiging zum Slave

5- Wenn von RS485 gekommen ist dann:
5.1- setze Umschalter RS485 vom Slave auf 0, d.h. EMPFANGEN
5.2- finde eine Zahl zwischen 01 bis 255, ( 00 ist breits Master)
5.3- Multipliziere Zahl mit ms
5.4- ist die Zeit vorbei?
5.5- nein, springe zu 5.4
5.5- ja, schicke die Zahl als Adresse zum Master, setze Umschalter auf 1
5.6- Umschalter zurück setzen-
5.7- Bestätigung?
5.8- nein, ende , nix
5.9- ja, die Adresse ist gültig
///////////////////////////////////////////////////////////////////////////////

für den Fall, dass zwei Slave nicht gleichzeitig was los schicken, wird eine Pausezeit dazwischen vor gesehen , d.h, ganze routine dauert z.B 4ms
dann wird nur die Zahlen, die abstand 4 haben angenommen, z.B 4, 8, 12,...
das ist meine Idee, kannst du bei programmieren helfen?