QUOTE (smk @ Feb 2 2012, 09:42)

ИАР выдает несколько предупреждений
Правильно выдает. Чтение volatile может приводить к изменению ее содержимого (вспомните регистр UDR или подобные) и содержимого других volatile-переменых (при чтении ADCH обновляется ADCL). В вычислении результата ваших выражений используются минимум две volatile-переменные. Компилятор предупреждает, что поскольку порядок вычисления выражений не определен, то и результат вычислений
может быть не таким, как вы ожидаете. У вас есть два варианта решения:
1) Избавиться от лишних volatile и тогда большинство выражений будет содержать максимум одну volatile-переменную.
2) В оставшихся выражениях вместо "лишних" volatile-переменных использовать временные локальные переменные, в которые заранее считано значение из volatile:
CODE
uint16_t ADC_result;
{
uint8_t Tmp = ADCL;
ADC_result = (ADCH << 8) | Tmp;
}
Ну или не делать п.1 а везде применять п.2, но это тупиковое решение и сокращения кода вы так не получите.
Исправил - попутаны были ADCH и ADCL