реклама на сайте
подробности

 
 
> Операция с битами 3 бинарных чисел.
zheka
сообщение Dec 10 2009, 10:34
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Коллеги, подскажите наиболее рациональный в плане быстродействия способ решения задачи в CodeVision:
Есть такакя шняжка

const unsigned char LINE[] ={0b0000001,0b00000001,0b00000001};

А еще есть 0,1 и 2 линии порта A. Необходимо за 8 циклов передать содержимое LINE побитно - 0-й элемент в 0-ю линию, 1-й элемент в 1-ю линии, побитно - значит, за первый цикл, первый бит элементов массива и так далее..
Спасибо.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 25)
=GM=
сообщение Dec 10 2009, 10:49
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Ну, раз это константы, заведите другие 8 констант и выдавайте их в цикле, в чём проблема?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 10 2009, 11:04
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Это пока константы, потому как данные мне пока получать неоткуда.

мне бы для начала - как узнать значение определенного бита в переменной?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 10 2009, 11:04
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(zheka @ Dec 10 2009, 10:54) *
Это пока константы, потому как данные мне пока получать неоткуда

Тогда не надо писать const в постановке задачи.

Приведите ваше неоптимальное решение вашей задачи.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 10 2009, 12:23
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Ну хорошо, если с const вам непонятно, если так понятнее то:
unsigned char d1,d2,d3;

-----

d1=0b00000001;
d2=0b00000010;
d3=0b00000011;

СЛишком сложно для вас, тогда ответьте на вопрос - как вычислить значение определенног бита в числе, остальное я сам доделаю.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 10 2009, 12:33
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



byte=byte>>1;
bit=byte&0x01;


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 10 2009, 12:35
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zheka @ Dec 10 2009, 16:23) *
СЛишком сложно для вас, тогда ответьте на вопрос - как вычислить значение определенног бита в числе, остальное я сам доделаю.

Код
void bit_out(char b0,b1,b2)
{
char jj;
for(jj=0;jj<8;jj++)
{
   char tmp = 0;
   if(b0 & 1) tmp |= 0x01;
   if(b1 & 1) tmp |= 0x02;
   if(b2 & 1) tmp |= 0x04;
   PORTA = (PORTA & 0xf8) | tmp;
  b0 >>= 1;
  b1 >>= 1;
b2 >>= 1;
}
}

И не хами(те) тута - и так сплошная [censored] smile.gif
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 10 2009, 13:28
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Спасибо, что-то вроде этого я и ожидал увидеть. Хамить никому не собирался.

Сообщение отредактировал zheka - Dec 10 2009, 13:34
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 10 2009, 18:10
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



В общем ТЗ окончательно сформировалось и выглядит несколько по-иному.
Задача следующая:
имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать
есть число из 8 бит типа aaaaaaaa.
нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx

Сообщение отредактировал zheka - Dec 10 2009, 18:12
Go to the top of the page
 
+Quote Post
IJAR
сообщение Dec 10 2009, 19:31
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Цитата(zheka @ Dec 10 2009, 21:10) *
В общем ТЗ окончательно сформировалось и выглядит несколько по-иному.
Задача следующая:
имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать
есть число из 8 бит типа aaaaaaaa.
нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx


Попробую сформулировать конкренее:
Дано:
байт A=z7 y6 y5 y4 x3 x2 x1 x0
и бай B=a7 a6 a5 a4 a3 a2 a1 a0
где a, x, y, z могут принимать значения 0 или 1
(цифра справа от символа означает позицию бита в байте)

Требуется:
сформировать байт C следующего вида: C=Z7 a6 a5 a4 x3 x2 x1 x0

Вам это требуется?


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 10 2009, 19:58
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(IJAR @ Dec 10 2009, 23:31) *
Попробую сформулировать конкренее:
Дано:
байт A=z7 y6 y5 y4 x3 x2 x1 x0
и бай B=a7 a6 a5 a4 a3 a2 a1 a0
где a, x, y, z могут принимать значения 0 или 1
(цифра справа от символа означает позицию бита в байте)

Требуется:
сформировать байт C следующего вида: C=Z7 a6 a5 a4 x3 x2 x1 x0

Вам это требуется?

Что-то я не пойму. А что так не проходит?

c = (a & 0x8f)|(b & 0x70);
Go to the top of the page
 
