Hallo Zusammen,
ich hätte mal eine Frage zum Auslesen des ADCL bei einer ADC Wandlung.
Ich möchte zur Erzeugung einer Zufallszahl das niederwertigste Bit als
Rauschsignal verwenden. Hierzu gibt es auch einige Beispiele im
Internet,
deren Abfrage so
if (ADCL & (1<<1)) ...
oder so aussieht
if (ADCL & 1) ...
Von der Syntax her is das ja das gleiche! (oder?)
Die Frage die mich beschäftig ist:
Müsste sich die Abfrage nicht auf das "Bit 0" beziehen, wenn ich das
"niederwertigste" Bit verwenden möchte?
also: if (ADCL & (1<<0)) ...
Danke für eure Antworten.
zander
Hallo,
(1<<1) heißt schiebe die "1" einmal nach links, also 1 * 2 = 2 = b0010 !
und bitte lies mal für die Atmel-Welt nach, wann Du bei Zugriff auf ADCL
ein Ergebnis erhälst.
:-)
Danke für die Aufklärung.
Also ist es falsch, dass ich mit
if (ADCL & (1<<1)) ...
das niederwertiste Bit lese (was ich öfters gelesen habe)
Mit ... if (ADCL & (1<<0)) ... schiebe ich somit die 1 auf die
"0te-Stelle", was gleichbedeutend ist mit ... if (ADCL & 1) ... und ich
somit das niederwertigste Bit auslese!
zander
Am einfachsten ist es wohl, direkt ADC in eine 16 Bit Variable zu lesen
und dann ein x & 1 zu machen. Dann muss man über den 16 Bit
Registerzugriff nicht nachdenken.
gruß cyblord
zander schrieb:> Ich möchte zur Erzeugung einer Zufallszahl das niederwertigste Bit als> Rauschsignal verwenden.
Hast du da auch mal beispielsweise über einen Rauschgenerator in
Software nach gedacht?
Wilhelm Ferkes schrieb:> zander schrieb:>>> Ich möchte zur Erzeugung einer Zufallszahl das niederwertigste Bit als>> Rauschsignal verwenden.>> Hast du da auch mal beispielsweise über einen Rauschgenerator in> Software nach gedacht?
Was ist denn das? Wie willst du mit Software ein nicht-deterministisches
Rauschen erzeugen? Oder meinst du einen PRNG? Kleiner HW-Rauschgenerator
am ADC ist doch DIE Möglichkeit einfach und billig an gute Zufallszahlen
zu kommen.
cyblord ---- schrieb:> Was ist denn das? Wie willst du mit Software ein nicht-deterministisches> Rauschen erzeugen? Oder meinst du einen PRNG? Kleiner HW-Rauschgenerator> am ADC ist doch DIE Möglichkeit einfach und billig an gute Zufallszahlen> zu kommen.
Keine Sorge, das funktioniert schon. Ich machte bereits auf einem µC
statistische Auswertungen zu Würfelaugen, ohne den ADC zu beanspruchen.
Mein implementierter Rauschgenerator 32 bit wiederholt ein Bitmuster
etwa an einem ganzen Tag, wenn er jede Millisekunde betätigt wird, und
ich vermenge es mit einem System-Timer, der auch bis unendlich zählt,
länger als ich leben werde.
Um der Sache analytisch auf den Grund zu kommen, ist indessen
schwieriger. Aber die Ergebnisse sind schon gut.
Ich wollte auf den ADC verzichten, weil ich dort hätte Anbauteile an ein
Board bauen müssen.
Wilhelm Ferkes schrieb:> Keine Sorge, das funktioniert schon. Ich machte bereits auf einem µC> statistische Auswertungen zu Würfelaugen, ohne den ADC zu beanspruchen.
Klar es gibt auch gute PRNGs. Trotzdem bleibt es aber halt Pseudo.
> Mein implementierter Rauschgenerator 32 bit wiederholt ein Bitmuster> etwa an einem ganzen Tag, wenn er jede Millisekunde betätigt wird, und> ich vermenge es mit einem System-Timer, der auch bis unendlich zählt,> länger als ich leben werde.
Das ist aber trotzdem deterministisch. D.h. bei Kentniss aller
Startparameter und der Laufzeit können alle Zufallszahlen berechnet
werden.
Das gilt zwar ebenfalls für einen HW-Rauchgenerator, aber dort ist die
genaue Kentniss aller Parameter real unmöglich. Vor allem weil die dort
nicht diskret sind. In einem Controllerprogramm hat man aber nur
diskrete Werte.
gruß cyblord
cyblord ---- schrieb:> Trotzdem bleibt es aber halt Pseudo.
Egal, wenn es geht. Du kannst mir ja anhand von Beispielen belegen, daß
es nicht geht.
Sicher ist das alles deterministisch, und man versucht das beste. Es
gibt ja am PC auch eine Menge Spiele, die auch nicht einen ADC benutzen.
Was hatte ich da mal: Auch Kniffle, mit 5 Würfelaugen. So wie ich es
jetzt an einem µC gestalte. Danach kommt der Lottozahlengenerator, wenn
Kniffle fertig ist.
Also, zander, man kann da was machen. Auch noch einen zweiten Timer
starten, der asynchron zum ersten läuft, und auch einen Rauschgenerator
bedient.
Experimentiere mal damit. Laß dir Zahlen über den UART an ein
Terminal-Programm ausgeben, z.B. eine Probe mit 1000 Elementen, lese die
in z.B. Excel ein, und schau, was du damit machst. Bei mir gibt es kein
Excel, aber OpenOffice. Geht aber genau so gut.
Wilhelm Ferkes schrieb:> cyblord ---- schrieb:>>> Trotzdem bleibt es aber halt Pseudo.>> Egal, wenn es geht. Du kannst mir ja anhand von Beispielen belegen, daß> es nicht geht.
Wie gesagt, es gibt gute PRNGs, also was soll die Frage? Und
Mathematiker wirst du wohl auch nie mit so einer Aussage ;-) Da hättest
du ja die Riemannsche Vermutung schon bewiesen....
Allerdings kommt bei einem Microcontroller der Umstand dazu, dass dieser
meist keine mitlaufende RTC mit Kalender hat, wie ein PC. Soll heißen,
wenn ich einen guten PRNGs im PC, via Uhrzeit (d.h. Microsekunden seit
1.1.1970) Seede, dann ist dieser Wert sicher einmalig. Bei einem
Controller fängt halt meist bei einem Reset alles wieder von vorne an.
Lange Rede kurzer Sinn: Rauschen am ADC ist besser als ein PRNG in SW.
Mehr will ich nicht sagen.
gruß cyblord
Wilhelm Ferkes schrieb:> Ich weiß immer noch nicht, was ein PRNG ist.
Aber hier über Zufallsgeneratoren schwadronieren. Super.
PRNG= Pseudo Random Number Generator
http://de.wikipedia.org/wiki/PRNG> Andere Leute wiederum wissen nicht, was ein EVZ ist.
Interessiere mich leider nicht sooo sehr für die schweizerische
Eishockeyszene.
http://de.wikipedia.org/wiki/EV_Zug
>Ich weiß immer noch nicht, was ein PRNG ist.
Pseudo Random Noise Generator.
>Rauschen am ADC ist besser als ein PRNG in SW.
Dann aber auch echtes Rauschen an den ADC geben und nicht einfach
das nur letzte Bit auswerten. Wo kommt dieses Rauschen wohl her?
Aus der Schaltung und hauptsächlich vom uC selber. Man findet
da dann die PWM für die LEDs, die Motorsteuerung, I2C, usw.
holger schrieb:> Dann aber auch echtes Rauschen an den ADC geben und nicht einfach> das nur letzte Bit auswerten. Wo kommt dieses Rauschen wohl her?> Aus der Schaltung und hauptsächlich vom uC selber. Man findet> da dann die PWM für die LEDs, die Motorsteuerung, I2C, usw.
Naja ein echter Rauschgenerator wäre sicher gut. Aber auch das übliche
Rauschen am offenen ADC Pin ist sicher nicht-deterministisch genug für
die meisten Anwendungen. Einen RSA-Schlüssel für Atomwaffen würde ich
damit nun aber nicht erstellen wollen ;-)
Wilhelm Ferkes schrieb:> EVZ
Alter Telekomiker?
> Ich weiß immer noch nicht, was ein PRNG ist.
Pseudo Randondom Number Generator.
> und auch einen Rauschgenerator bedient.
Wie erzeugst du mit einem Timer ein Rauschen? Ein Controller macht doch
ab Reset immer wieder das Gleiche. Es sei denn man holt sich
irgendwelche "Umwelteinflüsse" rein.
mfg.
Thomas Eckmann schrieb:> Wilhelm Ferkes schrieb:>> EVZ> Alter Telekomiker?>>> Ich weiß immer noch nicht, was ein PRNG ist.> Pseudo Randondom Number Generator.>>> und auch einen Rauschgenerator bedient.> Wie erzeugst du mit einem Timer ein Rauschen? Ein Controller macht doch> ab Reset immer wieder das Gleiche. Es sei denn man holt sich> irgendwelche "Umwelteinflüsse" rein.
Aber er hat doch einen Timer der ewig läuft ;-)
> Ach so. Klugscheißerei.
Ja sorry aber ein wenig theoretisches Grundwissen erwartet man halt wenn
jemand anfängt über das Thema zu diskutieren und wenn dann mitten drin
die Frage nach PRNG gestellt wird, dann finde ich das etwas merkwürdig.
gruß cyblord
cyblord ---- schrieb:> Aber er hat doch einen Timer der ewig läuft ;-)
Nee, aber mal ernsthaft.
Warum soll ein µC, der nur auf seine eigene Peripherie zurückgreift,
heute was anderes machen als morgen nach z.B 5478278236ns nach Reset?
mfg.
Thomas Eckmann schrieb:> cyblord ---- schrieb:>> Aber er hat doch einen Timer der ewig läuft ;-)> Nee, aber mal ernsthaft.> Warum soll ein µC, der nur auf seine eigene Peripherie zurückgreift,> heute was anderes machen als morgen nach z.B 5478278236ns nach Reset?
Ja eben, das macht er natürlich nicht. Die einzige Chance ist halt, dass
man eben nicht genau weiß bei welcher ns er gerade ist und so die
nächste erzeugte Zufallszahl nicht voraussagen kann.
uiuiui, da hab ich ja was ausgelöst. ^^
Vielen Dank an alle.
Meine Frage war nach der Erkenntnis, das ich mit "(ADCL & (1<<1))" nicht
das 1.Bit sondern das 2. lese schon beendet.
Für alle die es vllt. gebrauchen können, anbei der Codebrocken sowie ein
Bild zur statistischen Auswertung über 1mio Ereignisse.
Für mich ist die Verteilung gut genug (auch wennd die Null scheinbar
öfters kommt.
Aber ihr wisst ja theoretisch könnte auch 1million mal die 0 kommen und
dann der Rest, bis es gleich verteilt ist.
Die Chance dafür ist aber sehr gering... wahrscheinlicher ist dann, dass
der ADC Eingang auf Masse liegt... :-P
Gruß
zander
zander schrieb:> uiuiui, da hab ich ja was ausgelöst. ^^> Vielen Dank an alle.>> Meine Frage war nach der Erkenntnis, das ich mit "(ADCL & (1<<1))" nicht> das 1.Bit sondern das 2. lese schon beendet.
Dass du dafür überhaupt einen Thread aufmachst ist schon erschreckend.
Kurzes Nachdenken, bzw. Stift und Papier und schnell mal den Shift + das
Bitweise AND per Hand gemacht und fertig.