Forum: Mikrocontroller und Digitale Elektronik Zufallsgenerator in Assembler


von Patrick (Gast)


Lesenswert?

hi!
ich hoffe jemand kann mir weiter helfen?!?!

und zwar soll ich ein sensorspiel mit hilfe eines aduc boards
entwickeln! das sensor spiel soll folgendermaßen funktionieren: ich
habe 5 led's und 5 dazugehörige schalter bzw. taster! der
zufallsgenerator soll nun einen wert ausgeben und die dazu gehörige
led
soll aufleuchten, dann bestätige ich den taster von der aufleuchtenden
led.....dann soll die led wieder erlischen! danach läuft der
zufallsgenerator wieder an....nun soll er die davor aufleuchtenede led
nochmals anzeigen und dazu soll noch eine weitere von den 5 leds
aufleuchten, die betätige ich nun auch wieder usw.!!  der ablauf soll
folgendermaßen sein:

1. der zufallsgenerator läuft und gibt dann einen wert aus
2. die zu dem wert gehörige led leuchtet auf
3. die led bestätige ich durch den dazugehörigen taster
4. der wert muss irgendwie gespeichert werden
5. led erlischt und zufallsgenerator läuft erneut an
6. zufallsgenerator stoppt und gibt den vorherigen wert nochmals aus
und dazu soll er noch einen weiteren wert anzeigen
7. dann muss man wieder beide aufleuchteneden leds durch die
dazugehörigen taster bestätigen
8. zufallsgenerator läuft erneut an
9. zufallsgenerator stoppt wieder und zeigt beide zuvor aufleuchtenden
leds wieder an und dazu noch eine weiter led
10. die 3 leds bestätigen usw.


nun stehe ich vor dem problem.....wie mache ich das??? ich hatte
vielleicht gedacht, das rauschen eines transistors mit einzubinden,
nur
wie binde ich dann diesen transistor mit in das programm ein? oder
gibt
es vielleicht noch andere möglichkeiten??


ich hoffe ihr könnt mir helfen!!


vielen dank schon einmal im voraus!!

gruß patrick

von Andreas Hesse (Gast)


Lesenswert?

Hallo,
schau mal hier:

http://www.mikrocontroller.net/forum/read-4-619.html

Gruss
   Andreas

von Patrick (Gast)


Lesenswert?

dankeschön, das ist auf jedenfall schon einmal hilfreich.....nur wie
lege ich die werte fest, wann welche led angeht und wie speicher ich
den wert, damit ich ihn dann wieder ausgeben kann!! und an welcher
stelle gebe ich den wart an die ports aus?

von Olaf (Gast)


Lesenswert?

Wie dir bestimmt schon aufgefallen ist gehoert die Erzeugung von Zufall
mit zu dem schwierigsten was man so machen kann in einem Prozessor wo
nichts zufaellig ist. :-]

Rauschen zu messen ist sicherlich moeglich, aber auch nicht ganz
einfach, da du dann ja einen AD-Wandler brauchst, oder vielleicht die
Zeit zwischen zwei Spitzenwerten messen musst. Da stellt sich dann die
Frage ist deine externe Schaltung gut genug um wirklich zufaellig zu
sein? Oder kommt es z.B zu einer Haeufung von bestimmten Zahlen?

Ich wuerde bescheissen. :-) Es gibt pseudozufallszahlen auf Basis
rueckgekoppelter Zaehler. Verwendet man z.B wenn man mit Zaehlern
rauschen erzeugen moechte. Sowas wuerde ich programmieren.

Dann hast du nur noch das Problem jedesmal einen anderen Startwert zu
haben damit du nicht immer dieselben Zufallszahlen nach dem einschalten
bekommst. Das wuerde ich z.b Loesen indem ich die Zeit nach dem
einschalten bis zum ersten Tastendruck messe und damit den Generator
einmal initialisiere.

Olaf

von Ben2 (Gast)


Lesenswert?

Schau mal unter "rückgekoppelte Schieberegister", die sind mit
FlipFlops einfach aufzubauen. Wenn man verstanden hat wie sie
funktionieren kann man die Funktion leicht in Assembler
nachprogrammieren.

von Elektrikser (Gast)


Lesenswert?

