Einfacher Zufallsgenerator

Gast #1202766
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
Gast #1203168
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
#1203178
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
Gast #1203187
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
*********************************************************
#1203315
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.
Gast #1264858
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
Angehängte Dateien:
Persönliche Seite #1264877
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren