реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Операции над большими числами, Операции над большими числами
rezident
сообщение Mar 10 2010, 22:49
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(NickSmith @ Mar 11 2010, 00:44) *
Что не так?
Дык значение фазы-то в радианах должно быть выражено, а не в градусах rolleyes.gif Ну либо замените 2*Π в вашей формуле на 360 градусов wink.gif
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 11 2010, 00:00
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rezident @ Mar 11 2010, 01:49) *
Дык значение фазы-то в радианах должно быть выражено, а не в градусах rolleyes.gif Ну либо замените 2*Π в вашей формуле на 360 градусов wink.gif

Спасибо.. Действительно все сошлось сразу...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 11 2010, 23:52
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Что то не получается у меня переделать умножение из апликух, которое "mpy16u" - 16x16 Bit Unsigned Multiplication, что бы оно стало 24х16. Что я не так делаю??

CODE
.def mc16uL =r16 ;multiplicand low byte
.def mc16uH =r17 ;multiplicand high byte
.def mp16uL =r18 ;multiplier low byte
.def mp16uH =r19 ;multiplier high byte
.def mp16UM=r20
.def m16u0 =r18 ;result byte 0 (LSB)
.def m16u1 =r19 ;result byte 1
.def m16u2 =r20 ;result byte 2
.def m16u3 =r21 ;result byte 3 (MSB)
.def mcnt16u =r22 ;loop counter

;***** Code

ex: nop;;
nop
nop

ldi mc16ul,low(5050)
ldi mc16uh,high(5050)
ldi mp16ul,0x31
ldi mp16uh,0xAF
ldi mp16um,0x02
;
mpy16u: clr m16u3 ;clear 2 highest bytes of result
clr m16u2
ldi mcnt16u,24;init loop counter
lsr mp16uH
ror mp16uL
ror mp16uM

m16u_1:
brcc noad8 ;if bit 0 of multiplier set

add m16u2,mc16uL;add multiplicand Low to byte 2 of res
adc m16u3,mc16uH;add multiplicand high to byte 3 of res

noad8: ror m16u3 ;shift right result byte 3
ror m16u2 ;rotate right result byte 2
ror m16u1 ;rotate result byte 1 and multiplier High
ror m16u0 ;rotate result byte 0 and multiplier Low;
dec mcnt16u ;decrement loop counter
brne m16u_1 ;if not done, loop more
rjmp ex


Сообщение отредактировал NickSmith - Mar 11 2010, 23:53
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 12 2010, 11:17
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Пробовал менять местами множимое и множитель с добавление регистра, но все то же..
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 12 2010, 13:31
Сообщение #35


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Поменяйте порядок сдвига, как показано ниже, и будет вам щастье
Код
noad8:    ror    m16u3;shift right result byte 3
    ror    m16u1;rotate result byte 1 and multiplier High
    ror    m16u0;rotate result byte 0 and multiplier Low;
    ror    m16u2;rotate right result byte 2

На будущее, не надо именовать один и тот же регистр разными именами, это моветон. Да, и откажитесь от таких ужасных обозначений переменных, почему не взять просто prod0, prod1, prod2, prod3, a0,a1, b0, b1, b2?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 12 2010, 14:03
Сообщение #36


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 12 2010, 02:52) *
Что то не получается у меня переделать умножение из апликух, которое "mpy16u" - 16x16 Bit Unsigned

Мда.. Не понос, так золотуха... Я не понял, надо что, реализовать это чудо на младших представителях семейства AVR, "тиньках" ? Нет ? Тогда на кой, простите, икс, брать _такую_ реализацию ? Есть же на то команда mul. Да, многоразрядное умножение довольно "развесистое", но все ж быстрее, чем цикл, да и компактнее при таких разрядностях. Блин, дал же _готовое_ деление, по регистру прибавить - и больше ничего не надо...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 13 2010, 10:10
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(=GM= @ Mar 12 2010, 16:31) *
На будущее, не надо именовать один и тот же регистр разными именами, это моветон. Да, и откажитесь от таких ужасных обозначений переменных, почему не взять просто prod0, prod1, prod2, prod3, a0,a1, b0, b1, b2?

Счастье не наступило.. Все равно не верный результат умножения..

