Un pequeño microcontrolador (Atmel de 8 bits) controla varias luces para presentar un espectáculo de luces con muchas secuencias de luces aleatorias de fantasía.
Un pseudo-RNG adecuado hace su trabajo muy bien, pero estoy buscando una buena semilla para ello. Será necesaria una semilla porque si alguien enciende múltiples dispositivos al mismo tiempo, no se verá bien si todos generan las mismas secuencias de efectos hasta que se separen lentamente debido a las pequeñas diferencias en sus fuentes de reloj individuales. / p>
Un método muy bueno para sembrar un pseudo-RNG, que uso a menudo, es posible en el caso de un dispositivo que debe iniciarse presionando un botón o presionando un interruptor. Tan pronto como se enciende el µc, se puede iniciar un temporizador muy rápido, y el valor de este temporizador siembra el RNG tan pronto como se presiona el botón por primera vez.
El problema es que, en este escenario, no hay botones. El programa debe iniciarse tan pronto como se encienda el dispositivo.
El lugar en el PCB es extremadamente limitado (no caben más que algunas de las piezas SMD más pequeñas), así que estoy buscando la solución más pequeña y simple posible. Por lo tanto, descartaré soluciones sofisticadas como hardware RNG verdadero, receptores de radio, etc.
Todo lo que tengo es un contador de temporizador de 16 bits en la CPU, y un puerto no utilizado que tiene acceso a un ADC.
Mi solución actual es usar una resistencia (lo más inexacta posible) para proporcionar aproximadamente la mitad de la tensión de alimentación al pin del ADC, y sembrar el RNG con el primer valor de conversión de AD. Sin embargo, en la actualidad, la mayoría de las resistencias del 10% tienen una inexactitud muy por debajo del 1% (sería divertido imaginar la cara de un proveedor cuando les digo que queremos las resistencias SMD de peor calidad que puedan encontrar), por lo que hay una posibilidad muy alta de unidades múltiples comenzando con la misma semilla.
Una mejor alternativa sería realizar conversiones múltiples y construir un valor a partir de los bits menos significativos de estas mediciones. Sin embargo, antes he usado el ADC de este tipo µc y sé que es muy preciso. Ejecutar el ADC a la velocidad más rápida posible podría ayudar aquí.
¿Alguien tiene una sugerencia mejor? No se requiere que la semilla esté perfectamente distribuida uniformemente, pero cuanto más uniforme sea la distribución, mejor. Una semilla de 16 bits con una distribución perfectamente uniforme sería un sueño demasiado bueno para ser verdad, pero creo que una distribución media decente de 5 o 6 bits podría ser suficiente.