PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit RND Befehl eine wirkliche Zufallszahl erzeugen?



Dane
27.08.2006, 20:32
Hallo,

ich bräuchte für eine Schaltung eine Zufallszahl, die aber schon ab Power-on-Reset wirklich zufällig sein soll.
Das Problem beim RND-Befehl ist ja, dass er immer die selben Zahlen liefert, wenn der selbe SEED-Startwert verwendet wird.
Wenn ich jetzt einen Timerwert verwenden würde, wären es ja wieder die selben Zahlenfolgen.

Ich hab mit der Forum-Suche was von einem Rauschgenerator oder zwischenspeicherin im EEPROM gelesen, das ist mir aber zu aufwändig bzw. zu epromvernichtend.

Meine Idee: einen ADC-Port "in der Luft" hängen lassen und den ermittelten Wert als Startwert verwenden.

Würde das funktionieren oder sind die Ports dafür zu niederohmig, wenn sie als ADC arbeiten?

Oder einfach einen Digitalport ohne Pullup in der Luft hängen lassen und jedes mal wenn er high ist, eine Variable hochzählen und diesen Wert dann verwenden.

Was haltet Ihr von meinen zwei Vorschlägen?

MfG, Dane

Hanni
27.08.2006, 21:54
Das Problem beim RND-Befehl ist ja, dass er immer die selben Zahlen liefert, wenn der selbe SEED-Startwert verwendet wird.


Nimm halt den Inhalt des nicht Initialisierten RAM's als SEED
Der ist übrigens jedesmal verschieden.

Dane
28.08.2006, 21:14
Hallo,

das hört sich interessant an.

Kannst Du mir auch mit einem Beispielcode weiterhelfen?
Das wär super!

greetz, Dane

Hanni
28.08.2006, 21:40
Hmm, schau mal in der Bascom Doku nach ... oder hier im Wiki.

Grüße,
da Hanni.

Dane
29.08.2006, 18:27
Hallo,

im Wiki hab ich leider nix gefunden und in der Hilfe zum RND-Befehl steht nur was von der Verwendung des Timers als SEED.

Dane

PicNick
29.08.2006, 18:36
Du kannst ja auch den aktuelle RND() Wert im EERAM speichern und beim nächsten Start von dort weiterrechnen lassen (als SEED)

SprinterSB
30.08.2006, 08:16
Als Seed kann man bei AVR sehr gut uninitialisierten RAM-Inhalt verwenden, der nach einem PowerDown-RESET gut streut. Und selbst wenn es nur ein externer Reset oder so war, sind das RAM als Seed gut brauchbar.

Aus dem RAM-Inhalt berechnest du eine Seed, und zwar bevor dein Programm das RAM und die Variablen initialisiert hat, und speicherst das in einer Variablen, die nicht initialisiert wird (also nicht von deinem Programm mit ini-Werten besetzt wird).

schont den EEPROM :-)

Für C beschrieben ists hier (https://www.roboternetz.de/wissen/index.php/Zufallszahlen_mit_avr-gcc), muss nur noch nach BASCOM "übersetzt" werden...