Работа с байтами

peit
Offline
Зарегистрирован: 07.10.2018

Наверное немного не корректно название темы.

Ситуация такая, нужно записать в масив некое значение, но, 6 и 7 байт должны оставатся всегда 11, а остальныже меняются в зависимости от состояния портов.

Порты я использовал С, там 5 выводов, настроены на вход, с подтяжкой PORTC = 0b00111111;

Теперь, я считываю состояние через регистр PINC, но значение я получаю 111111, что для мнея не корректно, мненужно все 7 байт.

Можно как то приписал в старшую часть две еденицы ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно. +B11000000.

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Можно. +B11000000.

Что то вроде PINC + B11000000 ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

ну можете 192 прибавить

b707
Онлайн
Зарегистрирован: 26.05.2017

peit пишет:

Что то вроде PINC + B11000000 ?

что непонятного? чтобы получить из 5 - 15, надо к 5 прибавить 10

тут ровно также.

peit
Offline
Зарегистрирован: 07.10.2018

Да, вы правы.
Всё решилось, большое спасибо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

peit, у меня сложилось впечатление, что Вы путаете биты и байты.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Можно. +B11000000.

 ну чтоб старшие 2 бита всегда были выставлены правильнее будет  <x> | b11000000

peit
Offline
Зарегистрирован: 07.10.2018

Что то задуманное не привело мнея к исполняемому))
Мне оказывается не все порты нужно читать, а только часть)

Для некой задачи, нужно мне все 7 бит, 0, 6 и 7 дожнны быть статичными и не менятся, т.е вот так 0b11xxxxx0, где х прочитаные данные с портов PC0...PC4.

Не знаю, правильно ли я сделал (можете сть более правильный путь), но по началу решил сделать так:

 pin = PINC & (1 << PC0);
 pin1 = PINC & (1 << PC1);
 
и т.д
Но потом возник вопрос, как мне их всех вставить в нужнэ биты, в место х ? 
peit
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

peit, у меня сложилось впечатление, что Вы путаете биты и байты.

Речь именно про биты...)

Я помню, что в одном байте, 8 бит)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е. нужно взять PINC, установить биты 6, 7 и сбросить бит 0?

peit
Offline
Зарегистрирован: 07.10.2018

кажется решил))))

Нужно было лучше вникнуть в операции над битами)

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Т.е. нужно взять PINC, установить биты 6, 7 и сбросить бит 0?

АГа, примернил & там где 0, всегда будет 0, 1 будет только там где 1 и 1))

сделал так: PINC & 0b11111110;

Получается, когда на PINC =1 то и результат 1, а на нулевом бите, всегда будет 0, какое бы значение не было на пине)

peit
Offline
Зарегистрирован: 07.10.2018

Не знаю, корректно так будет или нет... но вроде как работает)

sadman41
Offline
Зарегистрирован: 19.10.2016

Вполне корректно.

nik182
Offline
Зарегистрирован: 04.05.2015

Как же корректно? Если в порту верхние биты будут нулями, то в результате получите там нули. Правильно будет два действия: &  0xfe | 0хc0. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, сначала обсуждалось, как установить старшие биты, потом - как сбросить младший. Думаю, что ТС не стоит принимать за человека, который два действия не может последовательно совершить. А если и не совершит, то сделает правильные выводы. Читать-то умеет вроде справочные материалы.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну может, но видя:"сделал так: PINC & 0b11111110" что то начал сомневаться. 

peit
Offline
Зарегистрирован: 07.10.2018

nik182 пишет:

Как же корректно? Если в порту верхние биты будут нулями, то в результате получите там нули. Правильно будет два действия: &  0xfe | 0хc0. 

Вы правы.

Вник в ваше сообщение и наглядно увидел.

порт С имеет только 5 выводов, последние два бита 00 и нули я и получал в 6 и 7 битах.

Совместив И и ИЛИ дало точный результат.

sadman41
Offline
Зарегистрирован: 19.10.2016

Извините...

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Ну, сначала обсуждалось, как установить старшие биты, потом - как сбросить младший. Думаю, что ТС не стоит принимать за человека, который два действия не может последовательно совершить. А если и не совершит, то сделает правильные выводы. Читать-то умеет вроде справочные материалы.

Я конечно в программирование не силён, т.к начинаю изучать, а потом перерыв, по разным причинам... а когда нужно снова уже часть не помню...

Но голова варит)

Сейчас спецом пытаюсь код писать на С, т.к он и более быстр в исполнении и меньше место занимает.

peit
Offline
Зарегистрирован: 07.10.2018

В конечном итоге конструкцию сделал так: 0b11000000 + PINC & 0b11111110

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Правильнее было бы заменить + на |.

peit
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

Правильнее было бы заменить + на |.

Спасибо, так и сделал.

А можете объяснить, почему лучше ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

peit пишет:

andriano пишет:

Правильнее было бы заменить + на |.

Спасибо, так и сделал.

А можете объяснить, почему лучше ?

Подумайте, что будет, если в этих разрядах УЖЕ будут единицы.

Только не надо говорить, что их там быть не может: правильная программа - та, что корректно обрабатывает в том числе и неверные входные данные.

Это первое.

И второе: правильно написанную программу должно быть легко читать. Когда мы видим знак "|", ы знаем, что идет работа над битами, а когда знак "+", то - математическая операция. Когда в одной строке намешаны и арифметические и битовые операции, возникает путаница и ощущение хаоса.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Если эти пины НИКОГДА не будут меняться - не используй их, а подай на выход +5В.

nik182
Offline
Зарегистрирован: 04.05.2015

В 25 тиньке регистр 8 бит а ног только 6. Ну никак на верхние 2 бита +5 вольт не подать. 

peit
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

peit пишет:

andriano пишет:

Правильнее было бы заменить + на |.

Спасибо, так и сделал.

А можете объяснить, почему лучше ?

Подумайте, что будет, если в этих разрядах УЖЕ будут единицы.

Только не надо говорить, что их там быть не может: правильная программа - та, что корректно обрабатывает в том числе и неверные входные данные.

Это первое.

И второе: правильно написанную программу должно быть легко читать. Когда мы видим знак "|", ы знаем, что идет работа над битами, а когда знак "+", то - математическая операция. Когда в одной строке намешаны и арифметические и битовые операции, возникает путаница и ощущение хаоса.

Спасибо за ценные советы.