Чему равно выражение в скобках: (0 & 0x07) ?

SLKH
Offline
Зарегистрирован: 17.08.2015

(0 & 0x07)  - у меня ощущение, что результат равен нулю. Ошибаюсь?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, а что есть сомнения?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

а если первая после скобки буква не Ноль, "О". Может это переменная такая ? ;)

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

Нет, а что есть сомнения?

Дык... Цитата: 

Кравченко Виктор пишет:
ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования

 

Источник 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 тупо остается неизменным.

Прикол в том, что строка повторяется на странице несколько раз. Опечатка раскопированная? 

 

SLKH
Offline
Зарегистрирован: 17.08.2015

wdrakula пишет:

а если первая после скобки буква не Ноль, "О". Может это переменная такая ? ;)

ноль там.

"ADMUX |= (0 & 0x07)"

загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

выглядит смешно, но это для единообразия. Вместо 0 можно подставить номер аналогового входа.

например:

ADMUX |= (2 & 0x07) //для А2

 

b707
Offline
Зарегистрирован: 26.05.2017

вв

 

SLKH
Offline
Зарегистрирован: 17.08.2015

wdrakula пишет:

выглядит смешно, но это для единообразия. Вместо 0 можно подставить номер аналогового входа.

например:

ADMUX |= (2 & 0x07) //для А2

 

не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования

т.е. разговор о конкретном пине A0 - какое тут единообразие? 

и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.  

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SLKH пишет:

и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.  

Зачем Вы это написали? От тупости или незнания?

MUX = 0010 для ADC2, который разведен на А2 на Уно и Нано.

Даташитом в морду ткнуть или сами справитесь?

b707
Offline
Зарегистрирован: 26.05.2017

SLKH пишет:

не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования

т.е. разговор о конкретном пине A0 - какое тут единообразие? 

и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.  

почему? именно пин 2 и получается

Вы. кстати. там выше писали :

"загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?" - я думал вы в переносном смысле. Может вы и правда думаете, что это умножение?

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

не понимаю. ясно написано: ADMUX |= (0 & 0x07); // Выбираем пин A0 для преобразования

т.е. разговор о конкретном пине A0 - какое тут единообразие? 

и из "ADMUX |= (2 & 0x07) //для А2" - А2 не получается.  

почему? именно пин 2 и получается

Вы. кстати. там выше писали :

"загадочная строка: ноль умножить на константу, а результат прибавить к переменной. зачем?" - я думал вы в переносном смысле. Может вы и правда думаете, что это умножение?

я вправду думаю, что это побитовое умножение. и результат = B00000000.

 

 

b707
Offline
Зарегистрирован: 26.05.2017

SLKH пишет:

я вправду думаю, что это побитовое умножение. и результат = B00000000.

(2 & 0x07) ?

SLKH
Offline
Зарегистрирован: 17.08.2015

wdrakula пишет:

SLKH пишет:

и из "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)" ? 

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

я вправду думаю, что это побитовое умножение. и результат = B00000000.

(2 & 0x07) ?

(0 & 0x07)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ладно. Сорри за резкость. Но передергивать не нужно. В контексте статьи, откуда Вы все это взяли, значение пишется в setup(), в чистый контроллер. То есть ADMUX обнулен. Автор включает нужные ему биты.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:
значение пишется в setup(), в чистый контроллер.

куда куда пишется? о_О

b707
Offline
Зарегистрирован: 26.05.2017

SLKH пишет:

3. в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ? 

думаю  примерно как int c =100; и int c = 30 +70;

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Кла! Иди в жопу! В функции setup(). Я с телефона в сортире писАл... не мог развернуть мысль.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:

не мог развернуть мысль.

так, вытащи сейчас телефон из унитаза и разверни мысль о чистоте контроллера.

*сейчас телефон после туалета на обеденном столе лежит?

SLKH
Offline
Зарегистрирован: 17.08.2015

wdrakula пишет:
Ладно. Сорри за резкость. Но передергивать не нужно. В контексте статьи, откуда Вы все это взяли, значение пишется в setup(), в чистый контроллер. То есть ADMUX обнулен. Автор включает нужные ему биты.

Да ничего он не включает. Его строка абсолютно бессмысленная - что в регистре было, то и осталось. А я читал то, что написано.

К сожалению, автор не удосужился написать "если 4 младших бита ADMUX обнулены, подключить ADC можно вот такой командой."

