0) F_CPU следует определить в makefile, или до включения delay.h;
1) Здесь прерывание следует использовать лишь в том случае, если между запуском АЦ-преобразования и собстно его завершением вы занимаетесь какой-то другой полезной работой;
2) Прерывание будет срабатывать не по вашей задумке, т.к., как уже подметил
smac, или необходимо ждать завершения текущего преобразования перед сменой флага и канала (просто ждать нельзя, см пункт 2 -- теряется целесообразность вообще прерывания), либо исключить ситуацию что флаг меняется до срабатывания прерывания (например, АЦ-преобразование по второму каналу пусть запускается из прерывания, после оконцания работы с 1-м каналом). Регистры АЦП-блока буферизуются (если идет АЦ-преобразование, то запись в регистры не повлияет на текущее преобразование), и таким образом у вас преобразование выполнится для одного канала, а результаты воспримутся как для другого...
Примерчик простой реализация преобразования без прерываний:
CODE
/* ATMega103 (128 with M103C programmed */
#define BIT(x) (1 << (x))
WORD DoADC(BYTE _ADMUX)
{
WORD value;
ADMUX = _ADMUX;
_delay_ms(250); // Wait till signals are stabilized
ADCSR |= BIT(ADSC); // Start conversion
while(ADCSR & BIT(ADSC)); // Wait till conversion done
*((BYTE *) &value) = ADCL; // Read lower byte
*(((BYTE *) &value) + 1) = ADCH; // Read higher byte
return value;
}
void GetVoltages(void)
{
ADCSR = BIT(ADEN) | BIT(ADSC) | BIT(ADPS2) | BIT(ADPS1) | BIT(ADPS0); // Enable ADC, start dummy conversion to init ADC
while(ADCSR & BIT(ADSC)); // Wait till dummy conversion done
voltage1 = DoADC(0x00); // AREF, single ended input - PORTF0
voltage2 = DoADC(BIT(MUX0)); // AREF, single ended input - PORTF1
voltage3 = DoADC(BIT(MUX1)); // AREF, single ended input - PORTF2
voltage4 = DoADC(BIT(MUX1) | BIT(MUX0)); // AREF, single ended input - PORTF3
ADCSR = 0; // disable ADC
}