Коллеги, подскажите наиболее рациональный в плане быстродействия способ решения задачи в CodeVision:
Есть такакя шняжка
const unsigned char LINE[] ={0b0000001,0b00000001,0b00000001};
А еще есть 0,1 и 2 линии порта A. Необходимо за 8 циклов передать содержимое LINE побитно - 0-й элемент в 0-ю линию, 1-й элемент в 1-ю линии, побитно - значит, за первый цикл, первый бит элементов массива и так далее..
Спасибо.
Ну, раз это константы, заведите другие 8 констант и выдавайте их в цикле, в чём проблема?
Это пока константы, потому как данные мне пока получать неоткуда.
мне бы для начала - как узнать значение определенного бита в переменной?
Цитата(zheka @ Dec 10 2009, 10:54)

Это пока константы, потому как данные мне пока получать неоткуда
Тогда не надо писать const в постановке задачи.
Приведите ваше неоптимальное решение вашей задачи.
Ну хорошо, если с const вам непонятно, если так понятнее то:
unsigned char d1,d2,d3;
-----
d1=0b00000001;
d2=0b00000010;
d3=0b00000011;
СЛишком сложно для вас, тогда ответьте на вопрос - как вычислить значение определенног бита в числе, остальное я сам доделаю.
byte=byte>>1;
bit=byte&0x01;
_Pasha
Dec 10 2009, 12:35
Цитата(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]
Спасибо, что-то вроде этого я и ожидал увидеть. Хамить никому не собирался.
В общем ТЗ окончательно сформировалось и выглядит несколько по-иному.
Задача следующая:
имеется 7 бит: yyyxxxx , из которых 3мя (yyy )нужно управлять, а 4 (xxxx) не трогать
есть число из 8 бит типа aaaaaaaa.
нужно взять 3 младшие бита и поместить их на место yyy, при этом не тронув биты xxxx. Чтоы получилось в итоге aaaxxxx
Цитата(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
Вам это требуется?
SasaVitebsk
Dec 10 2009, 19:58
Цитата(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);
Цитата(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
......
вариантов то много......
Нам бы схемку аль чертеж -мы б затеяли вертеж,
Ну а так - ищи что хочешь
Черта лысого найдешь.
sergeeff
Dec 10 2009, 20:58
Сделай то, не знаю что. Автору каждый день будут ТЗ менять, а он у нас тут переспрашивать? Сам то автор понимает, про что спрашивает?
des333
Dec 10 2009, 21:28
Цитата(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);
1. Автор прекрасно понимает чего хочет.
2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;
А посоветуйте где накопать информации и примеров по битовым хитростям. То есть я в принципе знаю что дают операции &| << >>, но вот практическое их применение типа - вычислить значение бита №n, расположить биты в обратном порядке, заменить биты там-то и там-то...
M_Andrey
Dec 11 2009, 10:06
{
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; // и так далее
sergeeff
Dec 11 2009, 10:16
Цитата(zheka @ Dec 11 2009, 13:26)

1. Автор прекрасно понимает чего хочет.
2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;
А посоветуйте где накопать информации и примеров по битовым хитростям. То есть я в принципе знаю что дают операции &| << >>, но вот практическое их применение типа - вычислить значение бита №n, расположить биты в обратном порядке, заменить биты там-то и там-то...
Ну раз вы все знаете... Массив LINE у вас вроде как const. Так кто мешает туда сразу записать сигнатуру, сдвинутую влево на 4 бита и не заниматься этим всякий раз.
Цитата(zheka @ Dec 11 2009, 09:26)

2. У автора получилось вот так PORTA = (PORTA & 0xF) | (LINE[jj]<<4) ;
Ну и где здесь у автора "передача за 8 циклов содержимого LINE побитно - 0-й элемент в 0-ю линию, 1-й элемент в 1-ю линии, побитно - значит, за первый цикл, ПЕРВЫЙ БИТ ЭЛЕМЕНТОВ МАССИВА и так далее..."?
Цитата
Ну и где здесь у автора "передача за 8 циклов содержимого
господи, а как же вы отсутствие #include и void main() не заметили, а?
Vlad219i
Dec 11 2009, 12:13
Цитата(zheka @ Dec 10 2009, 21:10)

В общем ТЗ окончательно сформировалось
Обязательно С? А то на асме это в несколько тактов делается...
Цитата
Обязательно С? А то на асме это в несколько тактов делается...
был бы рад примеру
Vlad219i
Dec 11 2009, 14:26
Цитата(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
_Pasha
Dec 11 2009, 14:27
Цитата(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
Спасибо, только я в асме полный ноль. Мне нужно асмовскую подпрограмму скрестить с Сишной, чтобы данные из сишного массива передавались в асм-подпрограмму.
Сейчас у меня программа выгляди так (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();
}
Как сделать, подскажите если не трудно.
используя 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
мб ужос ? )
des333
Dec 12 2009, 11:10
Автор (который все знает),Вроде, в окончательно сформировавшемся ТЗ:
Цитата(zheka @ Dec 10 2009, 21:10)

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