Hallo, ich bastel grade an einem Programm zur beleuchtung eines gegenstandes. Dazu hab ich einen ATTiny13, nun soll damit in gewissen Abständen eine LED an und aus gehen (stark vereinfach gesagt), das tut auch alles so wie es soll. Nur bräuchte ich jetzt einen pseudo Zufallsgenerator damit die Sequenz immer etwas unterschiedlich aussieht, ich hab zwar jetzt schon gegoogelt, aber irgendwie erschlägt mich das "Angebot" deutlich. Kennt da vlt jemand was was nicht viel Speicher braucht? Ich brauch einfach eine "Zufallszahl zwischen 0 und 10 oder sowas ähnliches. Denn davon hab ich auf dem Tiny13 wirklich ziemlich wenig. Gruß David
>aber irgendwie erschlägt mich das "Angebot" deutlich Mathematik scheint nicht dein Ding zu sein .. http://www.mathematik.tu-darmstadt.de/fbereiche/stochastik/contents/summerschool/t1.php Einfacher gehts nicht.
Welche Programmiersprache benutzt du denn? In C und Basic gibts es da meistens schon fertige Funktionen. In Assembler habe ich mal ein 19-bit Shifter von Dave VanHorn auf einen Tiny portiert:
1 | ; register defs |
2 | .def stateA = r9 |
3 | .def stateB = r10 |
4 | .def stateC = r11 |
5 | .def temp =r16 ;misc usage, must be in upper regs for IMMED mode |
6 | .def temphi =r17 ;misc usage, |
7 | .def scratch =r22 |
8 | .def scratch2 =r23 |
9 | .def scratch3 =r24 |
10 | ; state_random |
11 | ;
|
12 | ; Random number generator |
13 | ; Maximal length 19 bit shift register sequence, adapted from the |
14 | ; "getting started" notes of Dave van Horn. Thanks, Dave! |
15 | random: |
16 | ; scratch3 scratch2 scratch |
17 | ;22222111 11111110 00000000 |
18 | ;43210987 65432109 87654321 |
19 | |
20 | mov scratch,stateA |
21 | mov scratch2,stateB |
22 | mov scratch3,stateC |
23 | |
24 | mov temp,scratch ;Make copy |
25 | mov temphi,scratch3 ;Make copy |
26 | |
27 | rol scratch ;Shift the bits D7->Carry |
28 | rol scratch2 ;Carry->D0 D7->Carry |
29 | rol scratch3 ;Carry->D0 D7->Carry, but that will be fixed. |
30 | ;Now we have to Xor the bits to see what |
31 | ;goes in to bit 1 |
32 | |
33 | rol temphi ;Move bit 19->20 |
34 | andi temphi,$08 ;Important that D1,0 be zero |
35 | |
36 | andi temp,$13 ;Mask out irrelevants, protecting bit 19 |
37 | or temphi,temp ;Get bits 5->21 2->18 1->17 |
38 | |
39 | andi temphi,$18 ;Nuke bits 18,17 |
40 | lsr temphi ;19->19 5->20 |
41 | lsr temphi ;19->18 5->19 |
42 | lsr temphi ;19->17 5->18 |
43 | |
44 | eor temphi,temp ;First xor, result in temphi (5x2 in 02 and 19x1 in 01) |
45 | mov temp,temphi ;Make a copy |
46 | ror temp ;Move the 5x2 result to 01 |
47 | andi temphi,$01 ;Mask off everything else |
48 | andi temp,$01 ;in both |
49 | eor temphi,temp ; |
50 | brne state_random_1 ;If one, do that, else |
51 | state_random_0: |
52 | ;Set a zero in the lsb of the low byte |
53 | mov temp,scratch ;Get the low byte |
54 | andi temp,$FE ;Make the LSB zero |
55 | mov scratch,temp ;Put it back |
56 | rjmp state_random_exit ;Bye bye |
57 | state_random_1: |
58 | ;Set a one in the lsb of the low byte |
59 | mov temp,scratch ;Get the low byte |
60 | ori temp,$01 ;Make the LSB one |
61 | mov scratch,temp ;Put it back |
62 | state_random_exit: |
63 | mov stateA,scratch |
64 | mov stateB,scratch2 |
65 | mov stateC,scratch3 |
66 | mov temp,scratch ; and return it |
67 | ret
|
Matthias Sch. schrieb: > In Assembler habe ich mal ein 19-bit > Shifter von Dave VanHorn auf einen Tiny portiert: > [...] OMG. Ein sehr schönes Beispiel dafür, dass die Verwendung von Assembler alleine noch nicht zwangsläufig gute oder effiziente Programme hervorbringt... Das hier macht exakt dasselbe, braucht dafür allerdings nur die Hälfte der Register und weniger als die Hälfte der Taktzyklen und hat als i-Tüpfelchen auch noch eine konstante Laufzeit, was manchmal auch nicht ganz unwichtig ist: .def stateA = r9 .def stateB = r10 .def stateC = r11 .def temp = r16 random: clr tmp sbrc stateA,0 inc tmp sbrc stateA,1 inc tmp sbrc stateA,4 inc tmp sbrc stateC,2 inc tmp lsr tmp rol stateA rol stateB rol stateC mov tmp,stateA ret
c-hater schrieb: > random: > clr tmp Übrigens fällt mir gerade noch auf: Wenn man das clr tmp durch ser tmp ersetzt, macht der Code zwar nicht mehr exakt das, was die Vorlage tut, ist aber dafür stabil, mutiert also nicht zum Konstantengenerator, wenn der Wert im Schieberegister mal zufällig 0 ist... Auch die Wahl der Polynomkoeffizienten sollte man vielleicht nochmal überdenken. Mir scheint, wenn man nur zwei benutzt, nämlich Bit 21 und Bit 19 oder Bit 21 und Bit 17, wird die Zufallsfolge deutlich länger werden. Als abgenehmer Nebeneffekt würde dadurch auch noch der Code um weitere 4 Takte schneller werden.
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.