|
|
  |
Генератор шума на AVR, Как сделать на ASM |
|
|
|
Dec 4 2006, 22:28
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(Oldring @ Dec 4 2006, 23:16)  Тогда используйте LFSR и не парьтесь. На каждый вызов подпрограммы (получение одного бита) - сдвиг на один бит и с вероятностью 1/2 XOR регистра с константой. Какой требуется минимальный период повторения последовательности? 1. А что означает "сдвиг на один бит и с вероятностью 1/2 XOR регистра "? 2. Период повторения для 16 бит будет 65535 (или 32767), что для звуковых целей вполне устроит.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Dec 4 2006, 22:48
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(Oldring @ Dec 4 2006, 23:39)  Интересует период повторения для одного бита. 2^16 или 2^20 ? Прошу прощения, не понял. Что такое "период повторения для одного бита"? Требуемый период повторения побитно выводимого числа - 16 битов.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Dec 4 2006, 22:58
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата ldi r19, #87h lsl r16 sbrc r18, 7 eor r16, r19 rol r17 rol r18 Очередной бит - в С. Или в r16.0, если больше нравится. Период повторения должен быть 2^24 - 1. Между вызовами нужно сохранять r16, r17, r18. Любой из этих регистров нужно проинициализировать чем-нибудь ненулевым. Цитата(Nanobyte @ Dec 4 2006, 22:48)  Прошу прощения, не понял. Что такое "период повторения для одного бита"? Требуемый период повторения побитно выводимого числа - 16 битов. Это означает, что в любом случае Вы выводите не последовательность чисел, а последовательность битов. Так как она псевдослучайная - у нее есть период повторения. Как генератор 16-битных псевдослучайных чисел этот генератор неидеален, но на слух вряд-ли кто-то что-то заметит.
--------------------
Пишите в личку.
|
|
|
|
|
Dec 4 2006, 23:07
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(Oldring @ Dec 4 2006, 23:58)  Как генератор 16-битных псевдослучайных чисел этот генератор неидеален, но на слух вряд-ли кто-то что-то заметит. Совершенно верно. Спасибо за пример реализации. Буду пробовать.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Dec 5 2006, 00:42
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-11-06
Из: Tromsoe, Norway
Пользователь №: 22 821

