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

 
 
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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:16
Рейтинг@Mail.ru


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