Forum: Mikrocontroller und Digitale Elektronik Zufallszahl bei Start des Mikrocontrollers


von FloJ (Gast)


Lesenswert?

Hallo Leute,

ich habe einen Slave-Mikrocontroller der mit einem Master-Controller 
über CAN kommuniziert. Beim Start des Slave-Mikrocontrollers soll eine 
WakeUp Message versendet werden mit einer zufälligen ID welche sich wie 
folgt berechnet: 0x660 + Zufallszahl (0-31).
Die Zufallszahl soll bei jedem Neustart des Controllers anders sein.

Aktuell verwende ich folgendes:
1
// Set Random Wakeup-ID
2
m_random = xorshift8();
3
srand(m_random);
4
WAKEUP_ID = STARTDEFID + (rand() % 31);

Ist ja egtl. auch verständlich damit ich immer die gleiche Zahl erhalte, 
da die Base immer die gleiche ist oder?
Hintegrund ist dieser, es sollen mehrere Slave-Controller starten können 
ohne die gleiche ID zu besitzen. (PIC18F45K80)

Weiterhin wollte ich fragen ob sich jemand mit dynamischen Masken und 
Filtern, welche sich abhängig von der eigenen zugewiesenen ID ändern 
auskennt.

MFG

Flo

von Ulrich F. (Gast)


Lesenswert?

Also, erstens ist für mich eine ID eine ID.
Eine unverwechselbare eindeutige Erkennung.

Vielleicht konfigurierbar, aber dann ist auch gut.


Wenn dein PIC einen ungenutzten ADC hat, könntest du diesen ein paar mal 
auslesen. Und aus dem jeweils letzten Bit, deinen Seed zusammenstoppeln.


--------

Wie auch immer, ich habe kein Ahnung von PICs, aber das hört sich alles 
falsch an.

von Max M. (jens2001)


Lesenswert?

Wüsste jetzt wie ein MC-Program aus sich selbst heraus 
(Pseudo)Zufallszeiten erzeugen kann.

Eine möglichkeit wäre bei der Initialisierung am CAN-BUS auf 
irgendwelche Signale zu lauschen und dabei einen Timer mitlaufen 
zulassen. Den Timer könnte man dann (beschnitten auf gewüchte Anzahl 
Bits) als ID nehmen oder als Startwert für die Zufalszahlenerzeugung

Alternativ könne man an einen freien Pin eine R/C-Kombination hängen die 
beim Start umgeladen wird und diese Zeit timen. Die Bauteil-, 
Thermische- u. Versorgungsspannungsschwankungen sollten ausreichen das 
der Wert ausreichend streut.

Oder an einem freien A/D-Wandler ein Temperaturabhängiges Bauteil...

"Echter" Zufall lässt sich nur in Hardware erzeugen.

P.S. Bei einem ID-Bereich von nur 1-31 seh ich allerdings die Gefahr von 
häufigen ID-Kollisionen.
Du brauchst also auch dringend eine Kollisionserkennung.

P.P.S.
Ausserdem widerspricht dein Vorhaben der Philosophie des CAN-Bus.
Beim CAN-BUS werden Messages autentifiziert, keine ICs.

: Bearbeitet durch User
von Felix A. (madifaxle)


Lesenswert?

Was auch geht, ist ein Spannungsteiler (2 * z.B. 10 MegOhm), mittig 
daran angeschlossen eine elektrisch leitende Fläche mit vielleicht 1 
cm^2 und dann ebenfalls an den ADC. Sollte durch externe Felder auch 
zufällig sein.

Allerdings gebe ich meinem Vorposter auch recht darin, dass man dadurch 
ID-Kollisionen erhält. Vielleicht einen kleinen Baustein mit einer 
einzigartigen ID nutzen? Sind nicht teuer gewesen soweit ich weiß.

von Michael B. (laberkopp)


Lesenswert?

FloJ schrieb:
> Hintegrund ist dieser, es sollen mehrere Slave-Controller starten können
> ohne die gleiche ID zu besitzen. (PIC18F45K80)

Ist doch Unsinn: Bei nur 32 Adressen kommt es ganz schnell zu zufällig 2 
mal derselben Zahl.

Wenn es wenigstens 64 bit wären...

Immerhin hat auch ein PIC18F45 ein EEPROM, kann also eine Zahl 
speichern. Beim nächsten Start kann er per PRNG eine andere nehmen. Das 
wäre aber blöd, weil das dann vielleicht dieselbe ist, die sich ein 
anderer uC ausdenkt. Das Verfahren ist also Scheisse.

Nehmen wir an, jeder uC lauscht immer am Bus, und registriert, mit 
welchen Nummern sich andere uC anmelden, und sucht sich dadurch eine 
Nummer, die bisher nicht verwendet wird. Dann hast du ein anderes 
Problem: Alle uC müssen unterschiedlich lange warten, bis sie versuchen, 
ihre Nummer mitzuteilen. DAS wiederum kann man per fester aber 
individueller Konstante machen, also eine 16 bit Zahl und der uC wartet 
so viele Takte nach dem Anlegen der Spannung bevor er versucht, sich mit 
seiner dann noch freuen Nummer zu registrieren. Aber wenn er sowieso 
eine feste aber individuelle Nummer hat, dann nimm doch einfach die, und 
erweitere im Protokoll die Zahl auf 16 bit.

