Easyelectronics.ru

Электроника для всех
Текущее время: 19 сен 2018, 04: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
Сообщения: 962
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
Сообщения: 1314
Откуда: Курск
Else не сработает как надо, почитайте как сбросить бит


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

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1723
Откуда: Харьков
Условие правильное, но ноль нельзя установить операцией сложения ибо Х+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
Сообщения: 1314
Откуда: Курск
Ещё чуть чуть не так
X&1=X
А что не так в конструкции? Это скорее всего превратится в одну команду процессора


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 475
А чем вам битовые поля не угодили ? 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
Сообщения: 102
Cthulhu писал(а):
X&1=X
А что не так в конструкции?

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


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

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

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


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

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


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


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

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

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


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

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 962
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
Сообщения: 1249
siarzhuk писал(а):
Не отчаивайтесь, подобно тому как привычные слова мы распознаём при чтении целиком, не тратя время на побуквенный разбор, так и все эти |=, &=~ через неделю практики будут распознаваться мгновенно, обращая внимание сразу на то какие конкретно бит/биты снимаются или ставятся.

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


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 102
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
Сообщения: 475
Код:
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
Сообщения: 2514
Откуда: Москва
Цитата:
PORTD &= ~(1<<4);
- Это вряд ли , или с компилятором что-то не так


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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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