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
Was ist nun eigentlich Dein Problem? Einen Port-Pin auf 0 oder 1 zu setzen oder eine Zufallszahl erzeugen?
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
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...
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
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
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?
http://www.mikrocontroller.net/articles/AVR-Tutorial http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
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...
ANSI-C hat in der stdlib die Funktion für Pseudozufallszahlen: rand(). Gruß Dietrich
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.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.