Alexeyslav писал(а):есть - пишется как "|| <маска битов>"
ни в коем случае! пишется так "| <маска битов>"
Alexeyslav писал(а):есть - пишется как "|| <маска битов>"
во-первых, снова непонятное увлечение макросами - для установки сразу 4 бит сделаете еще один макрос, для двух - еще, для пяти - тоже?! чем ваш макрос лучше обычной записи?!FreshMan писал(а):#define SetBit(reg, bit0, bit1, bit2) reg |= (1<<(bit0)|(1<<(bit1)|(1<<(bit2))
почему этими макросами пользоватся не рекомендуется ?
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
Да, равнозначны. Второй вариант позволяет более гибко им (макросом) пользоваться.FreshMan писал(а):равнозначны ли они по правильности ?
Отчего же, ИС-пытатель правильно написал - главное чётко понимать что делается.FreshMan писал(а):почему этими макросами пользоватся не рекомендуется ?
хотя при этом флаги и сбросятся, но в целом гарантировать предсказуемый результат при этом нельзя.ИС-пытатель писал(а):Т.е. можно даже сбрасывать флаги вот таким способом: ADCSRA = ADCSRA

WiseLord писал(а):Тут ещё вопрос, не выбросит ли при оптимизации компилятор такую инструкцию вообще, как бессмысленную (с его точки зрения).
Если "удачно" сложиться ситуация, когда прочитается состояние в последний такт перед сбросом флага...
ничем не отличается, поэтому ручное сбрасывание флагов запросов прерываний делать надо с особой осторожностью. лично мне никогда и в голову не приходило использовать ADIF для определения окончания преобразования без прерываний - ADSC для этой цели куда логичнее (и безопаснее) использовать.ИС-пытатель писал(а):А с другой стороны, рассматривая в этом же ключе, чем ADCSRA = ADCSRA отличается от ADCSRA |= (1<<ADIF) ??
ARV писал(а):ADSC для этой цели куда логичнее (и безопаснее) использовать.