소형 마이크로 컨트롤러 (8 비트 Atmel)는 수많은 무작위 무작위 조명 시퀀스로 조명 쇼를 나타 내기 위해 많은 조명을 제어합니다.
적절한 의사 RNG가 잘 작동하지만 좋은 씨앗을 찾고 있습니다. 누군가가 동시에 여러 장치를 켜면 개별 클럭 소스의 작은 차이로 인해 천천히 표류 할 때까지 동일한 효과 시퀀스를 생성하면 좋지 않을 것이므로 시드가 필요합니다.
내가 자주 사용하는 pseudo-RNG를 시드하는 매우 좋은 방법은 버튼을 누르거나 스위치를 돌려서 시작 해야하는 장치의 경우 가능합니다. µc의 전원을 켜 자마자 매우 빠른 타이머를 시작할 수 있으며이 타이머의 값은 버튼을 처음으로 누르는 즉시 RNG를 시드합니다.
문제는이 시나리오에서 버튼이 없다는 것입니다. 장치의 전원을 켜 자마자 프로그램을 시작해야합니다.
PCB의 위치는 극히 제한적 이며 (가장 작은 SMD 부품 중 일부만 적합 할 수는 없음) 가장 작고 간단한 솔루션을 찾고 있습니다. 따라서 진정한 RNG 하드웨어, 라디오 수신기 등과 같은 멋진 솔루션을 배제하겠습니다.
내가 가진 것은 CPU의 16 비트 타이머 카운터와 ADC에 액세스 할 수있는 사용되지 않는 포트 핀입니다.
내 현재 솔루션은 저항을 사용하여 가능한 한 정확하지 않은 ADC 핀에 공급 전압의 약 절반을 제공하고 첫 번째 AD 변환 값으로 RNG를 시드하는 것입니다. 그러나 현재 대부분의 10 % 저항기는 1 % 미만의 정확도를 가지고 있습니다 (공급 업체가 최악의 품질의 SMD 저항기를 찾을 수 있다고 말하면 재미있을 것입니다). 동일한 시드로 시작하는 여러 유닛.
더 나은 대안은 여러 변환을 수행하고 이러한 측정에서 가장 중요하지 않은 값으로 값을 작성하는 것입니다. 그러나 나는 이전에이 µc 유형의 ADC를 사용했으며 매우 정확하다는 것을 알고 있습니다. 가장 빠른 속도로 ADC를 실행하면 도움이 될 수 있습니다.
더 나은 제안이 있습니까? 종자는 완벽하게 균일하게 분포 될 필요는 없지만, 분포가 균일할수록 더 좋습니다. 완벽하게 균일 한 분포를 가진 16 비트 시드는 현실화하기에는 너무 좋은 꿈이지만 5 또는 6 비트에 대한 중간 정도의 분포는 충분하다고 생각합니다.