Zufall

Gast #362870
Lesenswert?
• ▲
▼
Hi,

gibt es eine Möglichkeit einen AVR aus einer Gruppe heraus zu
identifizieren oder durch entsprechende Hardware nachzuhelfen? Anders
fomuliert, wie kriege ich heraus wieviele Mikrocontroller in meinem CAN
Netz hängen ...

Eine Idee wäre, das alle auf einen Broadcast mit einer ausgehend vom
Timer berechneten zufälligen ID antworten ...

Gibts was besseres, Chip IDs oder ähnliches?

Freue mich auf Eure Anmerkungen
Gast #362871
Lesenswert?
• ▲
▼
Allein schon um Kollisionen aus dem Weg zu gehen hat bei mir jeder
Teilnehmer am Bus seine eigene ID.

Für den Fall einer 29-Bit ID sind ja genug Bits da.

z.B.

Bit 0:7: eindeutige Kennung des AVRs (steht als Konstante in dessen
Programmcode, ermöglicht 256 Teilnehmer)

Bit 8:28: Kennung für Frame-Inhalt, anhand derer an den Bus
angeschlossene Geräte erkennen, ob der Inhalt für sie interessant ist

Gleichzeitig kann man sich auf diese Weise Subnetze schaffen, so dass
durch Hilfe der Acceptance-Mask jeder Teilnehmer gleich nur die Frames
einsammelt, die ihn interessieren (entlastet den Controller).
Gast #362872
Lesenswert?
• ▲
▼
Vielleicht muss ich mein Problem etwas genauer beschreiben ... an meinem
Roboter sind mehrere gleichartige Antriebseinheiten montiert. Um nun
nicht nach jeder Programmodifikation alle nacheinander neu flashen zu
müssen, möchte ich das gern über den ohnehin vorhandenen CAN Bus
abwickeln. Da alle AVRs den selben Programmcode tragen fallen die im
Code hinterlegten IDs aus ...

Ich muss also irgendwie dynamisch eine eindeutige ID aushandeln. Dies
koennte dann so geschehen, dass ich zunaechst eine Message an alle
schicke, um die Knoten aufzufordern mir mit einer zufälligen? ID zu
antworten.
Gast #362873
Lesenswert?
• ▲
▼
Könntest du nicht die IDs ins EEPROM schreiben?
Wenn du sie vorher ausliest, weißt du, welche AVR sich "im Kreis"
befinden.
>aufzufordern mir mit einer zufälligen? ID zu
>antworten.

Und wie findest du dann heraus, welcher wer ist?
Die Knoten müssen doch vorher wissen, wer sie sind, oder machen die
immer das gleiche? Auch um sie zu steuern, mußt du doch wissen, wer wer
ist.
#362874
Lesenswert?
• ▲
▼
Die AVRs haben keine Seriennummer, Du müsstest also extra Chips dafür
einsetzen. Die 1wire-Chips von Dallas (z.B. Thermometer) haben alle
eine eindeutige Seriennummer. Andererseites: Wenn Du sowieso spezielle
Chips dafür nimmst, dann kannst Du natürlich auch EEPROMs nehmen, das
ist billiger. Oder gleich den AVRs beim programmieren eine Seriennummer
verpassen, die haben ja auch ein internes EEPROM.

Markus
Gast #362876
Lesenswert?
• ▲
▼
an Rahul: ja alle Antriebsmodule machen das gleiche
an Markus: mmmm das mit dem EEPROM gefiel mir als Lösung nicht so
richtig, weil dann jeder AVR erst noch "präpariert" werden muss ...
ich weiss, so ein richtiges Argument ist das nicht :-)
Gast #362878
Lesenswert?
• ▲
▼
Die 1-Wire-Chips, von denen Markus schrieb, gibt's auch ohne weitere
Funktionen, nur als elektronische Seriennummer, z.B. DS2401 und DS2411.
Sind teurer als EEPROM, müssen dafür aber nicht programmiert werden, da
sie mit einer garantiert einmaligen Seriennummer im ROM geliefert
werden.
Gast #362879
Lesenswert?
• ▲
▼
Hallo,

