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

Беда в том, что у меня нет уверенности, что в дэйташите и в *.h файлах константы называются одинаково. По крайней мере, я уже встречался с ситуацией, что в разных *.h файлах одни и те же константы могут называться по-разному.
Кроме того, бывает, что некоторые параметры представлены не одним, а 2-3-4 битами, а то и вообще целиком служит для хранения какого-либо значения. Тогда сразу возникает неопределенность, какие константы получаются путем сдвига, а какие - нет.

Так я для этого и задаю вопросы на форуме.

тогда каждый бит имеет свое уникальное название с номером, как биты того же прескалера CS00 CS01 CS02

у меня тоже нет такой уверенности, поскольку это зависит от добросовестности автора этих файлов

Использование именованных макросов для номеров битов в регистрах МК - стандарт как минимум для АВР. Если автор библиотеки придерживается этого стандарта - все будет хорошо.
А за всех мы отвечать не можем :slight_smile:

Если в stm32cubeide открыть файл с определениями регистр, то там есть как и маска, так и позиция битов.
Что программисту удобнее, тем он и пользуется.
Спор ни о чем…

Глупо писать true false high low вместо 1 0

Лучше на конкретном примере:


как мне установить двухбитовое поле CMS в 0x03?

TIM1 |= 1<<CMS1 | 1<<CMS0;

Или это прикол?

1 лайк

по моему это нокаут)

1 лайк

Это чтобы 2 не проскочило.

Я не знаю как эти биты описаны в хедере. Для случая с AVR так как я написал. В других семействах может быть иначе.

ага, это когда решение хуже, чем проблема

Вообще-то это не двухбитное поле, а два однобитных поля.
И еще: а если это будет двухбайтовое поле в 32-разрядном регистре?

Далее:
Проверяем:

void setup() {
      TIMER1_BASE->CR1 |= 0x0060; // компилиоуется
      TIMER1_BASE->CR1 |= 1<<CMS1 | 1<<CMS0; // не компилируется
}

void loop() {
}

результат:

D:\Arduino\ard-1.8.19\portable\sketchbook\sketch_oct27a\sketch_oct27a.ino: In function 'void setup()':
sketch_oct27a:3:30: error: 'CMS1' was not declared in this scope
       TIMER1_BASE->CR1 |= 1<<CMS1 | 1<<CMS0; // 
                              ^
sketch_oct27a:3:40: error: 'CMS0' was not declared in this scope
       TIMER1_BASE->CR1 |= 1<<CMS1 | 1<<CMS0; // 
                                        ^
exit status 1
'CMS1' was not declared in this scope

Похоже на то.

Вот и я о том: намного проще использовать числовую константу, чем для каждой конкретной архитектуры копаться в куче заголовочных файлов, чтобы выяснить, как писать “правильно”.
При этом простого способа “писать правильно” НЕ СУЩЕСТВУЕТ.

А так:

TIMER1_BASE->CR1 |= (1<<CMS1) | (1<<CMS0);

Арифметику забыл?)))

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

Хотя я это написал не дочитав до ошибки.
Что за среда разработки и что за мк?

TIMER1_BASE->CR1
stm пытается на тиньку натянуть))

  1. Я дословно процитировал код из сообщения №47.
  2. Сообщение об ошибке не связано с расстановкой скобок.
  3. Посмотрим, что из этого получится:
void setup() {
      TIMER1_BASE->CR1 |= 0x0060; // компилиоуется
      TIMER1_BASE->CR1 |= (1<<CMS1) | (1<<CMS0); // 
}

void loop() {
}

результат:

D:\Arduino\ard-1.8.19\portable\sketchbook\sketch_oct27a\sketch_oct27a.ino: In function 'void setup()':
sketch_oct27a:3:31: error: 'CMS1' was not declared in this scope
       TIMER1_BASE->CR1 |= (1<<CMS1) | (1<<CMS0); // 
                               ^
sketch_oct27a:3:43: error: 'CMS0' was not declared in this scope
       TIMER1_BASE->CR1 |= (1<<CMS1) | (1<<CMS0); // 
                                           ^
exit status 1
'CMS1' was not declared in this scope

там тут же поправка была

1 лайк

Среда разработки, естественно, Arduino IDE.
А какая разница, какой МК? Я хочу понять, как можно писать “правильно” (т.е. в виде TCCR0B |= (1 << CS00) | (1<<CS01);) без непропорциональных непроизводительных затрат времени на ковыряние в куче заголовочных файлов. Это либо работает на любом МК, либо не работает вообще.

Так это самое главное: либо существует способ писать подобные константы, пользуясь только дэйташитом, либо - не существует.
А когда тут “я знаю”, а тут - “я не знаю”, то это значит: “все должны писать так, чтобы удобно читать было именно мне”.

пишите тогда так
TCCR0B |= (1 << 5) | (1<<6);

хоть сразу понятно какие биты, в отличие от этого
TCCR0B |= 0x00000600;

1 лайк

Так может быть тогда и даташиты читать не нужно, если разницы нет никакой (по твоим словам). Я всё сильнее убеждаюсь что ты придуриваешься.

Выбери мк, выбери среду разработки поддерживающий этот мк, открой даташит и напиши. Никаких ошибок не будет.

ЗЫ: Ты же видел мою вчерашнюю тему про Attiny13? Я сразу написал - какая среда, приложил даташит и ошибок компиляции НЕ БЫЛО.