Перейти к содержанию

Побитовая проверка переменной


SergeyKa

Рекомендуемые сообщения

Добрый день.

Есть побитовая проверка портов микроконтроллера.

if( PIND & (1 << PD0) ) { ... }

Т.е. если на PIND на 1 бите, логическая 1 то, условие выполняется.

А как сделать такую же побитовую проверку для переменной?

unsigned int test = 171;

if( test & (1 << 0) ) { ... } 

 

верно ли я мыслю? Или как-то по другому?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

С точки зрения компилятора порт ничем от переменной не отличается. 

Поэтому все побитовые проверки аналогичны.

Для удобства рекомендую определить макрос #define BIT(x)  (1<<(x)) и пользоваться им:

if (PINB & BIT(7)) или if (test & BIT(2))

В avr-gcc уже есть предопределенный макрос точно такого же смысла _BV(x)

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

  • 9 месяцев спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Подскажите, а как присвоить один какой нибудь бит регистра, другому биту другого регистра, на СИ ?

Изменено пользователем NIKE
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Либо маской, либо условием.

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

Присвоение просто как переменной невозможно.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, my504 сказал:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\

PORTA (1<<0) = PINB (1<<1) ; // Так чтоли ?

Изменено пользователем Borodach
не цитируйте предыдущие посты.
Ссылка на комментарий
Поделиться на другие сайты

13 минут назад, NIKE сказал:

Так чтоли ?

Вы знакомы с Си? Может, вам стоит начать со знакомства с языком, прежде чем затевать присваивания битов?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, ARV сказал:

Вы знакомы с Си? Может, вам стоит начать со знакомства с языком, прежде чем затевать присваивания битов?

Знаком относителино, методом тыка даже термореле сделал и таймер . И книгу по Си тоже читаю, но во первых она не очень легко мне даётся (старею уже), а во вторых про регистры там не написано ничего( . Подскажите лучше конкретным примером, если не трудно, чем посылать вежливо

Изменено пользователем NIKE
Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, NIKE сказал:

про регистры там не написано ничего

Зато там написано про переменные. Регистр в парадигме Си от переменной ничем не отличается, просто он уже существует без усилий программиста, т.е. его не надо описывать самому.

28 минут назад, NIKE сказал:

Подскажите лучше конкретным примером

Конкретный пример я, конечно, дать могу, но станет ли вам от этого легче?

// "копирование" бита X из переменной А в бит Y переменной B
// переменные типа int, соответствено, X и Y от 0 до 15
if (A & (1<<X))
    B |= (1<<Y);
else
    B &= ~(1<<Y);

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

16 минут назад, NIKE сказал:

а вот маской как писал колега my504, у меня не получается. Можете написать пример с маской

мне тоже интересно увидеть если можно без условия это сделать

Хотя, если вначале сбросить принудительно, то можно) Но это уже совсем другая история

Ссылка на комментарий
Поделиться на другие сайты

Не знаю, что там имел ввиду @my504 , но я вот такой вариант могу предложить:

B = (B & ~(1<<Y)) | (!!(A & (1<<X)) << Y);

 

Только не понимаю, зачем делать загадочно, если можно просто...

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, ARV сказал:

B & ~(1<<Y)

а это не будет как раз этим?

7 минут назад, DrobyshevAlex сказал:

если вначале сбросить принудительно

но как то не красиво и может навредить даже кратковременным переключением бита

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, DrobyshevAlex сказал:

но как то не красиво и может навредить даже кратковременным переключением бита

Если думать о том, что B - это volatile-переменная (регистр), то да, возможны неприятности.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Туповат я. Я даже не глянул ваш пример. У вас не будет кратковременного сброса одного бита, у вас же все биты переприсваивабются. Но это не особо лучше) 

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, DrobyshevAlex сказал:

У вас не будет кратковременного сброса одного бита

Побочные эффекты все равно могут быть для SFR-ов...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

Побочные эффекты все равно могут быть для

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

1 час назад, NIKE сказал:

Да действительно загадочно

это не загадочно, это нужно просто аккуратно делать, ибо перезапись не 1го бита а всех.

1 час назад, NIKE сказал:

Может кто-то знает ещё какой нибуть вариант

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

Например записав в stm GPIOA->BSRR вы установите/сбросите бит не касаясь других. 

В авр не уверен, там на сколько я помню есть sbi или нечто подобное в ассемблере, что позволит сделать тоже установки бита не затрагивая другие. Но как скомпилит компилятор я не в курсе) Думаю атмел студи должна правильно сделать это :) 

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, NIKE сказал:

Подскажите, а как присвоить один какой нибудь бит регистра, другому биту другого регистра, на СИ ?

Асм вставка BLD BST

Цитата

; Copy bit

bst r1,2  ; Store bit 2 of r1 in T flag

bld r0,4 ; Load T into bit 4 of r0

 

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, AvrAsm сказал:

Асм вставка BLD BST

Вообще-то это нечестно :) ассемблерные вставки - это уже не Си, а костыль.

3 минуты назад, NIKE сказал:

Не понимаю, что значит "!!"

Если кратко, то это превращение любого числа в 0 или 1: если число было равно 0, то ноль и получим, а любое иное ненулевое будет превращено в 1.

!!0 == 0

!!1 == 1

!!3456746 == 1

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, AvrAsm сказал:

Почему костыль?

По определению: язык Си не содержит конкретных спецификаций ассемблерных вставок, т.е. это нестандартная фича, меняющаяся от компилятора к компилятору. Т.е. костыль :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...