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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

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

А ято я могу вообще макрос из 1 буквы придумать, будет ещё короче :)
Реклама
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

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

Сообщение 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 буквы придумать, будет ещё короче :)
Я буду только рад если кому нибудь удастся ещё упростить код, при условии что он останется работоспособным :)
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25295
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

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
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Работает элементарно:
Я не только понимаю, что эта запись обозначает, но так же знаю, как она работает :)
Фишка в том, что этот кусок кода можно будет собрать только под одним единственным компилятором. Напрочь убивается переносимость из-за экономии пары строк текста, а выигрыша ни в скорости, ни в занимаемой памяти не будет.
Реклама
Эиком - электронные компоненты и радиодетали
Fallk
Мудрый кот
Сообщения: 1842
Зарегистрирован: Пт май 29, 2009 10:58:47
Откуда: Саратов

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

Сообщение 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
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение А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-ого бита :)
Реклама
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

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

Сообщение alex_ »

Похоже Вы вообще не понимаете архитектуру контроллера....
Ну вроде я не совсем дуб, иногда бывает и покуриваю мануалы, но и до профи мне далеко, тут не поспоришь.
Поэтому на самом деле побитный вывод ВСЕГДА имеет операцию условного перехода.
С этим я обсолютно согласен
Я не только понимаю, что эта запись обозначает, но так же знаю, как она работает
Теперь я не могу сообразить в чём смысл спрашивать "как работает?" если ответ уже известен?
О асм рулит, с этим не один компилятор не сравниться, правда если писать что то масштабное то легко затеряться в коде :)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25295
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

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

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

Сообщение Fallk »

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

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

Сообщение alex_ »

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

Вернуться в «PIC»