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
Den genzen RAM voll Zufall? Dafür braucht man auch keine Programmierkenntnisse: Strom aus -- 10 Sekunden warten -- Strom an: Voilà! In 0 Zeilen Code :-))
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
Ja, Comparator ist drin. Gute Idee, hatte ich noch garnicht dran gedacht :)
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
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?
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.
Wenns UNechter Zufall sein soll tut es dann auch ein sehr langes Generatorpolynom? Grüße Hugo
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
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 |
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?
So, hab das mit dem ausschalten und wieder einschalten auch mal probiert. Komme auf das gleiche Ergebniss wie Thomas T.
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
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
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.
Du kannst auch ein Netzteil von Pollin nehmen 0-5V und damit direkt in den ADC Eingang. Das letzte Bit rauscht dann sicherlich :D
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... )
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.
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.
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.
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.
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?
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.
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
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.