Forum: Mikrocontroller und Digitale Elektronik AVR gcc random()


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Matthias T. (matthias_199)


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


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


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


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


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


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


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


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


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


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


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


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


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


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

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]
  • [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.