Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega8515 + внешний генератор через USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Dante Krieger
Доброго времени суток!
Есть такое учебное задание - составить генератор случайных чисел (не псевдо случайных, а именно случайных).
Все что есть - атмега и подключенный к PD4 R-C генератор частоты.
Собственно генератор:

Частота генератора ~10кГц. Мне кажется, что нужно при помощи USARTа считать импульсы, хотя возможно и ошибаюсь.
С USARTом почти не работал.
Проверка будет проводится путем подачи RESETа на МК.
Подскажите, у кого какие идеи еще могут быть. Желательно с кусочками кода :-)
Заранее благодарен!
zombi
Что то сомневаюсь что соорудить из того что есть генератор "не псевдо случайных, а именно случайных" чисел невозможно!
Если нужен генератор именно случайный то необходим еще как минимум случайный раздражитель (человек,счетчик гейгера и т.д.)
_guardianangel
генератор белого шума можно собрать на стабилитроне. И снимать сигнал АЦП меги. По другому как то не придумывается.
kovigor
QUOTE (Dante Krieger @ Nov 17 2010, 06:09) *
...


А почему бы, например, АЦП не использовать ? Таким путем генератор случайных (!!!) чисел сделать невозможно. Сделайте, а потом чисто для интереса посчитайте ту же энтропию. Вот смеху-то будет smile.gif Барахло все это. Разве что для студенческой поделки и сгодится. Если интересуют детали, то почитайте хотя бы того же Брюса Шнайера. Там и код есть, причем приводятся исходники на Си. А вот это вам просто для общего развития:

http://habrahabr.ru/blogs/python/62237/
xxxdarksxx
QUOTE (kovigor @ Nov 17 2010, 10:34) *
...