von Karl H. (kbuchegg)


Lesenswert?

CAN Bus?

Dann lass deinen Slave einen Broadcast verschicken, mit der er eine ID 
anfordert, die er ebenfalls bei Broadcast zugestellt kriegt.
Während der Mechanismus läuft, darf kein anderer Slave eine ID 
anfordern. Sollte das doch der Fall sein (weil ein Slave noch nicht 
mitgekriegt hat, dass gerade eine ID Vergabe läuft), gibt der Master 
eine Cancel Broadcast raus und alle Slaves, die noch keine ID haben, 
müssen noch mal neu anfordern.

Mit Zufallszahlen kannst du hier sowieso nichts anfangen. Du müsstest 
dich genauso um Kollisionen kümmern. Da kannst du es auch gleich lassen 
und die ID Vergabe zentral machen und dir was überlegen, wie du 
Kollisionen bei der Vergabe bereinigst.

: Bearbeitet durch User
von Felix A. (madifaxle)


Lesenswert?

Hier mal ein Link zu solchen Unique ID Chips. Kosten dort kaum 35 Cent.

http://www.microchip.com/UniqueIDEEPROMAd4161393

Gibt es bestimmt auch bei verschiedenen Distris für privat.

Der hier ist übrigens mit SPI ausgestattet:

http://www.microchip.com/wwwproducts/Devices.aspx?product=25AA02UID

P. S.: Reichelt hat die für knapp 60 Cent.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Eine zuverlässige Methode ist, man schließt die Slaves zuerst 
nacheinander an und der Master weist jedem neu erkannten eine ID zu, die 
dieser in seinem EEPROM speichert.

von FloJ (Gast)


Lesenswert?

Hi,

danke für die Antworten!

Ich weiß es hört sich dämlich an mit der CAN-Bus und den ID´s etc. es 
funktioniert aber. Und daran kann ich nichts ändern ist von einer 
anderen Firma die den Master-Controller entwickelt so vorgegeben. 
Nochmals die Vorgehensweise detaillierter:

1. Slave startet
2. Slave sendet WakeUp Message
3. Master weißt eine logische Adresse zu, aus welcher sich die 
Nachrichten Identifier der Slaves errechnen.
4. Slave nimmt die Adresse an und weißt den Telegrammen entsprechende 
IDS zu.
5. Master sendet Nachricht für den start der zyklischen Kommunikation
6. Slave legt los und sendet zyklische Daten...

... das funktioniert alles soweit nur eben mit immer der gleichen 
wake-Up ID, das werde ich aber mal mit dem ADC-Versuchen.

Dann zu der Filterung:

Es ist so der Master sendet die Steuerbefehle immer mit der ID 0x020. 
Das funktioniert auch alles soweit, jedoch wird die Zeit (4-Byte) 
abhängig von der zugewiesenen logischen Netzwerkadresse versendet 
(versteh ich selber nicht warum), sozusagen bekommt jeder Teilnehmer die 
Zeit mit persönlichem Identifier geliefert.

Wenn die Zeit zentral mit kp 0x030 gesendet werden würde wärs kein 
Problem, aber da muss ich glaube ich nochmal mit der anderen Firma 
reden.

Auf jeden!

Vielen Dank für eure bisherigen Antworten!

MFG

Flo

von Karl H. (kbuchegg)


Lesenswert?

Ganz abgesehen davon.
Was passiert denn mit dieser ID weiter?

Meistens wird die ja in irgendeiner Form benutzt, so dass man wissen 
sollte welche ID zu welchem Gerät gehört. Schon alleine deshalb sind 
ständig wechselnde ID nicht so prickelnd.

von Temperateurier (Gast)


Lesenswert?

Ich kenn mich mit PICs jetzt nicht aus,
aber manche µCs haben doch eh einmalige Seriennummern in einem festen 
Register stehen. Aus der kann man sich ja ne Adresse basteln, die immer 
einmalig ist.
Vlt. hat der PIC auch sowas.

mfg.

von Ich (Gast)


Lesenswert?

Aus einem Paper, es ging um Temperatursensoren am CAN:
"Data is sent using two CAN bus controller mailboxes, one acting as a 
transmit mailbox, the other as a receive mailbox. Commands are uniquely 
defined by their CAN bus address contained in each datagram's header. 
All datagrams transfer one 32 bit address word and one 32 bit wide data 
word.

