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

 
 
 
Reply to this topicStart new topic
> FMul как Div, Почему не используем?
Erv&Sed
сообщение Feb 26 2008, 12:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Добрый день уважаемые форумчане. На днях созрел вопрос: почему бы не использовать FMul как Div, например так:


Ldi Tmp,0xFF ;
Ldi Tmp2,0b00011001 ; 1/5, вообще то говоря должна быть
; 0b00110010, но AVRStudio утверждает обратное

FMul Tmp,Tmp2 ; Необходимо убрать

Sts 0x00+XMEM_Base,R0 ; Записать по внешнему адресу
Sts 0x01+XMEM_Base,R1 ;
Stop ; Безконечный цикл


Посчитал на калькуляторе - некоторые расхождения есть, но я думая что есть области где и это можно будет применить.
Ниже прикрепляю файл для перевода делителя для Div`а в множитель для FMul`а.

_____________________

Не удается прикрепить, не знаю почему, короче кому надо - просите здесь отправлю на мыло.

Файл можно скачаать здесь

Сообщение отредактировал Erv&Sed - Feb 26 2008, 12:38
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 26 2008, 12:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Erv&Sed @ Feb 26 2008, 16:19) *
Ldi Tmp2,0b00011001 ; 1/5, вообще то говоря должна быть
; 0b00110010, но AVRStudio утверждает обратное


Это по моим расчётам 0,09765625. Вообще 1/5 такими коэффициентами получить невозможно. На 8-ми битах.

Почему не пользуемся - пользуемся.
Go to the top of the page
 
+Quote Post
Erv&Sed
сообщение Feb 26 2008, 12:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Дело в том, что все библиотеки которые поподались мне в руки - в качестве процедуры истользовали оогромные алгоритм, но я не видел ни одной, которая использовала бы FMul, поэтому я и решил что люди в основном пользуются именно этими библиотеками.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 26 2008, 12:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Erv&Sed @ Feb 26 2008, 16:27) *
Дело в том, что все библиотеки которые поподались мне в руки - в качестве процедуры истользовали оогромные алгоритм, но я не видел ни одной, которая использовала бы FMul, поэтому я и решил что люди в основном пользуются именно этими библиотеками.


Дело в том, что деление и умножение не размножишь как сложение и вычитание. А используется, как правило двух-четырёх байтовые числа для арифметики. Алгоритм намного сложнее получается. Тем не менее эти команды в библиотеках присутствуют.
Go to the top of the page
 
+Quote Post
Erv&Sed
сообщение Feb 26 2008, 12:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Да конечно, можно получить приближенное значение, но достаточно точное чтобы использовать этот спопсоб для выигрыша в скорости.
Go to the top of the page
 
+Quote Post
umup
сообщение Feb 26 2008, 18:01
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



у меня такое работает :

Код
u8 div_by5_u8_hmul(u8 data_in)
{return((((u16)data_in * 0x33) + 0x33) >> 8);
}

u16 div_by5_u16_hmul(u16 data_in)
{return((((u32)data_in * 0x3333) + 0x3333) >> 16);
}


можно и без аппаратного умножения :

Код
u8 div_by5_u8_soft(u8 data_in)
{u16 u16_01, result;
result = u16_01 = data_in;
u16_01 <<= 1; result += u16_01;
u16_01 <<= 3; result += u16_01;
u16_01 <<= 1; result += u16_01;
result += 0x33; //correction
return(result >> 8);
}

u16 div_by5_u16_soft(u16 data_in)
{u32 u32_01, result;
result = u32_01 = data_in;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
result += 0x3333; //correction
return(result >> 16);
}


Сообщение отредактировал umup - Feb 26 2008, 18:10
Go to the top of the page
 
+Quote Post
Erv&Sed
сообщение Feb 26 2008, 19:19
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Umup я не понял про что вы, может это из-за моего С, но мы говорим что с помощью FMul можно разделить на любое число, а не только на 5, для чего нужно предварительно загрузить значения 1/число в Tmp2(в нашем примере).

Но я действительно не понял что у вас происходит в программе.

Со всем уважением. (насколько я понимаю вы владелец ресурса Umup.Narod.Ru)
Go to the top of the page
 
+Quote Post
Erv&Sed
сообщение Feb 26 2008, 21:01
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Кстати говоря, можно писать так:

Код
    Ldi    Tmp,0xFF;
;    Ldi    Tmp2,0b00011001; 1/5
    Ldi    Tmp2,Q7(0.2);!!!!!!!!!!!!!!!!!!!!!!!!

    FMul    Tmp2,Tmp; Необходимо убрать

    Sts    0x00+XMEM_Base,R0
    Sts    0x01+XMEM_Base,R1    
    Stop


Q7() - это функция преобразующая простое дробное число - в число необходимое для FMul`а. Она поддерживается AVRASM2 но 1-ым нет.

Кстати а кто-нибудь знает как можно оформить структуры в AVRStudio, как-то сложно без них.

Сообщение отредактировал Erv&Sed - Feb 26 2008, 21:04
Go to the top of the page
 
+Quote Post
GrayCat
сообщение Feb 27 2008, 08:38
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342



Умножение на обратную величину вместо деления используется очень широко -- но только при постоянном (const) делителе!


--------------------
Gray©at
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:06
Рейтинг@Mail.ru


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