реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> битовая арифметика, битовое условие
ЧипХрум
сообщение Jun 3 2008, 06:01
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 3-06-08
Пользователь №: 38 011



Програмирую на AVRStudio под atmega32 , делаю сигналку себе на авто.
Програмирую на си.
1.Испытываю затруднение по обращению к биту порта в условии.
к примеру

if ((бит порта)==1)
или
if ((бит порта)==0)

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


2.Так же имею вопрос как обратиться правильно к биту переменной
типа unsigned char или unsigned int в том же условии
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 3 2008, 06:14
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ЧипХрум @ Jun 3 2008, 10:01) *
Если я правильно понимаю к порту на ввод информации лучше всего
обращаться через регистр PIN

Мало того, это единственно возможный способ считать информацию с порта
Цитата
2.Так же имею вопрос как обратиться правильно к биту переменной

Ну, есть куча способов. Самый простой (для меня) - наложение маски.
То есть:
#define BIT5 0x20 // определили маску 5-го бита

PIN & BIT5 - будет равно BIT5, если соответственный бит в PIN включен, либо 0, если выключен.

Ну а также есть способы для работы через битовые команды, но я лично их не люблю.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 3 2008, 06:15
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Если транслятор WinAVR - воспользуйтесь макросами из sfr_defs.h :

bit_is_set
bit_is_clear и др.

Если другой - взять эти макросы или найти аналогичные
Go to the top of the page
 
+Quote Post
bloodden
сообщение Jun 3 2008, 06:49
Сообщение #4


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



if( (PINB&BIT5) != 0) делаем, если бит установлен
Это, так сказать, итог под постом MrYuran

Можно через заднее место если в CodeVision пишите: if(PINB.5)
Но это работает ТОЛЬКО в это компиляторе.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
ЧипХрум
сообщение Jun 3 2008, 07:46
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 3-06-08
Пользователь №: 38 011



Спасибо за разьяснение !!! beer.gif
Go to the top of the page
 
+Quote Post
ЧипХрум
сообщение Jun 3 2008, 07:46
Сообщение #6





Группа: Новичок
Сообщений: 4
Регистрация: 3-06-08
Пользователь №: 38 011



Спасибо за разьяснение !!! beer.gif
Go to the top of the page
 
+Quote Post
ЧипХрум
сообщение Jun 4 2008, 10:36
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 3-06-08
Пользователь №: 38 011



Появилась траблемма , помогайте я не справляюсь !!!

#define BIT3 0x08

if ((PINC&BIT3) == 1) //
{

Sirena();

}

А вот выражение .
При установке 3 го бита в порте PINC в 1 цу выражение не реагирует .
А вот в этом выражении все впорядке

#define BIT0 0x01

if ((PINC&BIT0) == 0)
{

Sirena();

}

Почему так и чего не хватает в первом выражении.
Go to the top of the page
 
+Quote Post
vitko
сообщение Jun 4 2008, 11:43
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066



Цитата(ЧипХрум @ Jun 4 2008, 13:36) *
Появилась траблемма , помогайте я не справляюсь !!!

#define BIT3 0x08

if ((PINC&BIT3) == 1) //
{
Sirena();
}

А вот выражение .
При установке 3 го бита в порте PINC в 1 цу выражение не реагирует .
Почему так и чего не хватает в первом выражении.


а по вашему, результат операции (PINC & 0x08) может быть равен 0x01 ?

Сообщение отредактировал vitko - Jun 4 2008, 11:45
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 4 2008, 12:02
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



При использовании в условиях битовых операций с наложением маски я вам крайне рекомендую использовать только сравнение с нулем, либо с одной и тех масок, что вы накладываете. Не используйте сравнение с каким либо другим числом, чтобы не попасть впросак. Причину ошибки вам указал vitko.
PINC&BIT3 преобразуется препроцессором в выражение PINC&0x08. Это выражение может принимать значение либо 0x08, либо 0x00. 0x01 оно никогда равно не будет.
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Jun 5 2008, 10:22
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