+Quote Post
IJAR
сообщение Dec 10 2009, 20:07
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Цитата(SasaVitebsk @ Dec 10 2009, 22:58) *
Что-то я не пойму. А что так не проходит?

c = (a & 0x8f)|(b & 0x70);


Я сам тоже не могу понять, а может ему надо
C=z7 a2 a1 a0 x3 x2 x1 x0
или
C=z7 a0 a5 a2 x1 x0 x2 x3
......
вариантов то много......

Нам бы схемку аль чертеж -мы б затеяли вертеж,
Ну а так - ищи что хочешь
Черта лысого найдешь.


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 10 2009, 20:58
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Сделай то, не знаю что. Автору каждый день будут ТЗ менять, а он у нас тут переспрашивать? Сам то автор понимает, про что спрашивает?
Go to the top of the page
 
+Quote Post
des333
сообщение Dec 10 2009, 21:28
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(IJAR @ Dec 10 2009, 22:31) *
Попробую сформулировать конкренее:
Дано:
байт A=z7 y6 y5 y4 x3 x2 x1 x0
и бай B=a7 a6 a5 a4 a3 a2 a1 a0
где a, x, y, z могут принимать значения 0 или 1
(цифра справа от символа означает позицию бита в байте)

Требуется:
сформировать байт C следующего вида: C=Z7 a6 a5 a4 x3 x2 x1 x0

Вам это требуется?

Я думаю, раз автор просил взять младшие 3 бита, то нужно ему получить:

C=Z7 a2 a1 a0 x3 x2 x1 x0

Цитата(SasaVitebsk @ Dec 10 2009, 22:58) *
Что-то я не пойму. А что так не проходит?

c = (a & 0x8f)|(b & 0x70);



Учитывая вышесказанное, наверное, так:

Код
a = (a & 0x8f) | ( (b & 0x07) << 4);


Сообщение отредактировал des333 - Dec 10 2009, 21:32


--------------------
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 11 2009, 09:26
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



1. Автор прекрасно понимает чего хочет.
2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;

А посоветуйте где накопать информации и примеров по битовым хитростям. То есть я в принципе знаю что дают операции &| << >>, но вот практическое их применение типа - вычислить значение бита №n, расположить биты в обратном порядке, заменить биты там-то и там-то...

Сообщение отредактировал zheka - Dec 11 2009, 09:26
Go to the top of the page
 
+Quote Post
M_Andrey
сообщение Dec 11 2009, 10:06
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



{
union char_by_bit
{
struct
{
unsigned char D0 :1;
unsigned char D1 :1;
unsigned char D2 :1;
unsigned char D3 :1;
unsigned char D4 :1;
unsigned char D5 :1;
unsigned char D6 :1;
unsigned char D7 :1;
} bit;
unsigned char byte;
} a,b;

a.byte=data_in;
b.bit.D6=a.bit.D2;
b.bit.D5=a.bit.D1;
b.bit.D4=a.bit.D0;
data_out=b.byte;
}

вычислить значение бита №n:
x=a.bit.D5;

расположить биты в обратном порядке:
b.bit.D0=a.bit.D7; // и так далее

заменить биты там-то и там-то...:
b.bit.D4=1; // и так далее
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 11 2009, 10:16
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(zheka @ Dec 11 2009, 13:26) *
1. Автор прекрасно понимает чего хочет.
2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;

А посоветуйте где накопать информации и примеров по битовым хитростям. То есть я в принципе знаю что дают операции &| << >>, но вот практическое их применение типа - вычислить значение бита №n, расположить биты в обратном порядке, заменить биты там-то и там-то...


Ну раз вы все знаете... Массив LINE у вас вроде как const. Так кто мешает туда сразу записать сигнатуру, сдвинутую влево на 4 бита и не заниматься этим всякий раз.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 11 2009, 10:40
Сообщение #18


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(zheka @ Dec 11 2009, 09:26) *
2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;

Ну и где здесь у автора "передача за 8 циклов содержимого LINE побитно - 0-й элемент в 0-ю линию, 1-й элемент в 1-ю линии, побитно - значит, за первый цикл, ПЕРВЫЙ БИТ ЭЛЕМЕНТОВ МАССИВА и так далее..."?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 11 2009, 11:46
Сообщение #19


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
Ну и где здесь у автора "передача за 8 циклов содержимого


