Страница 1 из 2

АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 13:13:03
kobzar
Добрый день!
В процессе изучения микроконтроллеров практикуюсь в создании ампервольтметра!
Читаю про ацп и так далее! В связи с чем вохникло несколько вопросов:

1. Планируется снимать показания с трех точек - следовательно мне необходимо по очереди подключать определенную ногу (ADC0-ADC2)
Для удобства хотелось бы написать макросы их для использования в коде!
согласно даташита мне нужно сконфигугрировать 4 бита MUX0-MUX3 !
Но пока никак не пойму как в одной строке указать явный ноль и явную единицу!
То есть мне нужно три значения
//Макросы

Код: Выделить всё

#define Volt (ADMUX	&= ~(1 << MUX3) ~ (1 << MUX2) ~ (1 << MUX1) ~ (1 << MUX0)) // вход ADC0
#define Amper (ADMUX |= (0 << MUX3) | (0 << MUX2) | (0 << MUX1)) | (1 << MUX0)) // вход ADC1
#define Watt (ADMUX |= (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0)) // вход ADC2
Но если я в цикле буду их выибирать для обработки сигнала то после третьей переменной биты сумирутся и я получу не 3 а другую лапку!
Как правильно записать данные биты Явным образом?

#define Watt (ADMUX |= &~(1 << MUX3) &~ (1 << MUX2) | (1 << MUX1) &~ (1 << MUX0)) // вход ADC2 -- но это я вно неправильная запись :(

2. Обрабатывать полученные данные можно либо по прерыванию либо просто функцией! Есть ли разница что предпочтительней использовать?

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 13:49:34
Gudd-Head
Почему нельзя явно задавать ADMUX присвоением?

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:05:04
kobzar
Что вы имеете в виду?

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:06:43
Gudd-Head
Что-то вроде
ADMUX = 0b10101010

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:21:20
kobzar
Ето не трувей которым пользуются только КВАВР-щеки! :)

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:39:37
Engineer_Keen
Gudd-Head писал(а):Что-то вроде
ADMUX = 0b10101010
Фууу, это же магические числа... Конечно все так делали (даже я в начале), но это же не читабельно...
А зачем в

Код: Выделить всё

#define Volt (ADMUX   &= ~(1 << MUX3) ~ (1 << MUX2) ~ (1 << MUX1) ~ (1 << MUX0)) // вход ADC0
#define Amper (ADMUX |= (0 << MUX3) | (0 << MUX2) | (0 << MUX1)) | (1 << MUX0)) // вход ADC1
#define Watt (ADMUX |= (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0)) // вход ADC2
такая сложность? почему просто не написать одинаково (точные комбинации не знаю, т.к. непонятно что за контроллер):

Код: Выделить всё

#define Volt (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(0 << MUX0)) // вход ADC0
#define Amper (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(1 << MUX0)) // вход ADC1
#define Watt (ADMUX= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0)) // вход ADC2
Ну и если нужно, там же REF и ADLAR прописать?

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:42:01
Gudd-Head
Engineer_Keen писал(а):

Код: Выделить всё

#define Volt (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(0 << MUX0)) // вход ADC0
Я это и имел в виду: присвоением. А дальше кому как нравится.

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 14:51:57
Dr. Alex
Gudd-Head писал(а):

Код: Выделить всё

#define Volt (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(0 << MUX0)) // вход ADC0
Эта запись некорректна!

Код: Выделить всё

(0 << MUX3)
Вы таким образом никогда 0 не выставите!!! Как известно 0 выставляется

Код: Выделить всё

ADMUX&= ~(1 << MUX3)

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:14:15
Engineer_Keen
Тут как бы присвоение, а не чтение-модификация-запись... Хотя хрен вас сишников знает :)))

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:29:02
kobzar
Ну так изначально так и было

Код: Выделить всё

#define Volt (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(0 << MUX0)) // вход ADC0
#define Amper (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(1 << MUX0)) // вход ADC1
#define Watt (ADMUX= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0)) // вход ADC2
Но я планирую например использовать опрос лапок в цикле. Тогда получится что
опросили первую лапку - все окей
потом записали идиницу и опросили вторую лапку - тоже окей
но потом пробуем опросить третью, а у нас ведь уже висит единичка со второй и в итоге мы получим не 0010 а 0011 ну и когда опять вернемся к первой то уже там нули не выставяться!

Все верно - что бы записать ноль - нужно использовать инверт

ADMUX &= ~(1<<MUX0)

Вопрос в том как в ожнйо строке дефайна явно указать где ноль а где один ?

Есть конечно вариант ето сделать вот так

Код: Выделить всё

#define Volt (ADMUX&= ~((0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(0 << MUX0))) // вход ADC0 - Явно ноль!
#define Amper (ADMUX= (0 << MUX3)|(0 << MUX2)|(0<< MUX1)|(1 << MUX0)) // вход ADC1
#define Watt (ADMUX= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0)) // вход ADC2
И потом если опрашиваем вторую или третью ногу предварительно обнулять! Но тоже не тру вей !

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:30:50
Gudd-Head
kobzar писал(а):Но я планирую например использовать опрос лапок в цикле.
А зах*я цикл, можно спросить?

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:32:43
Engineer_Keen
Счетчик есть, который для цикла используется? Я б его значение в ADMUX и писал, вообще без заморочек :)

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:36:33
kobzar
а что вы предлагаете вместо цикла кейс использовать?
Это ж бред !
Так запускаем цыкл - он все время крутиться и выдает нам значения а мы и потом на екран пуляем в зависимости от других условий !

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:38:50
Gudd-Head
Я предлагаю не высасывать проблему из пальца, а писать подряд.

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 15:56:55
kobzar
Я предлагаю помочь мне с ответом по моему вопросу - если это вохможно а не предлагать альтернативные варианты которые у меня и так будут работать! :)

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 16:10:57
pyzhman
Комментарий от нетрувэйщика ( :) ):
напишите так

Код: Выделить всё

#define Watt (ADMUX= (ADMUX & 0xF0) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0)) // вход ADC2
, т.е. сброс бит перед их установкой.

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 17:26:47
kobzar
Ну вот я к тому же и пришел ! Просто как то читал в книге како-то что можно прямо в однйо строке явно указывать 0 и 1
Знать бы как

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 19:09:15
zero648
kobzar писал(а):Знать бы как
Напиши так как предлагают

Код: Выделить всё

#define Volt  (ADMUX=(ADMUX & 0xF0) | (0b0000 << MUX0)) // вход ADC0
#define Amper (ADMUX=(ADMUX & 0xF0) | (0b0001 << MUX0)) // вход ADC1
#define Watt  (ADMUX=(ADMUX & 0xF0) | (0b0010 << MUX0)) // вход ADC2

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 20:24:44
kobzar
благодарю - натолкнули на светлую мысль !

Re: АЦП - выбор лапки

Добавлено: Чт янв 23, 2014 20:34:59
pyzhman
Обратите внимание, там есть , что не есть трувэй. :))