Цитата(ARV @ Jun 9 2009, 09:03)

что сделано сейчас и что не удовлетворяет (псевдо-Си-код)
t2 = 0;
do{
t1 = t2;
pause_1s();
t2 = get_temperature();
} while (t1 != t2);
Попробуйте так (код написан исходя из 16-битной разрядности int)
Код
// Допустимые колебания показаний,
// вы говорите, что дрожат младшие 2 бита, накинем еще один, чтобы избежать ложного перезапуска осреднения
#define ERROR 8
#define AVERAGE_SHIFT 4
// Количество показаний для осреднения,
// whatever you like чтобы получить больше точность, в данном случае 16
#define AVERAGE_COUNT (1<<AVERAGE_SHIFT)
#define ABS(a) ((a)>=0 ? (a) : -(a))
int t1;
int t2;
long int average = 0; // если разрядности хватит для суммирования температур из области
//допустимых значений, то long может и не нужен
int count = 0
t2 = get_temperature();
do
{
t1 = t2;
if (!count)
pause_long(); // достаточно долго, чтобы датчик успел нагреться/остыть на величину больше ERROR
else
pause_1s(); // при осреднении интервалы короче (может, можно и чаще чем раз в секунду?)
t2 = get_temperature();
if (ABS(t2-t1)<ERROR)
{
// если температура устаканилась, начинаем считать среднее
average+=t2;
count++;
}
else
{
// если температура не устаканилась, или опять начала меняться, сбрасываем среднее и опять ждём
average=0;
count=0;
}
} while (count<AVERAGE_COUNT);
average>>=AVERAGE_SHIFT; // результат
Надеюсь, четыре int в стеке - это не слишком большие ресурсы.
Сообщение отредактировал il--ya - Jul 2 2009, 10:58