Forum: Mikrocontroller und Digitale Elektronik AVR und Zufallszahlen erzeugen


von Jens-Erwin (Gast)


Lesenswert?

Hallo,

möchte Zufallszahlen einsetzen - aber wie.


DA-Wandler brauche ich - kann ich nicht verwenden.


Bisher habe ich Zufallszahlen im SRAM "gesammelt" (z.B. beim
Verändern des AD-Wertes Timer auslesen)

Bin über alle Erfahrungen damit dankbar.

Gruß Jens-Erwin

von Marcel Meyer (Gast)


Lesenswert?

assembler, c oder welche sprache?

in c gibts dafür funktionen, in codevision z.B.

int rand (void)
generates a pseudo-random number between 0 and 32767.

von Jens-Erwin (Gast)


Lesenswert?

Hallo,

Ich programmiere nur in Assembler.
Ich könnte mir ja mal den C-Code anschauen.

von Alexander Höller (Gast)


Lesenswert?

Mhmmm .... du könntest einen Timmer immer Laufen lassen, und wenn du den
Zufallswert benötigst liest du ihn einfach aus.
Ist zwar, nicht wirklich "Zufall" ... aber sollte für die meisten
Anwendungen (außer aufwendige Verschlüsselung, etc.) ausreichend sein!

mfG
Alex

von Oliver (Gast)


Lesenswert?

Hi,

einfach mal nach "Zufallszahlen" und "Schieberegister" googeln.
Schieberegisterimplementation in Assembler ist das einfachste und
schnellste, anstatt Modulo-Operationen.

Olli

von Jens-Erwin (Gast)


Lesenswert?

Hallo,

Ich probiere das mal mit dem Schieberegister.

Timer einfach irgendwann auslesen geht natürlich nicht, da ja alles
wirklich präzise abläuft und genau um das irgendwann geht es ja.

Wann soll ich ihn also auslesen?

von Hagen (Gast)


Lesenswert?

Hier im Forum habe ich meine GLCD Sourcen gepostet. Diese Sourcem
enthalten auch einen SG-LFSR in Assembler. Dies ist ein sogenanntes
Lineares Feedback Shift Register als Shrinking Generator. Seine Periode
beträgt 2^63-2 Bits, ist also bei weitem ausreichend. Enthalten sind
auch jeweils 1000 vorberechnete nicht reduzierbare Polynome, die
ebenfalls sehr wichtig sind, damit sie die mathematischen Eigenschaften
eines LFSR auch ergeben.
Der Source selber dürfte in ASM sehr leicht zu adaptieren sein, und
umfasst 72 Bytes Code.

Wichtig ist auch das zB. die BasicCard Cryptokarten diesen Algo. als
Verschlüsselung benutzten. D.h. dieses SG-LFSR ist ein sehr guter
Zufallsgenerator.

Eines will ich hier noch loswerden, da ich öfters im Netz auf Aussagen
treffe das ein Hardware Zufallsgenerator besser wäre als ein
Pseudo-Zufallsgenerator. Diese Aussage ist schlichtweg falsch. Denn man
kann bei einem HW-Generator NIEMALS mathematisch exakt beweisen das der
HW-Generator auch wirklich Zufall produziert. Ganz im gegensatz dazu
stehen Pseudo-Zufalls-Geenratoren. Diese entsprechen ganz exakt der
Mathematik, sind also absolut exakt vorhersehbar, und somit kann man
über die Wahl der richtigen Paramerter und Verfahren auch ganz exakt
ausrechnen wie sicher der produzierte Zufall tatsächlich sein wird.
Bei einem Zufallsgenerator ist es primär nur wichtig das die
produziereten Zahlenfolgen statistisch gesehen zufällig sind. Durch die
korrekte Wahl von Startwerten = Seed's und deren Geheimhaltung, kann
nunmehr auch der Zufalls geschützt werden. Wie gesagt, alle diese
Eigenschaften können mit Rauschgeneratoren, Radioaktivem Zerfall bisher
NICHT mathematisch beweisen werden, man geht bei solchen Generstoren
einfach davon aus das sie Zufall produzieren, einfach weil der Mensch
bisher kein Muster entdecken konnte. D.h. aber nicht das kein Muster
exsitieren kann.

Gruß Hagen

von Jens-Erwin (Gast)


Lesenswert?

Danke,

ich schau mir das gleich mal an. Ich habe mal blos ein ganz kleines
Programm geschrieben und geht für meine Ansprüche. Bin schon denke ich
auf dem richtigen Weg.

MacheZufZahl:  lds  temp,SR_ZufZahl
    lds  temp2,(SR_ZufZahl+1)   ;2 Byte im SRAM
    ror  temp              ror  temp2

                mov  temp3,temp2
    andi  temp3,0b00000011  ;Maske

    cpi  temp3,0      ;Exor
    breq  ClrBit7                ;kann man auch
                                               ;anders machen
    cpi  temp3,3
    breq  ClrBit7

  SetBit7:       sbr   temp,1<<7
           rjmp   EndMacheZuf

  ClrBit7:       cbr    temp,1<<7

  EndmacheZuf:   sts    SR_ZufZahl,temp
           sts   (SR_ZufZahl+1),temp2
           ret                         ;temp kann man
                                                    dann nehmen

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.