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

Здравствуйте.

 

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

 

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

 

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

 

Заранее благодарен

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


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

Можно ли целую величину поделить например на 1.66

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

 

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

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

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


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

Спасибо большое за поддержку.

 

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

 

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

 

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

 

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

 

Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.

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


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

Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.

float f2 = (float)f1 / 1.66;

Это если время есть.

Если нет - то как сказали ранее

f2 = f1 * 3 / 5;

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


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

"на входе" и "на выходе" целое число, коэффициент деления вещественное число.
Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления?

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


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

Не сооброжу как можно наиболее точно поделить(, используя ресурсы 8-ми битного микроконтроллера и IAR компилятора.

Проблемы не в 8-разрядным контроллере или IARе, а в Вашей голове ;)

Поточнее поделить можно только смещая "фиксированную точку"

Например a=b*50/3

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


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

А я понял вопрос топикстартера так: как сделать делитель частоты с дробным коэффициентом деления?

 

В этом случае полезно почитать заметки по fractional baud rate generation в мануале на atxmeg'у. Тут важно понять принцип, написать соотв. алгоритм, и неважно, реализовать его на Си или ассемблере (в смысле, сложность написания программ в данном конкретном случае примерно одинакова). А выливается это в периодическое переключение коэффициентов пересчета таймера после достижения переполнения.

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


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

Поточнее поделить можно только смещая "фиксированную точку"

Например 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%.

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


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

Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов.

Кстати тема "магических" чисел уже, кажется, звучала на сахаре. Может автору топика будет полезно там покопаться

Изменено пользователем rezident
Нарушение п.3.4 Правил форума.

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


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

another_one

А почему нельзя сразу частоту таймера поделить на 1.66 при измерении?

Значение таймера будет уже готовое для использования.

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


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

another_one

А почему нельзя сразу частоту таймера поделить на 1.66 при измерении?

Значение таймера будет уже готовое для использования.

Начнем с того, что тем способом, о котором Вы писали, Вы измеряете не частоту, а период.

А относительно того, как действовать дальше Вам достаточно подробно ответили. Ибо других

подробностей Вашей задачи нам неизвестно.

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


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

VladimirYU

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

если выходная частота - деление на 1.66 входной, то зачем выполнять арифметическое деление, если можно напрямую измерить с коэффициентом?

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


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

Нет. Деление нужно заменить умножением.

Покажите мне преимущества Вашего метода при входном значении 5 ;)

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


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

Всем большое спасибо за поддержку

Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления?

Планирую использовать 2 16-битных таймера(вход, выход), коэффициент деления фиксированый, точность до 100-х

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


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

точность до 100-х

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

 

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

 

timer2 = (unsigned int)(((unsigned long)timer1*39480L)>>16);

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


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

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

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

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

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

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

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

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

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

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