Forum: Mikrocontroller und Digitale Elektronik Zufall


von Poseidonius (Gast)


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

von Alex (Gast)


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).

von Poseidonius (Gast)


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.

von inoffizieller WM-Rahul (Gast)


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.

von Markus K. (markus-)


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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Und die Nummer muß man den Dingern ja nur beim ersten Programmieren
einmalig verpassen.

von Poseidonius (Gast)


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 :-)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Wenn es egal ist, dann könntest du ja doch in der Software eine
"Seriennummer" verankern, die deinen CAN-Knoten als AVR ausweist.

von Christian (Gast)


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.

von Thomas (Gast)


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.

von Poseidonius (Gast)


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 ...

von Markus K. (markus-)


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

von Chief Brady (Gast)


Lesenswert?

Du benötigst also die ID nur zum Updaten und nicht um die Knoten im
Betrieb zu unterscheiden?

von Chief Brady (Gast)


Lesenswert?

@Markus K.
Vielleicht beschäftigt er sich mit KI und die Module/Knoten wissen nach
einiger Zeit selbst, ob sie links oder rechts sind ;-)

von Thomas (Gast)


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.

von ---- (Gast)


Lesenswert?

und dann gibts ja zur Unterscheidung noch die guten alten Dip-Schalter
(oder Lötbrücken), die jeweils unterschiedlich eingestellt werden
können...

----, (QuadDash).

von Poseidonius (Gast)


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

von Frank E. (erdi-soft)


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.

von kosmonaut pirx (Gast)


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

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.