Помощник
|
Смещение битов, не затрагивая остальные. |
ZhukV
|
Сообщение
#1
|
||
|
|
||
|
|||
Arks |
27.7.2012, 0:31;
Ответить: Arks
Сообщение
#2
|
|
а что получить хотите из 0b00000001, не понял просто. 0b00100001 ?
Надо XOR'ить тогда с нужной битовой маской 0b00000001 ^ 0b00100000 = 0b00100001 - изменение бита на противоположный который прочие биты не затронет. Смещение именно смещает биты, они затронут все число а не нужный по счету, оно тут не подойдет. Или вам надо не на противополжный а именно тот который в определенной позиции исходного? Короче я не понял. |
|
|
ZhukV
|
Сообщение
#3
|
|
Если более детально:
Есть контролер ATMega8515. Использую порт С для передачи данных, но только первых 4 бита порта - PORTC[0-3]. Вторые же 4 бита при этом выделены как статустные, с которых можно прочитать статус текущей операции в контролере. Так вот, нужно полностью сместить первых 4 бита (НЕ ОДИН РАЗ!) не затрагивая вторых 4. Предположим, что сейчас PORTC = 0b10100001 Первых 4 бита: 0001 Вторых 4 бита: 1010 Мне нужно сместить несколько раз весь порт (PORTC = PORTC << 0b1), но при этом не затронуть вторых 4 бита, тоесть нужно смещать только первых 4 бита. Битовые маски не подойдут, так как количество смещений тоже первоначально не известно, а передается не контроллер другими портами. Вот, припустим, на выходе, при нескольких смещений я должен получить: 0b10101000 |
|
|
alexdrob |
27.7.2012, 10:28;
Ответить: alexdrob
Сообщение
#4
|
|
(PORTC = PORTC << 0b1) это не смещение бита, это смещение всех битов на 1 влево.
Алгоритм не продумывал, что бы на порте не на один такт процессора не включить не нужные ножки, думаю что то типа такого кода tmp = PORTC & 0x0f; tmp <<= 1; if (tmp & 0x10) tmp |= 0x01; PORTC = (PORTC & 0xff) | tmp; а можно просто докупить микросхему 4 битвый сдвиговый регистр, и сдвигать, она сама первый бит будет перекидывать |
|
|
ZhukV
|
Сообщение
#5
|
|
Не помогло..
Все 5 битов (пинов), даже не 4! были с логической еденицой ( alexdrob, а на ПХП есть работа с бинарными данными (кроме pack-а)? С 16-ой системой точно есть (0xFF ....) Пробывал: [PHP]$t = 0b10101010[/PHP] материться, тип нету константы ))) Ну ет понятно. Мог бы на ПХП все протестить, а то с перезаливкой прошивки долго играться, да и дебагов как бы нету ((( |
|
|
ZhukV
|
Сообщение
#6
|
|
а можно просто докупить микросхему 4 битвый сдвиговый регистр, и сдвигать, она сама первый бит будет перекидывать Да вот как раз и беда в том, что сайты надоело писать, хочется чего то нового. Вот и решил: контроллеры ) Покупать нету смысла, так как в любом случае должен быть выход! |
|
|
alexdrob |
27.7.2012, 23:23;
Ответить: alexdrob
Сообщение
#7
|
|
Так регистр стоит рублей 10 в розницу :)
Я сам в январе изучал AVR :) на 8515 у меня спидометр электорнный для авто сделан :) PORTC = (PORTC & 0xff) | tmp; тут кстати опечатка[PHP]PORTC = (PORTC & 0xf0) | (tmp & 0x0f);[/PHP]надо, тебе надо только 4 бита старших брать от порта ц ща освобожусь набросаю на пхп код |
|
|
alexdrob |
27.7.2012, 23:43;
Ответить: alexdrob
Сообщение
#8
|
|
|
[PHP]<?php
$PORTC = 0xAA; function l4b(&$PORTC) { $tmp = $PORTC & 0x0f; $tmp <<= 1; if ($tmp & 0x10) $tmp |= 0x01; $PORTC = ($PORTC & 0xf0) | ($tmp & 0x0f); } printf('<p>%b', $PORTC); l4b($PORTC); printf('<p>%b', $PORTC); l4b($PORTC); printf('<p>%b', $PORTC); [/PHP]
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Размещаю казино, покер, адалт, политику и остальные тематики | 18 | Trueman | 11097 | 29.7.2019, 22:18 автор: whatIF |
|
Смещение меню в лево в браузерах Сафари и Хром | 0 | SL-project | 7619 | 5.10.2011, 11:16 автор: -SL-project- |
Текстовая версия | Сейчас: 28.3.2024, 18:20 |