Цитата(singlskv @ Oct 10 2007, 22:20)

Покажите наконец весь код ....
Ваша проблема скорее всего заключается в использовании 2 прерываний для работы с ADC,
в итоге Вы и имеете то что переключение каналов происходит в момент когда его нельзя
переключать, Вы должны понять что преобразование НЕ начинается в момент когда
Вы выставили флаг начать преобразование и НЕ начинается синхронно от таймера в случае
если частота преобразования ADC не кратна частоте таймера.
Весь код я привел выше. Единственное, о чем умолчал - как я определял правильно измеряется величина ADC или нет. Так как Дракона под рукой все еще пока нет использовались два метода:
1. Значение AS2value (по сути значение ADC для сигнала AS2) записывалось в EEPROM с периодом 5 сек. В некоторый момент EEPROM считывалась программатором. Если мультиплексор переключался в прерывании по оконч преобр., то считывалось из EEPROM AS2value == 0;
2. Так как программатор самопал, в истинности считывания я усомнился и для контроля инициализировал таймер1 в режим inverted fastPWM, далее значение ADC записывалось в регистр сравнения. Контроль скважности проводился на пине OC1D. При увеличении значения ADC ширина импульсов должна была уменьшаться - так и было для всех трех сигналов, если mux не переключать в прерывании по оконч. преобразования...
Заметьте, что флаг ADATE в исправленном коде не установлен. То есть ADC работает в режиме единичного преобразования но с разрешенным прерыванием по оконч. преобраз. В обработчике стартует новое преобраз. Так организовано зацикливание. Согласно даташиту, если ADATE не установлен, то ADMUX можно безопасно записывать. Но даже в этом случае, если не пропускалось "битое" измерение от AS2, AS2value == 0, а на выводе OC1D присутствовал высокий уровень...
Далее я пробовал менять записи в ADMUX в прерывании, т. е. измерял сигналы в разной последовательности. И опять: только дифференциальный сигнал AS2 всегда возвращал некорректное (нулевое) значение...
"Двойственность" прерываний легко проверить. Для этого устанавливаем в единицу какой-либо тестовый пин в начале обработчика и сбрасываем его в ноль в конце. В моем случае на осцилле наблюдались короткие прямоуголные импульсы с периодом 62 мкс.