ацп (аналого-цифровой преобразователь) на несколько ножек

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 12
Зарегистрирован: Пт янв 08, 2016 13:49:20

Сообщение zekmaster »

Господа, нуждаюсь в вашей помощи!Я знаю, что на подобный вопрос уже отвечали, но всё-таки повторюсь. Нужно с помощью мк (у меня atmega16a) измерять напряжение на 3-х ножках. Я настроил и запустил ацп (аналого-цифровой преобразователь) (пишу на C++ в atmel studio). Итак, вот алгоритм(прошивку прикрепил): я последовательно меняю значение регистра ADMUX, при каждом изменении устанавливая ADSC "1" и записывая значение ADCW в отдельную переменную, но, подходя непосредственно к выводу информации(вывожу на 3 прота в двоичном виде), сталкиваюсь с проблемой: значения тех отдельных переменных совпадают!А ещё proteus отказывается компилировать. .-. Пробовал множество вариаций кода с прерываниями и if-ами. HELP! P.S.: в инете ничего дельного не нашёл: всё только для 1 ножки. P.P. S.: в данной вариации кода "спёр" функцию чтения ADCW с сайта "doneathome" :3

Сорян, уже сам разобрался) Исправленный код прикрепил
Вложения
2acp.rar
(20.49 КБ) 125 скачиваний
Не стоит бояться задавать вопросы
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Здесь очень мало, кто пишет на C++, предпочтения отдают простому C.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

При использовании С++, применимом к контроллерам, "С с классами" не слишком отличается от "С без классов".
ADMUX=0b01000000;
ADMUX|=0x07&adc_input;
_delay_us(10);
ADCSRA |= (1 << ADSC);
if(ADMUX==0b01000000)
{A=ADCW;
Отвыкайте использовать магические числа. Вот что должно означать 0b01000000? Почему бы не записать (1<<REFS0) а лучше (0b01<<REFS0).
А проблема в том, что вы не дожидаетесь окончания преобразования. Можете воспользоваться прерыванием, а можете просто дожидаться флага ADIF.
Ответить

Вернуться в «AVR»