Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 12:32

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 22:50 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
putman писал(а):
Так что пока нет жестких рамок по времени оставлю эту затею.

Так Вам быстрый вариант уже не нужен? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 08:10 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
lizard66 писал(а):
putman писал(а):
Так что пока нет жестких рамок по времени оставлю эту затею.

Так Вам быстрый вариант уже не нужен? :)

Как же не нужен, нужен !!!
Просто начали отговаривать из-за нецелесообразности всвязи с нечастым выводом на индикатор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 08:45 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Не, сами алгоритмы никогда лишними не бывают! Выкладывайте :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 09:47 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD
viewtopic.php?f=14&t=457&start=25
http://radioded.ru/forum/viewtopic.php?f=7&t=156

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 10:24 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
putman писал(а):
Как же не нужен, нужен !!!
Просто начали отговаривать из-за нецелесообразности всвязи с нечастым выводом на индикатор.

Интересующий Вас метод на асме в конце первой страницы под спойлером. Сразу после этого заявления:
putman писал(а):
Действительно оно того не стоит, вычитанием 10-ки проще и нагляднее получается.
Оставляю значит как есть процедуру в своей программе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 10:30 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
Johnny0007 писал(а):
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD
viewtopic.php?f=14&t=457&start=25
http://radioded.ru/forum/viewtopic.php?f=7&t=156


Для BCD есть достаточно компактный и быстрый метод, описан в AVR204


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 11:04 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
Johnny0007 писал(а):
На самом деле ТС неправильно сформулировал вопрос - ему нужно не деление на 10, а преобразование в BCD

Мне не только для индикатора, мне в программе еще нужно на 10 делить число от 1 до 100.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 11:37 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
>>мне в программе еще нужно на 10 делить число от 1 до 100

ну уж тут вычитания, наверно, проще всего - максимум 10 простейших циклов

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 11:45 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
putman писал(а):
мне в программе еще нужно на 10 делить число от 1 до 100.


Но только до 178

DIV_D - что делить

на выходе
- DIV_Q - результат
- DIV_D - остаток

Если остаток не нужен - последние 3 команды не нужны.

Код:
    ldi     DIV_Q, 0x67
    mul     DIV_Q, DIV_D
    mov     DIV_Q, r1
    lsr     DIV_Q
    lsr     DIV_Q

    ldi     TEMP, 10
    mul     DIV_Q, TEMP
    sub     DIV_D, r0

    ret


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 11:58 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
Кстати, и ещё.
Мы тут касаемся точных алгоритмов, а они часто не нужны на практике абсолютно, как в случае с велосипедом.
Например снимаем показания с АЦП - там уже есть погрешности, так стоит ли ломать голову, проще добавить ещё одну, но упростить алгоритм.

например, можно заменить деление умножением, поскольку аппаратный умножитель имеется.
надо поделить на 10? тупо умножаем на дробь, обратную данной, т.е. 1/10
1/10 это примерно 6554/65536
в знаменателе - число, на которое легко делить сдвигом (степень двойки)
так можно делить на любые числа, не забивая себе голово заумными алгоритмами, про погрешность я уже сказал, будет - но в разумных пределах и ничего страшного

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 12:09 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
Johnny0007 писал(а):
Мы тут касаемся точных алгоритмов, а они часто не нужны на практике абсолютно, как в случае с велосипедом.
Например снимаем показания с АЦП - там уже есть погрешности, так стоит ли ломать голову, проще добавить ещё одну, но упростить алгоритм.

например, можно заменить деление умножением, поскольку аппаратный умножитель имеется.
надо поделить на 10? тупо умножаем на дробь, обратную данной, т.е. 1/10
1/10 это примерно 6554/65536
в знаменателе - число, на которое легко делить сдвигом (степень двойки)
так можно делить на любые числа, не забивая себе голово заумными алгоритмами, про погрешность я уже сказал, будет - но в разумных пределах и ничего страшного


То что я написал выше - точный алгоритм при соблюдении указанных ограничений и очень быстрый. А так как Вы предлагаете - делать нельзя. В крайнем случае - только для младшего разряда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 12:13 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
В связи с чем это - нельзя? Запрещено Конституцией что ли? очень даже можно по причинам, которые я указал выше.

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

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 12:20 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
Потому, что так можно (при последовательном делении) только для младшего разряда, который на глаз, а вот старшие могут быть сильно покалеченными.

