Проблема с примитивной функцией

потому что

TOIE1 - это положение бита в регистре. Чтобы получить из него битовую маску для изменения регистра, нужно выполнить сдвиг 1<<TOIE1

это заслуга тс :slight_smile:

Ты правда считаешь, что он этого не знает? :smiley:

спрашивает же

Где об этом можно почитать?

Так в даташите написано же…

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

Где вы увидели что оно задается сдвигом? маской и задается

это маска

Порты ввода/вывода тебя же не смущают?

PORTB |= (1<<PB0);

Или лучше исправить «порты» на «регистры»? А то это же +100 к нудятине может быть :smiley:

Я понимаю так:
сдвиг маска
0 1
1 2
2 4
3 8

Вопрос: почему для получения маски, я должен применять операцию сдвига?
Почему константа не содержит уже сдвинутый результат?

П#зд@ц, опять нудятину включил…

Наверное так удобнее.

Тем не менее, поскольку мы с @BOOM продемонстрировали, что этот синтаксис не наша выдумка, а идет из оригинального даташита, может вы закончите эту тупую пикировку? Или вам прям оттуда же привести пример использования номера бита через сдвиг - а то я могу

1 лайк

Не следует обо всех судить по себе.

Вот я встречаю запись: TIMSK0 = 1<<TOIE1;
Что я вынужден делать?
Я в папке с Ардуино запускаю поиск файлов, которые содержат строку TOIE1;, получаю более сотни имен файлов. Теперь я должен угадать, который из этих ~150 файлов мне нужен. В данном случае я понимаю, что мне нужен файл, содержащий в имени название контроллера, но так бывает далеко не всегда, иногда приходится просматривать ВСЕ файлы, чтобы найти искомое. И именно это - самая трудоемкая операция, чтобы понять, что означает 1<<TOIE1;.
Потом я открываю дэйташит и ищу там уже TIMSK0, чтобы понять, что именно делается с контроллером.
А если бы было написано сразу TIMSK0 = 0x01;, то я бы сэкономил кучу времени на поиски, так как ограничился бы поиском только по дэйташиту.
Но при этом кто-то находит запись TIMSK0 = 1<<TOIE1; более удобной.
Поэтому я предполагаю, что этот кто-то тратит на поиски меньше времени, чем я.
Вот я и хотел бы узнать, как он это делает.
В таком желании есть что-то неправильное?

Если ты такую запись встречаешь - это плохо.
Правильно так:

TIMSK |= (1<<TOIE1);

Открываешь даташит, нажимаешь Ctrl + F и вводишь TIMSK.

ЗЫ: Хотел бы я узнать - а как ты в даташите что-то ищешь? 0x01 вбиваешь?

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

TIMSK0 = 0x01;
и
TIMSK0 = 1<<TOIE1;
нет.

Однако если вы в целом знакомы с битами соответствующего регистра, но не помните наизусть порядок - то запись через имя бита скажет вам больше, чем просто число.

Например, в этой записи всякий кто имел дело с таймерами - сразу увидит установку прескалера:

TCCR0B |= (1 << CS00) | (1<<CS01);

а тут непонятно что
TCCR0B |= 0b00000011;

1 лайк

Это исключительно от того, что вы не подозревали, что бит TOIE1тоже определен в даташите, более того - на той же самой странице что и TIMSK0

Развивайтесь - и не надо будет искать в куче файлов…

Возможно идёт ещё с ассемблера, где развиты операции с битами.
P.S. Так сказать, традиция))

а потом пишешь

*(0x39) |= 0b00000100 ;
4 лайка

лучше так

#define TRUE FALSE
1 лайк