Работа с битовым представлением
- Войдите на сайт для отправки комментариев
Пт, 27/02/2015 - 21:04
я получаю от восьмиканального устройства состояние его каналов в виде восьми нулей/единиц:
- deviceState: 01111100 - контакт на 1-м канале разомкнут, LED на 4-м канале включен (остальное аналогично)
- deviceState: 01111101 - контакт на 1-м канале замкнут, LED на 4-м канале включен
- deviceState: 01110101 - контакт на 1-м канале замкнут, LED на 4-м канале выключен
Как мне выделить (узнать) из этого только, к примеру, состояние контакта на 1-м канале - 0111110x, независимо от остальных циферок?
Т.е. в идеале получить что-то вроде boolean state1ch = true/false.
Наложение маски boolean state1ch = deviceState & 00000001; не срабатывает (точнее, выполняет не то, что в моем представлении ожидалось).
Странно. Вообще-то должно быть именно то. А полный текст можно?
Только не забывайте b добавлять к маске - для единицы оно может и так сойдёт, а для других разрядов вряд ли. :)
А ешё так не делайте -
- скорее всего не сработает, хотя и кажется на первый взгляд, что всё правильно.
без b как раз коряво работает.
Penni, спасибо.
А ешё так не делайте -
- скорее всего не сработает, хотя и кажется на первый взгляд, что всё правильно.
хм, выглядит-то всё цивильно :) Область видимости?
пардон, но в постановке задачи неоднозначность.....
какие биты отвечают за канал ? какие - за вкл/выкл ?
или чёта пропустил :(
если канал работает на вход (чтение состояния), то 0 - контакт разомкнут, 1 - замкнут
если канал работает на выход (питание нагрузки), то 1 - есть 5В, 0 - нет напряжения.
Нумерация справа налево.
В данном случае это не важно - с этими заморочками мне все понятно.
byte deviceState: - можно узнать какой бит за что отвечает ?
если канал работает на вход (чтение состояния), то 0 - контакт разомкнут, 1 - замкнут
если канал работает на выход (питание нагрузки), то 1 - есть 5В, 0 - нет напряжения.
Нумерация справа налево.
В данном случае это не важно - с этими заморочками мне все понятно.
извините, но это - бла..........
см. #7
тогда мне непонятен ваш вопрос.
вы получили от устройства ( 8-ми канального ) байт состояния....
как его ( байта ) состояние битов интерпретировать ?
если канал работает на вход (чтение состояния), то 0 - контакт разомкнут, 1 - замкнут
если канал работает на выход (питание нагрузки), то 1 - есть 5В, 0 - нет напряжения.
Нумерация справа налево.
В данном случае это не важно - с этими заморочками мне все понятно.
как это понимать ?
Как мне выделить (узнать) из этого только, к примеру, состояние контакта на 1-м канале - 0111110x, независимо от остальных циферок?
моя думал про вас - что это легко.... щас - прикалываетесь, видимо :(
моя твоя не понимай...
получаю в переменной deviceState значение 01110101.
Что сидит на каждом канале - геркон или LED - мне известно.
В вопросе мне надо было узнать состояние конкретного канала, имея весь набор данных. Как это сделать - теперь мне понятно. :)
Сам канал может быть и входом и выходом:
Each of 8 PIO is opendrain and can be use as output or as input. No configuration is needed to use PIO as output or as input.
- to use pin as output, write value in PIO register
- to use pin as input, simply read value.
после #12 - всё понятно :)
Как это сделать - теперь мне понятно. :)
типеричя - ещё понятнее :)
хм, выглядит-то всё цивильно :) Область видимости?
Не, не в этом дело. Просто компиляторы часто (если не всегда) не поддерживают настоящий тип boolean или bool, а используют вместо него обычный int или byte. В результате boolean-переменная может принимать не 2 значения, как хотелось бы, а намного больше.
Поэтому в выражении boolean state5ch = deviceState & 0b00010000; переменной state5ch присваиваются не логические 0 или 1, а байтовые 0b00000000 или 0b0010000;
А значение true, для компилятора, при этом определено всё же как обычная единица.
Получается, что условие if( state5ch == true ) будет работать не так, как условие if( state5ch != false ) :
if( 0b0010000 == 1 ) не выполняется, а if( 0b0010000 != 0 ) выполняется.
Такие вот грабли. :)
if
( state5ch == TRUE ) ->
if
( state5ch > 0 )
if( state5ch > 0 ) - > if( state5ch )
это уже слишком просто :)
Чем проще решение, тем оно непонятнее новичкам. Классика :)
Думаю, что компилятор любое из этих выражений все равно приведёт к наиболее оптимальному, т.е. размер прошивки не изменится.
Самое оптимальное и логичное.
Сравнение на >0 - выдуманное и нелогичное, некорректное, поскольку deviceState изначально беззнаковое по смыслу. Уж тогда лучше сравнивать на неравенство нулю.
А есть еще вариант:
Более читабельно и понятно.
PS По опыту, сравнивать что либо с true/TRUE не стОит, наступали на эти грабли в реальных проектах.