Официальный сайт компании Arduino по адресу arduino.cc
Чему равно выражение в скобках: (0 & 0x07) ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 23/08/2017 - 17:49
(0 & 0x07) - у меня ощущение, что результат равен нулю. Ошибаюсь?
Нет, а что есть сомнения?
а если первая после скобки буква не Ноль, "О". Может это переменная такая ? ;)
Нет, а что есть сомнения?
Дык... Цитата:
Источник http://codius.ru/articles/Arduino_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D1%8F%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BF%D0%BB%D0%B0%D1%82%D1%8B_%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%90%D0%A6%D0%9F_%D0%B8_analogRead
Ни хрена я не вижу в этой строке выбора A0; ИМХО, значение ADMUX тупо остается неизменным.
Прикол в том, что строка повторяется на странице несколько раз. Опечатка раскопированная?
а если первая после скобки буква не Ноль, "О". Может это переменная такая ? ;)
ноль там.
"ADMUX |= (0 & 0x07)"
загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?
выглядит смешно, но это для единообразия. Вместо 0 можно подставить номер аналогового входа.
например:
вв
выглядит смешно, но это для единообразия. Вместо 0 можно подставить номер аналогового входа.
например:
не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования
т.е. разговор о конкретном пине A0 - какое тут единообразие?
и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.
и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.
Зачем Вы это написали? От тупости или незнания?
MUX = 0010 для ADC2, который разведен на А2 на Уно и Нано.
Даташитом в морду ткнуть или сами справитесь?
не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования
т.е. разговор о конкретном пине A0 - какое тут единообразие?
и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.
почему? именно пин 2 и получается
Вы. кстати. там выше писали :
"загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?" - я думал вы в переносном смысле. Может вы и правда думаете, что это умножение?
не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования
т.е. разговор о конкретном пине A0 - какое тут единообразие?
и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.
почему? именно пин 2 и получается
Вы. кстати. там выше писали :
"загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?" - я думал вы в переносном смысле. Может вы и правда думаете, что это умножение?
я вправду думаю, что это побитовое умножение. и результат = B00000000.
я вправду думаю, что это побитовое умножение. и результат = B00000000.
(2 & 0x07) ?
и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.
Зачем Вы это написали? От тупости или незнания?
MUX = 0010 для ADC2, который разведен на А2 на Уно и Нано.
Даташитом в морду ткнуть или сами справитесь?
ну, не всем же быть умными.
лучше расскажите:
1. было: ADMUX==BXXXX1000 (температуру измеряли).
после команды "ADMUX |= (2 & 0x07)" какой ADC включен?
2. как подключить A0 в режиме единобразия? так "ADMUX |= (0 & 0x07)" нельзя? или можно? или как?
3. в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ?
я вправду думаю, что это побитовое умножение. и результат = B00000000.
(2 & 0x07) ?
(0 & 0x07)
Ладно. Сорри за резкость. Но передергивать не нужно. В контексте статьи, откуда Вы все это взяли, значение пишется в setup(), в чистый контроллер. То есть ADMUX обнулен. Автор включает нужные ему биты.
куда куда пишется? о_О
3. в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ?
думаю примерно как int c =100; и int c = 30 +70;
Кла! Иди в жопу! В функции setup(). Я с телефона в сортире писАл... не мог развернуть мысль.
не мог развернуть мысль.
так, вытащи сейчас телефон из унитаза и разверни мысль о чистоте контроллера.
*сейчас телефон после туалета на обеденном столе лежит?
Да ничего он не включает. Его строка абсолютно бессмысленная - что в регистре было, то и осталось. А я читал то, что написано.
К сожалению, автор не удосужился написать "если 4 младших бита ADMUX обнулены, подключить ADC можно вот такой командой."
И не только он.
Мне в скетче нужно кое-что перманентно измерять, но лишнего времени нет, стандартный analogRead не подходит. Накопытил статью - вроде бы обещает ускорение. Раньше с этими регистрами никаких дел не имел; начал построчно разбираться в программе, уткнулся в совершенно непонятную для меня команду. Сейчас вроде бы понимаю, что должно быть в том месте (или думаю, что понимаю).
Но что осталось непонятным: в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ?
3. в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ?
думаю примерно как int c =100; и int c = 30 +70;
зачем?
Выпендреж? или?
Выпендреж? или?
Но что осталось непонятным: в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ?
написано для того, чтобы такие как Вы понимали. Возможно, автор Вас переоценил. ;)
А так - отличия - никакого.
--------
Я бы, все таки, MUX задавал так::
То есть сперва убедиться, что все биты обнулены, а потом установить pinA, как аналоговый вход.
pinA - само собой - от 0 до 7.
---------------
Так стало понятнее - константу разбивают для читаемости, на генерируемый код это никак не влияет.
Разбивают, чтобы не было в коде "магических чисел".
В моем варианте виден номер пина и позиции ADMUX - легко проверять такой код.
========================
теперь про Вашу задачу.
Я, Евгений, ДимаХ, Логик ну еще пара человек на форуме - просто ОЧЕНЬ хорошо знают настройку АЦП в Атмеге 328.
Чем ковыряться, лучше озвучте задачу - Вы нормальный участник форума, глумиться никто не станет. Я, например, просто предложу Вам решение, используете, если понравится.
Вот только объяснять ничего не обещаю, но Вам и не надо - разберетесь.
Я
ТЫ, руки и телефон помыл после туалета, что бы давать советы, как в чистый контроллер писать что-то?
так, вытащи сейчас телефон из унитаза и разверни мысль о чистоте контроллера.
"Чистый" - освященный должным образом в расово-верном Храме. Все тебе объяснять надо!
-------
(*)просто после включения, все регистры - по дефолту.
Я
ТЫ, руки и телефон помыл после туалета, что бы давать советы, как в чистый контроллер писать что-то?
А как же! Святой водой! У меня проточный освЯтитель стоит.
"Чистый" - освященный должным образом в расово-верном Храме. Все тебе объяснять надо!
согласно старославянским канонам?
Необходимость рассовой чистоты контролера несомненна. Только китаец годится . Лучше с али. Не китайцы есть признак лоховства владельца контролера,заплатившего больше чем положено. Не о чем с такими говорить, для них (2 & 0x07) дает неопределенное значение, пусть они платят исполнителям в соответствующем разделе. И в жертву Перуну ополченца за успех разработки.
Блин, тема началась с вопроса: "У меня ощущение, что 2х2=4. Я ошибаюсь?" И ... это уже 28 пост! Интересно, насколько тема потянет.
Женя! Нудный Вы. Нет у Вас страсти к познанию непознаваемого! Вот!
Блин, тема началась с вопроса: "У меня ощущение, что 2х2=4. Я ошибаюсь?" И ... это уже 28 пост! Интересно, насколько тема потянет.
Да как сказать... Баян:
- 2х2= ?
- а мы продаём или покупаем?
Начал я, тупой и незнающий. кое в чем меня просветили. оказывается, до оператора "|=" соответствующие биты действительно следует обнулить - как я и предполагал. ну и на том спасибо.
А чтобы я не сильно радовался такому разгулу демократии и вседозволенности, мне запретили* подключать внутренний термодатчик, да ещё и с формулировкой "само собой":
"2. ADMUX |= (pinA & 0x07);
pinA - само собой - от 0 до 7."
==============
На вопрос "на кой икс нужна конструкция "v |= (n & 0x07)" вместо "v |= n" ", и какое магическое значение в этой истории придается числу "7" (при 4 битах MUX!), как мне представляется, тоже никто не ответит.
Складывается впечатление, что выражение в скобках - какая-то сакральная ценность для true-СИонистов. Вроде анальной адресации у юристов - те тоже признают только её, но не объясняют, почему.
=============
* Причем запретил не Клапауций!
На вопрос "на кой икс нужна конструкция "v |= (n & 0x07)" вместо "v |= n" ", и какое магическое значение в этой истории придается числу "7" (при 4 битах MUX!), как мне представляется, тоже никто не ответит.
SLKH, если вы думаете, что написатели дуино-скетчей в тырнете божественные программисты -то напрастно вы так думаете :-) Ибо так же тупят, говнокодят, косячат, и копипастят у других.
SLKH, если вы думаете, что написатели дуино-скетчей в тырнете божественные программисты -то напрастно вы так думаете :-) Ибо так же тупят, говнокодят, косячат, и копипастят у других.
И не только написатели дуино-скетчей и не только в тырнете ))))
мне запретили* подключать внутренний термодатчик, да ещё и с формулировкой "само собой":
"2. ADMUX |= (pinA & 0x07);
pinA - само собой - от 0 до 7."
Опять вечер, поэтому даже заранее извиняться не стану. Я опять пьяный и опять совсем недобрый, как многие знают.
Ты, доблбоёб, не видел, что я написал pinA, то есть пин. Температура и внутренний ИОН - ЭТО, МЛЯТЬ, НЕ ПИНЫ!!!
Пинов, запиши это себе в жопу, - в 328-ом контроллере, 8 штук! И не на всех реализациях все разведены.
Пишут так, и это не влияет на размер кода, чтобы НЕ БЫЛО МАГИЧЕСКИХ ЧИСЕЛ В КОДЕ, мудло ты грёбаное!
Вместо константы пишут выражение для ее получения. Ты это только сейчас узнал? - так учись, хоть, по моему мнению, это уже бесполезно. Вместо 2 пишут (2 & 0x07) для того, чтобы ЯВНО указать, что мы меняетм ТОЛЬКО ТРИ последних бита.
Ты понимаешь, что это НИКАК не влияет на размер генерируемого кода, а нужно ТОЛЬКО читателям программы?
Автор заботился о тебе, и зря он это делал! Спасибо ему ты не скажешь, от скудоумия, как я полагаю.
Кажется я понял смысл выражения (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.
Кажется я понял смысл выражения (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.
Да! Дима. Та оно и есть. Это нормально. Ты же сам, во всех своих кодах, не используешь магические числа, а всегда комбинацию из именованных констант avr-gcc. Может даже с перебором. Я бы немного проще писал, но твои коды всегда легко читаемы.
Опять вечер, поэтому даже заранее извиняться не стану. Я опять пьяный и опять совсем недобрый, как многие знают.
ты опять из унитаза пишешь?
* Причем запретил не Клапауций!
nomen illis legio
ты опять из унитаза пишешь?
ну, ты разобрался, что без разницы, что писать в коде "2*2" или "4" ?
Кажется я понял смысл выражения (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.
==================
Ипатьевьский монастырь!
полез в wiring и заменил 7 на F.
теперь вместо всей этой хни
======================
полез в wiring и заменил 7 на F.
теперь вместо всей этой хни ... измерение температуры стало выглядеть так
!!!
респект и уважуха!
int
term = analogRead(8)-273;
SLKH, я уже как-то писал про это :)
SLKH, я уже как-то писал про это :)
Дима! Вы там, по ссылке, написали, что "ничему не мешает", это не так.
"Ничему не мешает" это ТОЛЬКО на 328 контроллере.
а для переносимости на 32U4 и 2560, с которыми мы встречаемся, нужно маскировать pin тремя младшими битами, потому, что старший бит пишется в MUX5, А НЕ В MUX4, о чем в коде analogRead() прямо и написано.
Так, как сделад SLKH, делать можно, если уверен, что не забудешь об изменениях при использовании Леонардо, Микро или Меги.
-------------------
Почему среди молодежи бытует мнение, что wiring написан неучами и дилетантами?
Это очень неплохо написанная библиотека, которая помогает новичкам не совершать ошибок.
Если выросли из песочницы - можно ее менять, перелопачивать, переписывать, или вовсе без нее обходиться.
Но проект Ардуино - это проект на основе этой библиотеки. Гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring.
wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring." - Воистину :)
SLKH, я уже как-то писал про это :)
Ну да, в дебрях темы "Как измерить Arduino mini напряжение своего питания"
т.к. мне это было ясно (использовать напряжение INTERNAL, экспериментально определенное для конкретного чипа), то глубже заголовка я её не читал.
wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring." - Воистину :)
"Не надо обабщивать". правильнее в общем - не всегда лучше для конкретного случая.
Предположим, функцию я напишу. А как она будет работать на леонарде? А на фига мне та леонарда, если речь идет о единственном экземпляре устройства на про мини? и делаю его я сам для себя - один, без ансамбля.
Или не напишу, а в начало рабочего скетча вставлю себе напоминалку про замену 7 на F.
И скорее будет "или".
wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring." - Воистину :)
wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring." - Воистину :)
Совсем не работает или что то связанное с wiring? Если использовать main то не вызывается init, cooтвественно не инициализируется переферия и не вызывются setup и loop. Зато экономится куча памяти и скорость оборота бесконечного цикла увеличивается.
Дисклеймер: По утрам и днем я трезвый, и неагрессивный. ;) За вечер - тут уж простите, алкоголизм - не болезнь, а образ жизни.
-----------------
Погоди, SLKH!
А зачем тебе ее на Меге или Микре отлаживать? Ты же для себя пишешь.
Просто не меняй analogRead() в wiring, а напиши РОВНО такую же свою, только с 0xf вместо 0x7.
Линковщик не добавит функцию из wiring, если ты ее не вызываешь нигде (включая библиотеки), твой код не увеличится. На, а если где и забудешь про нее, то врядли сотня байт кода критична для твоего проекта.
Хотя я теперь "враг народа", вероятно. Ну да ладно.