Forum: Mikrocontroller und Digitale Elektronik AVR gcc random()


von Matthias T. (matthias_199)


Lesenswert?

Hallo meine lieben,

ich baue gerade an einem Funkprotokoll für meine RFM69 Module.
Falls der Träger gerade belegt ist soll der AVR erst nach einer 
zufälligen Zeit wieder Senden. rand() liefert Zufallswerte soweit so 
gut.

Diese sind ja nicht wirklich zufällig...

Macht aber nix sollte für diesen Zweck reichen.

Aber was ich auf keinen Fall will ist das alle AVRs mit dem gleichen 
seed rennen.

Beitrag "Random Zahl generieren"

die Funktion hat mich nicht so richtig überzeugt denn das getseed würde 
für die gleiche Software doch immer den gleichen seed berechnen ?

Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie 
einen seed generieren zu lassen jedes mal wenn er compiliert.
geht sowas ? und diese als konstante in die srand() zu füttern ?

Ich bin aber ehrlich gesagt auch für jede andere Lösung offen ohne meine 
Schaltung ändern zu müssen :) und ohne den seed manuell einzugeben :D


MFG
Matthias

von Felix U. (ubfx)


Lesenswert?

Man kann ADC-Werte von einem offenen Pin nehmen. Erfüllt sicherlich 
keine kryptografischen Ansprüche aber sorgt dafür, dass du mit an 
Sicherheit grenzender Wahrscheinlichkeit keine zwei gleichen Seeds 
kriegst.

von Hmmm (Gast)


Lesenswert?

Hast Du Eingaben, die ohne exaktes Timing stattfinden, z.B. per Taster?

Wenn ja, Timer laufenlassen und bei jedem derartigen Ereignis den Wert 
auslesen und als Seed (oder Teil davon) verwenden.

von AntiMaker (Gast)


Lesenswert?

in deiner main()-Loop ab und zu ein "rand()" ausführen.

Auch wenn alle AVRs dann mit gleichem Seed starten und die gleiche 
Zahlensequenz erzeugen, sind dann alle (laufzeitabhängig) an 
unterschiedlichen Stellen in der Sequenz, wenn es zur Kollision kommt.

von Matthias T. (matthias_199)


Lesenswert?

@Hmmm

sorry nope leider nicht ;(


@Felix U
Hast du erfahrung damit ? ich habe das bis jetzt auch nur gelesen.
Und wollte den ADC eigentlich nicht benutzen, er ist schon 
ausgeschaltet.
jede mA zählt :).

ich hab bis jetzt im Forum gelesen das,dass ohen Rauschdiode, also über 
Floating pin doch nicht so toll sein soll, deshalb auch die erste idee 
den präprozessor dafür irgendwie zu "misbrauchen"

MFG
Matthias

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


Lesenswert?

Matthias T. schrieb:
> Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie
> einen seed generieren zu lassen jedes mal wenn er compiliert.

Willst du denn für jeden beteiligten Knoten dann ein eigenes Compilat
machen?

Wenn nicht: durch irgendwas müssen sich die Knoten doch ohnehin
unterscheiden, irgendeine Knotennummer, Adresse etc.  Nimm diese doch
als seed.

Ein echtes Seed basierend auf physikalischen Effekten ist natürlich
besser, aber (sofern man nicht bereits Hardware dafür hat) auch nicht
ganz unaufwändig.  Der offene ADC-Port allein tut's in der Regel nicht,
denn der hat eine hohe Wahrscheinlichkeit, dass er gerade auf Masse
oder Vcc „klebt“.  Mit einem differenziellen und vorverstärkten
ADC-Kanal kann man das Rauschen einer Z-Diode benutzen, aber auch das
ist halt wieder Aufwand in Hardware.

von Stefan F. (Gast)


Lesenswert?

> jede mA zählt

Also nutzt du Batterien?
Dann könntest du beim Start die Bateriespannung einmalig mit dem ADC 
messen udn als seed verwenden.

> den präprozessor dafür irgendwie zu "misbrauchen"

Wie soll das helfen. Wenn ich ein Programm compiliere und dann auf 10 µC 
flashe, erhalten sie alle exakt den selben Code.

Aber da fällt mir was ein: Viele µC haben eine eindeutige Seriennummer - 
die könnte man doch nehmen.

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Messwerte oder Timestamps nehmen, dazu (wenn es geht) irgendwelche 
Seriennummern  vom µC oder anderen ICs auslesen und addieren. RFM69 
müsste auch eine Versions- und Seriennummer haben(?!).

Wenn Du das wirklich jedes mal neu kompilierst kannst Du natürlich auch 
ein Skript bauen und darin eine Zufallszahl vom Entwicklungsrechner.

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


Lesenswert?

Chris F. schrieb:
> Wenn Du das wirklich jedes mal neu kompilierst kannst Du natürlich auch
> ein Skript bauen und darin eine Zufallszahl vom Entwicklungsrechner.

Sinnvoller wäre es dann, ein Seed in den EEPROM zu schreiben.

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Matthias T. schrieb:
> Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie
> einen seed generieren zu lassen jedes mal wenn er compiliert.

Jörg W. schrieb:
> Sinnvoller wäre es dann, ein Seed in den EEPROM zu schreiben.

Ja, weil man dann auch ohne neue Software das Seed ändern könnte. Wollte 
dem TO nur bestätigen, dass es auch geht.

von Matthias T. (matthias_199)


Lesenswert?

Danke Für die Tips,manchaml sieht man den wald vor lauter bäume nicht

@chris .F

das rfm69 hat ein AFC aka Automatic Frequency Correction.
(fast besser als eine serienummer XD)

Diese wird jedes mal beim empfang eines Trägers durchgeführt.
und produziert auf jeden Fall immer eine andere zahl, bei mehren sendern 
wird die Streuung besser weil jeder quarz auf dem modul etwas anders 
tickt :)

ich werde srand einfach nach der afc mit dem wert füttern :)

MFG Matthias

: Bearbeitet durch User
von Dussel (Gast)


Lesenswert?

Jörg W. schrieb:
> Ein echtes Seed basierend auf physikalischen Effekten ist natürlich
> besser, aber (sofern man nicht bereits Hardware dafür hat) auch nicht
> ganz unaufwändig.  Der offene ADC-Port allein tut's in der Regel nicht,
> denn der hat eine hohe Wahrscheinlichkeit, dass er gerade auf Masse
> oder Vcc „klebt“.
Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit 
ziemlich gewackelt. Ich denke, damit sollte das gehen. Achtmal das 
letzte Bit gelesen gibt ein relativ zufälliges Byte.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Dussel schrieb:
> Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit
> ziemlich gewackelt. Ich denke, damit sollte das gehen. Achtmal das
> letzte Bit gelesen gibt ein relativ zufälliges Byte.

Haha, wär auch meine Idee gewesen und wollte ich gerade vorschlagen xD

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


Lesenswert?

Dussel schrieb:
> Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit
> ziemlich gewackelt.

Wenn du ein wirkliches Analogsignal dran hast, passt das.

Wenn der Pin aber vorher auf Ausgang/Low war und du schaltest ihn
auf Eingang um, dann bleibt er noch eine ganze Weile in einem Bereich,
wo auch der ADC einfach nur 0 liest.  Schließlich ist erstmal niemand
da, der die Eingangskapazität umladen würde.

Wenn er wirklich nur eine eindeutige Unterscheidung der Knoten braucht,
dann ist er mit einer manuellen Seriennummer oder Knotenadresse im
EEPROM am einfachsten bedient.

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.