|
Операция с битами 3 бинарных чисел. |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 25)
|
Dec 10 2009, 19:31
|

Местный
  
Группа: Свой
Сообщений: 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 Вам это требуется?
--------------------
Вяжешь - вой, а поедешь - песни пой. Между "хочу" и "можно" всегда есть дистанция
|
|
|
|
|
Dec 10 2009, 20:07
|

Местный
  
Группа: Свой
Сообщений: 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 ...... вариантов то много...... Нам бы схемку аль чертеж -мы б затеяли вертеж, Ну а так - ищи что хочешь Черта лысого найдешь.
--------------------
Вяжешь - вой, а поедешь - песни пой. Между "хочу" и "можно" всегда есть дистанция
|
|
|
|
|
Dec 10 2009, 21:28
|
Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
Dec 11 2009, 12:13
|

Участник

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

|
Цитата(zheka @ Dec 10 2009, 21:10)  В общем ТЗ окончательно сформировалось Обязательно С? А то на асме это в несколько тактов делается...
|
|
|
|
|
Dec 11 2009, 14:26
|

Участник

Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 11 2009, 14:27
|
;
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 11 2009, 14:33
|
Гуру
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 11 2009, 19:05
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 12 2009, 11:10
|
Профессионал
    
Группа: Свой
Сообщений: 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 уже ни слова нет про побитную передачу. Что Вы спрашивали - то Вам и ответили.
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|