Например TDA7294

Форум РадиоКот :: Просмотр темы - Как проще прочитать один бит из регистра? (Си)
Форум РадиоКот
https://radiokot.ru/forum/

Как проще прочитать один бит из регистра? (Си)
https://radiokot.ru/forum/viewtopic.php?f=57&t=178792
Страница 1 из 1

Автор:  Kalisnik [ Ср сен 22, 2021 18:14:57 ]
Заголовок сообщения:  Как проще прочитать один бит из регистра? (Си)

Можно вычислить сумму регистра, но это отнимает время. Как быстро и универсально прочитать один бит из регистра в среде программирования Си?

Автор:  parovoZZ [ Ср сен 22, 2021 20:25:07 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

считываешь регистр и накладываешь битовую маску.

Автор:  Dimon456 [ Ср сен 22, 2021 21:31:27 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

Смотря для чего читать бит.

Самый простоя вариант накладываем маску
Спойлер
Код:
   if(main_registr & (1<<2))
   {   // бит = 1
      x=1;
   } else
   {    // бит = 0
      x=0;
   }
то же самое и с портом
Код:
   if(PORTB & (1<<2))
   {   // бит = 1
      x=1;
   } else
   {    // бит = 0
      x=0;
   }
но при попытке прочитать
Код:
   x = main_registr & (1<<2);
   x = PORTB & (1<<2);
x=0 либо x=(1<<2)=4
но, существует и другой способ
Спойлерсоюз union
Код:
union mmByte {
struct {
unsigned  b0:1;
unsigned  b1:1;
unsigned  b2:1;
unsigned  b3:1;
unsigned  b4:1;
unsigned  b5:1;
unsigned  b6:1;
unsigned  b7:1;
} mbyte;
 volatile char m_byte;
}__attribute__((packed));

union mmByte mym_reg;
запись в переменную напрямую числом
Код:
mym_reg.m_byte = 196;
либо напрямую в бит
Код:
mym_reg.mbyte.b2 = 1;
соответственно прочитать бит можно так
Код:
x = mym_reg.mbyte.b2;
x=0 либо x=1

Ну а это из области фантастики, работа с регистром порта
Код:
union mmByte * mym_reg2;
mym_reg2  = (void *)&PORTB;
запись число в порт
Код:
mym_reg2->m_byte = 196;
отдельно бит
Код:
mym_reg2->mbyte.b2 = 1;
теперь чтение:
полностью порт
Код:
x = mym_reg2->m_byte;
отдельно бит
Код:
x = mym_reg2->mbyte.b2;
x=0 либо x=1
Достаточно исчерпывающий ответ?

Автор:  Eddy_Em [ Ср сен 22, 2021 21:51:59 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

Битовые поля - хуже, т.к. не факт, что компилятор развернет поле в считывание и наложение маски.

Автор:  Dimon456 [ Ср сен 22, 2021 22:13:18 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

Eddy_Em писал(а):
Битовые поля - хуже,
Смотря какая конечная цель.
Eddy_Em писал(а):
т.к. не факт, что компилятор развернет поле в считывание и наложение маски
а мне все равно во что он разворачивает, главное что бы разворачивал так, как мне нужно.

Автор:  Kalisnik [ Чт сен 23, 2021 13:30:38 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

Dimon456, спасибо.

Автор:  ARV [ Чт сен 23, 2021 13:37:33 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

в "среде" программирования на Си под названием avr-gcc, например, давно все встроено, есть набор макросов для чтения битов
bit_is_set
bit_is_clear
ну а запись битов - это обычная операция И или ИЛИ

Автор:  Kalisnik [ Чт сен 23, 2021 18:31:53 ]
Заголовок сообщения:  Re: Как проще прочитать один бит из регистра? (Си)

ARV, да, проще уже некуда. Спасибо. :)

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/