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