Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 23.08.2012, 12:24   #1
X_Max
Senior Member
 
Аватар для X_Max
 
Регистрация: 07.12.2007
Адрес: N54°31' E36°15'
Возраст: 43
Сообщений: 557
Вес репутации: 464/54
X_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of light
Отправить сообщение для X_Max с помощью ICQ
По умолчанию как повернуть массив в таблице на 90 гр.

Вот задача возникла, не придумаю как малой кровью да побыстрей её реализовать...
А суть в следующем, поступило в контроллер 8 байт, положили их в буфер какой-нить, и надо эти 8 байт как-бы набок положить. Т.е. все старшие биты этого массива становятся 1-м байтом, ...... , все младшие биты этого массива становятся 8-м байтом (ну или наоборот). Дальше не важно, можно на том же месте этот массив оставить, можно в другое место положить, тут главное чтоб побыстрее. Пробовал в лоб решать через 'btfsc ...', но чтоб все 64 бита обработать - слишком много машинных циклов требуется, боюсь на остальное времени не останется. Может есть какие хитрости для решения подобных задач?
П.С. камень PIC18F2520 и ассемблер.
__________________
конденсатор оказал сопротивление

Последний раз редактировалось X_Max; 23.08.2012 в 12:26. Причина: ... арфаграфейя
X_Max вне форума   Ответить с цитированием
Старый 23.08.2012, 12:51   #2
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,754
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
Вот задача возникла, не придумаю как малой кровью да побыстрей её реализовать...
А суть в следующем, поступило в контроллер 8 байт, положили их в буфер какой-нить, и надо эти 8 байт как-бы набок положить. Т.е. все старшие биты этого массива становятся 1-м байтом, ...... , все младшие биты этого массива становятся 8-м байтом (ну или наоборот). Дальше не важно, можно на том же месте этот массив оставить, можно в другое место положить, тут главное чтоб побыстрее. Пробовал в лоб решать через 'btfsc ...', но чтоб все 64 бита обработать - слишком много машинных циклов требуется, боюсь на остальное времени не останется. Может есть какие хитрости для решения подобных задач?
П.С. камень PIC18F2520 и ассемблер.
Подобные вещи решаются аппаратно, например в МК R32C есть специальный модуль. Но в PIC-ах такого, вроде, нет.
Миниатюры
X-Y Conversion.PNG  
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 23.08.2012, 13:09   #3
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,132
Вес репутации: 4577/130
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
Вот задача возникла, не придумаю как малой кровью да побыстрей её реализовать...
А суть в следующем, поступило в контроллер 8 байт, положили их в буфер какой-нить, и надо эти 8 байт как-бы набок положить. Т.е. все старшие биты этого массива становятся 1-м байтом, ...... , все младшие биты этого массива становятся 8-м байтом (ну или наоборот). Дальше не важно, можно на том же месте этот массив оставить, можно в другое место положить, тут главное чтоб побыстрее. Пробовал в лоб решать через 'btfsc ...', но чтоб все 64 бита обработать - слишком много машинных циклов требуется, боюсь на остальное времени не останется. Может есть какие хитрости для решения подобных задач?
П.С. камень PIC18F2520 и ассемблер.
а куда ты торопишься? может есть смысл взять проц другой
__________________

Vanizma вне форума   Ответить с цитированием
Старый 23.08.2012, 13:27   #4
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,503
Вес репутации: 2750/85
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
Вот задача возникла, не придумаю как малой кровью да побыстрей её реализовать...
А суть в следующем, поступило в контроллер 8 байт, положили их в буфер какой-нить, и надо эти 8 байт как-бы набок положить. Т.е. все старшие биты этого массива становятся 1-м байтом, ...... , все младшие биты этого массива становятся 8-м байтом (ну или наоборот). Дальше не важно, можно на том же месте этот массив оставить, можно в другое место положить, тут главное чтоб побыстрее. Пробовал в лоб решать через 'btfsc ...', но чтоб все 64 бита обработать - слишком много машинных циклов требуется, боюсь на остальное времени не останется. Может есть какие хитрости для решения подобных задач?
П.С. камень PIC18F2520 и ассемблер.
Это сдвигом надо делать в цикле...
Код:
...
rlf _0,f
rlf INDF,f
...
rlf _7,f
rlf INDF,f
incf FSR,f
...
зы хотя что в лоб что полбу, меньше 128 циклов в любом случае не будет