|
Цитата(Oldring @ Dec 4 2006, 22:16)  И разрядность числа возрастает бесконечно В любом случае, это наверняка очень плохой генератор псевдослучайных чисел, раз Кнут о нем не упоминает  это каким это образом разрядность будет возрастать бесконечно, в AVR бесконечные регистры по длине?  естественно подразумевалось периодическое обнуление seed'a. Да и придираться особо не надо, этот метод был предложен в 1946 году и в плане обучения, так для расширения кругозора очень даже подходит
|
|
|
|
|
Dec 5 2006, 02:12
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Nanobyte @ Dec 4 2006, 22:28)  2. Период повторения для 16 бит будет 65535 (или 32767), что для звуковых целей вполне устроит. Нет, не будет (65536 или 32768) У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много. Если у Вас есть реализация CRC16 на asm, то попробуйте просто подсовывать ей значения в цикле например так: 1,2,3,4,..... ну или так: 1,2,3,5,8,13,21,..... ну или так: выберите максимальное простое число xxxxx в диапазоне 0-65535 с него и начните подсовывать xxxxx, 2*xxxxx/65536, 3*xxxxx/65536, .... Типа, вариантов куча. Просто нужно протестировать какой длинны последовательность Вы будете полчать до зацикливания. Удачи.
|
|
|
|
|
Dec 5 2006, 02:28
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(singlskv @ Dec 5 2006, 03:12)  Нет, не будет (65536 или 32768) У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много. Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом. Ну, а что касается IAR, то его функции и библиотеки могут быть просто недоработаны, или написаны студентами в качестве курсовой работы (IMHO, конечно). Сталкивался с такими примерами для компонентов Delphi. Отбил весь лоб на поле с граблями, плюнул и написал необходимое сам.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Dec 5 2006, 02:55
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Nanobyte @ Dec 5 2006, 02:28)  Цитата(singlskv @ Dec 5 2006, 03:12)  Нет, не будет (65536 или 32768) У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много. Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом. Ну, а что касается IAR, то его функции и библиотеки могут быть просто недоработаны, или написаны студентами в качестве курсовой работы (IMHO, конечно). Сталкивался с такими примерами для компонентов Delphi. Отбил весь лоб на поле с граблями, плюнул и написал необходимое сам. Попробуйте выяснить какая у Вас получится длинна последовательности 16битнных значений. ИМХО, в IAR должно получаться не меньше. А то, что на слух Вас устраивает, так это всего лишь ознаает что Вы изначально завышали свои требования к случайности сигнала. Тот код который Вам привел Oldring, это ИМХО, некоторые вариации на темму CRC8
|
|
|
|
|
Dec 5 2006, 09:39
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
RND.zip ( 8.04 килобайт )
Кол-во скачиваний: 158Странно что поиск ничего не дал?! http://electronix.ru/forum/index.php?showtopic=22174&hl=Вот непомню где нашел, прикладываю (asm) (правда псевдо RND- по понятным причинам), но переделывал под свою прогу... все ок. Была необходимость чтобы в начале работы нескольких контроллеров было RND значение, вот с этим парился..и ничего лучшего чем прописать в несколько контроллеров разные константы не нашел. зы:внешние элементы не катят..разбежка внутренних генераторов тоже. код он и есть код зы2: clr r16 clr r17 sbrc r3,6 ;39 sbr r16,1<<0 ;XXXXXXXA sbrs r3,2 ;35 sbr r17,1<<0 ;XXXXXXXB eor r17,r16 ;Xor ror r17 ;Put bit 0 in carry ;Bits Hill's bits rol r1 ;7-0 8-1 rol r2 ;15-8 16-9 rol r3 ;23-16 and so on rol r4 ;31-17 зы: можно сделать любую разрядность псевдо rnd.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Dec 5 2006, 10:00
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(Nanobyte @ Dec 5 2006, 02:28)  Ну почему-же не будет? Кусочек кода, приведённый Oldring, я только что попробовал. Работает вроде-бы нормально (детально не проверял). Самое главное, уяснил принцип, теперь подберу коэффициенты для получения последовательности максимальной длины. Хотя, на слух, меня вполне устраивает шум, сгенерированный приведённым в примере кодом. Если я не ошибся с переводом восьмеричных чисел в шестнадцатеричные  использованный мною полином дает последовательность максимальной длины 2^24-1. Можете это протестировать экспериментально. Цитата(singlskv @ Dec 5 2006, 02:12)  У IAR при старте генератора псевдослучайных чисел с 1 зацикливание происходит примерно после 2000 значений, при старте с 2 чуть побольше, но тоже не так уж и много. Смешно. Настолько стало любопытно что даже посмотрел что IAR генерирует, хоть я и не брался за AVR уже давно. IAR3.2. Применен 32-битный линейный конгруэнтный генератор, при этом берутся старшие 16 бит. Реализация использует библиотечную функция умножения 32-битных беззнаковых чисел. То есть, медленно но стандартно. Скорее всего, Вас ввело в заблуждение то, что для такого генератора повторение 16-битного числа не означает повторение последовательности. Период повторения последовательности должен быть равен 2^32 чисел.
--------------------
Пишите в личку.
|
|
|
|
|
Dec 5 2006, 10:27
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Nanobyte @ Dec 4 2006, 20:14)  Здравствуйте, коллеги. Необходимо генерировать шумовой сигнал на одном из выводов МК. Как я понимаю, используя генератор псевдослучайных чисел, можно получить требуемый результат. Разрядность числа вполне устроит 16 бит. Поиск по форуму даёт реализации только на Си. Вопрос: как это сделать, используя ассемблер? Может, кто нибудь из Вас уже делал такой ГПСЧ ? Спасибо. Я сделал генератор ПСЧ на 31 бит так: Код name Rand ; ; ; File: rand.s90 ; ; 08-Sep-05 BK Initial edit ; 28-Sep-05 BK Last update ; $fmacros.inc
rseg CODE ; Code segment ; ; ENTRY$ Rand ldi r30, LOW(_rand) ; Point at random number ldi r31, HIGH(_rand) ; tst r16 ; See the seed value breq _1 ; Branch if zero
clr r17 ; Initialize the generator clr r18 ; and return initial value clr r19 ; rjmp _2 ;
_1: ; Calculate new random number ld r16, Z ; Load the previous value into registers ldd r17, Z+1 ; ldd r18, Z+2 ; ldd r19, Z+3 ; eor r16, r19 ; Calculate feedback bit bst r16, 6 ; eor r16, r19 ; lsl r16 ; Shift the number left rol r17 ; rol r18 ; rol r19 ; andi r19, ~(1<<7) ; Clear high (sign) bit bld r16, 0 ; Insert feedback bit in the new value _2: st Z, r16 ; Save the number std Z+1, r17 ; std Z+2, r18 ; std Z+3, r19 ; ret
rseg NEAR_Z ; Data segment _rand: ; Random number ds 4 ;
end
|
|
|
|
|
Dec 5 2006, 11:01
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(_Bill @ Dec 5 2006, 10:27)  Я сделал генератор ПСЧ на 31 бит так: Код eor r16, r19 ; Calculate feedback bit bst r16, 6 ; eor r16, r19 ; Хотите сказать, что полином 0x80000041 примитивный? Кроме того, Вы используете из результата на каждой итерации 1 бит или 31?
--------------------
Пишите в личку.
|
|
|
|
|
Dec 5 2006, 11:35
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Oldring @ Dec 5 2006, 11:01)  Цитата(_Bill @ Dec 5 2006, 10:27)  Я сделал генератор ПСЧ на 31 бит так: Код eor r16, r19 ; Calculate feedback bit bst r16, 6 ; eor r16, r19 ; Хотите сказать, что полином 0x80000041 примитивный? Кроме того, Вы используете из результата на каждой итерации 1 бит или 31? Вообще-то, на каждой итерации я использую все 31 бит. Что касается полинома, то я взял номера отводов из таблицы, приведенной в статье "Генеатор белого шума на сдвигающем регистре с обратной связью" (Электроника, №11, 1976). Там имеется ссылка на: S.Golomb "Shift Register Sequences", 1967. Для 31-разрядного регистра имеется несколько вариантов включения: x30 + x2, x30 + x5, x30 + x6, x30 + x12. Я выбрал варианте x30 + x6, поскольку не требуется дополнительных сдвигов для выравнивания разрядов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|