Цитата(azure @ Mar 20 2008, 13:45)

Помогите разобратся с АЦП.
Пишу программу для считывания уровня напряжения с переменного резистора (от 0 до 5 В).
Микроконтроллер: ATmega16 работает на частоте 16МГц. Вход A0. Разрядность АЦП: 10бит. Считывание одинарное (но вызывается регулярно). Программа работает, но при считывании уровня 0В выдает в ADCW не 0, а 15. При этом с верхним уровнем никаких проблем нет (1023)
Похоже у вас плохое опорное напряжение. Попробуйте внутреннее 2,56В для начала или подключите к ноге AREF внешний опорник. Не забудьте только биты REFS1-0 поправить.
Ну и несколько замечаний по коду, что сходу бросаются в глаза.
1) Запустили ацп в режиме free run, но в главном цикле вы всё время запускаете начало преобразования. Если вы хотите single conversion, то надо дождаться конца преобразования.
2) Есть стробы записи в регистры 1, 2, 3. А вот в регистр 4 строба записи нет, надо добавить.
3) В главном цикле используется переменная ADC_w, но она может быть испорчена в любой момент в прерывании. Примите меры.
4) Непонятна роль оператора while(ADCSRA & 0x40). Почему что-то делается, когда преобразование не закончено?
5) Зачем стоит оператор return 0 в конце программы? У вас там что, операционка стоит?