Страница 1 из 3
Числа с плавающей точкой в микроконтроллерах AVR
Добавлено: Пн фев 12, 2007 13:39:30
FAndrey
Возможно ли использовать в микроконтроллерах AVR, числа с плавающей точкой? Как я понял при их программировании используется язык СИ. Если возможно их использование, то работают ли ля них операции деления и умножения?
Добавлено: Пн фев 12, 2007 13:56:48
Tohey
А чего ж невозможно! Если на си программируют, то ессно и на АСМе возможно.
Добавлено: Пн фев 12, 2007 14:01:30
FAndrey
Т.е. АЛУ получается в них прошито?
Добавлено: Пн фев 12, 2007 14:21:09
ARV
Какое еще АЛУ-малу прошито?!
АЛУ в AVR байтовое, обрабатывает только целые числа от 0 до 255 (или со знаком, т.е. от -127 до +127). А все операции с дробными числами (хоть с плавающей точкой, хоть с фиксированной) реализуются программно. Какую программу напишешь - то она и будет делать: хочешь - умножать, хочешь - делить, хочешь - корень извлекать.
А в Си основные операции арифметики уже есть, потому никакой самодеятельности не требуется.
Добавлено: Пн фев 12, 2007 14:23:40
FAndrey
Понял, спасибо.
Добавлено: Пн фев 12, 2007 15:16:14
Abakt
на Си напиши то что нужно, откомпиль и посмотри листинг на АСМе.
Добавлено: Пн фев 12, 2007 22:27:05
Aheir
И что это даст в свете вопроса о возможности арифметических операций над числами с плавающей точкой?
Добавлено: Пн фев 12, 2007 22:54:26
Abakt
покажет как эти операции реализовать на АСМе.
Добавлено: Пн фев 12, 2007 22:59:28
FAndrey
Жаль что не все так же просто на ПЛИС.
Добавлено: Пн фев 12, 2007 23:42:26
KT315B
Гм, странно... Только что пытался посмотреь, как МК передаст в порт десятичную дробь - сделал в лоб написал PORTB=15.41 и посмотрел в VMLAB'e осциллографом выход - там оказалось только 00001111 (то бишь 15 - целая часть). Куда-же делось все остальное? Кстати, а в каком виде AVR хранить десятичные дроби? Подозреваю, что не одним байтом дело обходится?
Добавлено: Вт фев 13, 2007 08:50:41
ARV
1. Интересно, а что ты ожидал увидеть?! Порт-то ОДНОБАЙТОВЫЙ!!! А любое дробное число представлено как минимум НЕ ОДНИМ байтом (а в зависимости от типа 4 или более, иногда 3-мя).
2. Проанализируйте свою необходимость работы с дробными числами. Всегда можно заранее предусмотреть диапазон как входных чисел, так и выходных. анализ этих входны-выходных потоков чисел возможно позволит вам отказаться от дробей - это резко ускорит вычисления и сократит объем программы, а так же требования к памяти. Как и почему это получается: предположим, мы работаем с температурой - датчик нам выдает значения в сотых долях градуса, а весь диапазон наших температур не более 50 градусов. Это значит, что всего мы можем получить от датчика не более 5000 разных чисел, т.е. ЦЕЛОЕ число (которое займет 2 байта), и никаких сотых долей!. Грубо говоря, во всех расчетах просто отбрасываем запятую, в результате чего получаем ЦЕЛОЕ ЧИСЛО в 100 РАЗ БОЛЬШЕ ФАКТИЧЕСКОЙ ТЕМПЕРАТУРЫ. С этим значением делаем, что нам надо по правилам целочисленной арифметики, а когда потребуется вывести результат - просто ВСТАВИМ знак запятой перед ДВУМЯ ПОСЛЕДНИМИ ЦИФРАМИ - и все! Никакой плавающей точки!
Как правило, почти всегда можно воспользоваться этим приемом.
Добавлено: Вт фев 13, 2007 10:06:01
Abakt
KT315B писал(а):написал PORTB=15.41 и посмотрел в VMLAB'e осциллографом выход - там оказалось только 00001111
можно было просто открыть просмотр портов в VMALB и посмотреть что там.
почитайте о переменных Си в самом начале странички pid.by.ru/05a.htm и подумайте что такое PORTB с точки зрения компилятора.
Добавлено: Вт фев 13, 2007 16:38:47
moLCHec
ARV дело говорит если нужно организовать простые арифметические операции то лучше умножить число на 10^n. Я так с температурой делал тока в Си используя тип long int. Хуже если синусы или там корни какиенибудь но и здесь можно просто разложить в ряд и всё ограничется делением и сложением. Для тех кто не верит слепо в Си есть функции AVR для работы с дробными числами. НАпример функция умножения знаковых чисел FMULS. тока в тини вроде этой команды нет.
Добавлено: Вт фев 13, 2007 16:54:00
Abakt
moLCHec писал(а):Для тех кто не верит слепо в Си есть функции AVR для работы с дробными числами.
а для тех кто верит в Си эти функции недоступны ?
Добавлено: Вт фев 13, 2007 18:06:17
moLCHec
Доступны только про них часто забывают или вообще не знают либо не заморачиваются когда можно объявить тип float. Скажи честно как часто ты используешь в Си асемблеровские вставики.
Добавлено: Вт фев 13, 2007 18:45:37
Abakt
я только sei cli wdt использую - чисто традиционно для CVAVR. так как и средствами Си можно управлять битами и пимеры приведены в даташитах на меги.
на счет "по честному" - я только так всегда и пишу.
Добавлено: Вт фев 13, 2007 20:48:54
ARV
moLCHec писал(а):Хуже если синусы или там корни какие-нибудь но и здесь можно просто разложить в ряд и всё ограничется делением и сложением.
Если и хуже, то не сильно

