PDA

Просмотр полной версии : Получить в скрипте бит 10 из word



vik™
14.12.2023, 04:48
Кусок скрипта который не отрабатывает как мне хочется :)
Задача: с переменной word по адресу 1200 получить десятый бит и скопировать его в регистр битов 707

if ((PSW[1200]&(1<<10))!=0)
{
SetPSB(707);
}
else
{
ResetPSB(707);
}

С 0 по 7 бит всё четко работает. Но за пределами восьми бит не корректно отрабатывает.
Хелп

МихаилГл
14.12.2023, 05:21
Может из-за того, что требуется 16ричное число, а не десятичное?

Согласно справки: PSW[400] & 0x01

Или вообще 8ричное...

А зачем добавлено: !=0

Код макроса: if (PSW[400] & 0x01) // побитовое И
{
SetPSB(300);
}
else
{
ResetPSB(300);
}
Может это лишнее? Сам в макросах не понимаю, но тут возможно не полноценный язык...

vik™
14.12.2023, 05:34
Может из-за того, что требуется 16ричное число, а не десятичное?

Согласно справки: PSW[400] & 0x01

Или вообще 8ричное...

А зачем добавлено: !=0

Код макроса: if (PSW[400] & 0x01) // побитовое И
{
SetPSB(300);
}
else
{
ResetPSB(300);
}
Может это лишнее? Сам в макросах не понимаю, но тут возможно не полноценный язык...

!=0 это сравнивание бита . Если бит не равен нулю, то присвоить биту 707 истину, в противном случае присвоить ложь.
Вопрос не в HEX, DEC или BIN. Это всего лишь представление информации.
Если с 0 по 7 бит код работает, то почему не хочет работать дальше седьмого бита.
WORD это два байта, 16 бит. Не вижу логики почему не работает.

МихаилГл
14.12.2023, 05:38
!=0 это сравнивание бита . Если бит не равен нулю, то присвоить биту 707 истину, в противном случае присвоить ложь.
Вопрос не в HEX, DEC или BIN. Это всего лишь представление информации.
Если с 0 по 7 бит код работает, то почему не хочет работать дальше седьмого бита.
WORD это два байта, 16 бит. Не вижу логики почему не работает.

Я спрашивал зачем добавлено... В справке к СП этого нет. Может это лишнее.. Или вы не в СП макрос пишите, а на чистом С? (Но я в нем тоже не понимаю))
Ну или в справке ошибка. Тогда должно работать.

vik™
14.12.2023, 05:46
Я спрашивал зачем добавлено... В справке к СП этого нет. Может это лишнее.. Или вы не в СП макрос пишите, а на чистом С? (Но я в нем тоже не понимаю))
Ну или в справке ошибка. Тогда должно работать.

Это С подобное чтото. Единственное я не совсем понимаю как компилятор обрабатывает код на ошибки. Как работает с внутренними переменными PSB, PSW. Есть вариант взять переменную и силой сказать что это UINT и попробовать так. Но решил спросить тут, т.к. постоянно скрипт грузить в панель и тестить, извращение полнейшее.
Справка есть еще тут https://owen.ru/uploads/388/sp3xx_rp_2.2.pdf страница 181
Этот код отсюда. он более понятный
Пробовал разные варианты.
С битами мне проще в деках работать, чем с маской. Удобнее читать код спустя некоторое время. Сразу видишь бит нужный. С маской для меня сложнее читать.

vik™
14.12.2023, 05:56
Вчера пол дня мучался, теперь когда написал, понял, сам дурак.
Забыл сранные скобки. Сначала нужно получить бит, потом его сравнить.
if ((PSW[1200]&(1<<10))!=0)
{SetPSB(707);}
else
{ResetPSB(707);}
Когда писал, забыл с 8 бита и дальше сделать это
Проверил. Работает!

МихаилГл
14.12.2023, 06:04
Это С подобное чтото. Единственное я не совсем понимаю как компилятор обрабатывает код на ошибки. Как работает с внутренними переменными PSB, PSW. Есть вариант взять переменную и силой сказать что это UINT и попробовать так. Но решил спросить тут, т.к. постоянно скрипт грузить в панель и тестить, извращение полнейшее.
Справка есть еще тут https://owen.ru/uploads/388/sp3xx_rp_2.2.pdf страница 181
Этот код отсюда. он более понятный
Пробовал разные варианты.
С битами мне проще в деках работать, чем с маской. Удобнее читать код спустя некоторое время. Сразу видишь бит нужный. С маской для меня сложнее читать.

А я смотрел справку в самой среде, там ошибка... Вот и верь после этого документации.
72363

vik™
14.12.2023, 06:59
А я смотрел справку в самой среде, там ошибка... Вот и верь после этого документации.
72363

Это рабочий вариант. Просто метод битовой маски
С интернета
Маскирование. Компьютер воспринимает информацию иначе. Ему нельзя сказать: «Посмотри на первый бит и выдай его значение» — нужно использовать маску. Например, чтобы узнать, какой ответ был дан на второй вопрос, потребуется маска 010 — единица стоит в том бите, значение которого мы хотим получить.

МихаилГл
14.12.2023, 08:38
Это рабочий вариант. Просто метод битовой маски
С интернета
Маскирование. Компьютер воспринимает информацию иначе. Ему нельзя сказать: «Посмотри на первый бит и выдай его значение» — нужно использовать маску. Например, чтобы узнать, какой ответ был дан на второй вопрос, потребуется маска 010 — единица стоит в том бите, значение которого мы хотим получить.

Я это все понимаю, но разве это будет работать без условия !=0 или !=1 и т.п.?
Мы же не бит на выходе получим, а число, но только 01000, 00100, 00010 и т.п.

Ладно, кажется я затупил конкретно...