сделал все таки - и не скачет, и почти мгновенно
...
#pragma vector = ADC_vect __interrupt void MY_ADC (void)
{
ADCrez = ADCL; ADCrez = ADCrez + (ADCH << 8);
}
...
ADMUX = Bit(REFS0) | Bit(REFS1);
ADCSRA = Bit(ADEN) | Bit(ADIE) | Bit(ADPS2) | Bit(ADPS1) | Bit(ADPS0);
ADCSRA |= Bit(ADSC);
DIDR0 |= Bit(ADC0D);
...
(main)
...
for (;;)
{
if (ADCSRA & Bit(ADIF) != 0)
{
x1=x2;
x2=x3;
x3=x4;
x4=x5;
x5=x6;
x6=x7;
x7=x8;
x8=x9;
x9=x10;
x10=ADCrez;
ADCrez = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)/10;
Uadc = (0.1947 * (float)ADCrez) + 9.5684;
ADCSRA |= Bit(ADSC);
j++;
}
...
case 1: // вывод напряжения
ADCSRA |= Bit(ADSC);
j=0;
SetDataDisp (1,(unsigned short)Uadc);
break;
...
правда, чтобы не загружать сильно процессор надо правильней наверно так:
...
if (j<10)
{
if (ADCSRA & Bit(ADIF) != 0)
{
x1=x2;
x2=x3;
x3=x4;
x4=x5;
x5=x6;
x6=x7;
x7=x8;
x8=x9;
x9=x10;
x10=ADCrez;
ADCrez = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10)/10;
Uadc = (0.1947 * (float)ADCrez) + 9.5684;
ADCSRA |= Bit(ADSC);
j++;
}
}
...
но тогда показания меняются совсем медленно, и не могу понять почему