Forum: Mikrocontroller und Digitale Elektronik Zufallszahlen mit Attiny13


von Eumel (Gast)


Lesenswert?

Guten Abend,

Leider sind meine elektronischen Kentnisse eher mau, deshalb hoffe ich 
auf Anregungen/Hilfe.
Ich benutze einen Attiny13, programmiere in Assembler und möchte pro 
Sekunde 8 zufällige Bytes erzeugen ( einmal das Ram vom Attiny13 voll 
machen)
Ich hab jetzt schon einiges darüber gelesen, bin aber noch nicht so 
wirklich weiter gekommen. Ich würde ungern ein LFSR benutzen, da ich 
tatsächlich echte Zufallszahlen benötige. Die Möglichkeit eines schnell 
laufenden Timers der durch eine Benutzereingabe gestoppt wird scheidet 
leider auch aus, da es keine Eingabe gibt.
Der meiner Meinung nach beste Weg führt uber den Integriert ADC. Ich 
hatte mir gedacht irgendein Rauschen einzufangen, das mit dem ADC zu 
messen und dann von jeder Messung nur das unterste Bit zu benutzen. Kann 
das so funktionieren? Und vorallem, wo kriege ich ein anständiges 
Rauschen her?

vielen Dank für eure Hilfe

der Eumel

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Den genzen RAM voll Zufall? Dafür braucht man auch keine 
Programmierkenntnisse:

Strom aus -- 10 Sekunden warten -- Strom an: Voilà!

In 0 Zeilen Code :-))

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

such doch einfach mal nach Rauschquelle!

Dort wird eine Diode oder B/E-Strecke eines Transistors verwendet. Um 
mit dem AD-Wandler zu messen musst die Spannung natürlich noch 
verstärken. Alternativ würde sich auch der Analog-Comp. verwenden lassen 
(??ähm hat der einen??) - der würde dann 1-Bit liefern.


Sascha

von Eumel (Gast)


Lesenswert?

Ja, Comparator ist drin. Gute Idee, hatte ich noch garnicht dran gedacht 
:)

von Thomas T. (knibbel)


Lesenswert?

Johann L. schrieb:
> Den genzen RAM voll Zufall? Dafür braucht man auch keine
> Programmierkenntnisse:
>
> Strom aus -- 10 Sekunden warten -- Strom an: Voilà!

Ich möchte fast dagegen wetten. Ich denke nämlich, es wird immer 
derselbe Wert in den Zellen stehen ($FF ?).

Da ich das aber genau wissen möchte, werde ich es mal gleich 
ausprobieren (leerer Chip (ok, kein ATtiny13) und dann mal mittels JTAG 
das RAM auslesen).

Auch wenn es nicht der ATtiny ist, sollten die Ergebnisse vergleichbar 
sein ...

Gruß,
Thomas

von Eumel (Gast)


Lesenswert?

Würde es denn vielleicht schon reichen den ADC mit einem zu hohen Takt 
zu betreiben und z.b. nen Spannungsteiler mit nem LDR zu verwenden? Ist 
dann das niedrigst Bit dann schon zufällig?

von Kurt (Gast)


Lesenswert?

Wohl nicht.

Es stellt sich zwar irgendwas außerhalb der
Spezifikation ein - aber auch das kann sehr
regelmäßig sein...

Rauschquelle wie oben beschrieben ist
schon ein guter Ansatz. Einfacher gehts
kaum, wenns ECHTER Zufall sein soll.

von Hugo W. (Gast)


Lesenswert?

Wenns UNechter Zufall sein soll tut es dann auch ein sehr langes 
Generatorpolynom?

Grüße
Hugo

von Thomas T. (knibbel)


Lesenswert?

Thomas T. schrieb:
> Ich möchte fast dagegen wetten. Ich denke nämlich, es wird immer
> derselbe Wert in den Zellen stehen ($FF ?).
>
> Da ich das aber genau wissen möchte, werde ich es mal gleich
> ausprobieren (leerer Chip (ok, kein ATtiny13) und dann mal mittels JTAG
> das RAM auslesen).

Also, JTAG war jetzt keine große Hilfe, stattdessen habe ich mir die 
ersten vier Byte ($0100-$0103) auf einem LED-Display ausgeben lassen.

Heraus kamen nahezu immer die gleichen Folgen:

"$0100: 1F B7 62 D7" Einige Male hatte ich auch "$0100: 1F B7 62 97".

Zum Vergleich habe ich auch vier andere Bytes im SRAM getestet:

"$0120: A5 75 36 99", mit ein paar "$0120: A5 75 36 19" dazwischen.

Die Bytes sind zwar alle sehr zufällig, aber nach dem Einschalten ist 
der Inhalt im Grunde sehr genau vorhersehbar.

"Device under Test" war ein AT90CAN128.

Gruß,
Thomas

von Eumel (Gast)


Lesenswert?

Also fällt das weg. Aber vielen vielen Dank für deine Mühe Thomas!

von Klempner (Gast)


Lesenswert?

moin

