Un pequeño microcontrolador (Atmel de 8 bits) controla una serie de luces para presentar un espectáculo de luces con muchas secuencias de luces aleatorias elegantes.
Un pseudo-RNG adecuado hace bien su trabajo, pero estoy buscando una buena semilla para él. Será necesaria una semilla porque si alguien enciende múltiples dispositivos de este tipo al mismo tiempo, no se verá bien si todos generaron las mismas secuencias de efectos hasta que se separen lentamente debido a las pequeñas diferencias en sus fuentes de reloj individuales.
Un método muy bueno para sembrar un pseudo-RNG, que solía usar, 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 genera 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 la PCB es extremadamente limitado (nada más que algunas de las piezas SMD más pequeñas pueden caber), por lo 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 portpin 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 del voltaje de alimentación al pin ADC, y sembrar el RNG con el primer valor de conversión AD. Sin embargo, hoy en día la mayoría de las resistencias del 10% tienen una imprecisión 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 gran probabilidad de unidades múltiples que comienzan con la misma semilla.
Una mejor alternativa sería hacer conversiones múltiples y construir un valor a partir de los bits menos significativos de estas mediciones. Sin embargo, usé el ADC de este tipo µc antes y sé que es muy preciso. Ejecutar el ADC a la velocidad más rápida posible podría ayudar aquí.
¿Alguien tiene una mejor sugerencia? No es necesario que la semilla esté distribuida de manera perfectamente uniforme, 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 más de 5 o 6 bits podría ser suficiente.