Более чем уверен, кто-то с этим уже сталкивался. Есть атмега128, надо прочитать все 8 каналов АЦП. Раз в 100 мс по прерыванию запускается процедурка:
Код: Выделить всё
void ADC_getdata()
{
for(uint8_t i=0; i<8;i++)
{
ADMUX |= ( i & 0x0f);
ADCSRA |= (1<<ADEN)|(1<<ADSC);
while ((ADCSRA & 0x10)==0);
[b] _delay_ms(1); // dirty hack[/b]
ADCSRA|=0x10;
ADC_data[i]=ADCH;
ADMUX &= ~( i & 0x0f);
}
}
ADC в free-running mode.
проблема в том, что delay нежелателен, а без него почему-то 2 раза подряд считывается значение 0-го канала ЦАП. Как это сделат правильно малой кровью? Главная прога большая, с несколькими прерываниями, и запускать еще одно не хочется.