einfacher 24 bit generator ,sollte ausreichen um dein ram ohne 
wiederholung vollzubekommen.Nach dem Init (seed) ,das unterprg. simpler 
aufrufen , gibt jedesmal ne neue 24bit zufallszahl.Kann man schön im 
AVR-Studio testen .

1
;RAND1 - RAND3 = ram oder Register
2
3
Init_Random:        ;first time
4
  ldi  TEMP,$AA  ;Init the random number generator
5
  mov  RAND1,TEMP  ;since a 00,00,00 state will not
6
  mov  RAND2,TEMP  ;progress.
7
  mov  RAND3,TEMP  ;you can get a timer to pre load first time
8
  ret
9
**********************************************************
10
 simple 24bit random generator
11
**********************************************************
12
simpler:
13
14
  rol  RAND1    ;Shift the bits ->Carry
15
  rol  RAND2    ;RAND are register or Ram
16
  rol  RAND3
17
  BRCC rr2
18
  ldi TEMP,0x87
19
  eor RAND1,TEMP
20
rr2:
21
  ret

von Simon K. (simon) Benutzerseite


Lesenswert?

Hagen hat sowas in seinem Projekt mal gemacht.
Beitrag "Glühwürmchen in Rotkohlglas gefangen"

von Eumel (Gast)


Lesenswert?

Hmmmm, hab jetzt mal nach Rauschgeneratoren gesucht. Das gefundene hat 
mich aber nicht wirklich überzeugt. Hat jemand von euch nen Schaltplan 
für einen einfachen Rauschgenerator?

PS: Könnte man vielleicht auch was mit eine NE555 basteln?

von Egon (Gast)


Lesenswert?

So, hab das mit dem ausschalten und wieder einschalten auch mal 
probiert. Komme auf das gleiche Ergebniss wie Thomas T.

von spess53 (Gast)


Lesenswert?

Hi

>Hmmmm, hab jetzt mal nach Rauschgeneratoren gesucht. Das gefundene hat
>mich aber nicht wirklich überzeugt. Hat jemand von euch nen Schaltplan
>für einen einfachen Rauschgenerator?

>PS: Könnte man vielleicht auch was mit eine NE555 basteln?

Dann kannst du auch gleich ein LFSR nehmen. Wozu soll das ganze 
überhaupt dienen?

MfG Spess

von Julian R. (tuefftler)


Lesenswert?

Wofür brauchst du den Zufallsgenerator eigentlich??
Den NE555 an den Portpin hängen wäre noch ein anderer Ansatz.
Dann könnte man intern einen Timer laufen lassen, ohne Prescaler, und 
mit dem NE555 einen externen Interupt auslösen, der dann das letzte 
Timerbit ausliest und speichert.
Problem:
die Frequenz des 555 sollte möglichst ungenau sein, und selber schwingen

julian

von Martin (Gast)


Lesenswert?

Kurt schrieb:
> Rauschquelle wie oben beschrieben ist
> schon ein guter Ansatz. Einfacher gehts
> kaum, wenns ECHTER Zufall sein soll.

Ist kein hochwertiger, "echter" Zufall.

Da muß man viel mehr Aufwand treiben. Einfach Diodenrauschen oder so 1:1 
übernehmen ist nicht.

von Chris (Gast)


Lesenswert?

Du kannst auch ein Netzteil von Pollin nehmen 0-5V und damit direkt in 
den ADC Eingang. Das letzte Bit rauscht dann sicherlich :D

von Eumel (Gast)


Lesenswert?

Sorry, dass ich mich nicht gleich gemeldet habe.

Das ganze soll ein Demonstrationsobjekt sein. Wenn die Zufallszahlen gut 
sind, wird wohl fast nie ein Muster zweimal auftreten ( gibt immerhin 
2^64 Kombinationen... )

von Kurt (Gast)


Angehängte Dateien:

Lesenswert?

Hiermit kann man recht guten, halbwegs echten
Zufall "für Anfänger" erzeugen.

UNECHT wird er durch schlechte Abschirmung.

Den Aufwand für Abschirmung vs. Echtheit muss
man halt für die Erfordernisse ermitteln.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Eumel schrieb:
> Sorry, dass ich mich nicht gleich gemeldet habe.
>
> Das ganze soll ein Demonstrationsobjekt sein. Wenn die Zufallszahlen gut
> sind, wird wohl fast nie ein Muster zweimal auftreten ( gibt immerhin
> 2^64 Kombinationen... )

Um das abschätzen zu können, sollte man erst mal eine Analyse 
durchführen, siehe 
http://de.wikipedia.org/wiki/Geburtstagsparadoxon#Mathematische_Herleitungen

Die Wahrscheinlichkeit p, daß bei n Zufallszahlen aus dem 
Wertevorrat B (hier wäre B=2^64) mindestens zwei gleiche enthalten 
sind, ist

Nach Anwendung von Sterling und etwas Rumrechnerei kommt man dann zB zu 
folgendem Ergebnis:

Damit die Wahrscheinlich für mindestens eine doppelte Zufallszahl p 
übersteigt, genügen
Ziehungen (wobei diese Annäherung nur für kleine p gilt).

