Страница 1 из 1

Си и AVR studio

Добавлено: Чт июл 11, 2013 07:40:34
СергейКир
Здравствуйте.
Среда - AVR studio 6
Язык - Си
МК - Mega8
Моделирую в Proteus
Пишу код

Код: Выделить всё

	 //начинаем основной цикл рабочего хода
	 
	 if (  ((PIND&(1 << PIND6)) == 0)) && ((PIND&(1 << PIND1)) == 1) )//если нажали вперёд и концевик 2 не замкнут то
	 {

	 }


При моделировании PIND6 - лог ноль, на PIND1 - лог единица (см. вложения).
Вопрос. Почему не срабатывает моё условие (см. код)?
Спасибо.

Re: Си и AVR studio

Добавлено: Чт июл 11, 2013 08:06:29
metan
Здравствуйте.
Ошибка в том, что на месте PIND6 и PIND1 должны быть номера битов, а не их значения.
Вообще неплохо было бы сделать так:

Код: Выделить всё

#define   SetBit(reg, bit)          reg |= (1<<bit)            
#define   ClearBit(reg, bit)       reg &= (~(1<<bit))
#define   InvBit(reg, bit)         reg ^= (1<<bit)
#define   BitIsSet(reg, bit)       ((reg & (1<<bit)) != 0)
#define   BitIsClear(reg, bit)    ((reg & (1<<bit)) == 0)
пример использования:

Код: Выделить всё

SetBit(PORTB, 0);    //установить нулевой бит порта B    
InvBit(tmp,6);         //инвертировать шестой бит переменной tmp

…
if  (BitIsClear(PIND, 0)) {   //если очищен нулевой бит в регистре PIND                                     
…..                                     //выполнить блок
}

Re: Си и AVR studio

Добавлено: Чт июл 11, 2013 08:25:50
СергейКир
Спасибо за ответ.
Я только начинаю. Буду придерживаться Вашего совета. Сейчас попробую.
P.S. Кстати вот так

Код: Выделить всё

 if  (((PIND&(1 << PIND6)) == 0) && (!(PIND&(1 << PIND1)) == 0) )//если нажали вперёд и концевик 2 не замкнут то
	 {
         }
заработало. Но сделал по Вашему. Естественно всё получилось.
Спасибо ещё раз.
P.S.2 Здорово, когда тебе отвечают просто так, без "гугли" и без "всё же просто, подумай немного".