another_one 0 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Здравствуйте. Нужна поддержка в следующем вопросе: Можно ли целую величину поделить например на 1.66 и можно ли как-нибудь вещественным рельтатом оперировать в качестве содержимым регистра таймера? Буду рад любой информации по этому поводу Заранее благодарен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Можно ли целую величину поделить например на 1.66 Если хотите выполнить вычисления в целых, то умножьте на 3, затем поделите на 5. можно ли как-нибудь вещественным рельтатом оперировать в качестве содержимым регистра таймера? Как-нибудь да можно. Вопрос уточните. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Спасибо большое за поддержку. Понял что не правильно задал вопрос: Задача заключается в деление частоты входного дискретного сигнала на 1.66 и выдача ее наружу. Частота входного сигнала - значение таймера между двумя соседними "импульсами", выходная частота - деление на 1.66 входной. "на входе" и "на выходе" целое число, коэффициент деления вещественное число. Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора. float f2 = (float)f1 / 1.66; Это если время есть. Если нет - то как сказали ранее f2 = f1 * 3 / 5; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба "на входе" и "на выходе" целое число, коэффициент деления вещественное число.Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора. Проблемы не в 8-разрядным контроллере или IARе, а в Вашей голове ;) Поточнее поделить можно только смещая "фиксированную точку" Например a=b*50/3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба А я понял вопрос топикстартера так: как сделать делитель частоты с дробным коэффициентом деления? В этом случае полезно почитать заметки по fractional baud rate generation в мануале на atxmeg'у. Тут важно понять принцип, написать соотв. алгоритм, и неважно, реализовать его на Си или ассемблере (в смысле, сложность написания программ в данном конкретном случае примерно одинакова). А выливается это в периодическое переключение коэффициентов пересчета таймера после достижения переполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 19 февраля, 2010 Опубликовано 19 февраля, 2010 · Жалоба Поточнее поделить можно только смещая "фиксированную точку" Например 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 0 20 февраля, 2010 Опубликовано 20 февраля, 2010 (изменено) · Жалоба Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов. Кстати тема "магических" чисел уже, кажется, звучала на сахаре. Может автору топика будет полезно там покопаться Изменено 20 февраля, 2010 пользователем rezident Нарушение п.3.4 Правил форума. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 20 февраля, 2010 Опубликовано 20 февраля, 2010 · Жалоба another_one А почему нельзя сразу частоту таймера поделить на 1.66 при измерении? Значение таймера будет уже готовое для использования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 20 февраля, 2010 Опубликовано 20 февраля, 2010 · Жалоба another_one А почему нельзя сразу частоту таймера поделить на 1.66 при измерении? Значение таймера будет уже готовое для использования. Начнем с того, что тем способом, о котором Вы писали, Вы измеряете не частоту, а период. А относительно того, как действовать дальше Вам достаточно подробно ответили. Ибо других подробностей Вашей задачи нам неизвестно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASN 0 20 февраля, 2010 Опубликовано 20 февраля, 2010 · Жалоба VladimirYU Речь идёт именно о том, что частота входного сигнала - значение таймера между двумя соседними "импульсами" если выходная частота - деление на 1.66 входной, то зачем выполнять арифметическое деление, если можно напрямую измерить с коэффициентом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 20 февраля, 2010 Опубликовано 20 февраля, 2010 · Жалоба Нет. Деление нужно заменить умножением. Покажите мне преимущества Вашего метода при входном значении 5 ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
another_one 0 21 февраля, 2010 Опубликовано 21 февраля, 2010 · Жалоба Всем большое спасибо за поддержку Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления? Планирую использовать 2 16-битных таймера(вход, выход), коэффициент деления фиксированый, точность до 100-х Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 21 февраля, 2010 Опубликовано 21 февраля, 2010 · Жалоба точность до 100-х Еще раз - как вы понимаете точность? До сотых - чего сотых?! Или Вы не можете перевести в код то, что rezident написал? timer2 = (unsigned int)(((unsigned long)timer1*39480L)>>16); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться