Сообщение от Devil Byte
|
Но для чего тогда служит опция при включении 1‹‹REFS0??
|
Вы даташит читаете?
Там указаны все комбинации. В частности
REFS0=1,
REFS1=0 задаёт напряжение питания AVCC в качестве опорного для АЦП.
Сообщение от Devil Byte
|
правильно сденлать вот так
Код:
|
while(!(ADCSRA &(1‹‹ADIF))); // Ожидание прерывания
ADCSRA |= (1‹‹ADIF); |
или можно использовать что то типа этого
Код:
|
while(!(ADCSRA &(1‹‹ADSC))) |
??
|
Я уже говорил вам по этому поводу.
Бит
ADSC будет установлен в
1 во время одиночного преобразования.
Отрицание в условии - уже не нужно. Этот код не будет ждать окончания преобразования.
В даташите явно
не сказано, что регистр данных будет обновлён в момент сброса этого бита. Это косвенно следует из графиков.
Но битом
ADSC можно пользоваться только при одиночных преобразованиях. При
Free Running всё равно нужно использовать бит
ADIF.
Сообщение от Devil Byte
|
Глобальные нет. А разве Установка флага ADIF не относится к прерыванию?
|
Использовать прерывания - это означает, что у вас есть обработчик прерывания, который может вызываться в момент установки флага соответствующего прерывания. Тогда можно разрешать или запрещать как конкретные прерывания (установкой нужных бит в регистре конфигурации (для АЦП, например, это бит
ADIE в регистре
ADCSRA), так и все сразу (командами
sei и
cli).
Сообщение от Devil Byte
|
Это был еще один совет...мол некоторые говорят что лучше сбрасывать биты.
|
Биты лучше сбрасывать, если вы пишите универсальную функцию для любого режима работы АЦП, которую вы потом будете везде использовать в других проектах, зная, что она не меняет опорное напряжение и выравнивание результата, заданное при инициализации АЦП. Но если уж сбрасывать биты, то надо сбрасывать все биты, а не младшие 4.
Сообщение от Devil Byte
|
ADMUX |= (1‹‹REFS0); // Внешний ИОН
|
Это не внешний ИОН, а напряжение питания AVCC.
Сообщение от Devil Byte
|
ADMUX|=channel;
|
Вы постепенно устанавливаете все биты MUX. В итоге ADMUX перестанет меняться, а записанное в него значение не будет соответствовать никакому из channel, ранее передаваемых как параметр функции.
Сообщение от Devil Byte
|
return ADCW; // Возрат прочитанных значений со старшего и младшего бита
|
Старшего и младшего
БАЙТОВ . Вы не различаете понятия бит и байт?
Сообщение от Devil Byte
|
double adcTOvolts = (vref / ADCMAX) * volt_devive;
|
Забудьте слово
double для 8-битных контроллеров. Код для чисел с плавающей точкой двойной точности будет выполняться очень и очень медленно. У вас всего 10 бит. Это 1024 значения. Ну пусть 4 значащих цифры. Откуда вы возьмёте ещё 12 значащих цифр для обработки и хранения типа
double? А вот быстродействие упадёт раз в 10.