реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> деление до сотых, на Си для 8-битного микроконтрллера
another_one
сообщение Feb 19 2010, 11:11
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 252
Регистрация: 2-03-08
Пользователь №: 35 557



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

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

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

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

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


--------------------
One Chip is All You Need
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 19 2010, 11:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

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

Как-нибудь да можно. Вопрос уточните.
Go to the top of the page
 
+Quote Post
another_one
сообщение Feb 19 2010, 11:51
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 252
Регистрация: 2-03-08
Пользователь №: 35 557



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

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

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

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

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

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


--------------------
One Chip is All You Need
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 19 2010, 12:00
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

float f2 = (float)f1 / 1.66;
Это если время есть.
Если нет - то как сказали ранее
f2 = f1 * 3 / 5;


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 19 2010, 13:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(another_one @ Feb 19 2010, 16:51) *
"на входе" и "на выходе" целое число, коэффициент деления вещественное число.
Какой разрядности целые числа на входе и выходе? Коэффициент деления фиксированный (1,66) или произвольный? С какой точностью нужно получить результат деления?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 19 2010, 14:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
V_G
сообщение Feb 19 2010, 15:05
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



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

В этом случае полезно почитать заметки по fractional baud rate generation в мануале на atxmeg'у. Тут важно понять принцип, написать соотв. алгоритм, и неважно, реализовать его на Си или ассемблере (в смысле, сложность написания программ в данном конкретном случае примерно одинакова). А выливается это в периодическое переключение коэффициентов пересчета таймера после достижения переполнения.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 19 2010, 15:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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%.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Feb 20 2010, 07:09
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(rezident @ Feb 19 2010, 18:57) *
Тогда получается "магическое" число 39480 (39480/65536=0,602417). Исходное 16-и разрядное число умножаем на 39480, а затем делаем сдвиг результата умножения вправо на 16 разрядов.

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

Сообщение отредактировал rezident - Feb 20 2010, 16:03
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 20 2010, 09:22
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



another_one
А почему нельзя сразу частоту таймера поделить на 1.66 при измерении?
Значение таймера будет уже готовое для использования.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Feb 20 2010, 11:37
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



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

Начнем с того, что тем способом, о котором Вы писали, Вы измеряете не частоту, а период.
А относительно того, как действовать дальше Вам достаточно подробно ответили. Ибо других
подробностей Вашей задачи нам неизвестно.
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 20 2010, 12:10
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



VladimirYU
Речь идёт именно о том, что частота входного сигнала - значение таймера между двумя соседними "импульсами"
если выходная частота - деление на 1.66 входной, то зачем выполнять арифметическое деление, если можно напрямую измерить с коэффициентом?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 20 2010, 15:35
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(rezident @ Feb 19 2010, 19:57) *
Нет. Деление нужно заменить умножением.

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
another_one
сообщение Feb 21 2010, 05:23
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 252
Регистрация: 2-03-08
Пользователь №: 35 557



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

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


--------------------
One Chip is All You Need
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 21 2010, 06:49
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(another_one @ Feb 21 2010, 08:23) *
точность до 100-х

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

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

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st July 2025 - 08:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016