Вот ещё: деление беззнаковых 16 бит на 10 с остатком - точный алгоритм на всём диапазоне:

Q = D/10

Q - результат
D - остаток

Код:
#define cDIV_10  0xCCCD      // multiplicative inverse of 10

Div16_10:
    ldi     rDIV_M0, low(cDIV_10)
    ldi     rDIV_M1, high(cDIV_10)

    // mul 16x16 => 32 discarding 16 lsb's
    clr     rDIV_R0

    mul     rDIV_M1, rDIV_D1
    movw    rDIV_Q0, r0

    mul     rDIV_M0, rDIV_D0
    mov     rDIV_R1, r1

    mul     rDIV_M1, rDIV_D0
    add     rDIV_R1, r0
    adc     rDIV_Q0, r1
    adc     rDIV_Q1, rDIV_R0

    mul     rDIV_M0, rDIV_D1
    add     rDIV_R1, r0
    adc     rDIV_Q0, r1
    adc     rDIV_Q1, rDIV_R0

    // quotient >>= 3
    lsr     rDIV_Q1
    ror     rDIV_Q0
    lsr     rDIV_Q1
    ror     rDIV_Q0
    lsr     rDIV_Q1
    ror     rDIV_Q0
   
    // multiple quotient back (*10)
    ldi     rDIV_M0, 10
    mul     rDIV_Q0, rDIV_M0
    movw    rDIV_R0, r0
    mul     rDIV_Q1, rDIV_M0
    add     rDIV_R1, r0

    // calculate reminder (now in dividend)
    sub     rDIV_D0, rDIV_R0
    sbc     rDIV_D1, rDIV_R1
    ret



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 12:26 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
причём тут последовательное деление?
Я написал как сразу поделить одно число на другое и получить приемлимый результат
надо мне, к примеру поделить 356 на 10

(356*6554) shr 16 = 35 - очень быстро, кого-то не устроит, а кого- то вполне

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 12:54 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
Johnny0007 писал(а):
причём тут последовательное деление?
Я написал как сразу поделить одно число на другое и получить приемлимый результат
надо мне, к примеру поделить 356 на 10

(356*6554) shr 16 = 35 - очень быстро, кого-то не устроит, а кого- то вполне

Хороший способ, но в меге-8 результат умножения не должен превышать 65535, в Вашем случае он гораздо больше.
Может быть как то можно обойти это ограничение ? т.е. средствами команды MUL умножать числа более 256 * 256 ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 13:13 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
putman писал(а):
Хороший способ, но в меге-8 результат умножения не должен превышать 65535, в Вашем случае он гораздо больше.
Может быть как то можно обойти это ограничение ? т.е. средствами команды MUL умножать числа более 256 * 256 ?


Я код выше написал, только он не приблизительный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 13:16 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
to putman
умножение многоразрядных чисел
http://controllersystems.com/books/prak ... hisel.html

>>в Вашем случае он гораздо больше.

я ж просто пример привёл,
просто чем больше числа в числителе и знаменателе, тем точнее результат (можно точнее подобрать соотношение числителя и знаменателя)

а где-то и меньшие числа подойдут
например
можно умножить и на 26/256

356*26 shr 8=36
и на 13/128
356*13 shr 7=36


единственное - остаток не получишь, но он часто и не нужен,
главное чтоб вы сами понимали, что выигрываете и что проигрываете

в вашем случае, может метод THE BEAST и лучше, но и то что я пишу - на заметку возьмите, пригодится, точность далеко не всегда нужна - мы ж в реальной жизни живём, иногда скорость и объём памяти куда важнее

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 15 янв 2013, 13:36 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
Всем спасибо, разбираюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 04 фев 2020, 11:49 
Здравствуйте!

Зарегистрирован: 07 май 2019, 00:49
Сообщения: 3
Гуглил деление на 10 и наткнулся на точную копию данной темы на другом сайте http://www.cyberforum.ru/avr/thread2086671.html.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 04 фев 2020, 12:01 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Они все темы отсюда и с других форумов воруют автоматом, тут целые темы об этом были.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB