Перейти к содержанию
    

Быстрое деление в AVR - Как?

Всех приветствую.

Есть программа индикации оборотов, в ней таймером считается период и переводится в об/сек - n=k/T, где к - константа, а Т - подсчитанный период. Обороты меняются и делить приходится на непредсказуемую величину. Если бы делить на константу, то там я знаю как - сдвинул влево, умножил, сдвинул вправо. А вот как оптимизировать деление в моём случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, MPetrovich сказал:

Всех приветствую.

Есть программа индикации оборотов, в ней таймером считается период и переводится в об/сек - n=k/T, где к - константа, а Т - подсчитанный период. Обороты меняются и делить приходится на непредсказуемую величину. Если бы делить на константу, то там я знаю как - сдвинул влево, умножил, сдвинул вправо. А вот как оптимизировать деление в моём случае?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, artemkad said:

Все равно период на индикатор чаще чем раз в треть секунды нет смысла выводить.

Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, MPetrovich сказал:

Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

иначе последний разряд не успеваешь осознать

Это если индикатор не стрелочный.

А дальше вопрос требуемой точности. Если она невелика, то можно попробовать обойтись байтовым делением - оно будет быстрее, чем более длинное. Опять же, для байтового можно и табличку в 256 значений себе позволить, а дальше сдвигами добрать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Alex11 сказал:

Это если индикатор не стрелочный.

И что должна означать расплывшаяся стрелка? Ведь именно ее и получим если сделаем вывод 25 разных значений за секунду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Alex11 сказал:

Можно, например, оценивать джиттер.

В попугаях?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, MPetrovich сказал:

Вы так считаете? Попробуйте кино смотреть с частотой кадров в 3 герца...

Имхо - для индикации достаточно обновления ~10Гц. Ну пускай, для самых быстроглазых = 20Гц. Неужто ваш AVR не справится с делениями 20 раз в секунду? И про какую точность идёт речь? 16 бит? 32 бита? ...

 

PS: При большой разрядности делителя, можно попробовать рядом Тейлора найти 1/x в несколько итераций, а затем - умножать. Но накладные расходы - большие, не факт что будет выигрыш. На DSP (без аппаратного деления, но с многоразрядными умножениями) это был вариант, на AVR - надо смотреть. Ведь у него и команды умножения дохлые.

И вряд-ли есть другие альтернативы, кроме тупого деления в лоб (сдвигами/вычитаниями). Пускай и отимизированным на асме кодом. Иначе команды деления в разных CPU не были бы такими тормозными.

При малой разрядности - таблица. (как уже писали выше)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/23/2024 at 4:29 PM, jcxz said:

Имхо - для индикации достаточно обновления ~10Гц. Ну пускай, для самых быстроглазых = 20Гц. Неужто ваш AVR не справится с делениями 20 раз в секунду? И про какую точность идёт речь? 16 бит? 32 бита?

Так, для справки.
Код на ассемблере

;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;*
;* Number of words	:196 + return
;* Number of cycles	:148/173/196 (Min/Avg/Max)
;* Low registers used	:2 (drem16uL,drem16uH)
;* High registers used  :4 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH)
;*
;***************************************************************************

https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/doc0936.pdf

 

Т.е. если на 16 МГц тактовой, то одно деление примерно 12 мкс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

51 minutes ago, jcxz said:

Неужто ваш AVR не справится с делениями 20 раз в секунду?

Справляется, не вопрос. Просто обидно, что молотит зря. У него ещё одно прерывание на входе (кроме отсчёта оборотов) с частотой 100Гц, плюс прерывание по окончании формируемого импульса(тут правда обработчик коротенький), ну и динамическая индикация и вывод кое-чего через UART в терминал...

 

51 minutes ago, jcxz said:

На DSP (без аппаратного деления, но с многоразрядными умножениями) это был вариант, на AVR - надо смотреть.

Эка Вы хватили! На STM32 тоже проблем никаких бы не возникло, там деление в одно действие)))

 

18 minutes ago, dimka76 said:

Код на ассемблере

Прошу прощения, но с ассемблером не дружу 😞 

 

18 minutes ago, dimka76 said:

на 16 МГц тактовой

Тактовая 8 МГц

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, MPetrovich сказал:

Эка Вы хватили! На STM32 тоже проблем никаких бы не возникло, там деление в одно действие)))

На STM32 есть аппаратное деление (по крайней мере на тех, которые >=Cortex-M3), на многих DSP - нет. Так что в этом плане к AVR они ближе.

Да и на тех STM32 тоже не факт, что "в одно действие". А всё сильно зависит от разрядности. О которой вы так ничего и не сказали.

24 минуты назад, MPetrovich сказал:

Прошу прощения, но с ассемблером не дружу 😞 

Тогда речь об "оптимизировать деление" вести бессмысленно.

 

PS: Хочу написать супер-пупер роман. Объясните как. Да - с грамотой не дружу, алфавита не знаю....  :sarcastic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/23/2024 at 5:19 PM, MPetrovich said:

На STM32 тоже проблем никаких бы не возникло, там деление в одно действие)))

Что вы имеете ввиду под одним действием ?
Деление на Cortex-M3 требует от 2 до 12 тактов.

On 7/23/2024 at 5:39 PM, jcxz said:

На STM32 есть аппаратное деление (по крайней мере на тех, которые >=Cortex-M3), на многих DSP - нет.

А при чем тут DSP ?

On 7/23/2024 at 5:19 PM, MPetrovich said:

Прошу прощения, но с ассемблером не дружу 😞 

ATMEL уже все за вас написал.
Вам только надо код, написанный ATMEL, подключить к своему проекту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...