деление на два или три - одна команда, а сдвиг- другая.
ещё раз: мне всё равно, какая там комманда и где.
Я говорю, что:
сдвиг битов в байте вправо то же самое, что и деление байта на два.
сдвиг влево - умножение.
Это логическая операция, а не комманда. Прикреплено изображение
beam
Отправлено: 12 Июля, 2010 - 01:00:39
Главнокомандующий
Сообщений всего: 278
Дата рег-ции: Дек. 2009
ладно,суть понял,...ну вот допустим мне надо загнать в последний регистр вот это....-чтобы на четырех выходах была логическая 1..(+)..а на остальных,логический 0..(-)..,возможно так продвинуть такие байты начиная с первого регистра,переполняя первый регистр,байты перейдут во второй,переполняя второй в третий и тд,
cjA
Отправлено: 12 Июля, 2010 - 01:10:05
Генерал
Сообщений всего: 3291
Дата рег-ции: Янв. 2010
дык легко! говорюж- варьируешь их как хочешь!
char var_0 = 0b10000000; /* переменная определяет содержимое регистра 0 */
char var_1 = 0b01000000; /* переменная определяет содержимое регистра 1 */
char var_2 = 0b00100000; /* переменная определяет содержимое регистра 2 */
char var_3 = 0b00010000; /* переменная определяет содержимое регистра 3 */
это у nest'а было, а можно так. будут по четыре скакать.
char var_0 = 0b11110000; /* переменная определяет содержимое регистра 0 */
char var_1 = 0b01111000; /* переменная определяет содержимое регистра 1 */
char var_2 = 0b00111100; /* переменная определяет содержимое регистра 2 */
char var_3 = 0b00011110; /* переменная определяет содержимое регистра 3 */ (Добавление)
все, я пас,
все ошибки уже исправленны, beam : с тебя только - запрограммировать и запустить, программа правильная
beam
Отправлено: 12 Июля, 2010 - 12:26:52
Главнокомандующий
Сообщений всего: 278
Дата рег-ции: Дек. 2009
А што это такое? if( var_0 & (1<<k) )
cjA
Отправлено: 12 Июля, 2010 - 13:27:14
Генерал
Сообщений всего: 3291
Дата рег-ции: Янв. 2010
гы beam учи лучьше ассемблер в чистом виде, меня эти единицы много меньшие нуля- тоже всегда смущают, я начинаю думать о метрике пространства в котором это может быть и отвлекаюсь ...
если k = 0 то в результате выполнения 1<<0 получим 0b00000001
...
если k = 2 то в результате выполнения 1<<2 получим 0b00000100
если k = 3 то в результате выполнения 1<<3 получим 0b00001000
...
если k = 7 то в результате выполнения 1<<7 получим 0b10000000
& поразрядное И
var_0 = 0b01000001
1<<k = 0b00001000
0b01000001
&
0b00001000
--------------
0b00000000
var_0 = 0b01001001
1<<k = 0b00000001
0b01001001
&
0b00000001
--------------
0b00000001
С бегущим огоньком можно попробовать все сделать проще. Проверь в своей схеме порты управляющие регистрами. Прикреплено изображение
О! Ну да, корпуса разные бывают.
А по схеме mihail'а - раньше все было правильно
beam, выложи уже свою прогу которую шьешь?
mihail
Отправлено: 12 Июля, 2010 - 17:33:47
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
Изобрази как нибудь, то что хочешь получить в итоге.
Пример:
0000000000001000000000000000 (первое состояние цепочки светодиодов)
0000000000000100000000000000 (второе состояние цепочки светодиодов)
0000000000000010000000000000 (третье состояние цепочки светодиодов)
0 - не светящийся светодиод
1 - светящийся светодиод (Добавление)
Забыл сказать, if( var_0 & (1<<k) ) это немного сокращенная запись. В полном виде она может выглядеть так: if( (var_0 & (1<<k)) != 0b00000000 )
Спасибо,...Я разобрался,бегущяя строка идет нормально,... (Добавление)
все 32 светодиода работают, (Добавление) << сдвиг влево ....а в право тоже можно сдвигать?
нет сдвигать вправо нельззя, только от младшего бита к старшему
можно подправить програмку так что будет казатья что огонек бежит в другую сторону, но
а- не знаю спосбны ли на это эти регистры
б- программа будет гораздо сложнее
покажи лучьще что получилось?
nest
Отправлено: 12 Июля, 2010 - 22:56:10
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
cjA пишет:
сдвигать вправо нельззя
это почему вдруг?
cjA пишет:
а- не знаю спосбны ли на это эти регистры
им совершенно всё равно, что в них вдвинем, то и светиться будет.
cjA, вы не путайте. В регистры можно вдвигнуть быстро и незаметно, а потом ждать сколько надо. Потом следующую "картинку" вдвинуть, опять ждать... ну и так далее, как смена кадров в телеке.
cjA
Отправлено: 12 Июля, 2010 - 23:22:42
Генерал
Сообщений всего: 3291
Дата рег-ции: Янв. 2010
я и сказал что не уверен что это регистры достаточно быстродействующие.
зависит кстати еще от светодиодов. может придется кондеры ставить.
nest пишет:
это почему вдруг?
ну нельзя для этих микросхем туда-обратно делать и все (гы-гы) читайте даташит
nest
Отправлено: 13 Июля, 2010 - 00:36:28
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
cjA, вы опять всё спутали. сдвигаем байт внутри МК как нам нравится и наружу выдвигаем как хотим: хоть вперемежку из всех четырёх байтов, хоть попорядку или с середины. Так как нам нужно их получить в регистрах.
Выдвинули 32 бита за пару мкс, светим пару секунд. Выдвинули ещё 32 бита - ещё светим.
Так делают serial in - parallel out преобразования.
Так сделаны практически все пропеллерные часы со схемой на внешних регистрах.
Быстро "выплюнули" строку в регистр - ждём, светим.
Выплёвываем следующую строку - опять ждём, светим.
Сами читайте даташит. Вы не разбираетесь. Вы смешали аппаратный сдвиговой регистр в виде отдельной микросхемы со сдвигом битов байта в процессе работы алгоритма МК.
Сами подумайте, где в регистре 74хх164 лево и право? где это однозначно определено?
А в байте лево и право вполне себе существуют - старший и младший бит.
Да и кондёры то тут к светодиодам при чём?!
Быстродействия у 74хх164 для чего может не хватить?
Мало 74HC164, есть 74F164, с ней хоть сотнями МГц работайте. Или вы о чём вообще?
Хватит вам уже флеймить. А то это опять похоже на "декавольты".
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.