Страница 2 из 2

Re: Перевод числа в массив бит

Добавлено: Чт ноя 28, 2013 09:44:32
ploop
отсутствуют операторы if и else, что увеличивет скорость передачи.
Вы уверены? Ассемблерный листинг сравнивали? :)
PORTB.B0 = t.B7 как работает?

А ято я могу вообще макрос из 1 буквы придумать, будет ещё короче :)

Re: Перевод числа в массив бит

Добавлено: Чт ноя 28, 2013 22:11:31
alex_
отсутствуют операторы if и else, что увеличивет скорость передачи.
Вы уверены? Ассемблерный листинг сравнивали? :)
В асемблере переходы безусловно будут, но речь немного о другом, в алгаритмах представленных выше эти операторы присутствуют а в моём случае их нет. Это упрощает код и уменьшает его размеры :)
PORTB.B0 = t.B7 как работает?
Работает элементарно: PORTB.B0 это пин контроллера, работаем с ним как с обычным битом =1 или 0. Переменная t имеет размер 8 бит. При передача начинается со старшего бита, PORTB.B0 = t.B7. Дальше идёт операция сдвига, все биты сдвигаются в "большую" сторону: тот что был t.B6 теперь является t.B7.
Короче, смысл в том чтобы на прямую присваивать знавения t в порт не производя сравнения:
PORTB.B0 = t.B7
PORTB.B0 = t.B6
...
PORTB.B0 = t.B0
А ято я могу вообще макрос из 1 буквы придумать, будет ещё короче :)
Я буду только рад если кому нибудь удастся ещё упростить код, при условии что он останется работоспособным :)

Re: Перевод числа в массив бит

Добавлено: Пт ноя 29, 2013 07:54:59
КРАМ
alex_ писал(а):
PORTB.B0 = t.B7 как работает?
Работает элементарно: PORTB.B0 это пин контроллера, работаем с ним как с обычным битом =1 или 0. Переменная t имеет размер 8 бит. При передача начинается со старшего бита, PORTB.B0 = t.B7. Дальше идёт операция сдвига, все биты сдвигаются в "большую" сторону: тот что был t.B6 теперь является t.B7.
Короче, смысл в том чтобы на прямую присваивать знавения t в порт не производя сравнения:
PORTB.B0 = t.B7
PORTB.B0 = t.B6
...
PORTB.B0 = t.B0
Похоже Вы вообще не понимаете архитектуру контроллера.... :facepalm:
Практически все контроллеры НЕ АДРЕСУЮТ ОТДЕЛЬНЫЕ БИТЫ.
Можно производить сдвиг и в выходной защелке порта, это сэкономит код, однако что Вы будете делать С ОСТАЛЬНЫМИ ПИНАМИ этого порта?
Они то же будут сдвигаться.
Поэтому на самом деле побитный вывод ВСЕГДА имеет операцию условного перехода.
Мало того, из-за отсутствия в Си операции сдвига через перенос приходится искуственно "подталкивать" компилятор к минимальному коду вида:
(намеренно не привожу конкретный ассемблер)
1. Сдвиг переменной через перенос.
2. Пропуск, если перенос.
3. Вывод 0 в пин.
4. Пропуск, если нет переноса.
5. Вывод 1 в пин.
Строки со 2 по 5 - это и есть if-else

Re: Перевод числа в массив бит

Добавлено: Пт ноя 29, 2013 08:01:07
ploop
Работает элементарно:
Я не только понимаю, что эта запись обозначает, но так же знаю, как она работает :)
Фишка в том, что этот кусок кода можно будет собрать только под одним единственным компилятором. Напрочь убивается переносимость из-за экономии пары строк текста, а выигрыша ни в скорости, ни в занимаемой памяти не будет.

Re: Перевод числа в массив бит

Добавлено: Сб ноя 30, 2013 02:36:14
Fallk
Или на асме
СпойлерSPI_REG EQU 040h ; Используется в SPI передаче
SPI_MAN EQU 041h
BYTE EQU 042h ; Используется в SPI передаче



;======
; Пины контроллера
;======
#define SCLK PORTB,1
#define D_OUT PORTB,0



;======
; Подпрограммы для передачи
; по интерфейсу SPI програмный
;======

SPI_MAN MOVWF SPI_REG ; число во временный регистр
;======
; Колличество бит в передааемом байте
;======
MOVLW .8
MOVWF BYTE
;======
; Выставляю выход данных в нужное состояние
; в зависимости от текущего передаваемого
; бита
;======