И не только он.  

 

Мне в скетче нужно кое-что перманентно измерять, но лишнего времени нет, стандартный analogRead не подходит. Накопытил статью - вроде бы обещает ускорение. Раньше с этими регистрами никаких дел не имел; начал построчно разбираться в программе, уткнулся в совершенно непонятную для меня команду. Сейчас вроде бы понимаю, что должно быть в том месте (или думаю, что понимаю). 

 

Но что осталось непонятным:  в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ? 

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

SLKH пишет:

3. в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ? 

думаю  примерно как int c =100; и int c = 30 +70;

зачем?

Выпендреж? или?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

SLKH пишет:
зачем?

Выпендреж? или?

Такое чувство, что вы не знаете  этапы написания программы. Сначало пишется программа, потом запускается, а затем поиск багов. Вот и остались рудименты. Не все программисты боги, и не у всех прямые руки и светлая голова... и чистая жопа.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SLKH пишет:

Но что осталось непонятным:  в чем отличие "byte val = 2" от "byte val = (2 & 0x07)" ? 

написано для того, чтобы такие как Вы понимали. Возможно, автор Вас переоценил. ;)

А так - отличия - никакого.

--------

Я бы, все таки, MUX задавал так::

ADMUX &= 0xf0;
ADMUX |= (pinA & 0x07);

То есть сперва убедиться, что все биты обнулены, а потом установить pinA, как аналоговый вход.

pinA - само собой - от 0 до 7.

---------------

Так стало понятнее - константу разбивают для читаемости, на генерируемый код это никак не влияет.

Разбивают, чтобы не было в коде "магических чисел".

В моем варианте виден номер пина и позиции ADMUX - легко проверять такой код.

========================

теперь про Вашу задачу.

Я, Евгений, ДимаХ, Логик ну еще пара человек на форуме - просто ОЧЕНЬ хорошо знают настройку АЦП в Атмеге 328.

Чем ковыряться, лучше озвучте задачу - Вы нормальный участник форума, глумиться никто не станет. Я, например, просто предложу Вам решение, используете, если понравится.

Вот только объяснять ничего не обещаю, но Вам и не надо - разберетесь.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:

Я

ТЫ, руки и телефон помыл после туалета, что бы давать советы, как в чистый контроллер писать что-то?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Клапауций 112 пишет:

так, вытащи сейчас телефон из унитаза и разверни мысль о чистоте контроллера.

"Чистый"  - освященный должным образом в расово-верном Храме. Все тебе объяснять надо!

-------

(*)просто после включения, все регистры - по дефолту.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Клапауций 112 пишет:

wdrakula пишет:

Я

ТЫ, руки и телефон помыл после туалета, что бы давать советы, как в чистый контроллер писать что-то?

А как же! Святой водой! У меня проточный освЯтитель стоит.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

wdrakula пишет:

"Чистый"  - освященный должным образом в расово-верном Храме. Все тебе объяснять надо!

согласно старославянским канонам?

Logik
Offline
Зарегистрирован: 05.08.2014

Необходимость рассовой чистоты контролера несомненна. Только китаец годится . Лучше с али. Не китайцы есть признак лоховства владельца контролера,заплатившего больше чем положено. Не  о чем с такими говорить, для них  (2 & 0x07) дает неопределенное значение, пусть они платят исполнителям в соответствующем разделе. И в жертву Перуну ополченца за успех разработки. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, тема началась с вопроса: "У меня ощущение, что 2х2=4. Я ошибаюсь?" И ... это уже 28 пост! Интересно, насколько тема потянет.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Женя! Нудный Вы. Нет у Вас страсти к познанию непознаваемого! Вот!

 

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

Блин, тема началась с вопроса: "У меня ощущение, что 2х2=4. Я ошибаюсь?" И ... это уже 28 пост! Интересно, насколько тема потянет.

Да как сказать... Баян:

- 2х2= ?

- а мы продаём или покупаем?

 

 

Начал я, тупой и незнающий. кое в чем меня просветили. оказывается, до оператора "|=" соответствующие биты действительно следует обнулить - как я и предполагал. ну и на том спасибо.

 

А чтобы я не сильно радовался такому разгулу демократии и вседозволенности, мне запретили* подключать внутренний термодатчик, да ещё и с формулировкой "само собой": 

