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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Операция с битами 3 бинарных чисел.
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 Текстовая версия Сейчас: 28th July 2025 - 04:13
Рейтинг@Mail.ru


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