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

|
Програмирую на AVRStudio под atmega32 , делаю сигналку себе на авто. Програмирую на си. 1.Испытываю затруднение по обращению к биту порта в условии. к примеру
if ((бит порта)==1) или if ((бит порта)==0)
Если я правильно понимаю к порту на ввод информации лучше всего обращаться через регистр PIN , поправте если я не прав.
2.Так же имею вопрос как обратиться правильно к биту переменной типа unsigned char или unsigned int в том же условии
|
|
|
|
|
Jun 3 2008, 06:14
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Jun 3 2008, 07:46
|
Группа: Новичок
Сообщений: 4
Регистрация: 3-06-08
Пользователь №: 38 011

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

|
Спасибо за разьяснение !!!
|
|
|
|
|
Jun 4 2008, 10:36
|
Группа: Новичок
Сообщений: 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(); }
Почему так и чего не хватает в первом выражении.
|
|
|
|
|
Jun 4 2008, 11:43
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 5 2008, 10:22
|
Участник

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

|
В таких ситуациях проще писать без сравнения, в стиле Код #define BIT3 0x08
if (PINC & BIT3) { // если бит == 1 } else { // если бит == 0 }
|
|
|
|
|
Jun 5 2008, 12:25
|
Участник

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

|
Цитата(rezident) Отнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия. Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек. Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути.
|
|
|
|
|
Jun 5 2008, 12:39
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Lepeksiy @ Jun 5 2008, 18:25)  Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек. Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути. При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем и только потом уже на уровне ЯВУ присваивается абстракция в виде true/ false. Кстати, значения true/false могут отличаться от 1/0. Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать?
|
|
|
|
|
Jun 5 2008, 14:27
|
Участник

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

|
Цитата При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем Какое это имеет значение? Мы тут наглядность на си рассматриваем, а не ассемблер. А в таких случаях, как в примере выше, avr-gcc (при включенной оптимизации) использует SBIC или SBIS. Цитата Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать? Да сравнивайте, кто ж вам не дает  Я разве утверждал что нельзя?? Я писал, что вариант без явного сравнения кажется мне более наглядным.
|
|
|
|
|
Jun 6 2008, 01:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Lepeksiy @ Jun 5 2008, 20:27)  Какое это имеет значение? Большое. Стиль написания на языке ЯВУ, который приближает программу к такой же, написанной на ASM, дает наиболее эффективный код. Цитата(Lepeksiy @ Jun 5 2008, 20:27)  Я писал, что вариант без явного сравнения кажется мне более наглядным. Да где же тут наглядность, если не понятно с чем сравнивать и как результат сравнения определять? Сраваните сами Код 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 совсем наоборот?  То, что вы ни разу с таким не сталкивались, не означает что такого не бывает никогда. Эталон сравнения в вашем варианте условия зарыт где-то далеко какими-то умолчаниями и/или хедерами. Ну и где тут ваша пресловутая "наглядность"?
|
|
|
|
|
Jun 6 2008, 05:16
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 6 2008, 12:02
|

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

|
есть надо руками - для этого они и нужны!!! если бы ножом и вилкой было удобно есть - то в процессе эволюции ноготь указательного пальца правой руки превратился в нож а левой руки в вилку. некоторые ещё считают что вилку надо держать в левой руке - бред  надо держать её так как удобнее  Цитата(zltigo @ Jun 6 2008, 09:16)  занимают отныне занимают второе место. за такие деньги можно купить rfpic и не думать о горождении радио брелка. или штуки 3 простых пиков
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|