AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
05.03.2019, 13:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.05.2008
Адрес: Мурманск
Сообщений: 1,300
Сказал спасибо: 461
Сказали Спасибо 526 раз(а) в 273 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от my504
|
Наверное не стоит плодить деление...
|
А, что вы так за МК переживаете. Если есть место, быстродействие удовлетворяет, пусть себе делит на здоровье. Мы тут решаем супер задачу, а мультиметры True RMS
обходятся в основном аналоговой схемой.
|
|
|
|
05.03.2019, 14:15
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от IOPA4
|
А, что вы так за МК переживаете.
|
Я переживаю не за МК, а за свойства того или иного алгоритма.
И с быстродействием все не так однозначно. Дело не столько в быстродействии, сколько в ПОТРЕБЛЕНИИ.
Каждая выполненная инструкция в МК - это определенное количество электроэнергии. Либо можно понизить тактовую у МК, либо быстро исполнять код измерения и падать в сон до следующего измерения.
Из этого следует, что код должен быть плотным. То есть минимальным по количеству исполняемых инструкций.
В части измерения RMS это дает уменьшение тепловыделения балластом питающим МК прямо от сети, либо уменьшение мощности изолирующего источника для измерения тока в высоковольтном фазном проводе. И много чего еще...
Раз уж речь идет о перфекционизме, то не стоит скатываться на решение из кубиков.
Иначе это либо непрофессионально, либо неинтересно (это в случае с хобби).
|
|
|
|
05.03.2019, 14:17
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от МВА
|
Я это понял.
Можно, где у меня есть вычисления в float, заменить деления умножением.
|
Деление заменяется умножением, только если это деление на константу.
|
|
|
|
06.03.2019, 22:46
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Как то не хотелось подымать тему... но...
Сообщение от МВА
|
Видно хреновый из меня программист.
Сегодня поэкспериментировал, в студии.
|
Хрен тоже разный бывает, Хреновуха она еще та.... Главное экспериментировать...и дрожжей побольше, ну и сахару...
Ты просто не то нашел...
То что ты сделал это кусок кода из стандартной функции старых версий компилятора HI-TECH... типа такого
PHP код:
|
{ ..... ng = (x/og + og)/2.0; if(ng == og) break; og = ng; } while(--niter); return og;
|
А ты, например, вот это попробуй (сделай под себя)...
PHP код:
|
MX_UINT FCM_isqrt(MX_UINT32 FCL_X) { //Local variable definitions MX_UINT32 FCL_M; MX_UINT32 FCL_B; MX_UINT FCR_RETVAL;
FCL_M = 0x40000; // // 0x40000000 Порядок FCR_RETVAL = 0;
while (FCL_M != 0) { FCL_B = FCR_RETVAL | FCL_M; FCR_RETVAL = FCR_RETVAL ›› 1;
if (FCL_X ›= FCL_B) { FCL_X = FCL_X - FCL_B; FCR_RETVAL = FCR_RETVAL | FCL_M; } FCL_M = FCL_M ›› 2; } return (FCR_RETVAL); }
|
Ни одного явного умножения и деления...
Главное определиться с необходимым порядком вычислений..
Вот что получается...
|
|
|
|
08.03.2019, 15:34
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Конечно, алгоритм вычисления я не понял, но функцию проверил.
Точность примерно такая же как и в тех функциях, что я использовал раньше, но трассировка показала, что не самая лучшая. Стандартная функция, вычисляющая с плавающей точкой, работает быстрей.
PS. Упс... Заметил, что в функции от mimuh64 когда я присваиваю принудительно 0xFFFFFFFF, результат квадрата равен 255 в то время, как у стандартной функции - 65536. И такая ситуация возникает, когда я присваиваю и 0хFFFF, и 0xFFFFFF. Я думал, что это дело в студии, но протез выдает аналогичные результаты. Хотя без присваивания программа вроде работает адекватно.
Что бы это значило?
Последний раз редактировалось МВА; 08.03.2019 в 16:20.
|
|
|
|
08.03.2019, 17:05
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от МВА
|
Что бы это значило?
|
Это значит не внимательный... Например, что бы это значило -
PHP код:
|
// 0x40000000 Порядок
|
.
А также изменить размер переменной "возврата"... Но, здесь большое но... Я написал - нужно определиться с порядком.
Все это оптимизировано для диапазона вычислений программы, тогда получаем выгоду... в противном случае это только мышиная возня.
Успехов.
ЗЫ да... я бы еще ковырнул тырнет... например там... , в конце...
Последний раз редактировалось mimuh64; 08.03.2019 в 17:21.
|
|
|
|
08.03.2019, 19:23
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Что-то меня данный алгоритм не вдохновляет. Если присмотреться к трассировке в студии, в моем предыдущем посте, то видно, что стандартная функция выполняется за в 2 раза меньшее количество машинных тактов, а следовательно и время. Я не думаю, чтобы студия могла ошибиться в этом случае.
|
|
|
|
10.03.2019, 10:30
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от МВА
|
Я не думаю, чтобы студия могла ошибиться в этом случае.
|
Студия не ошибается.... Там такой же компилятор каким и я пользуюсь...
Сделай следующий пример в протеусе (два действия в одном).
1. A=sqrt(0xFFFF);
2. В=sqrt(переменная);
Переменную читай с АЦП
Поставь метки, измерь время и спроси себя почему? в первом случае наносекунды, во втором микросекунды...? Думаю что придет переосмысление - оптимизация при компиляции...
Нельзя так сравнивать как ты сравнивал...
|
|
|
|
10.03.2019, 11:56
|
|
Прописка
Регистрация: 30.07.2006
Адрес: Фрязино, М.О.
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 23 раз(а) в 20 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Для МК с умножением извлечение квадратного корня последовательным приближением из 32 разрядов в 16 разрядов занимает примерно 160 м. ц. в 16-разрядной платформе и от 200 до 300 в 8-разрядной.
Учитывая, что извлечение корня производится один раз за период накопления, экономия на этой функции выглядит достаточно странной.
|
|
|
|
10.03.2019, 14:24
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Амперметр Atmega. Как устаканить??
Сообщение от my504
|
Учитывая, что извлечение корня производится один раз за период накопления, экономия на этой функции выглядит достаточно странной.
|
Если измерения производятся с целью отображения на индикатор, то да. А если с целью работы защиты, например от перегрузки, то тогда сокращение времени имеет смысл, и большой.
На счет сравнения вычисления из константы или переменной... Но если Вы заметили, то я сравнивал две функции в одинаковых условиях. Правда обе без оптимизации. И стандартная функция, несмотря на вычисления в float, показала себя более быстродействующей.
Сообщение от mimuh64
|
1. A=sqrt(0xFFFF);
2. В=sqrt(переменная);
Переменную читай с АЦП
|
И еще, стандартная sqrt() - Время выполнения зависит от величины переменной. Я это еще раньше заметил в AVR studio при работе симулятора студии, АЦП все время выдает 0, тогда sqrt() выполняется за 58 тактов (7,25 us при 8 MHz), а при переменной 0xFFFFFFFF - за 750 тактов.
Последний раз редактировалось МВА; 10.03.2019 в 14:38.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:24.
|
|