Forum: Mikrocontroller und Digitale Elektronik ADCL auslesen


von zander (Gast)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

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.

:-)

von Thomas E. (thomase)


Lesenswert?

zander schrieb:
> Von der Syntax her is das ja das gleiche! (oder?)
Nein. (1 << 1) ist 2.
http://www.mikrocontroller.net/articles/Bitmanipulation

Und ADCH muss immer gelesen werden.

mfg.

von zander (Gast)


Lesenswert?

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

von Mullwark (Gast)


Lesenswert?

Geht es Dir zwei zufällige Zustände, also 1 oder 0?
Dann sollte doch

if(ADCH % 2)

gehen, oder?

von Mullwark (Gast)


Lesenswert?

Ich meinte natürlich ADC und nicht ADCH.

von Cyblord -. (cyblord)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

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?

von Cyblord -. (cyblord)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

Ich weiß immer noch nicht, was ein PRNG ist. Andere Leute wiederum 
wissen nicht, was ein EVZ ist.

von Cyblord -. (cyblord)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Cyblord -. (cyblord)


Lesenswert?

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 ;-)

von Thomas E. (thomase)


Lesenswert?

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.

von Wilhelm F. (Gast)


Lesenswert?

cyblord ---- schrieb:
> 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

Ach so. Klugscheißerei.

von Cyblord -. (cyblord)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von zander (Gast)


Angehängte Dateien:

Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

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.

von Bernd K. (Gast)


Lesenswert?

Mir hat der Beitrag geholfen, danke für den Quellcode.

Bernd K.

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.