в 8515 АЦП нету, сам такой купил когда вообще не знал ничего о контроллерах, теперь понял, нужно другой покупать(((
Dante Krieger
Дело в том, что вся эта трагедия происходит на лабораторном стенде и само задание звучит как на этом генераторе собрать генератор случайных чисел. Мне почему-то в голову пришла мысль поотлавливать шумы с ножек. Как думаете, возможен ли такой вариант?
---
UPD: а если каким-то образом выдать первое случайное число (пусть даже псевдослучайное). Записать его. Запустить таймер и складывать его счетчик с этим числом пока не нажмем reset. После нажатия reset'а мы заново считаем последнее сохраненное число и снова проводим манипуляцию с таймером.
kovigor
Цитата(Dante Krieger @ Nov 17 2010, 19:24) *
Дело в том, что вся эта трагедия происходит на лабораторном стенде и само задание звучит как на этом генераторе собрать генератор случайных чисел. Мне почему-то в голову пришла мысль поотлавливать шумы с ножек. Как думаете, возможен ли такой вариант?
---
UPD: а если каким-то образом выдать первое случайное число (пусть даже псевдослучайное). Записать его. Запустить таймер и складывать его счетчик с этим числом пока не нажмем reset. После нажатия reset'а мы заново считаем последнее сохраненное число и снова проводим манипуляцию с таймером.


Вариантов масса. На вашей схеме нарисован простейший генератор. И частота этого генератора плавает в очень широких пределах, в зависимости от той же температуры и напряжения питания. Отсюда первое, что приходит на ум: подсчитывать, например, прерывания от кварцованного таймера, реализованного в вашем МК, в течение высокого уровня напряжения, поступающего от предлагаемого RC - генератора. Т.е., входим в обработчик и проверяем, единичка ли на линии, тактируемой генератором. Если да, увеличиваем счетчик на "1". Если нет, то считаем, что получено очередное случайное число; кладем его в массив или выводим по UART. Рекомендую второе. Ибо в этом случае вы можете передать массив чисел в компьютер и протестировать получившуюся последовательность случайных чисел. Немного подумав, вы и сами предложите не один десяток способов получения СЧ с помощью этого генератора. Но предупреждаю, что качество этих чисел будет весьма низким. В реальных генераторах для его повышения, в частноти, смешивают энтропию от разных источников. Например, вы можете дополнительно к этому генератору задействовать еще и АЦП или компаратор. Как это сделать ? Читайте того же Шнайера или Кнута. Тема эта очень обширная и сложная, и в двух словах ее не раскрыть ...
Dante Krieger
ясно. Но в принципе, мне кажется, что гораздо проще будет обойтись без USART'а. А просто прочитать количество импульсов за какое-то время таймера. И просто вывести на индикацию - и вполне хватит, как для условия задания.
Всем спасибо за ответы!
kovigor
Цитата(Dante Krieger @ Nov 17 2010, 21:15) *
ясно. Но в принципе, мне кажется, что гораздо проще будет обойтись без USART'а. А просто прочитать количество импульсов за какое-то время таймера. И просто вывести на индикацию - и вполне хватит, как для условия задания.
Всем спасибо за ответы!


Если сдать и забыть, то хватит. А если хотите хоть немного разобраться и хоть что-то отложить в голове, то очень советую все же передать полученные числа в машину и провести простейшие тесты. Поверьте, вы узнаете массу нового и интересного ...
Dante Krieger
Не совсем сдать и забыть. Дело в том, что это лабораторный стенд EV8031, а задание было предложено на олимпиаде, но сейчас оно входит в лабораторный практикум. Меня просто смутила тема с USART'ом, т.к. он немного "дальше". Вообще эта тема идет в рамках темы сопряжения двух Атмег или Атмега + СОМ порт.
Кстати, раз уж зашла такая тема, спрошу тут, чтоб потом не создавать новую тему.
Этот же самый стенд предназначен для работы только с СОМ портом, но на ноуте у меня такового не имеется. С прошивкой нормально - шьюсь программатором AVR910. Но вот с обменом информацией будут проблемы. Есть идея использовать переходник COM2USB, но не знаю, будет ли работать?
ReAl
Цитата(zombi @ Nov 17 2010, 07:53) *
Что то сомневаюсь что соорудить из того что есть генератор "не псевдо случайных, а именно случайных" чисел невозможно!
Если нужен генератор именно случайный то необходим еще как минимум случайный раздражитель (человек,счетчик гейгера и т.д.)
«Проверка будет происходить путём подачи RESET на МК»
Вот и случайный раздражитель — генератор лупит от подачи питания, а кнопку сброса нжимают при проверке. При каждом сбросе старт программы будет в случайно-разной фазе генератора, подсчёт числа тактов до перепада на выходе генератора даст «истинно случайное число».


Цитата(Dante Krieger @ Nov 17 2010, 22:14) *
это лабораторный стенд EV8031, а задание было предложено на олимпиаде, но сейчас оно входит в лабораторный практикум.
Да-да, именно так :-)
Dante Krieger
Тоесть, если я правильно понял, при RESET'е таймер не сбрасывается?
ReAl
Таймер сбрасывается, как и весь микроконтроллер. А вот генератор на инверторах — нет. И момент нажатия кнопки «сброс» асинхронен по отношению к генератору на инверторах и случаен. Поэтому случайно время от отпускания сброса до ближайшего перепада генератора.

Ну, если генератор на инверторах нигде больше не используется в обвязке микроконтроллера... Там, в альтеринке.
Это надо обвязку смотреть... Если от этого же генератора кнопка сброса микроконтроллера подсинхронизируется, то числа окажутся от запуска к запуску почти одинаковыми, с точностью до шумка.
Кажется, такая беда вполне может быть. Если в документации на стенд этого нет, спросите о нюансах на форуме у производителя стенда.

Тогда лучше брать тот второй генератор на стенде, который с переменным резистором.
ILYAUL
Вот так всегда , когда не надо , генератор случайных чисел получается запросто. Достаточно допустить ошибку в коде biggrin.gif
Я бы всё таки использовал USART , загоняя ему в UBR число которое только что прочитал, отгадать , что получишь в следующий раз - невозможно.Конечно можно немного ещё "помудрив" с ним.
Т.е. прочитал чёрт знает что и ещё и режим установил черт знает какой.
Dante Krieger
Только что написал:
Код
int main()
{
    init_hard();
    _delay_ms(15);
    while(TCNT1 < 2000)
    {
        if(!(bit_is_set(PIND,4)))
        {
            a += TCNT1;
        }
        else if(bit_is_set(PIND,4))
        {
            //;
        }
    }
    _delay_ms(12);
    *lefti = a;
}

Работает на "ура" :-)
Причем и при нажатии RESET и при полном выключении питания. ВотЪ)
------
UPD: еще раз всем спасибо за советы)
Еще только не остался отвеченным пост про COM2USB переходник)
aleksey_g
А почему бы ему не работать? (если он жив)
Согласуйте полярности сигналов, настройте USART и вперед!
GDI
Цитата(Dante Krieger @ Nov 18 2010, 01:02) *
Еще только не остался отвеченным пост про COM2USB переходник)
Конечно будет работать, для того и придуманы эти переходники, более того в вашем программаторе этот переходник реализован программным способом.
Dante Krieger
хм... ясно... тогда круто. Сейчас буду экспериментировать.
Всем спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.