Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FMul как Div
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Erv&Sed
Добрый день уважаемые форумчане. На днях созрел вопрос: почему бы не использовать 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`а.

_____________________

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

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


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

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


Дело в том, что деление и умножение не размножишь как сложение и вычитание. А используется, как правило двух-четырёх байтовые числа для арифметики. Алгоритм намного сложнее получается. Тем не менее эти команды в библиотеках присутствуют.
Erv&Sed
Да конечно, можно получить приближенное значение, но достаточно точное чтобы использовать этот спопсоб для выигрыша в скорости.
umup
у меня такое работает :

Код
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);
}
Erv&Sed
Umup я не понял про что вы, может это из-за моего С, но мы говорим что с помощью FMul можно разделить на любое число, а не только на 5, для чего нужно предварительно загрузить значения 1/число в Tmp2(в нашем примере).

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

Со всем уважением. (насколько я понимаю вы владелец ресурса Umup.Narod.Ru)
Erv&Sed
Кстати говоря, можно писать так:

Код
    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, как-то сложно без них.
GrayCat
Умножение на обратную величину вместо деления используется очень широко -- но только при постоянном (const) делителе!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.