Перейти к содержанию
    

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

Програмирую на си.

1.Испытываю затруднение по обращению к биту порта в условии.

к примеру

 

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

или

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

 

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

обращаться через регистр PIN , поправте если я не прав.

 

 

2.Так же имею вопрос как обратиться правильно к биту переменной

типа unsigned char или unsigned int в том же условии

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

обращаться через регистр PIN

Мало того, это единственно возможный способ считать информацию с порта

2.Так же имею вопрос как обратиться правильно к биту переменной

Ну, есть куча способов. Самый простой (для меня) - наложение маски.

То есть:

#define BIT5 0x20 // определили маску 5-го бита

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

bit_is_set

bit_is_clear и др.

 

Если другой - взять эти макросы или найти аналогичные

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if( (PINB&BIT5) != 0) делаем, если бит установлен

Это, так сказать, итог под постом MrYuran

 

Можно через заднее место если в CodeVision пишите: if(PINB.5)

Но это работает ТОЛЬКО в это компиляторе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

#define BIT3 0x08

 

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

{

 

Sirena();

 

}

 

А вот выражение .

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

А вот в этом выражении все впорядке

 

#define BIT0 0x01

 

if ((PINC&BIT0) == 0)

{

 

Sirena();

 

}

 

Почему так и чего не хватает в первом выражении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

#define BIT3 0x08

 

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

{

Sirena();

}

 

А вот выражение .

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

Почему так и чего не хватает в первом выражении.

 

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

Изменено пользователем vitko

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

PINC&BIT3 преобразуется препроцессором в выражение PINC&0x08. Это выражение может принимать значение либо 0x08, либо 0x00. 0x01 оно никогда равно не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таких ситуациях проще писать без сравнения, в стиле

#define BIT3 0x08

if (PINC & BIT3)
{ // если бит == 1
}
else
{ // если бит == 0
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таких ситуациях проще писать без сравнения, в стиле
Отнюдь. Явное сравнение гораздо нагляднее и доступнее для восприятия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для наглядности можно так:

#define MASK 0x01

if(PINX>>N&MASK==MASK)

{

bla;

}

else

{

bla;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек.

Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне как раз вариант без сравнения кажется более наглядным. Дело вкуса и привычек.

Явное сравнение более наглядно, если речь идет об арифметических операциях. А проверка бита является булевой по своей сути.

При проверке условия на уровне ассемблерных инструкций идет сравнение значения выражения с нулем и только потом уже на уровне ЯВУ присваивается абстракция в виде true/false. Кстати, значения true/false могут отличаться от 1/0. Так что прошу от вас обоснования, почему нельзя в условии явно с нулем сравнивать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...