www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zufall


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus K. (markus-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Markus K. (markus-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chief Brady (Gast)
Datum:

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

Autor: Chief Brady (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.