Doch ein Zufall

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • hero schrieb:

      Der Timer läuft übrigens nicht und wird immer 0 ausgeben.
      Mist, hab's korrigiert.

      Es soll immer dasselbe raus kommen, behaupte ich ja die ganze Zeit. Nur fredred meint, es gibt was zufälliges im Ablauf eines Programms im Kontroller. ZB. der Stand eines timers beim Start. Dass das nicht so ist, will ich mit dem Programm zeigen.
      Also nochmal ein Versuch. Ich hab' auch eine waitms 15 eingefügt und das $sim entfernt, damit man mit dem wait spielen kann und andere Stände für timer1 angezeigt bekommt.

      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 800000
      3. $hwstack = 64
      4. $swstack = 32
      5. $framesize = 30
      6. '$sim
      7. Config Lcd = 20x4
      8. Config Timer1 = Timer , Prescale = 1
      9. Start Timer1
      10. Initlcd
      11. Waitms 15
      12. Cls
      13. Locate 1 , 1 : Lcd Timer1
      14. Locate 2 , 1 : Lcd Rnd(1000)
      15. Locate 2 , 6 : Lcd Rnd(1000)
      16. Do
      17. Loop
      18. End
      Alles anzeigen
      Zufallszahlentest.PNG
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Das macht alles keinen Unterschied.
      Es kommt nur was anderes raus, wenn von außen etwas einfließt (z.B. ADC) oder intern unabhängig vom Controllertakt (WDT Timer). Die wären dann sogar unvorhersehbar. Oder eben einen Wert, der anders ist als beim letzten Mal (eeprom), wobei der Wert dann auch vorhersagbar wäre.
    • @fredred
      es ist mir fast peinlich,

      fredred schrieb:

      Bedaure nur das mein Grundsätzlicher Hinweis(electrostatically sensitive devices) so in die Lächerlichkeit gezogen wird.
      Ich habe deinen Hinweis schon verstanden.

      Dekaman schrieb:

      Wir sind uns aber darin einig, es ist keine "saubere"
      ESD Geschichte.
      Auch ich durfte erst an meinen Arbeitsplatz, wenn ich nachweislich nicht "geladen" war.
      Bei heutigen Technologien ist es nicht mehr ganz so prikär, aber auch Schutzdioden sind
      klug (und geben nach).
      Also begraben wir das "Blitzgewitter" und wenden uns wieder den ernsten Fragen zu.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Mit gefällt der Ansatz von hero gut.
      Am Anfang des Programms einen Wert aus dem EEPROM lesen, diesen Wert _seed zuweisen, einmal RND ausführen und dessen Wert ins EEPROM für den nächsten Start. Sind nur ein paar Zeilen Code. Kein Pin, Timer oder Watchdog wird benötigt. Eine EEPROM-Variable ist verschmerzbar. Wenn man nicht in einer Dauerschleife neu startet, dann wird auch nicht übermäßig oft ins EEPROM geschrieben. Müsste doch reichen, um eine nicht wiederkehrende Zufallsfolge über Programmstarts hinweg zu bekommen, oder?
    • Ja, klingt gut. Wie ist das mit einem byte im flash? Hat die eigentlich immer einen gleichen Wert bei Spannunganlegen, natürlich in eine Bereich, wo nix initialisiert wird?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Interessant, wie sich das Thema dahinzieht :) . Jetzt wird´s philosophisch :D . Zufall wird es nie geben, auch ein "Rauschen" folgt festen Gesetzen, wenn auch sehr komplexen und für uns wohl schwer nachvollziehbaren.
      Mir hat der Ansatz über die Zeit (Datum) am besten gefallen. Das ist zwar auch kein Zufall, garantiert aber immer neue Ausgangswerte.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Man kann ja auch eine Zahl bei jedem Aufruf incrementieren und im EEprom abspeichern. Sicherlich gibt es die Beschränkung in der Beschreibbarkeit des EEproms. Wenn man (es war ja für die Modellbahn) die Anlage täglich 5 mal hochfährt hat man aber nur eine garantierte Haltbarkeit von ca. 68 Jahren. Aber die meisten EEproms werden erst nach dem 10fachen Wert endgültig zerstört. Die angegebenen 100.000 Zyklen sind nur der Wert, den der Hersteller garantiert und der greift da mit Sicherheit nicht zum Grenzwert.
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Hier ein recht lesenswerter Artikel zum Erzeugen "echter" Zufallszahlen in embedded Systemen: ncbi.nlm.nih.gov/pmc/articles/PMC4634515/

      Die Rnd-Funktion liefert eine deterministische Zahlenreihe, wobei jede Zahl möglichst gleich oft vorkommen sollte. Die Reihenfolge, in der die Zahlen erzeugt werden, wird durch den Startwert ___rseed festgelegt. Wenn ___rseed den selben Wert bekommt, wird auch dieselbe Zahlenreihe erzeugt.
      Also: Rnd() hat keinen Zufall (Entropie). Daher kann der "Zufall" auch nicht verbessert werden, wenn man den Seed mit Rnd() festlegt.
      Je zufälliger also der Wert vom Seed ist desto zufälliger sind meine generierten Zahlen.

      Der Controller selbst arbeitet aber leider (vielleicht auch gut so...) sehr deterministisch, ist also als Quelle für Entropie wenig zu gebrauchen, daher nimmt man dafür irgendwelche äußeren physikalischen Einflüsse, zb. das Rauschen des LSB vom ADC (aber auch hier gibt es Unterschiede, siehe obigen Link), Zeit zwischen externen Interrupts, ...
      Wichtig ist aber, dass diese völlig unabhängig vom Controller ist. Die Zeit, die der Controller zum booten braucht, ist auch nur eine festgelegte Anzahl von Befehlen und damit deterministisch...

      Um den Startwert aus einer 1-Bit-Zufallsquelle zu erhalten (hier das LSB vom ADC) muss 16x gesampelt (___rseed = Word) und die Bits der Reihe nach zusammengesetzt werden.
      x-mal LSB samplen und addieren verringert die Entropie, weil der Startwert dann nur Werte von 0 bis max. x annehmen kann und damit nicht den ganzen Wertebereich der 16 bit ausnutzt (außer du samplest 65536x, dauert halt etwas :) )
      Pseudocode:

      Quellcode

      1. For X = 0 to 15
      2. EntropyBit = LSB(GetAdc)
      3. NewSeed.X = EntropyBit
      4. Next
      5. ___rseed = NewSeed
      Wenn der TE nur bei jedem Start andere Zahlen haben möchte, ist die Lösung mit Zwischenspeichern EEPROM wohl die einfachste, erzeugt aber auch eine deterministische Zahlenfolge. D.h. 2 Controller (die gleich oft resettet werden) werden auch immer die selben Zufallszahlen erzeugen.
    • ceperiga schrieb:

      Jetzt wird´s philosophisch
      JA.......
      So nun nach vielen Praxistest schließe ich mich an den Vertretern der Variante ADC als Startwert zu nuten an.
      Mit meiner Idee kann ich auch den µC nicht dazu bringen fast zuverlässig, auch mit großem SW- Aufwand, mit ein Zufallswert zu starten.
      Aktuell habe ich eine LED an adc(0) gegen GND und 1n Kondensator parallel(Reference = 2,56). Hat natürlich den Nachteil LED muss in Raum schauen aber auch den Vorteil ist gleich ein Lichtsensor. Nach 12000 Start bis jetzt keinen gleichen Startwert gehabt.

      Nun wieder was gelernt, es ist nicht so einfacher in der Digitwelt ein Zufallswert zu erzeugen.
      Hab ja bis dato immer gehofft das so was nicht passiert.

      Obwohl Thema realistisch betrachtet. Wer schaltet schon freiwillig die Energiequelle des µC ab? Hier liegt ja das Hauptproblem was zur Diskussion führte.
      Egal. Dies sind Themen die dieses Forum lesenswert machen. Man beschäftig sich mit Sachen auf die man vorab nicht mal im Traum kam und es wird bis zum Schluss ausdiskutiert. Obwohl der TE schon für seine Anwendung eine Lösung fand.
      Für mich ist es nun der lehrreiche Abschlusspunkt.
      Mit freundlichen Grüßen