Вот так будет понятнее?
#define Fnum 3 unsigned char a_mtemp[Fnum]; unsigned char a_dtemp[Fnum]; unsigned char amp_offset; unsigned char Temp_cur; #define MUX_offset 0x16 #define MUX_dry 0x14 #define MUX_moist 0x17 void LoadTemperature(void) { unsigned int temp; unsigned char i; ADCSR |= 1 << ADSC; // strat conversion while ((ADCSR & (1 << ADIF)) == 0); ADCSR |= (1 << ADIF); //clear interrupt flag temp = ADC; switch (ADMUX) { case MUX_offset: amp_offset = temp; ADMUX = MUX_moist; break; case MUX_moist: ADMUX = MUX_dry; break; case MUX_dry: for (i = 0; i < Fnum - 1; i++) { a_dtemp[i] = a_dtemp[i + 1]; } a_dtemp[Fnum] = (temp - amp_offset) / (Fnum + 1); // <----- а зачем ты здесь делишь? temp = 0; for (i = 0; i < Fnum; i++) { temp += a_dtemp[i]; } temp /= Fnum + 1; // <----- получается два раза? Temp_cur = temp; ADMUX = MUX_offset; break; } }