X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Смещение битов, не затрагивая остальные.
ZhukV
ZhukV
Topic Starter сообщение 26.7.2012, 16:27; Ответить: ZhukV
Сообщение #1


Доброго времени суток всем.

Есть вопрос, как то не могу сам решить.

Есть 8 бит: 0b00000001;

Мну нужно первый бит сместить влево, до 4 бита, потом он сам установиться на начало, но при этом, нельзя затрагивать вторых 4 бита.

Пример:
PORTC = 0b00100001;
PORTC = PORTC << 0b1;

Но при этом, вторых 4 бита, также имеют смещение.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 27.7.2012, 0:31; Ответить: Arks
Сообщение #2


а что получить хотите из 0b00000001, не понял просто. 0b00100001 ?
Надо XOR'ить тогда с нужной битовой маской 0b00000001 ^ 0b00100000 = 0b00100001 - изменение бита на противоположный который прочие биты не затронет. Смещение именно смещает биты, они затронут все число а не нужный по счету, оно тут не подойдет. Или вам надо не на противополжный а именно тот который в определенной позиции исходного? Короче я не понял.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 27.7.2012, 9:32; Ответить: ZhukV
Сообщение #3


Если более детально:

Есть контролер ATMega8515. Использую порт С для передачи данных, но только первых 4 бита порта - PORTC[0-3]. Вторые же 4 бита при этом выделены как статустные, с которых можно прочитать статус текущей операции в контролере. Так вот, нужно полностью сместить первых 4 бита (НЕ ОДИН РАЗ!) не затрагивая вторых 4.

Предположим, что сейчас PORTC = 0b10100001
Первых 4 бита: 0001
Вторых 4 бита: 1010

Мне нужно сместить несколько раз весь порт (PORTC = PORTC << 0b1), но при этом не затронуть вторых 4 бита, тоесть нужно смещать только первых 4 бита. Битовые маски не подойдут, так как количество смещений тоже первоначально не известно, а передается не контроллер другими портами.

Вот, припустим, на выходе, при нескольких смещений я должен получить: 0b10101000
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
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
ZhukV
Topic Starter сообщение 27.7.2012, 23:06; Ответить: ZhukV
Сообщение #5


Не помогло..
Все 5 битов (пинов), даже не 4! были с логической еденицой (


alexdrob, а на ПХП есть работа с бинарными данными (кроме pack-а)?
С 16-ой системой точно есть (0xFF ....)
Пробывал:
[PHP]$t = 0b10101010[/PHP]
материться, тип нету константы ))) Ну ет понятно.

Мог бы на ПХП все протестить, а то с перезаливкой прошивки долго играться, да и дебагов как бы нету (((
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 27.7.2012, 23:10; Ответить: ZhukV
Сообщение #6


(alexdrob @ 27.7.2012, 13:28) *
а можно просто докупить микросхему 4 битвый сдвиговый регистр, и сдвигать, она сама первый бит будет перекидывать

Да вот как раз и беда в том, что сайты надоело писать, хочется чего то нового. Вот и решил: контроллеры )

Покупать нету смысла, так как в любом случае должен быть выход!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 27.7.2012, 23:23; Ответить: alexdrob
Сообщение #7


Так регистр стоит рублей 10 в розницу :)
Я сам в январе изучал AVR :) на 8515 у меня спидометр электорнный для авто сделан :)


PORTC = (PORTC & 0xff) | tmp;
тут кстати опечатка
[PHP]PORTC = (PORTC & 0xf0) | (tmp & 0x0f);[/PHP]надо, тебе надо только 4 бита старших брать от порта ц

ща освобожусь набросаю на пхп код
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
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]

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Размещаю казино, покер, адалт, политику и остальные тематики
18 Trueman 11097 29.7.2019, 22:18
автор: whatIF
Открытая тема (нет новых ответов) Смещение меню в лево в браузерах Сафари и Хром
0 SL-project 7619 5.10.2011, 11:16
автор: -SL-project-


 



RSS Текстовая версия Сейчас: 28.3.2024, 18:20
Дизайн