Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Случайные числа
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
LoLo
Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.
kovigor
Цитата(LoLo @ Apr 19 2013, 08:37) *
Как реализовать в кейле генератор случайных чисел для 51 контроллера? Заранее спасибо.

Функция "rand()":

http://www.mir-koda.ru/full_leson.php?id=8
LoLo
Цитата(kovigor @ Apr 19 2013, 14:27) *


Фнкция Rand будет выдавать одно и тоже число, если не использовать srand. А в srand надо записывать разные числа. По приведенной выше ссылке туда записывается time(NULL).
Для контроллеров нет такой функции!!!
kovigor
Цитата(LoLo @ Apr 19 2013, 13:48) *
Фнкция Rand будет выдавать одно и тоже число, если не использовать srand

Какой именно у вас МК ? Можно же взять, например, шум младшего разряда АЦП. Или время, проходящее от момента запуска любой из PLL до того момента, как она засинхронизируется (именно так я делал на LPC214x, результат очень приличный). Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...
toweroff
Цитата(kovigor @ Apr 19 2013, 17:04) *
Думайте, думайте. Я уже молчу о том, что внешний аналоговый генератор шума можно собрать на каком-нибудь стабилитроне ...

С PLL да, интересно. А с внешним стабилитроном - это до тех пор, пока "пацаны-то не знают"
Потом сразу начинается закорачивание входов на массу и т.д. и результат srand становится абсолютно предсказуемым
редактор
Чтение таймера в произвольный момент времени. Период таймера желательно иметь меньше чем период чтения его содержимого, ну и чтение должно быть несильно ко времени привязано. Можно взять два таймера, с разной частотой (периодом) счета и брать функцию от них (сумма, XOR, перемножение с отбрасыванием младшей (старшей) части, выбор из области кода по полученному индексу). Для особо продвинутых моделей можно задействовать встроенный датчик температуры для получения ШУМА АЦП.
kovigor
Цитата(редактор @ Apr 22 2013, 11:22) *
Чтение таймера в произвольный момент времени.

Вот в этом и проблема. Неясно, какой именно момент времени считать произвольным - они все так или иначе детерминированы программой, исполняющейся в МК. Я этого дела наелся по самые уши, понапробовался всяких "моментов" и больше не хочу - качество случайных чисел, генерируемых таким образом, получается очень низким. А вообще, хорошие генераторы используют множество источников энтропии, а не один. Я в своем проекте остановился на генераторе FORTUNA, разработанном Брюсом Шнайером и Нильсом Фергюсоном, который "кормлю" энтропией из пяти или шести источников:
http://www.rsdn.ru/res/book/security/practicalcrypto.xml
ViKo
Если есть часы реального времени, можно их использовать.
Если есть органы управления, замерить время между X и Y нажатиями на кнопки.
scifi
Ещё вариант: инициализировать генератор случайных чисел на этапе калибровки, в дальнейшем сохраняя состояние генератора в энергонезависимой памяти, если есть такая возможность.
ARV
Цитата(scifi @ Apr 22 2013, 20:36) *
Ещё вариант: инициализировать генератор случайных чисел на этапе калибровки, в дальнейшем сохраняя состояние генератора в энергонезависимой памяти, если есть такая возможность.
это наиболее простой путь sm.gif при прошивке задать некий "серийный номер", который при включении питания считать и использовать для srand(), а потом при выключении питания запоминать последнее "случайное" число из rand() на месте серийного номера. в результате каждое изделие будет работать по-своему...
Fujitser
Стандартная функция генерации псевдослучайных чисел, в качестве seed можно использовать, например, показания часов реального времени (если есть), время нажатия на какие-либо кнопки (если они есть), шум младших разрядов АЦП, и т.п.
paskal
В классическом 8051 без АЦП, RTC, EEPROM и.т.п. можно использовать содержимое озу при включении. На всякий случай можно перексорить весь объем.
А на случай ресета, одну ячейку непрерывно менять, инкрементировать на 1 например.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.