. Если использовать функции Си для вычисления синуса - то никакой производительности
меги не хватит! Очень часто, точнее - везде, где можно, и в Си используют
табличное представление синуса (а не ряд - забодаешься суммировать

), т.е. вместо вычисления используют извлечение из таблицы заранее расчитанного значения. Этот путь намного быстрее, а наличие большого объема памяти позволяет хранить значение синуса хоть с точностью до пятого знака после запятой (хотя и двух знаков порой достаточно). Естественно, хранят целые числа, умноженные на коэффициент кратный 10: 10, 100, 1000 и т.д. Если знаком с алгеброй - то работа с синусами в
целочисленном представлении труда не составит.
Действительно хуже с корнями и логарифмами всякими, т.к. это апериодические функции. Это для синуса (а также косинуса) можно задать таблицу значений с определенным шагом для значений аргумента от 0 до Pi/4 - и хватит, остальное вычисляется элементарно по формулам преобразования. А для апериодических функций табличное представление возможно только для ограниченного набора аргумента.
В общем, без школьного учебника алгебры - никак, господа коты 
Добавлено: Вт фев 13, 2007 20:53:28
moLCHec
На счёт рядов точно не помню но вроде для точности 2-х знаков не более 4-х слагаемых. Хотя геммор а куды денешься.

Добавлено: Вт фев 13, 2007 21:36:27
ARV
Про Си могу привести пару отрицательных примеров.
1. Чисто для эксперимента пробовал на Си вычислить синус, в результате программа выполнялась несколько миллисекунд - это при АВРовской-то производительности! Размер кода тоже, мягко говоря, получился не радующим. Я конечно понимаю, у меги памяти куча, и внешний кварц на 10 МГц можно поставить и даже больше, но получается как-то нерационально... А с таблицей я тот же синус получаю за десяток команд асма (т.е. на 2 порядка быстрее), и размер кода не больше, чем на Си... Правда синус с тремя знаками после запятой, а не с плавающей точкой, но мне достаточно.
2. Пару раз попадал под "оптимизацию" компилятора Си, когда он так оптимизировал программу, что она просто не работала, а без оптимизации в память не влезала... Это я пытался "знаменитый" платформо-независимый код на Си использовать в чуть-чуть ином контроллере. Пришлось плюнуть и переписать на асме.
Может, я не такой уж знаток Си, но не очень-то и хотелось

Так что ухо надо держать востро постоянно...
Добавлено: Вт фев 13, 2007 21:54:05
Abakt
moLCHec писал(а):Не пойму почему ты так в Си слепо веришь.
Я не слепо а просто верю!
Так как Си
- существуют и применяется уже не одно десятилетие.
- он работает.
- он признан производителями МК - последние несколько лет БОЛЬШИНСТВО апноутов уже сопровождается кодом именно на Си.
Почему бы мне не доверять производителям если я использую их продукцию ?
Самое главное я ни где не писал что АСМ это плохо.