Ein kleiner Mikrocontroller (8-Bit-Atmel) steuert eine Reihe von Lichtern, um eine Lichtshow mit vielen ausgefallenen zufälligen Lichtsequenzen zu präsentieren.
Ein geeignetes Pseudo-RNG macht seine Arbeit gut, aber ich suche einen guten Samen dafür. Ein Startwert ist erforderlich, da es nicht gut aussieht, wenn jemand mehrere solcher Geräte gleichzeitig einschaltet, wenn alle dieselben Effektsequenzen erzeugen, bis sie aufgrund der winzigen Unterschiede in ihren einzelnen Taktquellen langsam auseinander driften.
Eine sehr gute Methode, um ein Pseudo-RNG zu setzen, das ich oft verwendet habe, ist bei einem Gerät möglich, das per Knopfdruck oder durch Drücken eines Schalters gestartet werden muss. Sobald der µc eingeschaltet ist, kann ein sehr schneller Timer gestartet werden, und der Wert dieses Timers setzt den RNG, sobald die Taste zum ersten Mal gedrückt wird.
Das Problem ist, dass in diesem Szenario keine Schaltflächen vorhanden sind. Das Programm muss gestartet werden, sobald das Gerät eingeschaltet wird.
Der Platz auf der Leiterplatte ist extrem begrenzt (es passen möglicherweise nicht mehr als ein paar der kleinsten SMD-Teile), daher suche ich nach der kleinsten und einfachsten möglichen Lösung. Daher schließe ich ausgefallene Lösungen wie echte RNG-Hardware, Funkempfänger usw. aus.
Alles, was ich habe, ist ein 16-Bit-Timer-Zähler in der CPU und ein unbenutzter Portpin, der Zugriff auf einen ADC hat.
Meine derzeitige Lösung besteht darin, nur einen Widerstand (so ungenau wie möglich) zu verwenden, um ungefähr die Hälfte der Versorgungsspannung für den ADC-Pin bereitzustellen, und den RNG mit dem ersten AD-Umwandlungswert zu setzen. Heutzutage haben die meisten 10% -Widerstände jedoch eine Ungenauigkeit von weit unter 1% (es wäre lustig, sich das Gesicht eines Lieferanten vorzustellen, wenn ich ihnen sage, dass wir die schlechtesten SMD-Widerstände suchen, die sie finden können), daher besteht eine sehr hohe Wahrscheinlichkeit für mehrere Einheiten, die mit demselben Samen beginnen.
Eine bessere Alternative wäre, mehrere Konvertierungen durchzuführen und einen Wert aus den niedrigstwertigen Bits dieser Messungen zu erstellen. Ich habe jedoch zuvor den ADC dieses µc-Typs verwendet und weiß, dass er sehr genau ist. Hier kann es hilfreich sein, den ADC mit der schnellstmöglichen Geschwindigkeit zu betreiben.
Hat jemand einen besseren Vorschlag? Es ist nicht erforderlich, dass das Saatgut perfekt gleichmäßig verteilt ist, aber je gleichmäßiger die Verteilung ist, desto besser. Ein 16-Bit-Startwert mit einer vollkommen gleichmäßigen Verteilung wäre ein Traum, der zu schön ist, um wahr zu sein, aber ich denke, eine halbwegs anständige Verteilung über 5 oder 6 Bits könnte ausreichen.