Easyelectronics.ru

Электроника для всех
Текущее время: 18 июн 2018, 16:15

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

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

Например
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
Сообщения: 652
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
Сообщения: 12
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
Сообщения: 1226
Откуда: Курск
Else не сработает как надо, почитайте как сбросить бит


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

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


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

Зарегистрирован: 03 апр 2018, 15:04
Сообщения: 12
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
Сообщения: 1226
Откуда: Курск
Ещё чуть чуть не так
X&1=X
А что не так в конструкции? Это скорее всего превратится в одну команду процессора


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

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


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

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


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

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


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

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


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


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

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

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


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

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

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


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

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


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


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

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

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


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

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

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

_________________
less is more


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 99
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
Сообщения: 452
Код:
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
Сообщения: 12
Спасибо за ответы!
Разобрался, код заработал


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

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


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

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


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

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


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

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


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

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

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