Последний раз редактировалось pal1222@yandex.ru; 23.08.2012 в 13:34. Причина: зы
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 23.08.2012, 13:30   #5
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 46
Сообщений: 507
Вес репутации: 1159/64
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
Вот задача возникла, не придумаю как малой кровью да побыстрей её реализовать...
А суть в следующем, поступило в контроллер 8 байт, положили их в буфер какой-нить, и надо эти 8 байт как-бы набок положить. Т.е. все старшие биты этого массива становятся 1-м байтом, ...... , все младшие биты этого массива становятся 8-м байтом (ну или наоборот). Дальше не важно, можно на том же месте этот массив оставить, можно в другое место положить, тут главное чтоб побыстрее. Пробовал в лоб решать через 'btfsc ...', но чтоб все 64 бита обработать - слишком много машинных циклов требуется, боюсь на остальное времени не останется. Может есть какие хитрости для решения подобных задач?
П.С. камень PIC18F2520 и ассемблер.
Табличная перестановка.
Код:
char xinv[256]={255,254,253...,1,0};
операция инверсии числа x:
Код:
x = xinv[x];
bzx вне форума   Ответить с цитированием
Старый 23.08.2012, 13:32   #6
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,942
Вес репутации: 5817/175
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от pal1222@yandex.ru Посмотреть сообщение
Это сдвигом надо делать в цикле...
Код:
...
rlf _0,f
rlf INDF,f
...
rlf _7,f
rlf INDF,f
incf FSR,f
...
цикл сэкономит размер, но не время, всё равно по факту придётся перещупать каждый бит.
Единственное что можно посоветовать - не переформатировать этот массив, а обращаться к элементам по-другому.
Greg вне форума   Ответить с цитированием
Старый 23.08.2012, 13:48   #7
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,503
Вес репутации: 2750/85
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от Greg Посмотреть сообщение
цикл сэкономит размер, но не время, всё равно по факту придётся перещупать каждый бит.
Единственное что можно посоветовать - не переформатировать этот массив, а обращаться к элементам по-другому.
Наверное... таблица-то получается большая, а выигрыш не принципиальный (не 2 раза)
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 23.08.2012, 14:25   #8
quarry
Senior Member
 
Аватар для quarry
 
Регистрация: 28.03.2007
Адрес: РБ Минск
Сообщений: 237
Вес репутации: 234/52
quarry has a spectacular aura aboutquarry has a spectacular aura aboutquarry has a spectacular aura about
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Код:
unsigned char    Buf1[1][8];
unsigned char    Buf2[8][1];

memcpy (&Buf2[0][0], &Buf1[0][0], sizeof (Buf1));
quarry вне форума   Ответить с цитированием
Старый 23.08.2012, 14:39   #9
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,754
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от quarry Посмотреть сообщение
Код:
unsigned char    Buf1[1][8];
unsigned char    Buf2[8][1];

memcpy (&Buf2[0][0], &Buf1[0][0], sizeof (Buf1));
Это разве Ассемблер?

Цитата:
Сообщение от X_Max Посмотреть сообщение
П.С. камень PIC18F2520 и ассемблер.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 23.08.2012, 14:40   #10
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,132
Вес репутации: 4577/130
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от quarry Посмотреть сообщение
Код:
unsigned char    Buf1[1][8];
unsigned char    Buf2[8][1];

memcpy (&Buf2[0][0], &Buf1[0][0], sizeof (Buf1));
это байты перекинет, а нужно из битов 8 байт собрать новые 8 байт
__________________

Vanizma вне форума   Ответить с цитированием
Старый 23.08.2012, 14:43   #11
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,503
Вес репутации: 2750/85
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от Vanizma Посмотреть сообщение
это байты перекинет, а нужно из битов 8 байт собрать новые 8 байт
причём, в том же порядке перекинет
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 23.08.2012, 14:44   #12
X_Max
Senior Member
 
Аватар для X_Max
 
Регистрация: 07.12.2007
Адрес: N54°31' E36°15'
Возраст: 43
Сообщений: 557
Вес репутации: 464/54
X_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of light
Отправить сообщение для X_Max с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от quarry Посмотреть сообщение
Код:
unsigned char    Buf1[1][8];
unsigned char    Buf2[8][1];

memcpy (&Buf2[0][0], &Buf1[0][0], sizeof (Buf1));
я как-то больше к ассемблеру привык (только без холливара!)

я тут прикинул, по алгоритму программы и выходит, что мне нужно уложиться в 400 машинных циклов (за вычетом обработки сохранения контекста). т.е. должно уложиться, на крайняк буду каждый принятый байт по битам раскладывать, а не блок из восьми, это то точно влезит, хотя не хотелось бы. так что щупаем каждый бит по очереди...
__________________
конденсатор оказал сопротивление
X_Max вне форума   Ответить с цитированием
Старый 23.08.2012, 14:58   #13
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,132
Вес репутации: 4577/130
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
я как-то больше к ассемблеру привык (только без холливара!)