Цитата(rx3apf @ Mar 12 2010, 17:03) *
Мда.. Не понос, так золотуха... Я не понял, надо что, реализовать это чудо на младших представителях семейства AVR, "тиньках" ? Нет ? Тогда на кой, простите, икс, брать _такую_ реализацию ? Есть же на то команда mul. Да, многоразрядное умножение довольно "развесистое", но все ж быстрее, чем цикл, да и компактнее при таких разрядностях. Блин, дал же _готовое_ деление, по регистру прибавить - и больше ничего не надо...


Я же писал. Я работаю с tiny2313. В нем к сожалению нет mul. Приходится что то изобретать.. Деление слишком громоздкое получается, аж под 750 тактов..
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 13 2010, 10:28
Сообщение #38


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 13 2010, 13:10) *
Я же писал. Я работаю с tiny2313. В нем к сожалению нет mul.


Ну тогда ладно wink.gif Хотя платформа для задачи не самая лучшая - mega8 стоит столько же, но такие вещи делаются быстрее.
Цитата
Приходится что то изобретать.. Деление слишком громоздкое получается, аж под 750 тактов..

Чтобы реализовать через умножение при той же точности результата, разрядность придется увеличивать, и как бы не получилось еще больше. А по реализации - умножение "в столбик" еще проще, проверили бит множителя, если "1" - прибавили множимое к аккумулятору. Затем сдвинули множитель для следующей проверки, и множимое тоже сдвинули (умножили на 2). И так до конца множителя. Вот только множимое придется расширить до разрядности аккумулятора, и все вместе это будет довольно долго...
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 13 2010, 11:09
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 13 2010, 13:28) *
Ну тогда ладно wink.gif Хотя платформа для задачи не самая лучшая - mega8 стоит столько же, но такие вещи делаются быстрее.

Я еще только начинаю знакомиться с современными микропроцессорами.. Просто мне попались толковые книжки по 2313 вот я ее и взял за основу.. Изначально я вообще хотел на 89С2051 делать, но с ней очень хлопотно и неудобно.. А меги я изучу обязательно..
Цитата(rx3apf @ Mar 13 2010, 13:28) *
Чтобы реализовать через умножение при той же точности результата, разрядность придется увеличивать, и как бы не получилось еще больше. А по реализации - умножение "в столбик" еще проще, проверили бит множителя, если "1" - прибавили множимое к аккумулятору. Затем сдвинули множитель для следующей проверки, и множимое тоже сдвинули (умножили на 2). И так до конца множителя. Вот только множимое придется расширить до разрядности аккумулятора, и все вместе это будет довольно долго...

А есть ли какие нибудь толковые книжки, где бы об этом можно было почитать.. Я к сожалению разбазарил свою библиотеку по электронике и выч. технике, правда я ее собирал в конце 80ч в начале 90 х, но помню, что там были книжки, в которых эти вещи очень доходчиво описывались с очень понятными примерами.. Во всяком случае во времена Z80 у меня с этим проблем не возникало.. Сейчас все забыл напрочь.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 13 2010, 11:18
Сообщение #40


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(NickSmith @ Mar 13 2010, 14:09) *
Я еще только начинаю знакомиться с современными микропроцессорами.. Просто мне попались толковые книжки по 2313 вот я ее и взял за основу.. А меги я изучу обязательно..

Да там разницы-то, по большому счету, никакой. Есть некоторое количество дополнительных команд, более развитая периферия.

Цитата
А есть ли какие нибудь толковые книжки, где бы об этом можно было почитать.. Я к сожалению разбазарил свою библиотеку по электронике и выч. технике, правда я ее собирал в конце 80ч в начале 90 х, но помню, что там были книжки, в которых эти вещи очень доходчиво описывались с очень понятными примерами..

Наверное, Левенталь и прочие ? Я большую часть выкинул уже за ненадобностью, неактуально нынче...
Цитата
Во всяком случае во времена Z80 у меня с этим проблем не возникало.. Сейчас все забыл напрочь.

Я как-то давно уже книжками не пользуюсь, тут как втянешься, так оно как-то само собой (и, по моим ощущениям, на asm для 8-битных RISC пишется проще и быстрее, чем на Z80). Ну, аппликухи еще поглядеть (и от других платформ тоже, для общего развития). Сейчас вообще набегут "сионисты", скажут, что ассемблер надо выкинуть и писать на ЯВУ wink.gif
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 13 2010, 11:31
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(rx3apf @ Mar 13 2010, 14:18) *
Да там разницы-то, по большому счету, никакой. Есть некоторое количество дополнительных команд, более развитая периферия.


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

