Um pequeno microcontrolador (Atmel de 8 bits) controla várias luzes para apresentar um show de luzes com muitas sequências de luzes aleatórias sofisticadas.
Um pseudo-RNG adequado faz seu trabalho bem, mas estou procurando uma boa semente para ele. Uma semente será necessária porque se alguém ligar vários dispositivos ao mesmo tempo, não parecerá bom se todos gerarem as mesmas seqüências de efeitos até que se afastem lentamente devido às pequenas diferenças em suas fontes de relógio individuais.
Um método muito bom para propagar um pseudo-RNG, que eu costumava usar, é possível no caso de um dispositivo que deve ser iniciado pressionando um botão ou pressionando um botão. Assim que o µc for ligado, um timer muito rápido poderá ser iniciado, e o valor desse timer semeará o RNG assim que o botão for pressionado pela primeira vez.
O problema é que, nesse cenário, não há botões. O programa deve iniciar assim que o dispositivo for ligado.
O local no PCB é extremamente limitado (nada mais do que algumas das menores peças SMD podem caber), então estou procurando a solução menor e mais simples possível. Portanto, descartarei soluções sofisticadas, como o verdadeiro hardware RNG, receptores de rádio etc.
Tudo o que tenho é um contador de timer de 16 bits na CPU e um alfinete de porta não utilizado que tenha acesso a um ADC.
Minha solução atual é usar apenas um resistor (o mais impreciso possível) para fornecer aproximadamente metade da tensão de alimentação ao pino do ADC e propagar o RNG com o primeiro valor de conversão do AD. No entanto, hoje em dia a maioria dos resistores de 10% tem uma imprecisão bem abaixo de 1% (seria divertido imaginar o rosto de um fornecedor quando eu lhes digo que queremos os resistores SMD da pior qualidade que eles encontrarem), então há uma chance muito alta de várias unidades começando com a mesma semente.
Uma alternativa melhor seria fazer várias conversões e criar um valor a partir dos bits menos significativos dessas medidas. No entanto, eu usei o ADC desse tipo µc antes e sei que é muito preciso. A execução do ADC na velocidade mais rápida possível pode ajudar aqui.
Alguém tem uma sugestão melhor? Não é necessário que a semente seja perfeitamente distribuída uniformemente, mas quanto mais uniforme for a distribuição, melhor. Uma semente de 16 bits com uma distribuição perfeitamente uniforme seria um sonho bom demais para ser verdade, mas acho que uma distribuição decente na metade de 5 ou 6 bits pode ser suficiente.