Forum: Mikrocontroller und Digitale Elektronik Wie Adress-ID an Teilnehmer eines Bus-Systems vergeben?


von Alexander I. (daedalus)


Lesenswert?

Hallo zusammen,

folgender Sachverhalt: Es gibt eine Platine, die insgesamt 24 identische 
"Intelligente Einheiten" beherbergt. Eine solche Einheit besteht aus je 
einem C51-Controller, ein bisschen Analog-Gemüse drum herum, sowie je 
ein Mosfet zur Ansteuerung von weiterer (externer) Hardware. Die 24 
C51-Controller haben alle dieselbe Aufgabe, d.h. in Ihnen arbeitet auch 
dieselbe Firmware.

Auf der Platine existiert auch ein Diagnose-Bus, d.h. von außen ist jede 
Einheit unter einer bestimmten ID über UART ansprechbar und liefert dann 
Diagnose-Daten zurück.

Es gibt auch eine Broardcast-ID, mit der alle Device's gleichzeitig 
angesprochen werden können (aber nicht antworten).

Bisher wird diese ID über 5 Pins kodiert. Das Problem: Es ist nur ein 
kleiner 20-Pinner und da sind 5 Pins (2^5 = 32 mögliche Adressen) nur 
für die ID-Konfiguration schon sehr schmerzhaft.

Was fallen euch für Möglichkeiten ein, die ID zu konfigurieren ohne 24 
verschiedene Firmwares downzuloaden oder alternativ über 5 Pins zu 
konfigurieren?

Gibt es übliche Verfahren, wie man zunächst identischen Devices an einem 
Bus zur Laufzeit unterschiedliche ID's zuweist ohne das am Anfang alle 
auf einmal reagieren?

von Pandur S. (jetztnicht)


Lesenswert?

Ja. gibt es. Man kann dynamisch zur Laufzeit adressieren. Aufgrund einer 
Seriennummer und Wahrscheinlichkeiten.

sofern die Einheiten unterscheidbar sind. zB per Serienummer oder so. 
Deren Ort im Bus ist egal, resp vertauschbar ?

von Alexander I. (daedalus)


Lesenswert?

Naja, es wäre sinnvoll wenn die ID's der "Busfolge" entsprechend 
durchnummeriert wären, auf der Platine sind sie als 4x6-Array angelegt. 
Wäre daher sinnvoll wenn z.B. ID=1 immer links oben und ID=24 rechts 
unten wäre.

von Martin (Gast)


Lesenswert?

Ja, gibt es. Beispiel:
CANopen Bus Dokument "CiA301", Stichwort "Identification Object" 
(Herstellernummer, Product Code, Product Revision, Serial Number).
Darüber kann jedes Gerät eindeutig identifiziert werden und ihm 
anschliessend d.h. nach Einbau in das System eine eindeutige 
Knotennummer "Node ID" zugewiesen werden.

von Vlad T. (vlad_tepesch)


Lesenswert?

naja, statt jedem 5 pins zu spendieren, könntest du jedem einen Pin 
geben und einen weiteren Controller als master defineiren, der eine id 
auf den Bus legt und derjenige Controller diese übernimmt, dessen input 
gerade vom Master hoch/runtergezogen wird.

alternativ könntest du jedem controller einen eingang und einen Ausgang 
verpassen und sie in einer kette hintereinander hängen.
jeder controller wartet nach dem Startup auf pulse auf dem Input und 
übernimmt deren Anzahl als id.
der controller, dessen input dauerhaft auf dem entsprechenden Level ist, 
weiß er ist der erste und gibt sich die id 0. dann wackelt er einmal an 
dem Ausgang, damit der nächste weiß, er ist die eins. und so weiter.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Man hat ja quasi zwei Parteien: Einmal den "Master Controller" (Hard- 
oder Software) und andererseits die Clienten.

Ich würde das so machen:

- Master Controller per Software oder Taste in eine Art Lernmodus 
versetzen
- am Clienten eine "Paarungs-Taste" drücken (nur 1 Pin!)

Daraufhin schaut Master in seine Library nach einer bisher unbenutzten 
ID-Nummer und bringt die dem Clienten per Protokoll bei. Der speichert 
sie im Flash. Erledigt.

Will man den Flash am Clienten sparen, so compiliert man in die Firmware 
jedes Clienten eine ID (Zufallszahl?). Beim "Paaren" teilt der Client 
diese dem Master mit und der merkt sie sich. Es sollte möglich sein, 
beim "Brennen" der Clients einen reservierten Bereich der Hexdatei zu 
patchen .. oder?

Ein serielles EEPROM wäre als ID-Träger auch denkbar, kostet aber 
zusätzlich Platz und Geld.

von ArminD (Gast)


Lesenswert?

Verwendung von vier Trinärpins:

3^4 = 81 Adressen (wie die Lokdecoder beim alten Märklin-Digitalsystem).
Eingange entweder offen, nach oben über Pullup oder oder nach unten über 
Pulldown.
Firmware prüft ob sie den Pin nach oben, nach unten oder in beide 
Richtungen ziehen kann und ermittelt daraus eine Adresse.

Also ein Pin weniger, dafür mehr Adressen.

von Alexander I. (daedalus)


Lesenswert?

Der Vorschlag von Vlad gefällt mir gut, das könnte man ja leicht 
umsetzen.

Mir ist gerade noch eine Idee eingefallen:
Der C51 hat einen ADC. Man könnte doch messen und über 24 
unterschiedliche Widerstandswerte (=gemessene Analogspannung) kodieren?

von PIC4ever (Gast)


Lesenswert?

- Versehe alle Slaves mit einem Schalteingang.

- Sobald zwei Schalteingänge gleichzeitig für mindestens eine Sekunde 
betätigt sind, schaltet der Master in einen Parametrierungsmodus.

- Jetzt müssen die Schalteingänge im Abstand von max. 5 Sekunden für 
jeweils mindestens 0,2 Sekunden betätigt werden. Der erste Slave bekommt 
dabei die Adresse 1 vom Master zugewiesen, der zweite Slave die Adresse 
2, usw.

- Wenn der Schalteingang des 24. Slaves (bzw. letzten Slaves) betätigt 
wurde, bist Du mit der Parametrierung fertig. Nach den eingestellten 5 
Sekunden läuft das System vom Master aus selbstständig mit den 
parametrierten Adressen an. Jeder Slave benötigt dazu nur eine 
Portleitung.

von Vlad T. (vlad_tepesch)


Lesenswert?

Alexander I. schrieb:
> Der Vorschlag von Vlad gefällt mir gut, das könnte man ja leicht
> umsetzen.

was mir daran aber noch nicht gefällt:
man hat da einen weiteren Bus in Daisy-Chain topologie geschaffen, der 
nach dem Init brach liegt.

Alexander I. schrieb:
> Mir ist gerade noch eine Idee eingefallen:
> Der C51 hat einen ADC. Man könnte doch messen und über 24
> unterschiedliche Widerstandswerte (=gemessene Analogspannung) kodieren?

die Idee kam mir auch, als ich den Beitrag davor gelesen habe. Du 
brauchst dann halt an jedem µC einen Spannungsteiler aus zwei 
Widerständen.

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.