eduardo писал(а):когда а принимает отрицательное значение(а<0),a-- не работает
С чего бы это ему не работать?
Не важно, отрицательное или положительное число. Это просто число, и инкремент/декремент работают всегда, и нулевую точку проходят бесшовно.
Другое дело, что у Вас код может быть кривым и вместо простых сравнений содержать разный ненужный изврат со сменой знака.
И убедитесь, что функция вывода на дисплей корректно умеет выводить отрицательное число, походя не меняя при этом его знак.
Volgol_555 писал(а):Average_R=Average_R*(0.3384+0.00104*(Average_R-361))
Странное выражение, т.к. пересчитывается не линейно, а есть и квадратичная зависимость. Но ладно. Принцип простой - избавиться от double чисел, и, по возможности, от делений. Ну или делить можно на степени двойки, это равносильно сдвигам. Если упростить выражение (сокращу Average_R до просто R).
Код: Выделить всё
R = R * (0.3384 + 0.00104 * (R - 361))
R = R * (0.3384 + 0.00104R - 0.37544)
R = R * (0.00104R - 0.03704)
С большой точностью 0.00104 можно представить как 68/65536, а 0.03704 - как 2427/65536. Поэтому
Ну а для AVR это можно записать уже как (учитывая, что деление на 65536 это сдвиг вправо на 16 знаков.
Думаю, что этот код будет гораздо компактнее варианта с double. Префикс L (в константе 68L) важен, так как 68 * R может теоретически выйти за пределы 16-битного целого, да и умножение потом ещё раз на R тоже может привести к этому. Поэтому пусть расчёты лучше будут целочисленные 32-битные.
Задавшись целью, можно ещё сильнее оптимизировать, но, думаю, и этого будет достаточно.