Wie Adress-ID an Teilnehmer eines Bus-Systems vergeben?

#4028550
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?
#4028564
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.
(Firma: Q3) #4028579
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.
Gast #4028588
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.
Gast #4028610
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.
#4028612
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren