Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: деление до сотых
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
another_one
Здравствуйте.

Нужна поддержка в следующем вопросе:

Можно ли целую величину поделить например на 1.66 и можно ли как-нибудь вещественным рельтатом оперировать в качестве содержимым регистра таймера?

Буду рад любой информации по этому поводу

Заранее благодарен
aaarrr
Цитата(another_one @ Feb 19 2010, 14:11) *
Можно ли целую величину поделить например на 1.66

Если хотите выполнить вычисления в целых, то умножьте на 3, затем поделите на 5.

Цитата(another_one @ Feb 19 2010, 14:11) *
можно ли как-нибудь вещественным рельтатом оперировать в качестве содержимым регистра таймера?

Как-нибудь да можно. Вопрос уточните.
another_one
Спасибо большое за поддержку.

Понял что не правильно задал вопрос:

Задача заключается в деление частоты входного дискретного сигнала на 1.66 и выдача ее наружу.

Частота входного сигнала - значение таймера между двумя соседними "импульсами", выходная частота - деление на 1.66 входной.

"на входе" и "на выходе" целое число, коэффициент деления вещественное число.

Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.
MrYuran
Цитата(another_one @ Feb 19 2010, 14:51) *
Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.

float f2 = (float)f1 / 1.66;
Это если время есть.
Если нет - то как сказали ранее
f2 = f1 * 3 / 5;
rezident
Цитата(another_one @ Feb 19 2010, 16:51) *
"на входе" и "на выходе" целое число, коэффициент деления вещественное число.
Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления?
Dog Pawlowa
Цитата(another_one @ Feb 19 2010, 15:51) *
Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.

Проблемы не в 8-разрядным контроллере или IARе, а в Вашей голове wink.gif
Поточнее поделить можно только смещая "фиксированную точку"
Например a=b*50/3
V_G
А я понял вопрос топикстартера так: как сделать делитель частоты с дробным коэффициентом деления?

В этом случае полезно почитать заметки по fractional baud rate generation в мануале на atxmeg'у. Тут важно понять принцип, написать соотв. алгоритм, и неважно, реализовать его на Си или ассемблере (в смысле, сложность написания программ в данном конкретном случае примерно одинакова). А выливается это в периодическое переключение коэффициентов пересчета таймера после достижения переполнения.
rezident
Цитата(Dog Pawlowa @ Feb 19 2010, 19:43) *
Поточнее поделить можно только смещая "фиксированную точку"
Например a=b*50/3
Нет. Деление нужно заменить умножением. Деление на 1,66=166/100 эквивалентно умножению на обратную дробь 100/166=0,6024096. При целочисленном умножении точность не уменьшается. Ошибка возникает при целочисленном делении. Вот ее и нужно оценить.
Для упрощения (и ускорения) целочисленного деления оно заменяется сдвигами, которые эквивалентны делению на 2^N. Соответственно исходную дробь нужно заранее умножить на 2^N так, чтобы с одной стороны не превысить разрядную сетку вычислений после умножения, а с другой стороны, чтобы обеспечить требуемую точность приближения дроби. Если исходное целое число 16-и разрядное, а вычисления ведутся в 32-х битной арифметике, то можно домножить на 2^16=65536. Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов. Погрешность при таком целочисленном делении получается меньше 0,0015%.
VladimirYU
Цитата(rezident @ Feb 19 2010, 18:57) *
Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов.

Кстати тема "магических" чисел уже, кажется, звучала на сахаре. Может автору топика будет полезно там покопаться
ASN
another_one
А почему нельзя сразу частоту таймера поделить на 1.66 при измерении?
Значение таймера будет уже готовое для использования.
VladimirYU
Цитата(ASN @ Feb 20 2010, 12:22) *
another_one
А почему нельзя сразу частоту таймера поделить на 1.66 при измерении?
Значение таймера будет уже готовое для использования.

Начнем с того, что тем способом, о котором Вы писали, Вы измеряете не частоту, а период.
А относительно того, как действовать дальше Вам достаточно подробно ответили. Ибо других
подробностей Вашей задачи нам неизвестно.
ASN
VladimirYU
Речь идёт именно о том, что частота входного сигнала - значение таймера между двумя соседними "импульсами"
если выходная частота - деление на 1.66 входной, то зачем выполнять арифметическое деление, если можно напрямую измерить с коэффициентом?
Dog Pawlowa
Цитата(rezident @ Feb 19 2010, 19:57) *
Нет. Деление нужно заменить умножением.

Покажите мне преимущества Вашего метода при входном значении 5 wink.gif
another_one
Всем большое спасибо за поддержку
Цитата
Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления?

Планирую использовать 2 16-битных таймера(вход, выход), коэффициент деления фиксированый, точность до 100-х
Dog Pawlowa
Цитата(another_one @ Feb 21 2010, 08:23) *
точность до 100-х

Еще раз - как вы понимаете точность? До сотых - чего сотых?!

Или Вы не можете перевести в код то, что rezident написал?

timer2 = (unsigned int)(((unsigned long)timer1*39480L)>>16);
ASN
another_one
Если у Вас ДВА таймера - можно задать коэффициент деления частот выходного таймера в N раз меньше, чем входного.
Значение заполнения входного скопируйте при перезагрузке таймера в выходной.
Всё само собой поделиться с точностью до тактовой частоты.
Зачем вводить лишние сущности ?
Если используйте ОДИН таймер - необходимо использовать арифметические операции как Вам расписали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.