"ja alle Antriebsmodule machen das gleiche"

Es klingt zwar nach semantischer Spitzfindigkeit, aber: machen die nur
das "gleiche" oder wirklich das "selbe".

Die einzelnen Module, die das gleiche tun, müssen doch trotzdem von
einander unterscheidbar sein? Ich sehe nicht, wie du das mit zufälligen
IDs machen willst.
Gast #362880
Lesenswert?
• ▲
▼
oh je, wie kann man den Unterschied zwischen das gleiche und das selbe
genau definieren? ... es soll eine einheitliche Software laufen, mit
der jeder Knoten seine Sache tut ...

Na ich dachte mir das so, dass sich alle im Bootmodus nach einem
Anfangssignal eine "zufällige" ID geben und einen Frame senden ...
#362881
Lesenswert?
• ▲
▼
Was Thomas und Rahul meinen:
Wenn Du immer alle Motoren gleich stark (und in die gleiche Richtung)
ansteuern willst, dann kannst Du zufällige IDs vergeben. Willst Du
dagegen z.B. die rechten Räder schneller als die linken Räder drehen
lassen um damit eine Kurve zu fahren, dann geht das nicht mehr. Woher
soll der Master denn wissen, was links oder rechts ist?

Markus
Gast #362884
Lesenswert?
• ▲
▼
Na zwei Dinge können gleich sein, aber nicht das selbe...

Oder anders, zwei Antriebseinheiten können das gleiche tun ("einen
Arm bewegen") aber nicht das selbe (unterschiedliche Arme). Und
spätestens da musst du die Geräte doch ohnehin unterscheiden und
identifizieren können?!

Bislang wird mir nicht klar, wie du diese Unterscheidung triffst.
Gast #362886
Lesenswert?
• ▲
▼
Die Antriebe tuen das selbe ... ;-) Danke

Die IDs sind nur für das flashen nötig.

Ich möchte das Tool ein wenig universeller Nutzen als auf eine
spezielle Hardware zugeschnitten ... nur so eine Idee
#362887
Lesenswert?
• ▲
▼
Wenn du die per CAN programmieren willst, brauchst du ja sowieso nen
Bootloader. Also kannst du jedem AVR im Bootloader ne Seriennummer
mitgeben, die diesen eindeutig und (zumindest per CAN) unlöschbar zu
identifizieren.
Hieße zwar, jedem AVR nen geringfügig modifizierten Bootloader zu
verpassen, sollte aber keine Probleme machen.
Gast #362888
Lesenswert?
• ▲
▼
Moin,
ich habe dem guten Poseidonius dieses problem im rl geschildert, und
wurde immer fleißig über die vorschläge hier unterrichtet. eeprom wäre
eine idee, skaliert aber imo ebenso wie eigene codes für jede mcu eher
schlecht mit der größe des netzes.
nach einigem grübeln bin ich auf folgenden ablauf gekommen:
1. der host sendet an alle nodes einen id-request
2. alle nodes antworten. da gebroadcastet wird, können alle mitlauschen
und fremde (!) broadcasts zählen.
3. der host zählt ebenfalls und verschickt (irgendwann) seinen zähler.

4. jeder node vergleicht den empfangenen zähler mit seinem eigenem + 1
(seinem transmit). gabs irgendwo (leider unbestimmt) probleme, äußerst
sich das in einer differenz. dann müsste eine neuwahl erfolgen.
ansonsten waren alle (zufällig oder wie auch immer) gewählten
identifier ok.

das ganze setzt voraus, das nur fremde Broadcasts gezählt werden. Nun
meine Frage: ist das im CAN gegeben?

Vielen Dank , auch für die bisherigen Ideen,
bye kosmo

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.