В таких ситуациях проще писать без сравнения, в стиле
Код
#define BIT3 0x08

if (PINC & BIT3)
{ // если бит == 1
}
else
{ // если бит == 0
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 5 2008, 10:25
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Lepeksiy @ Jun 5 2008, 16:22) *
В таких ситуациях проще писать без сравнения, в стиле
Отнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия.
Go to the top of the page
 
+Quote Post
bloodden
сообщение Jun 5 2008, 10:38
Сообщение #12


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



Какой МК? Если мега, то смотрите на порту Ц jitag есть. так вот он если включен, то порты не работают.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Jun 5 2008, 12:02
Сообщение #13


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Для наглядности можно так:
#define MASK 0x01
if(PINX>>N&MASK==MASK)
{
bla;
}
else
{
bla;
}


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Jun 5 2008, 12:25
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



Цитата(rezident)
Отнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия.

Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек.
Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 5 2008, 12:39
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Lepeksiy @ Jun 5 2008, 18:25) *
Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек.
Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути.
При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем и только потом уже на уровне ЯВУ присваивается абстракция в виде true/false. Кстати, значения true/false могут отличаться от 1/0. Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать?
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Jun 5 2008, 14:27
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



Цитата
При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем

Какое это имеет значение? Мы тут наглядность на си рассматриваем, а не ассемблер.
А в таких случаях, как в примере выше, avr-gcc (при включенной оптимизации) использует SBIC или SBIS.
Цитата
Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать?

Да сравнивайте, кто ж вам не дает smile.gif
Я разве утверждал что нельзя?? Я писал, что вариант без явного сравнения кажется мне более наглядным.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 6 2008, 01:29
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Lepeksiy @ Jun 5 2008, 20:27) *
Какое это имеет значение?
Большое. Стиль написания на языке ЯВУ, который приближает программу к такой же, написанной на ASM, дает наиболее эффективный код.
Цитата(Lepeksiy @ Jun 5 2008, 20:27) *
Я писал, что вариант без явного сравнения кажется мне более наглядным.
Да где же тут наглядность, если не понятно с чем сравнивать и как результат сравнения определять? laughing.gif
Сраваните сами
Код
if ((tmp&BIT0)!=0)
  var=1;
else
  var=0;

Читаем/расшифровываем выражение: если при битовой операции tmp AND BIT0 результат не равен нулю, то переменной var присвоим значение 1, иначе - значение 0.
Теперь ваш вариант
Код
if (tmp&BIT0)
  var=1;
else
  var=0;

Пытаемся расшифровать: если при битовой операции tmp AND BIT0 .... а дальше чего? В этом месте нужно помнить, что где-то по умолчанию предполагается, что 0 это false, а не 0 это true. И исходя из этого предположения выбирать действие. А если вдруг окажется что true это 0, а false совсем наоборот? laughing.gif То, что вы ни разу с таким не сталкивались, не означает что такого не бывает никогда. Эталон сравнения в вашем варианте условия зарыт где-то далеко какими-то умолчаниями и/или хедерами. Ну и где тут ваша пресловутая "наглядность"? wink.gif
Go to the top of the page
 
+Quote Post
vet
сообщение Jun 6 2008, 04:30
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



rezident, при чём тут true/false? в plain C и слов-то таких нет;
выражение в if () проверяется именно что на неравенство нулю, в любом случае. Выражение вида a!=b имеет свой результат - ноль или не ноль соответственно.
Лично мне выражение с опущенным !=0 также представляется более естественным (для битовых операций; сравнение чисел с нулем лучше читается в явном виде). И уж конечно, такой стиль ближе к ассемблерному - в ассемблерном коде ветвление обычно ставится сразу же после наложения битовой маски, без лишних сравнений.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2008, 05:00
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Stanislav_S @ Jun 5 2008, 14:02) *
Для наглядности можно так:
#define MASK 0x01
if(PINX>>N&MASK==MASK)

