Forum: Mikrocontroller und Digitale Elektronik pseudo Zufallszahl Tiny13


von David .. (david1)


Lesenswert?

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

von Blaise Pascal (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.