mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfacher Zufallsgenerator


Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bräuchte mal wieder "Starthilfe" ;-)

Ich möchte gerne einen "einfachen Zufallsgenerator" programmieren. Ziel 
ist es, über einen Taster eine von 30 LEDs aufleuchten zu lassen. Welche 
LED aufleuchtet, sollte "zufällig" sein.

Ich habe evtl. daran gedacht, einfach die Zeit zu messen, wann der 
Taster gedrückt wird. Also eine Schleife bis 30 zählen zu lassen. Ist 
die Schleife bei 1 und der Taster wird betätigt, leuchtet LED1, ist die 
Schleife bei 2 und der Taster wird betätigt, leuchtet LED2 usw. Zum 
Schluss geht das wieder von vorne los.

Nun ist die Frage: Ist das so überhaupt möglich ?

Besten Dank im Voraus !

Viele Grüße
Sven

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum sollte das nicht möglich sein?
Inkrementiere den Zähler in der Schleife und fertig :-)

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
im Prinzip der "elektronische Würfel".
Den kennt fast jeder, der mal mit Elektronik gebastelt hat.
Da findest sicher jede Menge darüber im Netz

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rauschen am AD Wandler auslesen

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ein Pseudozufallsgenerator verwenden:

http://madgyver.roboterbastler.de/index.php?id=32,...

Damit der immer einen anderen Initialisierungswert beim Einschalten 
bekommt, benutzt du das EEPROM, wo du den Startwert ablegst, der z.B. 
bei jedem Einschalten um 1 erhöht wird.

