Easyelectronics.ru • Просмотр темы - Доступ к биту в байте.

Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2018, 07:45

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 21 ] 
Автор Сообщение
 Заголовок сообщения: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 00:19 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
Прошу прощения но только начинаю изучать С++.
Как получить доступ к биту в байте? Задача стоит записать бит , но ноги могут быть "раскинуты" по МК.

Например
PORTC|=0b01010101 // это мы пишем в порт

но если "ноги" не сгрупированны по порту?
на примере 1602

LCD_D4_PORT |=(Х<<LCD_D4_PIN);
где Х - бит в байте, LCD_D4_PORT и LCD_D4_PIN прописаны через #define.
Как получить Х??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 00:28 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 858
http://easyelectronics.ru/avr-uchebnyj- ... ast-4.html

Гугл - "битовые операции C", "C bitwise operations"

EDIT: а по ссылке нет почему-то про проверку битов... ладно, вот тут точно есть: https://ph0en1x.net/81-howto-work-with- ... oller.html
Часть "Проверка разрядов регистра".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 00:49 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
NStorm писал(а):
http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-4.html

Гугл - "битовые операции C", "C bitwise operations"

EDIT: а по ссылке нет почему-то про проверку битов... ладно, вот тут точно есть: https://ph0en1x.net/81-howto-work-with- ... oller.html
Часть "Проверка разрядов регистра".


такс, нужен, ну пусть 3ий бит.
byteexample=0b01010101;

if( byteexample & (1 << 3) )
{LCD_D4_PORT |=(1<<LCD_D4_PIN); }
else
{LCD_D4_PORT |=(0<<LCD_D4_PIN); }

Правильно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 01:30 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1283
Откуда: Курск
Else не сработает как надо, почитайте как сбросить бит


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 01:32 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1674
Откуда: Харьков
Условие правильное, но ноль нельзя установить операцией сложения ибо Х+0=Х


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 01:48 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
alexsam писал(а):
Условие правильное, но ноль нельзя установить операцией сложения ибо Х+0=Х

Сообразил, так ?

if( byteexample & (1 << 3) )
{LCD_D4_PORT |=(1<<LCD_D4_PIN); }
else
{LCD_D4_PORT &=~(0<<LCD_D4_PIN); }

Но не нравится сама конструкция, для 4битного режима еще туда сюда, для 8битного ......


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 02:06 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1283
Откуда: Курск
Ещё чуть чуть не так
X&1=X
А что не так в конструкции? Это скорее всего превратится в одну команду процессора


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 02:21 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
А чем вам битовые поля не угодили ? union с необходимыми полями и все у вас будет по феншую !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 02:29 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
Cthulhu писал(а):
Ещё чуть чуть не так
X&1=X
А что не так в конструкции? Это скорее всего превратится в одну команду процессора


Туплю {LCD_D4_PORT &=~(1<<LCD_D4_PIN); } ??

громоздкая конструкция. Нет, понятно что и в коде не видно будет и превратится в одну/две команды.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 02:31 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
void1509 писал(а):
А чем вам битовые поля не угодили ? union с необходимыми полями и все у вас будет по феншую !


Будем читать, изучать. Не все сразу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 11:40 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 101
Cthulhu писал(а):
X&1=X
А что не так в конструкции?

Ответ компилятора будет в стиле l-value required. Результат операции слева от = не является присваиваемой сущностью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 11:50 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 101
void1509 писал(а):
А чем вам битовые поля не угодили ? union с необходимыми полями и все у вас будет по феншую !

С полями приятнее - согласен, но битовые операции достаточно базовая тема, чтобы оставить её за спиной не вызубрив подробности. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 12:00 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 560
Откуда: Германия
void1509 писал(а):
А чем вам битовые поля не угодили ? union с необходимыми полями и все у вас будет по феншую !


Порядок битовых полей стандартом не определен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 12:02 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 101
Sergeynk писал(а):
громоздкая конструкция.

Не отчаивайтесь, подобно тому как привычные слова мы распознаём при чтении целиком, не тратя время на побуквенный разбор, так и все эти |=, &=~ через неделю практики будут распознаваться мгновенно, обращая внимание сразу на то какие конкретно бит/биты снимаются или ставятся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 12:11 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 858
siarzhuk писал(а):
Cthulhu писал(а):
X&1=X
А что не так в конструкции?

Ответ компилятора будет в стиле l-value required. Результат операции слева от = не является присваиваемой сущностью.

Это вообще-то был не вопрос Cthulhu, а ответ для ТС. На вопрос что не так в записи "LCD_D4_PORT &=~(0<<LCD_D4_PIN);" - она ничего не меняет, т.к. фактически это И с 1.

Цитата:
{LCD_D4_PORT &=~(1<<LCD_D4_PIN); } ??

Да, так.

Цитата:
Громоздкая конструкция. Нет, понятно что и в коде не видно будет и превратится в одну/две команды.

Нормальная конструкция. Громозкая она у вас только из-за длинных дефайнов номеров портов и пинов. На самом деле "для компилятора" она выглядит как-то так:
Код:
PORTD &= ~(1<<4);

Только вместо PORTD адрес порта. Но ведь наверное с LCD_D4_XXX вам проще ориентироваться? Не так уж и громоздко выглядит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 12:34 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1165
siarzhuk писал(а):
Не отчаивайтесь, подобно тому как привычные слова мы распознаём при чтении целиком, не тратя время на побуквенный разбор, так и все эти |=, &=~ через неделю практики будут распознаваться мгновенно, обращая внимание сразу на то какие конкретно бит/биты снимаются или ставятся.

Мыши плакали, кололись…

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 15:18 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 101
vt340 писал(а):
Мыши плакали, кололись…

;-) ну.... По мышам и кактус:
LCD_D4_PORT ^= (LCD_D4_PORT ^ (byteexample & 1 << 3 ? -1 : 0)) & 1 << LCD_D4_PIN;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 10 апр 2018, 15:44 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Код:
union {
      struct{
           unsigned a:3;
           unsigned b:3;
           unsigned c:2
      }bits;
      uint8_t byte;
}bitdiv;

bitdiv.byte = 0xc8;

PORTA = bitdiv.bits.a;
PORTB = bitdiv.bits.b;
PORTC = bitdiv.bits.c;

чем не устраивает ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 11 апр 2018, 01:50 
Только пришел

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 16
Спасибо за ответы!
Разобрался, код заработал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 12 апр 2018, 09:06 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2492
Откуда: Москва
Цитата:
PORTD &= ~(1<<4);
- Это вряд ли , или с компилятором что-то не так


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Доступ к биту в байте.
СообщениеДобавлено: 12 апр 2018, 09:24 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 858
Поэтому "для компилятора" я взял в кавычки. Имелось в виду, что вместо длинно названных дефайнов поставится просто 1 цифра.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB