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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|