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
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).
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.
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.
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
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 :-)
Wenn es egal ist, dann könntest du ja doch in der Software eine "Seriennummer" verankern, die deinen CAN-Knoten als AVR ausweist.
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.
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.
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 ...
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
Du benötigst also die ID nur zum Updaten und nicht um die Knoten im Betrieb zu unterscheiden?
@Markus K. Vielleicht beschäftigt er sich mit KI und die Module/Knoten wissen nach einiger Zeit selbst, ob sie links oder rechts sind ;-)
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.
und dann gibts ja zur Unterscheidung noch die guten alten Dip-Schalter (oder Lötbrücken), die jeweils unterschiedlich eingestellt werden können... ----, (QuadDash).
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.