я тут прикинул, по алгоритму программы и выходит, что мне нужно уложиться в 400 машинных циклов (за вычетом обработки сохранения контекста). т.е. должно уложиться, на крайняк буду каждый принятый байт по битам раскладывать, а не блок из восьми, это то точно влезит, хотя не хотелось бы. так что щупаем каждый бит по очереди...
посчитай по алгоритму, на асме может влезешь
B7=(A7&0x80) | ((A6>>1)&0x40)...|((A0>>7)&0x1)
B6=((A7<<1)&0x80) | (A6&0x40)...|((A0>>6)&0x1)
...

вроде так
__________________

Vanizma вне форума   Ответить с цитированием
Старый 23.08.2012, 15:24   #14
quarry
Senior Member
 
Аватар для quarry
 
Регистрация: 28.03.2007
Адрес: РБ Минск
Сообщений: 237
Вес репутации: 234/52
quarry has a spectacular aura aboutquarry has a spectacular aura aboutquarry has a spectacular aura about
По умолчанию Re: как повернуть массив в таблице на 90 гр.

ну если биты и асм, то тогда тока через таблицу
тут ужо предлагали
quarry вне форума   Ответить с цитированием
Старый 23.08.2012, 16:13   #15
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/126
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от X_Max Посмотреть сообщение
я тут прикинул, по алгоритму программы и выходит, что мне нужно уложиться в 400 машинных циклов (за вычетом обработки сохранения контекста). т.е. должно уложиться, на крайняк буду каждый принятый байт по битам раскладывать, а не блок из восьми, это то точно влезит, хотя не хотелось бы. так что щупаем каждый бит по очереди...
Ну, за 400 циклов с сохранением контекста и в цикл можно уложиться (postinc'ами повыкручиваться - выходит около 290 циклов). Прямыми бтфсс'ами - 128 циклов. Если нужно еще быстрее, то может рассмотреть переворот по мере поступления данных? Я так понимаю, за одно прерывание принимается 1 байт, так может его сразу же 16ю циклами и расфасовывать в нужный буфер?
tester вне форума   Ответить с цитированием
Старый 23.08.2012, 23:54   #16
X_Max
Senior Member
 
Аватар для X_Max
 
Регистрация: 07.12.2007
Адрес: N54°31' E36°15'
Возраст: 43
Сообщений: 557
Вес репутации: 464/54
X_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of light
Отправить сообщение для X_Max с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Действительно, побайтно компактнее получается и несоизмеримо быстрее. Просто в памяти ещё пару байт выделить для сохранения точки останова.
__________________
конденсатор оказал сопротивление
X_Max вне форума   Ответить с цитированием
Старый 24.08.2012, 01:18   #17
fol
Senior Member
 
Аватар для fol
 
Регистрация: 04.05.2007
Возраст: 44
Сообщений: 270
Вес репутации: 264/52
fol is a jewel in the roughfol is a jewel in the roughfol is a jewel in the rough
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Если нет времени на обработку, то: по мере поступления данных сразу формировать из них два массива, прямой и кривой.

... это вроде то-же что и "tester" предлагал

"или нет" (C)
__________________
...с особым цинизмом надругался над общественным мнением
fol вне форума   Ответить с цитированием
Старый 24.08.2012, 19:59   #18
X_Max
Senior Member
 
Аватар для X_Max
 
Регистрация: 07.12.2007
Адрес: N54°31' E36°15'
Возраст: 43
Сообщений: 557
Вес репутации: 464/54
X_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of lightX_Max is a glorious beacon of light
Отправить сообщение для X_Max с помощью ICQ
По умолчанию Re: как повернуть массив в таблице на 90 гр.

Цитата:
Сообщение от fol Посмотреть сообщение
Если нет времени на обработку...
Не, время есть ,оказалось эффективнее обрабатывать побайтно, а не блоками по 8 байт. Так что проблема решена.
__________________
конденсатор оказал сопротивление
X_Max вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Электропривод NSS Источники питания и силовая электроника 32 29.01.2012 14:17
Указатели на массив как параметры функции gontharov Продукция MICROCHIP 9 18.05.2010 17:55
PIC16F84a stepka Вопросы начинающих 56 24.03.2010 18:30
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
как в си хайтековском объявить массив и сказать чтобы он лежал на границе килобайта? Sergey Продукция MICROCHIP 1 22.05.2007 17:22


Часовой пояс GMT +3, время: 23:19.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot