PDA

Просмотр полной версии : Проверка бита в макросе панели СП300



GSK
02.03.2017, 12:03
Добрый день.

Есть переменная PSW[369]. У нее нужно проверить 6 бит. И если он 1 то установить бит 6 в переменной PSW[1369]....

WORD tmp;

tmp = PSW[369];

if ((tmp>>6) & 0x01)
{
PSW[1369] = PSW[1369] | (1<<6);
}
else
{
PSW[1369] = PSW[1369] & (0<<6);
}

Но такая конструкция не работает. Уважаемые спецы, почему?
Заранее спасибо...

Евгений Кислов
02.03.2017, 12:43
Добрый день. Используйте следующую конструкцию:



if ( PSW[369] & (1<<6) )
{
PSW[1369] = PSW[1369] | (1<<6);
}
else
{
PSW[1369] = PSW[1369] & ~(1<<6);
}


Внесем соответствующие правки в следующую версию РП.

Вот пример работы с памятью через макросы (набор готовых функций):
http://www.owen.ru/forum/showthread.php?t=25952&p=233959&viewfull=1#post233959

В рамках этого примера можно было бы сделать так:



WriteBitInReg(1369, 6, GetBitFromReg(369,6,TYPE_PSW), TYPE_PSW);

GSK
02.03.2017, 12:48
То есть будет работать условие

if ( PSW[369] & 0x40 ) ......

Это ошибка в коде панели?

Евгений Кислов
02.03.2017, 12:51
То есть будет работать условие

if ( PSW[369] & 0x40 ) ......

Это ошибка в коде панели?

Ошибка в документации, если точнее.

Запись типа



if ( PSW[369] & 0x40 )


вполне легитимна.

Обращаю внимание - в элементе при выборе бита они пронумерованы с нуля.
Т.е. в данном случае шестой бит - это именно 0x40.

GSK
02.03.2017, 13:50
Простите, но я что то запутался(((
Оператор IF логический. У него условие либо истина либо лож... либо 1 либо 0....
если PSW[369] = 255 то есть 11111111
то
11111111 & 01000000 = 01000000 или 0x40 или 64

получается

if (64)
{
......
} else
{
......
}
Как то не очень.....

а вот:

if (64 == 64)
{
......
} else
{
......
}

или

if ( (PSW[369] & 0x40) == 0x40)
{
....
}

Вполне логично!

Евгений Кислов
02.03.2017, 14:03
Все сказанное верно и логично. Компилятор устроит любой из двух видов записи.

GSK
03.03.2017, 15:17
Хорошо. Спасибо.