(i % 10) для AVR
От: pullover  
Дата: 05.02.08 08:25
Оценка:
как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...
Re: (i % 10) для AVR
От: ДимДимыч Украина http://klug.org.ua
Дата: 05.02.08 10:18
Оценка:
Здравствуйте, pullover, Вы писали:

P>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает.


На ассемблере, что ли? C-компилятор успешно справляется с этой задачей вычитаниями.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: (i % 10) для AVR
От: pullover  
Дата: 05.02.08 10:38
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, pullover, Вы писали:


P>>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает.


ДД>На ассемблере, что ли? C-компилятор успешно справляется с этой задачей вычитаниями.



да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?
Re[3]: (i % 10) для AVR
От: ДимДимыч Украина http://klug.org.ua
Дата: 05.02.08 11:20
Оценка: +1
Здравствуйте, pullover, Вы писали:

P>да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?


Если бы для общего случая можно было быстрее, думаю разработчики компилятора использовали бы этот способ.
Каков диапазон аргумента? Может можно обойтись таблицей.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: (i % 10) для AVR
От: pullover  
Дата: 05.02.08 11:57
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, pullover, Вы писали:


P>>да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?


ДД>Если бы для общего случая можно было быстрее, думаю разработчики компилятора использовали бы этот способ.

ДД>Каков диапазон аргумента? Может можно обойтись таблицей.


разобрался в r16 исходное число
результат r16 единицы, r17 десятки..




split_digit:
    clr r17
split_digit_loop:
    cpi r16, 10
    brlo split_digit_done
    subi r16, 10
    inc r17
    rjmp split_digit_loop
split_digit_done:
    ret
Re: (i % 10) для AVR
От: CreatorCray  
Дата: 05.02.08 12:39
Оценка:
Здравствуйте, pullover, Вы писали:

P>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...

я бы делал наверное так.
писано на глаз

int mod (int value, int divider)
{
    if (divider > value)
        return value;

    int shift = 1;
    do
    {
        divider <<= 1;
        shift++;
    }
    while (divider < value);

    while (shift--)
    {
        if (value >= divider)
            value -= divider;
        divider >>= 1;
    }

    return value;    
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: (i % 10) для AVR
От: ДимДимыч Украина http://klug.org.ua
Дата: 05.02.08 19:19
Оценка:
Здравствуйте, pullover, Вы писали:

P>
P>split_digit:
P>    clr r17
P>split_digit_loop:
P>    cpi r16, 10
P>    brlo split_digit_done
P>    subi r16, 10
P>    inc r17
P>    rjmp split_digit_loop
P>split_digit_done:
P>    ret
P>


Для определенных задач данный метод пойдет, но он имеет существенный недостаток: время вполнения линейно зависит от значения аргумента, где-то 6*N/10, т.е. уже для числа 100 это будет около 60 тактов. Ну если исключить подсчет частного, то 5*N/10.
Вообще в таких ситуациях необходимо рассматривать задачу более глобально: в чем (размер кода или скорость) требуется оптимизация и как будет использоваться результат. Если это например динамическая индикация на семисегментнике, то оптимальное решение может быть совсем другим.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: (i % 10) для AVR
От: pullover  
Дата: 06.02.08 07:34
Оценка:
Здравствуйте, ДимДимыч, Вы писали:
Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе FAQ данного форума и\или ресурса.
Нарушение правил может повлечь за собой санкции, описанные там же — модератор
ДД>Вообще в таких ситуациях необходимо рассматривать задачу более глобально: в чем (размер кода или скорость) требуется оптимизация и как будет использоваться результат. Если это например динамическая индикация на семисегментнике, то оптимальное решение может быть совсем другим.

согласен, но мне это подойдет — надо минуты, секунды отображать...
Re[7]: (i % 10) для AVR
От: ДимДимыч Украина http://klug.org.ua
Дата: 06.02.08 14:29
Оценка: 2 (2) +1
Здравствуйте, pullover, Вы писали:

P>согласен, но мне это подойдет — надо минуты, секунды отображать...


Я бы в таком случае время сразу в двоично-десятичном виде хранил.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: (i % 10) для AVR
От: Sergei I. Gorelkin Россия  
Дата: 06.02.08 18:06
Оценка: 4 (1)
Здравствуйте, pullover, Вы писали:

P>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...


Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.
Re[2]: (i % 10) для AVR
От: CreatorCray  
Дата: 06.02.08 20:08
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.

подозреваю что умножения там тоже нет.
тем более ему нужен остаток
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: (i % 10) для AVR
От: Sergei I. Gorelkin Россия  
Дата: 06.02.08 20:26
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>подозреваю что умножения там тоже нет.

CC>тем более ему нужен остаток

Умножение на большинстве современных AVR (за исключением некоторых low-end моделей) имеется.
Re[4]: (i % 10) для AVR
От: ДимДимыч Украина http://klug.org.ua
Дата: 06.02.08 21:02
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Умножение на большинстве современных AVR (за исключением некоторых low-end моделей) имеется.


Разве что в тех, где есть аппаратный модуль умножения. Но умножение на константу в большинстве случаев можно заменить сдвигами и сложением, в данном случае коэффициенты 16, 8 и 2.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: (i % 10) для AVR
От: VEAPUK  
Дата: 25.02.08 11:37
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, pullover, Вы писали:


P>>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...


SIG>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.

Ваша не правда (по сселке перейти не удалось):
для 38 чисел этот метод дает неправильный результат, попробуйте для 69.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: (i % 10) для AVR
От: VEAPUK  
Дата: 25.02.08 12:09
Оценка:
Здравствуйте, VEAPUK, Вы писали:

SIG>>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.

VEA>Ваша не правда (по сселке перейти не удалось):
VEA>для 38 чисел этот метод дает неправильный результат, попробуйте для 69.

А я предлагаю умножить на 205 (256*8/10), взять старший байт и поделить на 8 (>>3).
Работает 100%.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.