Числа с плавающей точкой в микроконтроллерах AVR
- Сообщения: 4
- Зарегистрирован: Пн фев 12, 2007 13:30:32
Возможно ли использовать в микроконтроллерах AVR, числа с плавающей точкой? Как я понял при их программировании используется язык СИ. Если возможно их использование, то работают ли ля них операции деления и умножения?
- Реклама
- Сообщения: 4
- Зарегистрирован: Пн фев 12, 2007 13:30:32
Какое еще АЛУ-малу прошито?!
АЛУ в AVR байтовое, обрабатывает только целые числа от 0 до 255 (или со знаком, т.е. от -127 до +127). А все операции с дробными числами (хоть с плавающей точкой, хоть с фиксированной) реализуются программно. Какую программу напишешь - то она и будет делать: хочешь - умножать, хочешь - делить, хочешь - корень извлекать.
А в Си основные операции арифметики уже есть, потому никакой самодеятельности не требуется.
АЛУ в AVR байтовое, обрабатывает только целые числа от 0 до 255 (или со знаком, т.е. от -127 до +127). А все операции с дробными числами (хоть с плавающей точкой, хоть с фиксированной) реализуются программно. Какую программу напишешь - то она и будет делать: хочешь - умножать, хочешь - делить, хочешь - корень извлекать.
А в Си основные операции арифметики уже есть, потому никакой самодеятельности не требуется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 4
- Зарегистрирован: Пн фев 12, 2007 13:30:32
- Реклама
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
И что это даст в свете вопроса о возможности арифметических операций над числами с плавающей точкой?
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
- Сообщения: 4
- Зарегистрирован: Пн фев 12, 2007 13:30:32
Гм, странно... Только что пытался посмотреь, как МК передаст в порт десятичную дробь - сделал в лоб написал PORTB=15.41 и посмотрел в VMLAB'e осциллографом выход - там оказалось только 00001111 (то бишь 15 - целая часть). Куда-же делось все остальное? Кстати, а в каком виде AVR хранить десятичные дроби? Подозреваю, что не одним байтом дело обходится?
R2AIV 73!
1. Интересно, а что ты ожидал увидеть?! Порт-то ОДНОБАЙТОВЫЙ!!! А любое дробное число представлено как минимум НЕ ОДНИМ байтом (а в зависимости от типа 4 или более, иногда 3-мя).
2. Проанализируйте свою необходимость работы с дробными числами. Всегда можно заранее предусмотреть диапазон как входных чисел, так и выходных. анализ этих входны-выходных потоков чисел возможно позволит вам отказаться от дробей - это резко ускорит вычисления и сократит объем программы, а так же требования к памяти. Как и почему это получается: предположим, мы работаем с температурой - датчик нам выдает значения в сотых долях градуса, а весь диапазон наших температур не более 50 градусов. Это значит, что всего мы можем получить от датчика не более 5000 разных чисел, т.е. ЦЕЛОЕ число (которое займет 2 байта), и никаких сотых долей!. Грубо говоря, во всех расчетах просто отбрасываем запятую, в результате чего получаем ЦЕЛОЕ ЧИСЛО в 100 РАЗ БОЛЬШЕ ФАКТИЧЕСКОЙ ТЕМПЕРАТУРЫ. С этим значением делаем, что нам надо по правилам целочисленной арифметики, а когда потребуется вывести результат - просто ВСТАВИМ знак запятой перед ДВУМЯ ПОСЛЕДНИМИ ЦИФРАМИ - и все! Никакой плавающей точки!
Как правило, почти всегда можно воспользоваться этим приемом.
2. Проанализируйте свою необходимость работы с дробными числами. Всегда можно заранее предусмотреть диапазон как входных чисел, так и выходных. анализ этих входны-выходных потоков чисел возможно позволит вам отказаться от дробей - это резко ускорит вычисления и сократит объем программы, а так же требования к памяти. Как и почему это получается: предположим, мы работаем с температурой - датчик нам выдает значения в сотых долях градуса, а весь диапазон наших температур не более 50 градусов. Это значит, что всего мы можем получить от датчика не более 5000 разных чисел, т.е. ЦЕЛОЕ число (которое займет 2 байта), и никаких сотых долей!. Грубо говоря, во всех расчетах просто отбрасываем запятую, в результате чего получаем ЦЕЛОЕ ЧИСЛО в 100 РАЗ БОЛЬШЕ ФАКТИЧЕСКОЙ ТЕМПЕРАТУРЫ. С этим значением делаем, что нам надо по правилам целочисленной арифметики, а когда потребуется вывести результат - просто ВСТАВИМ знак запятой перед ДВУМЯ ПОСЛЕДНИМИ ЦИФРАМИ - и все! Никакой плавающей точки!
Как правило, почти всегда можно воспользоваться этим приемом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
можно было просто открыть просмотр портов в VMALB и посмотреть что там.KT315B писал(а):написал PORTB=15.41 и посмотрел в VMLAB'e осциллографом выход - там оказалось только 00001111
почитайте о переменных Си в самом начале странички pid.by.ru/05a.htm и подумайте что такое PORTB с точки зрения компилятора.
ARV дело говорит если нужно организовать простые арифметические операции то лучше умножить число на 10^n. Я так с температурой делал тока в Си используя тип long int. Хуже если синусы или там корни какиенибудь но и здесь можно просто разложить в ряд и всё ограничется делением и сложением. Для тех кто не верит слепо в Си есть функции AVR для работы с дробными числами. НАпример функция умножения знаковых чисел FMULS. тока в тини вроде этой команды нет.
Настоящий кот всегда либо голоден,
либо невыспался ...
либо невыспался ...
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
Доступны только про них часто забывают или вообще не знают либо не заморачиваются когда можно объявить тип float. Скажи честно как часто ты используешь в Си асемблеровские вставики.
Настоящий кот всегда либо голоден,
либо невыспался ...
либо невыспался ...
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
Если и хуже, то не сильноmoLCHec писал(а):Хуже если синусы или там корни какие-нибудь но и здесь можно просто разложить в ряд и всё ограничется делением и сложением.
Действительно хуже с корнями и логарифмами всякими, т.к. это апериодические функции. Это для синуса (а также косинуса) можно задать таблицу значений с определенным шагом для значений аргумента от 0 до Pi/4 - и хватит, остальное вычисляется элементарно по формулам преобразования. А для апериодических функций табличное представление возможно только для ограниченного набора аргумента. В общем, без школьного учебника алгебры - никак, господа коты
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
На счёт рядов точно не помню но вроде для точности 2-х знаков не более 4-х слагаемых. Хотя геммор а куды денешься. 
Настоящий кот всегда либо голоден,
либо невыспался ...
либо невыспался ...
Про Си могу привести пару отрицательных примеров.
1. Чисто для эксперимента пробовал на Си вычислить синус, в результате программа выполнялась несколько миллисекунд - это при АВРовской-то производительности! Размер кода тоже, мягко говоря, получился не радующим. Я конечно понимаю, у меги памяти куча, и внешний кварц на 10 МГц можно поставить и даже больше, но получается как-то нерационально... А с таблицей я тот же синус получаю за десяток команд асма (т.е. на 2 порядка быстрее), и размер кода не больше, чем на Си... Правда синус с тремя знаками после запятой, а не с плавающей точкой, но мне достаточно.
2. Пару раз попадал под "оптимизацию" компилятора Си, когда он так оптимизировал программу, что она просто не работала, а без оптимизации в память не влезала... Это я пытался "знаменитый" платформо-независимый код на Си использовать в чуть-чуть ином контроллере. Пришлось плюнуть и переписать на асме.
Может, я не такой уж знаток Си, но не очень-то и хотелось
Так что ухо надо держать востро постоянно...
1. Чисто для эксперимента пробовал на Си вычислить синус, в результате программа выполнялась несколько миллисекунд - это при АВРовской-то производительности! Размер кода тоже, мягко говоря, получился не радующим. Я конечно понимаю, у меги памяти куча, и внешний кварц на 10 МГц можно поставить и даже больше, но получается как-то нерационально... А с таблицей я тот же синус получаю за десяток команд асма (т.е. на 2 порядка быстрее), и размер кода не больше, чем на Си... Правда синус с тремя знаками после запятой, а не с плавающей точкой, но мне достаточно.
2. Пару раз попадал под "оптимизацию" компилятора Си, когда он так оптимизировал программу, что она просто не работала, а без оптимизации в память не влезала... Это я пытался "знаменитый" платформо-независимый код на Си использовать в чуть-чуть ином контроллере. Пришлось плюнуть и переписать на асме.
Может, я не такой уж знаток Си, но не очень-то и хотелось
Так что ухо надо держать востро постоянно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 568
- Зарегистрирован: Ср янв 10, 2007 19:15:51
Я не слепо а просто верю!moLCHec писал(а):Не пойму почему ты так в Си слепо веришь.
Так как Си
- существуют и применяется уже не одно десятилетие.
- он работает.
- он признан производителями МК - последние несколько лет БОЛЬШИНСТВО апноутов уже сопровождается кодом именно на Си.
Почему бы мне не доверять производителям если я использую их продукцию ?
Самое главное я ни где не писал что АСМ это плохо.