The enumeration scheme takes advantage of the inherent medium access 
control of the CAN bus which guarantees collision-free communication and
allows each slave node to detect successful datagram transmission. The 
sensor network is initialized by the bus master by issuing a RESET 
datagram which will set all slaves to an uninitialized state. Thereafter 
the master sends out FIND datagrams and listens for SENDID datagrams, 
containing the node ID, sent simultaneously by all slave nodes in reply. 
On successful transmission of their ID slave nodes will enter the 
initialized state and in turn ignore SENDID datagrams unless reset. The 
master continues sending FIND datagrams and adding slave nodes to its 
slave node table until all slave nodes are initialized and no further
SENDID datagrams are received.

For further configuration and measurements the master sets the address 
word of the datagram to the desired slave ID and sends up to 32 bits of 
data. Initialized slave nodes act upon the received datagrams, issuing a 
reply datagram containing node ID and data value if required. Additional 
datagrams for triggering, of measurements, transferring measurement 
results and configuration have been defined."

von Karl H. (kbuchegg)


Lesenswert?

Ich schrieb:


> the master sends out FIND datagrams and listens for SENDID datagrams,
> containing the node ID, sent simultaneously by all slave nodes in reply.

Das setzt aber vorraus, dass jeder Slave schon eine eindeutige ID hat.

Was auch logisch ist, denn woher will man denn nachher wissen, welcher 
Sensor zb der im Schlafzimmer ist.

Die Methode in diesem Paper beschreibt eine Lösung für die 
Problemstellung: Wie kriegt der Master raus, welche Sensoren vorhanden 
sind, ohne den kompletten Adressraum von 32 Bit Adressen abklappern zu 
müssen und bei jeder einzelnen Adresse die Frage zu stellen "Ist da 
jemand?"

Was mit 32 Bit Adressen nicht mehr geht, ist mit lediglich 32 möglichen 
Adressen kein Problem. Die kann man einzeln durchgehen und abfragen. Das 
ist zeitlich noch kein Fiasko.

Aber: in beiden Fällen müssen die Sensoren (oder Slaves) fixe Adressen 
haben.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> Wüsste jetzt wie ein MC-Program aus sich selbst heraus
> (Pseudo)Zufallszeiten erzeugen kann.

Echter Zufall geht nur über physikalische Effekte, die auch wirklich
zufällig sind (Rauschen, der berühmte Abstand von Tastenanschlägen
etc.).

von Max M. (jens2001)


Lesenswert?

Jörg W. schrieb:
> Max M. schrieb:
>> Wüsste jetzt wie ein MC-Program aus sich selbst heraus
>> (Pseudo)Zufallszeiten erzeugen kann.
>
> Echter Zufall geht nur über physikalische Effekte, die auch wirklich
> zufällig sind (Rauschen, der berühmte Abstand von Tastenanschlägen
> etc.).

Sorry!!! Da fehlt ein "nicht"!

Sollte heissen:
Wüsste jetzt NICHT wie ein MC-Program aus sich selbst 
heraus(Pseudo)Zufallszeiten erzeugen kann.

Sorry!!!

Hatte das auch weiter unten so geschrieben

Max M. schrieb:
> "Echter" Zufall lässt sich nur in Hardware erzeugen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> Da fehlt ein "nicht"!

Das hatte mein Gehirn bereits automatisch eingefügt. :-)

von FloJ (Gast)


Lesenswert?

Hey,

der Master kann die angeschlossenen Geräte anhand einer festen 
MAC-Adresse, die er über CAN abfragen kann zuordnen. Er sendet ein 
Telegramm wobei im ersten Datenbyte die zugewiesene logische 
Netwerkadresse steht z.b. 0x19, der Teilnehmer mit der zugewiesenen 
Adresse 0x19 weiß jetzt ok ich muss meine MAC senden und tut das dann!

mfg

flo

von Karl H. (kbuchegg)


Lesenswert?

FloJ schrieb:

> Er sendet ein
> Telegramm

Er sendet ein Telegram an wen?

> wobei im ersten Datenbyte die zugewiesene logische
> Netwerkadresse steht z.b. 0x19, der Teilnehmer mit der zugewiesenen
> Adresse 0x19 weiß jetzt ok ich muss meine MAC senden und tut das dann!
>

Du hast doch hier ein 'Henne - Ei' Problem!

Anders rum wird ein Schuh daraus.
Der Teilnehmer sendet eine Nachricht: Hallo, ich bin der so und so (MAC 
Adresse) und ich bräucht eine ID.
Der Master antwortet: Ok lieber so und so (MAC Adresse), hier ist deine 
ID, mit der ich dich in Zukunft ansprechen werde.
Da ein Teilnehmer bis zur Vergabe seiner ID noch nicht weiss, welche 
Messages für ihn sind und welche nicht, filtert er die nicht aus, 
sondern wartet bis er eine ID-OK Message sieht. Die sieht er sich an, 
wenn die darin enthaltene MAC-Adresse seine eigene ist, dann übernimmt 
er die ID aus dieser Message ansonsten verwirft er die Msg und wartet 
weiter.

Niemand braucht dazu Zufallszahlen.

: Bearbeitet durch User
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.