Цитата(rx3apf @ Mar 13 2010, 14:18) *
Я как-то давно уже книжками не пользуюсь, тут как втянешься, так оно как-то само собой (и, по моим ощущениям, на asm для 8-битных RISC пишется проще и быстрее, чем на Z80). Ну, аппликухи еще поглядеть (и от других платформ тоже, для общего развития). Сейчас вообще набегут "сионисты", скажут, что ассемблер надо выкинуть и писать на ЯВУ wink.gif

Это да, практика великая вещь. А я последние лет 15 паяльник брал раз в год, что бы где то проводок припаять отвалившийся.. Вот сейчас опять сильный интерес появился и вспоминать все приходится. Но это не беда руки то все равно все помнят.
А асм мне у AVR понравился. Действительно удобный. Главное логику понять.. Хотя си я планирую изучить тоже. Тут уже надо по задаче смотреть на чем лучше писать..

Сообщение отредактировал NickSmith - Mar 13 2010, 12:30
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 14 2010, 10:12
Сообщение #42


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Имеется формула код фазы = ( a*b )/c где а =значение фазы в градусах, b = 2^12, c = 360 например: (90*4096)/360=1024. Значение фазы у меня хранится в виде 90*10^2.
Далее я 2^12/360 = 11,38. 11,38 я возвожу в 10^2. В итоге у меня получается 900*1138=1024200 и что бы мне привести это к нужному виду, я делю это на 1000..
А можно ли как то это свести к одному действию?? желательно делению...

Сообщение отредактировал NickSmith - Mar 14 2010, 10:13
Go to the top of the page
 
+Quote Post
ae_
сообщение Mar 14 2010, 15:25
Сообщение #43


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(NickSmith @ Mar 14 2010, 18:12) *
Имеется формула код фазы = ( a*b )/c где а =значение фазы в градусах, b = 2^12, c = 360 например: (90*4096)/360=1024. Значение фазы у меня хранится в виде 90*10^2.
...

360°/4096=0.088, т.е. хранить в 12-bit регистре число градусов 0...360 не выйдет точнее, чем 0.1° (округляем 0.088 в большую сторону до целого десятичного разряда).
Отсюда и формат хранения переменной должен быть не 90*10^2, а 90*10=900, т.е. 0...3599
Далее, надо получить из 900 код 1024, а из 3599->4095. N = 0x91AD
т.е. берёте фазу в виде 0...3599, умножаете на 0x91AD (используя алгоритм беззнакового mul16x16 из appnote), результат (32-bit) сдвигаете влево на один разряд. старшие два байта = код фазы
(900*N)<<1 = 0x2002434<<1 = 0x4004868. отбрасываем младшие 16 бит, получаем 0x400 (1024)
(3599*N)<<1 = 0x7FFFF23<<1 = 0xFFFFE46. -//- получаем 0xFFF (4095)
Go to the top of the page
 
+Quote Post
NickSmith
сообщение Mar 14 2010, 23:05
Сообщение #44


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 21-10-09
Пользователь №: 53 117



Цитата(ae_ @ Mar 14 2010, 18:25) *
Далее, надо получить из 900 код 1024, а из 3599->4095. N = 0x91AD
т.е. берёте фазу в виде 0...3599, умножаете на 0x91AD (используя алгоритм беззнакового mul16x16 из appnote), результат (32-bit) сдвигаете влево на один разряд. старшие два байта = код фазы
(900*N)<<1 = 0x2002434<<1 = 0x4004868. отбрасываем младшие 16 бит, получаем 0x400 (1024)
(3599*N)<<1 = 0x7FFFF23<<1 = 0xFFFFE46. -//- получаем 0xFFF (4095)

Огромнейшее спасибо!!!
А как получается N? какие преобразования надо было для этого сделать??

Сообщение отредактировал NickSmith - Mar 14 2010, 23:06
Go to the top of the page
 
+Quote Post
ae_
сообщение Mar 15 2010, 00:21
Сообщение #45


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(NickSmith @ Mar 15 2010, 07:05) *
Огромнейшее спасибо!!!
А как получается N? какие преобразования надо было для этого сделать??

Выполните вычисления в обратном порядке, неужели это так сложно ?
N=(0x0FFFFFFF/3599)>>1
Сдвиг вправо "волшебного" числа N и сдивг влево 32-бит результата при вычислении нужен лишь для того, что бы уместиться в 16-бит арифметику.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01629 секунд с 7
ELECTRONIX ©2004-2016