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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Перестановка бит в байте, получить зеркальное отображение
Qwertty
сообщение Nov 8 2008, 05:27
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Nov 8 2008, 00:39) *
на PIC можно за 12

Под "PIC" подразумевается 16-ая или 18-ая серии? Тогда интересно было бы взглянуть на реверс из трех инструкций... А для АВР можно и меньше 10 тактов если использовать таблицу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 8 2008, 07:10
Сообщение #17


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Qwertty @ Nov 8 2008, 08:27) *
А для АВР можно и меньше 10 тактов если использовать таблицу.

Угу.
Код
  movw SaveZ,zL
  ldi      zh,high(bit_rev_table << 1)
; и занимайтесь скока угодно
mov    zL,r0
lpm
;....................
movw zL,SaveZ
Go to the top of the page
 
+Quote Post
ae_
сообщение Nov 8 2008, 10:43
Сообщение #18


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(singlskv @ Nov 8 2008, 06:39) *
НЕ ВЕРЮ!
Покажите <13 на AVR...

на PIC можно за 12

12 тактов
Код
Reverse_1:; реверс бит в байте (R4 - вход/выход)

; обмен средних бит в тетрадах
mov R17,R4
andi R17,0b10011001
sub R4,R17
swap R4
or R4,R17
; выделение четных/нечетных бит
mov R17,R4
andi R17,0b10101010
sub R4,R17
; обмен четных/нечетных бит
out SREG,R4
ror R4
lsl R17
adc R4,R17

Порядок преобразования:
a b c d e f g h C
a f g d e b c h 0
a - g - e - c - 0
- f - d - b - h 0
h - f - d - b - -
- g - e - c - - a
h g f e d c b a 0

Единственный тонкий момент: обнуление I (запрет прерываний)
С разбегу обойти его мне не удалось без добавления 13-го такта.

©argus98 - все права защищены :))
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 8 2008, 20:22
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ae_ @ Nov 8 2008, 13:43) *
12 тактов
Код
Reverse_1:; реверс бит в байте (R4 - вход/выход)

; обмен средних бит в тетрадах
mov R17,R4
andi R17,0b10011001
sub R4,R17
swap R4
or R4,R17
; выделение четных/нечетных бит
mov R17,R4
andi R17,0b10101010
sub R4,R17
; обмен четных/нечетных бит
out SREG,R4
ror R4
lsl R17
adc R4,R17

Порядок преобразования:
a b c d e f g h C
a f g d e b c h 0
a - g - e - c - 0
- f - d - b - h 0
h - f - d - b - -
- g - e - c - - a
h g f e d c b a 0

Единственный тонкий момент: обнуление I (запрет прерываний)
С разбегу обойти его мне не удалось без добавления 13-го такта.

Ну это не до конца честный вариант,
Код
out SREG,R4
ror R4

нужно менять на
Код
    bst     R4,0
    lsr      R4
    bld     R4,7
а это уже 13 тактов...



Кстати говоря, тк тема снова всплыла, есть небольшая модификация 13тактового алгоритма
которая позволяет отказаться от использования бита T в SREG:
Код
; 13 words / 13 cycles
;                            ;tmp=  abcdefgh
    mov     tmp2, tmp        ;tmp2= abcdefgh
    asr     tmp              ;tmp=  aabcdefg C=h
    ror     tmp2             ;tmp2= habcdefg C=h
    rol     tmp              ;tmp=  abcdefgh C=a
    rol     tmp              ;tmp=  bcdefgha
    andi    tmp2, 0b10101010 ;tmp2= h0b0d0f0
    andi    tmp,  0b01010101 ;tmp=  0c0e0g0a
    add     tmp,  tmp2       ;tmp=  hcbedgfa
    mov     tmp2, tmp        ;tmp2= hcbedgfa
    andi    tmp2, 0b01100110 ;tmp2= 0cb00gf0
    swap    tmp2             ;tmp2= 0gf00cb0
    andi    tmp,  0b10011001 ;tmp=  h00ed00a
    add     tmp,  tmp2       ;tmp=  hgfedcba

но увы все равно 13... sad.gif


Цитата(Qwertty @ Nov 8 2008, 08:27) *
Под "PIC" подразумевается 16-ая или 18-ая серии? Тогда интересно было бы взглянуть на реверс из трех инструкций...

Увы, для PIC сейчас найти не могу, а писать заново не буду, Пики я только "со словарем", потаму
как редко...
Насколько я помню, пойдет даже на 10/12 серии...,
экономия 1 такта там из-за аккамуляторной модели, типа можно сделать сдвиг и получить
в результате 2 числа одно сдвинутое а второе исходное... как то так...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Nov 8 2008, 22:42
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Nov 8 2008, 23:22) *
Увы, для PIC сейчас найти не могу, а писать заново не буду, Пики я только "со словарем", потаму
как редко...
Насколько я помню, пойдет даже на 10/12 серии...,
экономия 1 такта там из-за аккамуляторной модели, типа можно сделать сдвиг и получить
в результате 2 числа одно сдвинутое а второе исходное... как то так...

Идет даже на 10/12 серии!!! Напряжение нарастает smile.gif За 12 тактов 10/12/16/18 серии выполняют ТРИ коротких инструкции или 1,5 длинных. Как в это упаковать реверс 8 бит я не понимаю.
Go to the top of the page
 
+Quote Post
ae_
сообщение Nov 9 2008, 00:47
Сообщение #21


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(Qwertty @ Nov 9 2008, 07:42) *
Идет даже на 10/12 серии!!! Напряжение нарастает :) За 12 тактов 10/12/16/18 серии выполняют ТРИ коротких инструкции или 1,5 длинных. Как в это упаковать реверс 8 бит я не понимаю.

Для PIC "такты" нужно заменить на "МЦ", для AVR тоже можно заменить, но т.к. для AVR они совпадают, то "такт" часто используется вместо "МЦ".

Сообщение отредактировал ae_ - Nov 9 2008, 00:50
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 9 2008, 08:24
Сообщение #22


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Qwertty @ Nov 9 2008, 01:42) *
Идет даже на 10/12 серии!!! Напряжение нарастает smile.gif За 12 тактов 10/12/16/18 серии выполняют ТРИ коротких инструкции или 1,5 длинных. Как в это упаковать реверс 8 бит я не понимаю.
Конечно я имел в виду "МЦ"... smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 11:10
Рейтинг@Mail.ru


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