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

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


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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

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

Так чтоли ?

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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 пользователей онлайн

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