Можете смело участвовать в конкурсе по запутыванию sad.gif. Это даже не "на любом языке можно писать, как на Accемблере", это круче.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Tiny
сообщение Jun 6 2008, 05:00
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 10-07-06
Пользователь №: 18 720



Я не программист, и до сих пор я считал, что на Си запись
if (tmp&BIT0)
означает в любом случае: Если выражение tmp&BIT0 равно 0, то результат if ЛОЖНОНО. В противном случае - ИСТИНО. Разве в этом плане есть разные варианты?
На PHP я попал с этим в просак. По привычке из Си, Си++ я писал подобным образом. А когда на сервере поменяли PHP4 на PHP5 моя база данных перестала работать. Пришлось повозиться пару часов, чтобы понять, что нужно писать полностью типа if(A>0). Тогда все заработало.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2008, 05:03
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(vet @ Jun 6 2008, 06:30) *
Лично мне выражение с опущенным !=0 также представляется более естественным..

Более того оно так и есть на самом деле smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jun 6 2008, 05:05
Сообщение #22


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



Цитата(ЧипХрум @ Jun 3 2008, 10:01) *
Програмирую на AVRStudio под atmega32 , делаю сигналку себе на авто.
Програмирую на си.
1.Испытываю затруднение по обращению к биту порта в условии.
к примеру

if ((бит порта)==1)
или
if ((бит порта)==0)


07.gif
да времена настали - зачем использовать для битовых операций (в сигналке почти всё будет такое) контроллер который для этого не очень предназначен??? немудрено))) что для большинства достаточно pic16 а то и pic12 или 51 где не то что делать отдельную операцию чтения а всё сравнение и переход будет одной командой ассемблера - что наиболее наглядно .

JB P2.1 METKA_1
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 6 2008, 05:16
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Tiny @ Jun 6 2008, 07:00) *
Разве в этом плане есть разные варианты?

Никаких вариантов нет.
Выражения if( (a & MASK)!=0 ) ничего кроме трудностей чтения выражений "масло маслянное с добавлением скобок" не добавляют.


Цитата(rv3dll(lex) @ Jun 6 2008, 07:05) *
да времена настали - зачем использовать для битовых операций (в сигналке почти всё будет такое) контроллер который для этого не очень предназначен???

Контроллер "не очень предназначенный для битовых операций". "Чернила для третьего класса"
занимают отныне занимают второе место.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 6 2008, 10:25
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ладно. Вижу что бесполезно убеждать. Обсуждаемый вопрос больше относится к культуре/стилю написания программ. Если человек легко обходится при еде руками и ложкой, то убеждать его в том, что кушать лучше с ножем и вилкой, как это принято у культурных людей, видимо не имеет смысла.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 6 2008, 11:39
Сообщение #25


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Потом выяснится, что культурные люди кушают только в ресторане, да ещё в костюме и при галстуке smile.gif

А дома вообще жрать нельзя smile.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
rv3dll(lex)
сообщение Jun 6 2008, 12:02
Сообщение #26


Полное ничтожество
*****

Группа: Banned
Сообщений: 1 991
Регистрация: 20-03-07
Из: Коломна
Пользователь №: 26 354



есть надо руками - для этого они и нужны!!!

если бы ножом и вилкой было удобно есть - то в процессе эволюции ноготь указательного пальца правой руки превратился в нож а левой руки в вилку.

некоторые ещё считают что вилку надо держать в левой руке - бред yeah.gif надо держать её так как удобнее 08.gif

Цитата(zltigo @ Jun 6 2008, 09:16) *
занимают отныне занимают второе место.


за такие деньги можно купить rfpic и не думать о горождении радио брелка. или штуки 3 простых пиков
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Jun 6 2008, 15:33
Сообщение #27


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(zltigo @ Jun 6 2008, 10:00) *
Можете смело участвовать в конкурсе по запутыванию sad.gif. Это даже не "на любом языке можно писать, как на Accемблере", это круче.

Почему? Хотя конечно объявлять MASK через define лишнее.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01906 секунд с 7
ELECTRONIX ©2004-2016