Код
ADCSRA = BIN(10111101); // ADC 250kHz при Fbq=8MHz, включен
ADCSRB = BIN(00000110);
Конечно, таймер 1 переполняется чаще, чем ADC успевает выполнить одно преобразование, но это пока представляется не важным.
Обработчик прерывания по завершению преобразования выполнен так:
Код
// ADC Conversion Complete
#pragma vector = ADC_vect
__interrupt void ADC_COMPLITE(void) {
unsigned int tmp = ADC;
if(ADMUX == BIN(10010010)){AS1 = tmp;ADMUX = BIN(10000010);return;}
if(ADMUX == BIN(10000010)){AS2 = tmp;ADMUX = BIN(10000011);return;}
if(ADMUX == BIN(10000011)){AS3 = tmp;ADMUX = BIN(10010010);return;}
}
#pragma vector = ADC_vect
__interrupt void ADC_COMPLITE(void) {
unsigned int tmp = ADC;
if(ADMUX == BIN(10010010)){AS1 = tmp;ADMUX = BIN(10000010);return;}
if(ADMUX == BIN(10000010)){AS2 = tmp;ADMUX = BIN(10000011);return;}
if(ADMUX == BIN(10000011)){AS3 = tmp;ADMUX = BIN(10010010);return;}
}
Казалось бы, все правильно: закончили одно преобразование, забрали результат, посмотрели от какого MUX оно произошло и записали в соотв глобалную переменную. Но не работает. Причина установлена, заключается в том, что ADMUX некорректно менять в данный момент в данном прерывании. Если читать только одну величину преобразования (не меняя ADMUX) ее значение получается правильным и устройство работает.
В даташите по поводу работы с мультиплексором написано на стр.147-148:
If Auto Triggering is used, the exact time of the triggering event can be indeterministic. Special
care must be taken when updating the ADMUX Register, in order to control which conversion
will be affected by the new settings.
If both ADATE and ADEN is written to one, an interrupt event can occur at any time. If the
ADMUX Register is changed in this period, the user cannot tell if the next conversion is based
on the old or the new settings. ADMUX can be safely updated in the following ways:
a. When ADATE or ADEN is cleared.
b. During conversion, minimum one ADC clock cycle after the trigger event.
c. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next ADC
conversion.
Использовать вариант (a) как-то не хочется, вкл/выкл ADC на такой частоте чреват переходными процессами... Хотелось бы все же менять ADMUX в прерывании по окончанию преобразования, но как это лучше сделать и можно ли понять пока не смог...