ЧипХрум 0 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба Програмирую на AVRStudio под atmega32 , делаю сигналку себе на авто. Програмирую на си. 1.Испытываю затруднение по обращению к биту порта в условии. к примеру if ((бит порта)==1) или if ((бит порта)==0) Если я правильно понимаю к порту на ввод информации лучше всего обращаться через регистр PIN , поправте если я не прав. 2.Так же имею вопрос как обратиться правильно к биту переменной типа unsigned char или unsigned int в том же условии Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба Если я правильно понимаю к порту на ввод информации лучше всего обращаться через регистр PIN Мало того, это единственно возможный способ считать информацию с порта 2.Так же имею вопрос как обратиться правильно к биту переменной Ну, есть куча способов. Самый простой (для меня) - наложение маски. То есть: #define BIT5 0x20 // определили маску 5-го бита PIN & BIT5 - будет равно BIT5, если соответственный бит в PIN включен, либо 0, если выключен. Ну а также есть способы для работы через битовые команды, но я лично их не люблю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба Если транслятор WinAVR - воспользуйтесь макросами из sfr_defs.h : bit_is_set bit_is_clear и др. Если другой - взять эти макросы или найти аналогичные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bloodden 0 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба if( (PINB&BIT5) != 0) делаем, если бит установлен Это, так сказать, итог под постом MrYuran Можно через заднее место если в CodeVision пишите: if(PINB.5) Но это работает ТОЛЬКО в это компиляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ЧипХрум 0 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба Спасибо за разьяснение !!! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ЧипХрум 0 3 июня, 2008 Опубликовано 3 июня, 2008 · Жалоба Спасибо за разьяснение !!! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ЧипХрум 0 4 июня, 2008 Опубликовано 4 июня, 2008 · Жалоба Появилась траблемма , помогайте я не справляюсь !!! #define BIT3 0x08 if ((PINC&BIT3) == 1) // { Sirena(); } А вот выражение . При установке 3 го бита в порте PINC в 1 цу выражение не реагирует . А вот в этом выражении все впорядке #define BIT0 0x01 if ((PINC&BIT0) == 0) { Sirena(); } Почему так и чего не хватает в первом выражении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitko 0 4 июня, 2008 Опубликовано 4 июня, 2008 (изменено) · Жалоба Появилась траблемма , помогайте я не справляюсь !!! #define BIT3 0x08 if ((PINC&BIT3) == 1) // { Sirena(); } А вот выражение . При установке 3 го бита в порте PINC в 1 цу выражение не реагирует . Почему так и чего не хватает в первом выражении. а по вашему, результат операции (PINC & 0x08) может быть равен 0x01 ? Изменено 4 июня, 2008 пользователем vitko Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 4 июня, 2008 Опубликовано 4 июня, 2008 · Жалоба При использовании в условиях битовых операций с наложением маски я вам крайне рекомендую использовать только сравнение с нулем, либо с одной и тех масок, что вы накладываете. Не используйте сравнение с каким либо другим числом, чтобы не попасть впросак. Причину ошибки вам указал vitko. PINC&BIT3 преобразуется препроцессором в выражение PINC&0x08. Это выражение может принимать значение либо 0x08, либо 0x00. 0x01 оно никогда равно не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lepeksiy 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба В таких ситуациях проще писать без сравнения, в стиле #define BIT3 0x08 if (PINC & BIT3) { // если бит == 1 } else { // если бит == 0 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба В таких ситуациях проще писать без сравнения, в стилеОтнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bloodden 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба Какой МК? Если мега, то смотрите на порту Ц jitag есть. так вот он если включен, то порты не работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба Для наглядности можно так: #define MASK 0x01 if(PINX>>N&MASK==MASK) { bla; } else { bla; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lepeksiy 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба Отнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия. Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек. Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 5 июня, 2008 Опубликовано 5 июня, 2008 · Жалоба Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек. Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути. При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем и только потом уже на уровне ЯВУ присваивается абстракция в виде true/false. Кстати, значения true/false могут отличаться от 1/0. Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться