Un petit microcontrôleur (Atmel 8 bits) contrôle un certain nombre de lumières afin de présenter un spectacle lumineux avec de nombreuses séquences lumineuses aléatoires fantaisistes.
Un pseudo-RNG approprié fait bien son travail, mais je cherche une bonne graine pour cela. Une graine sera nécessaire, car si quelqu'un allume plusieurs de ces dispositifs en même temps, il ne semblera pas bon qu'ils génèrent tous les mêmes séquences d'effets jusqu'à ce qu'ils se séparent lentement en raison des différences minimes entre leurs sources d'horloge individuelles.
Une très bonne méthode pour générer un pseudo-RNG, que j'ai souvent utilisée, est possible dans le cas d'un périphérique devant être démarré par une simple pression sur un bouton ou un commutateur. Dès que le µc est mis en marche, une minuterie très rapide peut être démarrée et la valeur de cette minuterie sème le RNG dès que le bouton est pressé pour la première fois.
Le problème est que, dans ce scénario, il n'y a pas de boutons. Le programme doit démarrer dès que l'appareil est allumé.
La place sur le circuit imprimé est extrêmement limitée (seules quelques-unes des plus petites pièces CMS peuvent être utilisées), je recherche donc la solution la plus petite et la plus simple possible. Par conséquent, j'éliminerai les solutions sophistiquées telles que le vrai matériel RNG, les récepteurs radio, etc.
Tout ce que j'ai est un compteur de minuterie 16 bits dans la CPU, et un portpin inutilisé qui a accès à un ADC.
Ma solution actuelle consiste simplement à utiliser une résistance (aussi imprécise que possible) pour fournir environ la moitié de la tension d'alimentation à la broche du convertisseur analogique-numérique, et ensemencer le générateur de base de réseau avec la première valeur de conversion AD. Cependant, de nos jours, la plupart des résistances à 10% ont une imprécision bien inférieure à 1% (il serait amusant d’imaginer le visage d’un fournisseur lorsque je leur dis que nous voulons les résistances CMS les plus médiocres qu’elles puissent trouver). plusieurs unités commençant par la même graine.
Une meilleure solution consisterait à effectuer plusieurs conversions et à créer une valeur à partir des bits les moins significatifs de ces mesures. Cependant, j’avais utilisé un ADC de ce type avant et je sais que c’est très précis. Faire fonctionner le CAN à la vitesse la plus rapide possible pourrait aider ici.
Quelqu'un a-t-il une meilleure suggestion? Il n'est pas nécessaire que la graine soit parfaitement uniformément distribuée, mais plus la distribution est uniforme, mieux c'est. Une graine de 16 bits avec une distribution parfaitement uniforme serait un rêve trop beau pour être vrai, mais je pense qu'une distribution à peu près décente sur 5 ou 6 bits pourrait suffire.