Hallo, ich habe hier schon viel zur Therorie der Zufallszahlen gelesen, jedoch kein Beispiel für einen AVR gefunden. In einem Beitrag war ein Hinweis auf die Codesammlung, jedoch war dann dort nichts zum Thema Zufallszahl zu finden. Mehrere externe Links sind nicht mehr erreichbar (2004 - 2006) Ich möchte ohne externe Bauelemente einen Zufallsgenerator, der Startwert wird im EEProm gespeichert, muß also nicht extern ermittelt werden. Wer kann mir einen Link zum Quellcode für einen Pseudozufallsgenerator schreiben? Hardy
Hallo, ich hatte da auch mal gesucht und wenig fertiges gefunden. Im Anhang ist der Source meines flackernden Kaminfeuers vom Modellpuppenhaus meiner Frau. Original ist irgendwo aus dem Netz, eine der vielen möglichen Varianten eines rückgekoppelten Schieberegisters, für meine Zwecke mehr als ausreichend. Sind 2 Vaersionen drin, 15Bit und 23Bit. Gruß aus Berlin Michael
Danke an beide, damit komme ich schon viel weiter. Das erste Projekt ist nur für eine Eisenbahn das Licht der Häuser zu steuern. Hardy
Was spricht dagegen eine einfache rand Funktion zu benutzen?
Resourcen ? Rand ist etwas heftig. Ein LFSR ist anspruchsloser.
Hi, für Controller mit MUL-Befehl kann man leicht die bekannte Formel SEED=181*(OLDSEED)+359 [8 bit random number=high(SEED)] benutzen, um 8 bit Random-Werte zu erzeugen. Wenn es wichtig ist, dass beim Neustart des Prozessors auch "neue" Zufallszahlen erzeugt werden, muss man den Seed-Wert (in rndseed und rndseed+1) jeweils neu wählen, oder den letzten zwischenspeichern. Da der Code kurz ist, poste ich ihn direkt in diesem Beitrag. Gruß Fred
1 | .equ RNDM=181 ; |
2 | .equ RNDA=359 ; |
3 | |
4 | .def lrpl=r2 |
5 | .def lrph=r3 ; low reg pair MSB |
6 | |
7 | .def rw=r16 ; 1st working reg |
8 | .def rw_=r17 ; 2nd working reg - 16bit pair, don't change |
9 | |
10 | .dseg |
11 | .org SRAM_START |
12 | rndseed: .BYTE 2 ; 16 bit seed for rnd() |
13 | |
14 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
15 | ; rnd() returns a random number in lrph, updates rndseed; changes lrpl |
16 | ; changes r1:r0 |
17 | ; SEED=181*(OLDSEED)+359; random number=high(SEED) |
18 | rnd: |
19 | push rw |
20 | push rw_ |
21 | lds rw, rndseed ; seed LSB |
22 | ldi rw_, RNDM ; multiplicator |
23 | mul rw, rw_ ; |
24 | movw lrph:lrpl,r1:r0; save result |
25 | lds rw, rndseed+1 ; seed MSB |
26 | mul rw, rw_ ; |
27 | add lrph, r0 ; add |
28 | ldi rw, low(RNDA) |
29 | add lrpl,rw ; add RNDA |
30 | ldi rw, high(RNDA) ; |
31 | adc lrph,rw ; |
32 | sts rndseed, lrpl ; save |
33 | sts rndseed+1, lrph ; |
34 | pop rw_ |
35 | pop rw |
36 | ret |
37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Der hier ist schön einfach; sollte fürs flackernde Kaminfeuer reichen :) Grüße, Ulrich
1 | /**********************************************************************/
|
2 | /** Simple pseudo random number generator.
|
3 | *
|
4 | * \note Based on work on Xorshift RNGs by George Marsaglia.
|
5 | * This simple implementation uses y as a fixed seed.
|
6 | *
|
7 | * \return number in range 0..2^32-1
|
8 | */
|
9 | uint32_t
|
10 | prng( void ) |
11 | {
|
12 | static uint32_t y=2463534242; |
13 | |
14 | y ^= y<<13; |
15 | y ^= y>>17; |
16 | return y ^= (y<<5); |
17 | }
|
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.