Forum: Mikrocontroller und Digitale Elektronik Zufällig ausgänge auf high setztn


von cach (Gast)


Lesenswert?

Hallo,
Wie der Titel des Threads schon möchte ich (softwaremäßig) immer einen 
von 4 verschiedenen Pins eines µC zufällig auf high setzten. Wofür wird 
das ganze benötigt? Ich möchte 4 LEDs 20x zufällig zum leuchten bringen. 
Leider bin ich erst vor kurzem in die Mikroporzessorenprogrammiereung 
eingestiegen. Mein Aktueller Prozessor ist der ATMega328.
Wenn das ganze mit den Pins so nicht funktioniert, ist es möglich auch 
anderes (wieder softwaremäßig) die LED in zufälliger Reihenfolge zum 
Leuchten zu bringen?

Schonmal danke für die Antworten,
cach

von Hmm (Gast)


Lesenswert?

Was ist nun eigentlich Dein Problem?

Einen Port-Pin auf 0 oder 1 zu setzen
oder
eine Zufallszahl erzeugen?

von flip (Gast)


Lesenswert?

Echter zufall ist echt schwer zu machen.
Entweder du nimmst einen tastendruck des bedieners als zufall (taste 
gedrückt-> zähler zählt sehr schnell immer und immer wieder durch, bis 
taste losgelassen)
gibt es keine taste, lassen sich pseudozufallszahlen aus einer 
gespeicherten liste erzeugen

von Max (Gast)


Lesenswert?

Oder du nimmst das Rauschen deiner Umwelt über den ADC als 
Zufallsquelle, sollte für sowas simples reichen und brauch nur ein paar 
zeilen code...

von cach (Gast)


Lesenswert?

Super danke für die schnelle Antworten!

Nein mein Problem ist nicht die Pins auf High zu setzten, einfach nur 
einen Zufallgenerator zu programmieren. Der Vorschlag von Max klingt 
gut, habe auch schon etwas darüber gelesen, aber leider habe ich keinen 
Ahnung wie ich so etwas realisieren soll. Kann man das rein 
softwaremäßig machen, oder benötigt man noch Hardware. Ich haben 
gelesen, dass man das Rauschen verstärken muss. Wie mache ich dann aus 
dem Rauschen eine Zufallsgenerator, und setzte damit die Pins auf High? 
/confused Wäre für eine Antwort dankbar!

cach

von Daniel (Gast)


Lesenswert?

cach schrieb:
>Wie mache ich dann aus
> dem Rauschen eine Zufallsgenerator, und setzte damit die Pins auf High?


Also ich würde so vorgehen:

Mit einem ADC-Pin irgendeine (pulsierende) Spannung messen und mit dem 
niederwerdigstem Bit eine Abfrage ausführen... Also niederwerdigstes Bit 
High --> LED-Pin einschalten, Bit Low --> LED-Pin ausschalten etc

Vielleicht reicht ja auch schon deine Versorgungsspannung zu messen, je 
nachdem wie verrauscht sie ist. Muss halt mal probieren

von cach (Gast)


Lesenswert?

Puh kling alles komplizieret. Das ist für mich völliges Neuland! Was ist 
ein ADC Pin, und wie messe ich hier die Spannung. Ich hab keine Ahnung 
wie ich hier vorgehen könnte, bei deiner beschriebene Methode :/. Wie 
führe ich mit dem Niederwertigsten Bit eine Abfrage aus?

von DDS-Entdecker (Gast)


Lesenswert?


von Ben _. (burning_silicon)


Lesenswert?

Wird Deine Schaltung rein zufällig von einem Schaltregler erzeugt oder 
wo kommen die 5V für den Controller her? Oder hast Du Wechselstrom (vor 
dem Gleichrichter) auf der Platine? Sowas würde sich (unsynchronisiert) 
sehr gut für einen Zufallszahlengenerator mittels ADC eignen.