Autor: Commtel @msn (commtel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven Löffler
Deine Idee ist vollkommen machbar: der (Timer im) Controller zählt ja im 
Hintergrund so schnell, daß die Zeiten zwischen den Tastendrücken wohl 
immer zufällig sind. Es kann bestimmt kein Mensch mikrosekundengenau 
einen Tastendruck wiederholen.

Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst mal vielen Dank für die zahlreichen Antworten.

Ich bekomme irgendwie die Verbindung zwischen Abfrage des Tasters, des 
aktuellen Wertes sowie das ausgeben der entsprechenden LED nicht hin.

Versuchshalber möchte ich es ganz einfach mit 3 LEDs machen. Controller 
ist ein Atmega8515.

Oh man, ich muss erstmal wieder ins Programmieren rein kommen. Ich 
schreibe übrigens in assembler. Vielleich kann mir nochmal jemand 
helfen.

Viele Grüße
Sven

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann her mit der Quelle!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Löffler wrote:

> Oh man, ich muss erstmal wieder ins Programmieren rein kommen. Ich
> schreibe übrigens in assembler. Vielleich kann mir nochmal jemand
> helfen.

Zeig doch mal das Programm, so wie du es bis jetzt hast.

Im Grunde ist das doch einfach. Der Prinzipielle Aufbau sieht so aus

   Initialisieren (Port auf Ausgang/eingang schalten.
                   Pullup ein, wenn notwendig)

   Zähler = 0
   Zähler am Port ausgeben

loop:
   Wenn Taste nicht gedrückt
        -> goto loop

   Zähler um 1 erhöhen
   Wenn Maximum erreicht
      -> Zähler wieder auf 0

   Zähler am Port ausgeben

   goto loop

Autor: PillePalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin

Einfacher 24 Bit pseudo Generator
Der Wert steht nach aufruf in Rand1 - Rand3
Rand ist im einfachsten Fall ein Register


Init_Random:        ;first time
  ldi  TEMP,$AA  ;Init the random number generator
  mov  RAND1,TEMP  ;since a 00,00,00 state will not
  mov  RAND2,TEMP  ;progress.
  mov  RAND3,TEMP  ;you can get a timer to pre load first time
  ret
**********************************************************
 simple 24bit random generator
**********************************************************
simpler:

  rol  RAND1    ;Shift the bits ->Carry
  rol  RAND2    ;RAND are register or Ram
  rol  RAND3
  BRCC rr2
  ldi TEMP,0x87
  eor RAND1,TEMP
rr2:
  ret
*********************************************************

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi PillePalle,

mit nur einem rückgekoppelten Bit, dürfte die Zufallszahl
ziemlich "regelmäßig" sprich berechenbar.
Gerade beim ersten Durchlauf steht es auf einem ungünstigen
Init.-wert (0xAA). Bei jedem zweiten Takt wird das Low-Byte
mit 0x87 geladen. Das nenne ich nicht mehr "zufällig".

Z8

Autor: Sven Löffler (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,

ich habe versucht, dass jetzt mal in ein Programm zu fassen. Wirklich 
gelungen ist mir das wohl nicht. Auf Tastendruck leuchten immer nur alle 
LEDs. Das Programm habe ich als Dateianhang beigefügt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Löffler wrote:

> gelungen ist mir das wohl nicht. Auf Tastendruck leuchten immer nur alle
> LEDs. Das Programm habe ich als Dateianhang beigefügt.

Vielleicht solltest du noch mal das Tutorial von Anfang an durchmachen. 
Scheinbar hast du schon ziemlich viel wieder vergessen :-)

ldi temp, 0b00000000            ; Port B als Ausgang
out DDRB, temp

Äh, nein.
Ein Portpin wird auf Ausgang gesetzt, indem man für den entsprechenden 
Pin eine 1 ins DDR Register schreibt.

ldi temp, 0b11111111            ; Port A als Eingang
out DDRB, temp

Vergleich mal den Kommentar mit dem was tatsächlich passiert.


Wie sind deine Taster angeschlossen?
Brauchst du einen Pullup Widerstand? Wenn ja, dann solltest du den auch 
einschalten.


Diese Sequenz

cpi zaehl, 4                    ; Z�hler mit Max ( 4 ) vergleichen
brcc Endloop                    ; wenn 4 erreicht, springe zu Endloop

EndLoop:
clr zaehl                       ; Z�hler auf null setzen.

ist nicht wirklich davon abhängig ob der Wert in zaehl irgendwas ist. 
Wenn das Carry gecleared ist, wird nach EndLoop gesprungen, wenn es 
nicht gecleared ist, wird der branch nicht genommen und statt dessen bei 
... EndLoop weiter gemacht. Im Endeffekt: Egal wie das Carry steht, es 
wird immer bei EndLoop weitergemacht (Und dort passiert daher immer: clr 
zaehl :-)
Warum eigentlich das Carry abfragen? Es gibt doch einen so schönen brne 
(Branch if not equal)


Wie sind deine LED angeschlossen? Wann leuchten die? Wenn der 
Ausgangspin auf 0 oder auf 1 ist (welches von beiden)

Das hier
  ldi zaehl, 0b11111111           ; Z�hler auf null
  out PortB, zaehl
lässt mich vermuten, dass die Led leuchten wenn eine 0 am Ausgang ist

Das hier allerdings
  clr zaehl                       ; Z�hler auf null setzen.
  out PortB, zaehl                ; Z�hlerwert auf Port B ausgeben.
lässt mich das Gegenteil vermuten.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das nur schnell zusammengekritzelt, oder auch mal versucht 
nachzuvollziehen, was dein Controller da tun soll?

Loop:                           ; Schleife

sbic PINA, 0
rjmp loop

Was soll danach noch gross passieren...?

Autor: Armin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mir für den ATTiny13 einen Pseudozufallsgenerator für 
Modellbahnbeleuchtung etc beschrieben, der ist zwar etwas fett, aber 
dafür sind die Zahlen ziemlich gut gleichverteilt und die Periode ist 
mindestens 100000 Bytes lang. Wem's hilft, bitte sehr (Anhang). Bestimmt 
kann man manches optimieren, gerade was den Platzbedarf angeht, aber ich 
kopiere gerne Code einfach hin und her und habe keine Lust jedesmal 
nachzusehen, welche Register so genutzt werden, daher die vielen pushs 
und pops um diese zu sichern. Bin aber für Anregungen offen, denn die 
MC-Programmierung betreibe ich erst seit ein paar Wochen.
Gruß
Armin

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein einfaches Beispiel ist im C-Projekt
   Beitrag "Re: Miniprojekt: Lagerfeuer-LED (ATtiny25)"

Als Startwert dient nicht-initialisierter RAM-Inhalt. Das Projekt ist 
für AVR, und dort ist der RAM-Inhalt nach PowerUp mehr oder weniger 
zufällig.

Weiter geht's dann mit Pseudo-Zufall, weil's so einfach ist natürlich 
hausgemacht :-)

Johann

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.