"2. ADMUX |= (pinA & 0x07);

pinA - само собой - от 0 до 7."

==============

 

На вопрос "на кой икс нужна конструкция "v |= (n & 0x07)" вместо "v |= n" ", и какое магическое значение в этой истории придается числу "7" (при 4 битах MUX!),  как мне представляется, тоже никто не ответит.

Складывается впечатление, что выражение в скобках - какая-то сакральная ценность для true-СИонистов. Вроде анальной   адресации у юристов - те тоже признают только её, но не объясняют, почему.

 

 =============

* Причем запретил не Клапауций!

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SLKH пишет:

На вопрос "на кой икс нужна конструкция "v |= (n & 0x07)" вместо "v |= n" ", и какое магическое значение в этой истории придается числу "7" (при 4 битах MUX!),  как мне представляется, тоже никто не ответит.

SLKH, если вы думаете, что  написатели дуино-скетчей  в тырнете  божественные программисты -то напрастно вы так думаете :-) Ибо так же тупят, говнокодят, косячат, и копипастят у других.  

Logik
Offline
Зарегистрирован: 05.08.2014

dimax пишет:

SLKH, если вы думаете, что  написатели дуино-скетчей  в тырнете  божественные программисты -то напрастно вы так думаете :-) Ибо так же тупят, говнокодят, косячат, и копипастят у других.  

И не только написатели дуино-скетчей и не только в тырнете  ))))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

SLKH пишет:

мне запретили* подключать внутренний термодатчик, да ещё и с формулировкой "само собой": 

"2. ADMUX |= (pinA & 0x07);

pinA - само собой - от 0 до 7."

Опять вечер, поэтому даже заранее извиняться не стану. Я опять пьяный и опять совсем недобрый, как многие знают.

Ты, доблбоёб, не видел, что я написал pinA, то есть пин. Температура и внутренний ИОН - ЭТО, МЛЯТЬ, НЕ ПИНЫ!!!

Пинов, запиши это себе в жопу, - в 328-ом контроллере, 8 штук! И не на всех реализациях все разведены.

Пишут так, и это не влияет на размер кода, чтобы  НЕ БЫЛО МАГИЧЕСКИХ ЧИСЕЛ В КОДЕ, мудло ты грёбаное!

Вместо константы пишут выражение для ее получения. Ты это только сейчас узнал? - так учись, хоть, по моему мнению, это уже бесполезно. Вместо 2 пишут (2 & 0x07) для того, чтобы ЯВНО указать, что мы меняетм ТОЛЬКО ТРИ последних бита.

Ты понимаешь, что это НИКАК не влияет на размер генерируемого кода, а нужно ТОЛЬКО читателям программы?

Автор заботился о тебе, и зря он это делал! Спасибо ему ты не скажешь, от скудоумия, как я полагаю.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Кажется я понял смысл  выражения  (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dimax пишет:

Кажется я понял смысл  выражения  (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.

Да! Дима. Та оно и есть. Это нормально. Ты же сам, во всех своих кодах, не используешь магические числа, а всегда комбинацию из именованных констант avr-gcc. Может даже с перебором. Я бы немного проще писал, но твои коды всегда легко читаемы.

SLKH
Offline
Зарегистрирован: 17.08.2015

wdrakula пишет:

 

Опять вечер, поэтому даже заранее извиняться не стану. Я опять пьяный и опять совсем недобрый, как многие знают.

ты опять из унитаза пишешь?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

SLKH пишет:

* Причем запретил не Клапауций!

nomen illis legio

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

SLKH пишет:

ты опять из унитаза пишешь?

ну, ты разобрался, что без разницы, что писать в коде "2*2" или "4" ?

SLKH
Offline
Зарегистрирован: 17.08.2015

dimax пишет:

Кажется я понял смысл  выражения  (0&0x07), это невдумчивый копипаст из ардуиновского wiring_analog.c , там командой pin&7 отсекаются порты больше 7.

а на кой мне в моем скетче это отсечение? контроль температуры внутри корпуса - полезная вещь для многих устройств. и если это можно осуществить двумя-тремя строчками кода, зачем от этого отказываться? 

==================

Ипатьевьский монастырь!

 

 

 

полез в wiring и заменил 7 на F.

теперь вместо всей этой хни

======================

void setup() {

  Serial.begin(115200);
  analogReference(INTERNAL);
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.
}
int get_temp(void) {
  unsigned int wADC;
  double t;

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA, ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 273 );

  // The returned temperature is in degrees Celsius.
  return (t);
}
void loop() {
  // put your main code here, to run repeatedly:
  int term = get_temp();
  Serial.println(term);
  delay(500);
}

 

 
================================
 
 
измерение температуры стало выглядеть так: 
// wiring_analog.c модифицирована!
void setup() {
 Serial.begin(115200);
  analogReference(INTERNAL);  
}
void loop() {
  int term = analogRead(8)-273;
Serial.println(term);
  delay(500);  
}

 

 
      
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:

полез в wiring и заменил 7 на F.

теперь вместо всей этой хни ... измерение температуры стало выглядеть так

!!! 

респект и уважуха!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

int term = analogRead(8)-273;

nredbf.jpg

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SLKH, я уже как-то писал про это :)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dimax пишет:

