|
Операция с битами 3 бинарных чисел. |
|
|
|
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
|
|
|