Цитата(Палыч @ Nov 3 2012, 17:40)

После первого преобразования ADIF навсегда остаётся в единице - нужно сбрасывать записью в него единицы
Вот именно, причём _явной_ записью.
У старых AVR-ок с SBI/CBI в виде Read (весь байт SFR) - Modify - Write (опять
весь байт SFR) достаточно было
Код
// Компилируется в SBI ADCSRA, ADSC -- хоть это, по моему мнению, некоторое отклонение от стандарта С,
// но полезное с точки зрения эффективности.
// Если бы оно компилировалось в более корректное IN/ORI/OUT, обсуждаемой проблемы не было бы,
// но была бы со всеобщей точки зрения «недостаточная оптимизация».
ADCSRA |= (1<<ADSC);
и ADIF сбрасывался сам собой, так как сам в себя писал единичку в RMW-цикле.
В новых шара не канает. То, что работало в Tiny26, в Tiny261/461/861 работать не будет.
Ну что оно в протеусе работает, так это он, значит, не знает, что работа команд SBI/CBI давно поменялась (тогда же, когда запись в PINx стала инвертировать PORTx).
Ещё по теме
http://electronix.ru/forum/index.php?showtopic=95401Цитата(_Артём_ @ Nov 3 2012, 17:24)

С какой стати ADIF должен сбросится?
Сбрасывается ADSC, ADIF - устанавливается по завершении преобразования.
Код
while ((ADCSRA &(1<<ADIF))==0); // ожидание завершения
Там надо читать «вот я и жду, пока ADIF сброшен» независимо от того, что написано «сбросится» :-)
Ведь
Цитата(Dimon84 @ Nov 3 2012, 16:29)

while (!(ADCSRA &(1<<ADIF))) //Дождатся окончания преобразования
это то же самое.