Hagen hat in seiner Nokia 6100-Bibliothek auch eine Art Zufallgenerator
programmiert, um das randomize das AVR-GCC zu ersetzen. Benötigt nur 72
Bytes und scheint sehr gut zu sein. Vielleicht kannst du das brauchen.
Die Bibliothek ist in der Codesammlung.

Gruß Elektrikser

von Hagen (Gast)


Lesenswert?

Ja, und da oben schon Schieberegister angesprochen wurden, die Lib
enthält ein 63Bit SG-LFSR. Das ist ein Shrinking-Generator Linear Shift
Register. Also im Grunde ein Schieberegister das per Software realisiert
wurde. Allerdings, eben von spezieller Form mit einer Periode von 2^63-1
Bits, ziemlich groß also. Lange Zeit wurden solche Register in der
Kryptographie benutzt, neben den sehr guten statischen Eigenschaften
als Zufallsgenerator. Die maximal machbare Sicherheit wären 126 Bit,
d.h. die "Schlüssel" wären 126 Bit groß.
Das SG-LFSR habe ich eigentlich nur deshalb programmiert weil die
Zufallsfunktionen der RTL vom WinAVR ziemlich viel Code benötigen und
wesentlich schlechtere Eigenschaften besitzen. Bindet man deren rand()
Funktion ein so kann das schon 1Kb Code kosten. Die rand() Funktion
benutzt einen LCG = Linear Congruental Generator, der wesentlich
schlechtere statische Zufallseigenschaften als LFSRs besitzt und zudem
nur eine maximale Periode von 2^32 Bits. (und er ist inperformanter).

Gruß Hagen

von Hagen (Gast)


Lesenswert?

Achso, und ganz wesentlich ist der Fakt das in den Sourcen schon 2x 1000
Polynome enthalten sind. Denn bei Schiftregistern, die ja im Galois
Field gf(2) arbeiten ist es enorm wichtig das die benutzen Polynome =
Abgriffspunkte in Hardware SRs, von spezieller Gestalt sind. Man kann
also nicht beliebige Polynome benutzen, da ansonsten die maximale
Periode nicht erreicht wird !! Nun, die Lib enthält 2000 zufällig
gewählte Polynome die zudem noch verifiziert wurden so daß sie auch
tatsächlich "irreduzible" = nicht reduzierbar == teilerfremd sind.

Gruß Hagen

von Thorsten (Gast)


Lesenswert?

Vielleicht kann man diesem Fall einfach die Zeit messen zwischen LED
aufleuchten und Taste drücken. Da diese Zeit höchstwahrscheinlich immer
unterschiedlich ist, hat man eigentlich schon einen wunderbaren
Zufallswert. Es müsste dafür jedoch ein Schritt zu Beginn eingefügt
werden (LED aufleuchten lassen und Taster drücken und das Ganze als
Bereitmeldung vom Benutzer deklarieren), um den Zufallsgenerator zu
starten.

Gruß
Thorsten

von Hagen (Gast)


Lesenswert?

Also wenn es möglich ist das du Daten im EEPROM speichern kannst dann
würde ich nur einen guten Pseudo Zufallsgenerator empfehlen. Den Seed,
bei meinem LFSR die Register A & S, müssten dann aber im EEPROM
gespeichert sein. Beim Programmieren der MCU müssten dann diese Seeds
mit einem einmaligem Zufallswert beschrieben werden. Beim LFSR mit
2^63-2 Bits Periode ist es sehr sehr unwahscheinlich das man als Mensch
an die Grenze stösst und Wiederholungen erhält.

ABER, und das ist der wesentlichste Unterschied zu jedem Hardware RNG,
die statistischen Eigenschaften dieses Zufallsstromes sind mathematisch
beweisbar. Bei einem Hardware RNG ist dies längst nicht der Fall !

Die Idee die individuelle Affinität des Menschens beim Drücken der
Taster zu benutzen ist sehr gut. Es ist zwar auch nur Pseudo-Zufall,
aber er ist sehr individuell und somit sehr schwer reproduzierbar.
Allerdings würde ich die Dauer der Tasterereignisse in den Seed des
mathematischen Pseudo-Zufallsgenerators einbauen/einrechnen. D.h. der
Seed zB. des LFSRs wird durch die gemessene Zeit zwischen den
Tasterereignissen leicht manipuliert. Somit hättest du dann immer noch
die Vorzüge des PRNG, eben seine bewiesene Funktionalität, erhalten.

Gruß Hagen

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.