господи, а как же вы отсутствие #include и void main() не заметили, а?
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Dec 11 2009, 12:13
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(zheka @ Dec 10 2009, 21:10) *
В общем ТЗ окончательно сформировалось


Обязательно С? А то на асме это в несколько тактов делается...
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 11 2009, 12:44
Сообщение #21


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
Обязательно С? А то на асме это в несколько тактов делается...


был бы рад примеру

Сообщение отредактировал zheka - Dec 11 2009, 12:44
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Dec 11 2009, 14:26
Сообщение #22


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(zheka @ Dec 10 2009, 21:10) *
имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать
есть число из 8 бит типа aaaaaaaa.
нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx

на входе: r16 = 0yyyxxxx, r17 = aaaaaaaa
на выходе в r16 будет 0aaaxxxx, r17 попортится

Код
     andi   r16,0b00001111
     andi   r17,0b00000111
     swap   r17
     or     r16,r17
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 11 2009, 14:27
Сообщение #23


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zheka @ Dec 11 2009, 16:44) *
был бы рад примеру


PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;
эквивалентно, например
Код
; ZL:ZH содержит адрес LINE[]
; XL счетчик цикла
; XH YL рабочие переменные

do_Line:
    lpm    XH,Z+
    swap     XH
    andi    XH,0xF0
    in    YL,PORTA
    andi    YL,0x0F
    or     YL,XH
    out     PORTA,YL
    dec     XL
    brne   do_Line
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 11 2009, 14:33
Сообщение #24


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Спасибо, только я в асме полный ноль. Мне нужно асмовскую подпрограмму скрестить с Сишной, чтобы данные из сишного массива передавались в асм-подпрограмму.
Сейчас у меня программа выгляди так (const все-таки добавил, и количество элементов в нем не 8, а 16):
Код
#include <mega32.h>
#include <stdio.h>
#include <delay.h>

#define LEDS_PORT PORTA
#define LEDS_DDR DDRA
#define ALARM PORTA.0
#define CLK   PORTA.1
#define EN   PORTA.2
#define LAT   PORTA.3
#define DAT1   PORTA.6
#define DAT2   PORTA.5
#define DAT3   PORTA.4

const unsigned char LINE[]={0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF
,0x00};

void byte_out()  
{

//хочу перевести а asm все что в этой подпрограмме.
char jj;
for(jj=0;jj<16;jj++)
{
CLK=0;
  PORTA = (PORTA & 0xF) | (LINE[jj]<<4);    
CLK=1;  
}

CLK=0;
LAT=1;
LAT=0;
EN=0;
EN=1;  

}

void main()
{

LEDS_DDR=0xFF;
LEDS_PORT=0x00;

EN=1;    
LAT=0;

while (1==1) byte_out();




}


Как сделать, подскажите если не трудно.

Сообщение отредактировал zheka - Dec 11 2009, 14:42
Go to the top of the page
 
+Quote Post
Duhas
сообщение Dec 11 2009, 19:05
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



используя 10 регистров мона сдвигами сформировать байты для отправки в 2 прогона для первых 8 и вторых 8 байт строки...

что-то вроде
Код
ldi xl, low(line_addr)
ldi xh, high(line_addr)
ld r1, x+
ld r2, x+
ld r3, x+
ld r4, x+
ld r5, x+
ld r6, x+
ld r7, x+
ld r8,x

ldi count, 7
ldi xl, low(temp_place)
ldi xh, high(temp_place)
conv_loop:
rol r1
rol temp
rol r2
rol temp
....
rol r7
rol temp
rol r8
rol temp
st x+, temp
dec count
brcc conv_loop

и еще раз также для оставшихся 8 байт...
потом просто берем по адресу temp_place и отправляем в порт


вот что взбрело в голову XD
мб ужос ? )

Сообщение отредактировал Duhas - Dec 11 2009, 19:06
Go to the top of the page
 
+Quote Post
des333
сообщение Dec 12 2009, 11:10
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Автор (который все знает),

Вроде, в окончательно сформировавшемся ТЗ: 


Цитата(zheka @ Dec 10 2009, 21:10) *
В общем ТЗ окончательно сформировалось и выглядит несколько по-иному.
Задача следующая:
имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать
есть число из 8 бит типа aaaaaaaa.
нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx





уже ни слова нет про побитную передачу.

Что Вы спрашивали - то Вам и ответили.


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 05:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01614 секунд с 7
ELECTRONIX ©2004-2016