Wenn der User eine Taste drücken soll, reicht auch eine einzige schnelle 
Zählschleife, bis er die Taste wieder losgelassen hat. Ein etliche Mhz 
schneller µC zählt ein 8 Bit-Register sehr schnell einige tausend Mal 
durch, so daß der Benutzer keine Chance hat, einen speziellen Wert beim 
Loslassen zu treffen. Fertig ist Deine Zufallszahl...

von Dietrich L. (dietrichl)


Lesenswert?

ANSI-C hat in der stdlib die Funktion für Pseudozufallszahlen: rand().

Gruß Dietrich

von cach (Gast)


Lesenswert?

Danke für die Links! Werde sie mir mal durchlesen.
@Ben _
Das ganze soll so ablaufen. Der User muss einen Taster (Reset oder 
Start) drücken, um eine das Programm zu starten. Der Zufallsgenerator 
generiert eine Zahl (1-4) die dann eine der LEDs zum Leuchten bringt. Es 
gibt dazu noch 4 Taster, die je einer LED zugeordnet sind. Wird der 
Taster gedrückt, die der LED zugeordnet ist (bsp: LED 4 leuchtet. User 
muss Taster4 drücken) dann kommt ein bestimmtes Signal zum Prozessor das 
sagt richtig ansonsten falsch. Eine einfache IF-Anweisung also. Auf 
jeden Fall generiert er sofort danach wieder eine Zufallszahl die eine 
andere LED aufleuchten lässt. Dieser Vorgang wird 20x wiederholt. Danach 
wird die Zeit gemessen beispielsweise 16 Sekunden und auf einen Display 
ausgegeben.

Hoffe ihr wisst was ich meine.

von Jürgen (Gast)


Lesenswert?

Ja, ist vielleicht etwas viel für den Anfang.
Folgende Dinge musst du dir noch anschauen:
- ADC
- Taster entprellen
- lernen anständig Fragen zu stellen.

In welcher Sprache programmierst du überhaupt?

von Peter D. (peda)


Lesenswert?

Max schrieb:
> Oder du nimmst das Rauschen deiner Umwelt über den ADC als
> Zufallsquelle

Das kannste voll vergessen. Das Problem dabei ist nicht der ADC, sondern 
das Rauschsignal. Kaum etwas, was schwankt, ist wirklich weißes 
Rauschen.
Wer so etwas implementiert, hat es garantiert nicht statistisch 
verifiziert.
Da hätte er sich nämlich arg gewundert, wie unzufällig das ist.

Nimm ein Taste und einen durchlaufenden Timer. Der Mensch ist garantiert 
asynchron zum CPU-Takt.

Oder Pseudozufallszahlen, ein 32Bit Schieberegister sollte reichen.


Peter

von Dietrich L. (dietrichl)


Lesenswert?

cach schrieb:
> Das ganze soll so ablaufen.
> .....

Dann empfehle ich folgende Lösung:
- Timer starten mit Interrupt z.B. alle 10ms
- in der Timer-Interruptroutine zählt ein "LED-Zähler" von 0...3
- in der Timer-Interruptroutine am besten auch gleich die Tasten 
abfragen wegen Entprellung
- Start-Taste (z.B. irgendeine Taste) gedrückt: "LED-Zähler" lesen und 
zugehörige LED einschalten; Wert der LED-Nr. merken
- warten, bis Taste losgelassen

Schleife 20 mal:
- Zeitmessung starten (auch in der Timer-Interruptroutine "Zeit" 
zählen))
- wenn Taste gedrückt, Tasten-Nr. mit LED-Nr. vergleichen und richtig 
oder falsch melden
- "LED-Zähler" lesen und zugehörige (neue) LED einschalten; Wert der 
LED-Nr. merken
- warten, bis Taste losgelassen
- weiter in der Schleife
Wenn Schleife fertig:
- LEDs ausschalten und "Zeit" anzeigen

So etwa müsste es funktionieren. Der "Zufall" ist der Zeitpunkt des 
Tastendrucks. Bei den kurzen Zeiten kann der Bediener das so gut wie 
nicht beeinflussen.

Gruß Dietrich

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.