AVR gcc random()

OP #5076939
Lesenswert?

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
Gast #5076955
Lesenswert?

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.
OP #5076958
Lesenswert?

@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
Moderator Persönliche Seite #5076959
Lesenswert?

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.
Gast #5076962
Lesenswert?

> 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.
Persönliche Seite #5076968
Lesenswert?

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.
OP #5076986
Lesenswert?

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
Gast #5077608
Lesenswert?

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.
Moderator Persönliche Seite #5077693
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren