Hi, Wie kann ich bei einem Atmega 644 progi (pseudi)zufalls zahlen generieren, ich nehme mal stark an das ohne eine extra RTC ich srand(time(null)); vergessen kann. Ich bräuchte was um mir Board mitteln des mega einpaar Zufalls zahlen zu bekommen, könnte es sein das ein hash über das gesamte ram einpaar Zufalls zahlen liefern? oder wird der ram immer mit 00en initialisiert? Was ich beabsichtige ist ne funktion zu schreiben die beim ersten start meines Smart WebServers eine zufällige MAC Adresse für das board generiert, falls keine im eeprom vorhanden. Ich denke ich könnte auch ohne MAC einpaar broadcasts aufschnappen und die dann als Hash futter verwenden um ne Zufalls zahl zu bekommen, wäre das was, oder gehts e'h einfacher?
Ich habe das mal folgendermaßen gemacht: Timer starten und mit höchster Frequenz frei laufen lassen; Elko über einen Widerstand laden und mit dem Analogcomparator einen Schaltzeitpunkt bestimmen; Im Compatorinterrupt den Timer auslesen -> Zufallszahl. Je schlechter der Elko um so besser ist die Zufallszahl:=)
Man könnte vielleicht das Rauschen des ADC verwenden, das ist thermisch bedingt und daher auch gleich noch wirklich zufällig.
Rückgekoppeltes Schieberegister. Ist auch auf einem AVR ohne Probleme implementierbar. Suche mal nach LFSR (Linear Feedback Shift Register).
>Damit jeder user meines proggis nicht die selbe MAC bekommt.
Ein Netzwerkteilnehmer mit einer nach jedem Einschalten per
Zufallsgenerator erzugten MAC ist so ziemlich der Supergau in jedem
Netzwerk. Lass das lieber.
Oliver
Nur beim ersten Einschalten wird die MAC zufällig erzeugt. Ich würde auch einfach das rauschen des ADCs verwenden, vielleicht an dem entsprechenden ADC Eingang noch eine lange Leiterbahn anschließen (damit man sich noch mehr einfängt). Am besten einen ADC Eingang mit 20x verstärkung verwenden.
Hmm, damit kanst du dir viel Ärger einhandeln, wenn deine Geräte verkauft werden. Am besten besorgst du dir die Microchip EEPROMs, die haben 2Kbit und eine gratis MAC dazu für rund 24 Cent.
Johannes M. wrote:
> Rückgekoppeltes Schieberegister.
Genau das (*) macht random() ja schon, aber das ist halt nur Pseudo-
Zufall. Wenn man echten Zufall haben will, muss man zumindest den
Startwert beeinflussen.
(*) Oder zumindest etwas Vergleichbares.
Für echten Zufall braucht man irgendwas, das auf physikalischen
Zufällen beruht. Das Rauschen einer Z-Diode mit dem ADC zu messen,
hatte ich hier schon einmal demonstriert.
Die Frequenzdifferenz zweier frei laufender Generatoren (RC-Oszillator
und Watchdog-Oszillator) oder eines frei laufenden gegen einen Quarz
kann man auch ausnutzen. Der SRAM ist meiner Erfahrung nach nicht
übertrieben zufällig: die Zellen haben so eine Art Vorzugslage
eingebaut -- nicht vorsätzlich, aber die ergibt sich aus der Geometrie.
Kann aber sein, wenn man über alle Zellen eine CRC bildet, dass sie
sich dann zumindest zwischen verschiedenen Exemplaren hinreichend gut
unterscheidet. Das sollte man sinnvoller Weise dann im startup-Code
vor dem Ausnullen der statischen Daten machen.
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.