Z.B. genügen für eine 32-Bit Zufallszahl (also 4294967296 Wert) bereits 
260000 Ziehungen, um die Wahrscheinlichkeit auf 1 Promille zu bringen 
und 560000 Ziehungen, um die 1%-Marke zu reissen.

B geht noch nicht einmal linear in die Anzahl der Ziehungen ein 
sondern nur zur Potenz 0.66.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Z.B. genügen für eine 32-Bit Zufallszahl (also 4294967296 Wert) bereits
> 260000 Ziehungen, um die Wahrscheinlichkeit auf 1 Promille zu bringen
> und 560000 Ziehungen, um die 1%-Marke zu reissen.
>
> B geht noch nicht einmal linear in die Anzahl der Ziehungen ein
> sondern nur zur Potenz 0.66.

Nachdem mir aufgefallen ist, daß ich die Entwicklunf für ln an einer 
Stelle zu früh abgebrochen habe *rotwerd*, hab ich die Abschätzung 
nochmals gemacht. Das Ergebnis:

Damit die Wahrscheinlich für mindestens ein Mehrfach-Vorkommen einer 
Zufallszahl p übersteigt (bei B möglichen Zufallszahlen), genügen
Ziehungen (wobei diese Annäherung nur für kleine p gilt).

Z.B. genügen für eine 32-Bit Zufallszahl (also 4294967296 mögliche Wert) 
bereits 3000 Ziehungen, um die Wahrscheinlichkeit auf 1 Promille zu 
bringen und 9200 Ziehungen, um die 1%-Marke zu reissen.

B geht nich tlinear sondern lediglich als Wurzel in die Anzahl der 
Ziehungen ein.

von Kurt (Gast)


Angehängte Dateien:

Lesenswert?

Oweh, T1 war falsch angeschlossen... hier die Korrektur.

Natürlich muss die BE-Diode von T1 im Durchbruch betrieben
werden, um Rauschen zu liefern.

Ansonsten wäre für auch mich ein LFSR die bevorzugte Lösung,
wenn es um stochastische DEMO-Anwendungen geht.

Der Vorteil dieser Rauschquelle ist, dass sie nicht bei jedem
Einschalten den gleichen Ablauf liefert. Auch ein > 100-Bit
breiter Pseudo-Zufallsgenerator braucht einen ZUFÄLLIGEN
Startwert, um nicht immer wieder den selben Ablauf zu liefern.

von Shuzz (Gast)


Lesenswert?

Mal ne doofe Frage zu diesen Schaltungen: Die funktionieren doch alle 
nur mit deutlich mehr als 5V Vcc oder?
Die Durchbruchspannung der BE-Strecke beträgt ja bei den meisten 
(Kleinsignal-)Transistoren 5V, korrekt?

Gibt es denn auch Lösungen die mit einer Versorgungsspannung von 5V 
auskommen? Ich habe mal irgendwo was gelesen man könne z.B. auch das 
"rauschen" der Bandgap-Reference von z.B. nem LM317 verwenden.
Wie würde sowas denn aussehen?

von Kurt (Gast)


Lesenswert?

Bei 5 V wirds schwieriger.

Die Rauschschaltung oben würde vielleicht bis hinab zu
7 ..8 V funktionieren.

Band-Gap-Referenzen sind "leider" recht rauscharm.
Also keine gute Wahl.

Schau mal zu:
http://www.prolab.tu-berlin.de/projekte/discopixel/referate/ref-ausarbeitung-rauschen-reinsch.pdf

Dort wird (auf Seite 6) ein ICL7660 benutzt, um aus +5 V
eine Versorgung von +/-5 V zu generieren.

Die intern erzeugte Wandelfrequenz des ICL7660 könnte
aber ohne einen gewissen Glättungsaufwand den "Zufall"
etwas verwässern.

von Julian R. (tuefftler)


Lesenswert?

Ich hab noch ne Idee:
Du kannst dir einen DCF77-Empfänger an den µC bauen, und die 
Wetterdaten(codiert) als Zufall benutzen!
Nähere Infos: 
http://www.mikrocontroller.net/articles/DCF77_Wetterinformationen#Verschl.C3.BCsselung

Aber wenn du das machst, würd ich nur die Bits 14-42 verwenden, die 
anderen haben zu starke Tendenzen...

juluan

von Ezis B. (ezis_b)


Lesenswert?

timer laufen lassen und mit WDT interrupt auslesen.Geht ganz gut,WDT hat 
andere taktgenerator.
1
ldi rmp,1<<CS00
2
out TCCR0B,rmp
3
ldi rmp,1<<WDTIE;
4
out WDTCR,rmp
5
6
interrupt:
7
8
WTO:
9
in tempR,TCNT0
10
reti

von Volker S. (volkerschulz)


Lesenswert?

Ich habe vor Jahren fuer einen Texas Hold'em Server das Rauschen eines 
abgedeckten CCD-Chips verwendet um "echte" Zufaellszahlen zu generieren. 
Am PC hat man mit einer Billig-Webcam eine akzeptable Loesung. Jetzt 
weiss ich nicht wie trivial das einlesen am µC ist. Evtl. reicht ja 
schon ein analoges Videosignal (eines Kameramoduls) am ADC?

Volker

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.