SLKH, я уже как-то писал про это :)

Дима! Вы там, по ссылке, написали, что "ничему не мешает",  это не так.

"Ничему не мешает" это ТОЛЬКО на 328 контроллере.

а для переносимости на 32U4 и 2560, с которыми мы встречаемся, нужно маскировать pin тремя младшими битами, потому, что старший бит  пишется в MUX5, А НЕ В MUX4, о чем в коде analogRead() прямо и написано.

Так, как сделад SLKH, делать можно, если уверен, что не забудешь об изменениях при использовании Леонардо, Микро или Меги.

-------------------

Почему среди молодежи бытует мнение, что wiring написан неучами и дилетантами?

Это очень неплохо написанная библиотека, которая помогает новичкам не совершать ошибок.

Если выросли из песочницы - можно ее менять, перелопачивать, переписывать, или вовсе без нее обходиться.

Но проект Ардуино - это проект на основе этой библиотеки. Гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring."  - Воистину :)

SLKH
Offline
Зарегистрирован: 17.08.2015

dimax пишет:

SLKH, я уже как-то писал про это :)

 

Ну да, в дебрях темы "Как измерить Arduino mini напряжение своего питания"

т.к. мне это было ясно (использовать напряжение INTERNAL, экспериментально определенное для конкретного чипа), то глубже заголовка я её не читал.

 

 

SLKH
Offline
Зарегистрирован: 17.08.2015

dimax пишет:

wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring."  - Воистину :)

"Не надо обабщивать". правильнее в общем - не всегда лучше для конкретного случая.

Предположим, функцию я напишу. А как она будет работать на леонарде? А на фига мне та леонарда, если речь идет о единственном экземпляре устройства на про мини? и делаю его я сам для себя - один, без ансамбля.

Или не напишу, а в начало рабочего скетча вставлю себе напоминалку про замену 7 на F. 

И скорее будет "или".

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dimax пишет:

wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring."  - Воистину :)

Если конечно сможешь ее написать. Вот я пытался написать скетч с main(). Компилируется, но нихрена не работает.

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

dimax пишет:

wdrakula, "гораздо правильнее написать свою функцию, например: SLKHanalogRead(), а не править wiring."  - Воистину :)

Если конечно сможешь ее написать. 

и проверить/отладить на меге, которой у мя нет.

nik182
Offline
Зарегистрирован: 04.05.2015

qwone пишет:
Если конечно сможешь ее написать. Вот я пытался написать скетч с main(). Компилируется, но нихрена не работает.


Совсем не работает или что то связанное с wiring? Если использовать main то не вызывается init, cooтвественно не инициализируется переферия и не вызывются setup и loop. Зато экономится куча памяти и скорость оборота бесконечного цикла увеличивается.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Дисклеймер: По утрам и днем я трезвый, и неагрессивный. ;) За вечер - тут уж простите, алкоголизм - не болезнь, а образ жизни.

-----------------

Погоди, SLKH!

А зачем тебе ее на Меге или Микре отлаживать? Ты же для себя пишешь.

Просто не меняй analogRead() в wiring, а напиши РОВНО такую же свою, только с 0xf вместо 0x7.

Линковщик не добавит функцию из wiring, если ты ее не вызываешь нигде (включая библиотеки), твой код не увеличится. На, а если где и забудешь про нее, то врядли сотня байт кода критична для твоего проекта.

Хотя я теперь "враг народа", вероятно. Ну да ладно.