Hallo meine lieben, ich baue gerade an einem Funkprotokoll für meine RFM69 Module. Falls der Träger gerade belegt ist soll der AVR erst nach einer zufälligen Zeit wieder Senden. rand() liefert Zufallswerte soweit so gut. Diese sind ja nicht wirklich zufällig... Macht aber nix sollte für diesen Zweck reichen. Aber was ich auf keinen Fall will ist das alle AVRs mit dem gleichen seed rennen. Beitrag "Random Zahl generieren" die Funktion hat mich nicht so richtig überzeugt denn das getseed würde für die gleiche Software doch immer den gleichen seed berechnen ? Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie einen seed generieren zu lassen jedes mal wenn er compiliert. geht sowas ? und diese als konstante in die srand() zu füttern ? Ich bin aber ehrlich gesagt auch für jede andere Lösung offen ohne meine Schaltung ändern zu müssen :) und ohne den seed manuell einzugeben :D MFG Matthias
Man kann ADC-Werte von einem offenen Pin nehmen. Erfüllt sicherlich keine kryptografischen Ansprüche aber sorgt dafür, dass du mit an Sicherheit grenzender Wahrscheinlichkeit keine zwei gleichen Seeds kriegst.
Hast Du Eingaben, die ohne exaktes Timing stattfinden, z.B. per Taster? Wenn ja, Timer laufenlassen und bei jedem derartigen Ereignis den Wert auslesen und als Seed (oder Teil davon) verwenden.
in deiner main()-Loop ab und zu ein "rand()" ausführen. Auch wenn alle AVRs dann mit gleichem Seed starten und die gleiche Zahlensequenz erzeugen, sind dann alle (laufzeitabhängig) an unterschiedlichen Stellen in der Sequenz, wenn es zur Kollision kommt.
@Hmmm sorry nope leider nicht ;( @Felix U Hast du erfahrung damit ? ich habe das bis jetzt auch nur gelesen. Und wollte den ADC eigentlich nicht benutzen, er ist schon ausgeschaltet. jede mA zählt :). ich hab bis jetzt im Forum gelesen das,dass ohen Rauschdiode, also über Floating pin doch nicht so toll sein soll, deshalb auch die erste idee den präprozessor dafür irgendwie zu "misbrauchen" MFG Matthias
Matthias T. schrieb: > Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie > einen seed generieren zu lassen jedes mal wenn er compiliert. Willst du denn für jeden beteiligten Knoten dann ein eigenes Compilat machen? Wenn nicht: durch irgendwas müssen sich die Knoten doch ohnehin unterscheiden, irgendeine Knotennummer, Adresse etc. Nimm diese doch als seed. Ein echtes Seed basierend auf physikalischen Effekten ist natürlich besser, aber (sofern man nicht bereits Hardware dafür hat) auch nicht ganz unaufwändig. Der offene ADC-Port allein tut's in der Regel nicht, denn der hat eine hohe Wahrscheinlichkeit, dass er gerade auf Masse oder Vcc „klebt“. Mit einem differenziellen und vorverstärkten ADC-Kanal kann man das Rauschen einer Z-Diode benutzen, aber auch das ist halt wieder Aufwand in Hardware.
> jede mA zählt Also nutzt du Batterien? Dann könntest du beim Start die Bateriespannung einmalig mit dem ADC messen udn als seed verwenden. > den präprozessor dafür irgendwie zu "misbrauchen" Wie soll das helfen. Wenn ich ein Programm compiliere und dann auf 10 µC flashe, erhalten sie alle exakt den selben Code. Aber da fällt mir was ein: Viele µC haben eine eindeutige Seriennummer - die könnte man doch nehmen.
Messwerte oder Timestamps nehmen, dazu (wenn es geht) irgendwelche Seriennummern vom µC oder anderen ICs auslesen und addieren. RFM69 müsste auch eine Versions- und Seriennummer haben(?!). Wenn Du das wirklich jedes mal neu kompilierst kannst Du natürlich auch ein Skript bauen und darin eine Zufallszahl vom Entwicklungsrechner.
Chris F. schrieb: > Wenn Du das wirklich jedes mal neu kompilierst kannst Du natürlich auch > ein Skript bauen und darin eine Zufallszahl vom Entwicklungsrechner. Sinnvoller wäre es dann, ein Seed in den EEPROM zu schreiben.
Matthias T. schrieb: > Was ich mir überlegt habe über gcc präprozessor vielleicht mir irgendwie > einen seed generieren zu lassen jedes mal wenn er compiliert. Jörg W. schrieb: > Sinnvoller wäre es dann, ein Seed in den EEPROM zu schreiben. Ja, weil man dann auch ohne neue Software das Seed ändern könnte. Wollte dem TO nur bestätigen, dass es auch geht.
Danke Für die Tips,manchaml sieht man den wald vor lauter bäume nicht @chris .F das rfm69 hat ein AFC aka Automatic Frequency Correction. (fast besser als eine serienummer XD) Diese wird jedes mal beim empfang eines Trägers durchgeführt. und produziert auf jeden Fall immer eine andere zahl, bei mehren sendern wird die Streuung besser weil jeder quarz auf dem modul etwas anders tickt :) ich werde srand einfach nach der afc mit dem wert füttern :) MFG Matthias
:
Bearbeitet durch User
Jörg W. schrieb: > Ein echtes Seed basierend auf physikalischen Effekten ist natürlich > besser, aber (sofern man nicht bereits Hardware dafür hat) auch nicht > ganz unaufwändig. Der offene ADC-Port allein tut's in der Regel nicht, > denn der hat eine hohe Wahrscheinlichkeit, dass er gerade auf Masse > oder Vcc „klebt“. Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit ziemlich gewackelt. Ich denke, damit sollte das gehen. Achtmal das letzte Bit gelesen gibt ein relativ zufälliges Byte.
Dussel schrieb: > Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit > ziemlich gewackelt. Ich denke, damit sollte das gehen. Achtmal das > letzte Bit gelesen gibt ein relativ zufälliges Byte. Haha, wär auch meine Idee gewesen und wollte ich gerade vorschlagen xD
Dussel schrieb: > Bei meinen Versuchen mit dem ADC (vor langer Zeit) hat das letzte Bit > ziemlich gewackelt. Wenn du ein wirkliches Analogsignal dran hast, passt das. Wenn der Pin aber vorher auf Ausgang/Low war und du schaltest ihn auf Eingang um, dann bleibt er noch eine ganze Weile in einem Bereich, wo auch der ADC einfach nur 0 liest. Schließlich ist erstmal niemand da, der die Eingangskapazität umladen würde. Wenn er wirklich nur eine eindeutige Unterscheidung der Knoten braucht, dann ist er mit einer manuellen Seriennummer oder Knotenadresse im EEPROM am einfachsten bedient.
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.