Spi_L.1 BTFSC SPI_REG,7
GOTO $+3
BCF D_OUT
GOTO $+2
BSF D_OUT ;
BCF STATUS,0 ; Очистка бита CARRY
RLF SPI_REG,1 ; Сдвиг числа влево

;======
; Включаю синхроимпульс
;======
BSF SCLK ; Включение синхроимпульса (SCLK=1)
NOP

;======
; Выключаю синхроимпульс
;======
BCF SCLK ; Выключение синхроимпульса (SCLK=0)
BCF D_OUT

;======
; Счетчик 8 бит
;======
DECFSZ BYTE, 1 ; Отнять от ячейки 1 и записать ответ в нее же
GOTO Spi_L.1 ; Если равно нулю, уходим

return

Re: Перевод числа в массив бит

Добавлено: Сб ноя 30, 2013 17:08:53
Аlex
Fallk писал(а):

Код: Выделить всё

                 BTFSC     SPI_REG,7
                 GOTO     $+3
                 BCF                 D_OUT
                 GOTO                 $+2
                 BSF                 D_OUT			;
                 BCF                 STATUS,0		; Очистка бита CARRY
                 RLF                 SPI_REG,1		; Сдвиг числа влево

Код: Выделить всё

                 BTFSS     SPI_REG,7
                 BCF         D_OUT
                 BTFSC     SPI_REG,7
                 BSF         D_OUT			;
                 RLF          SPI_REG,1		; Сдвиг числа влево
По выполнению будет немного шустрее. И бит переноса очищать незачем, всё равно сдвигов всего 8, и сдвинутые данные не дойдут до 7-ого бита :)

Re: Перевод числа в массив бит

Добавлено: Сб ноя 30, 2013 22:21:37
alex_
Похоже Вы вообще не понимаете архитектуру контроллера....
Ну вроде я не совсем дуб, иногда бывает и покуриваю мануалы, но и до профи мне далеко, тут не поспоришь.
Поэтому на самом деле побитный вывод ВСЕГДА имеет операцию условного перехода.
С этим я обсолютно согласен
Я не только понимаю, что эта запись обозначает, но так же знаю, как она работает
Теперь я не могу сообразить в чём смысл спрашивать "как работает?" если ответ уже известен?
О асм рулит, с этим не один компилятор не сравниться, правда если писать что то масштабное то легко затеряться в коде :)

Re: Перевод числа в массив бит

Добавлено: Сб ноя 30, 2013 22:35:58
КРАМ
Если Вы пишите на Си как начинающий, то стоит воздержаться от поучительных комментариев....
Остальное естественно...
ЗЫ На АСМе писать ПРОЩЕ чем на Си, если иметь ввиду эффективный код.
На Си нужно видеть СКВОЗЬ компилятор, заставляя его генерировать то, что Вам нужно на выходе с одной стороны и, оставляя при том читабельный и переносимый код с другой...
Задача довольно виртуозная.
Размер кода на АСМе никак не запутывает, если только соблюдать определенные правила.

Re: Перевод числа в массив бит

Добавлено: Вс дек 01, 2013 11:02:38
Fallk
Аlex писал(а):Сдвиг числа влево[/code]По выполнению будет немного шустрее. И бит переноса очищать незачем, всё равно сдвигов всего 8, и сдвинутые данные не дойдут до 7-ого бита :)
Хых, действительно. Заремил строки и огонек бегает так же весело по гирлянде. Это был код из реальной программы, и я его чуть чуть оптимизировал :)))
А Ваш кусок пошустрее и красивее будет, 5 циклов супротив 7. Беру!

Re: Перевод числа в массив бит

Добавлено: Вс дек 01, 2013 11:50:31
alex_
КРАМ писал(а):Если Вы пишите на Си как начинающий, то стоит воздержаться от поучительных комментариев....
Ну как сказать, в Си я не новичёк, только раньше приходилось писать для ПК а сейчас для МК, есть сходства но и отличий много, точнее сказать проходиться заморачиваться с вещами которые меня даже не интересовали по ненадобности, например асемблер или оптимизация кода из-за того что у контроллера мало памяти(PIC12F629, ATTiny13). К примеру раньше что бы вывести информацию на экран(или фаил) достаточно было спихнуть её классу IOS, а дальше это его задача. Тут же всё иначе, приходиться мелочам уделять гораздо больше внимания. :solder: