Описание: Не могу понять=) |
Поиск в теме | Версия для печати |
nest |
Отправлено: 11 Июля, 2010 - 13:00:17
|
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
|
beam пишет:у меня стоит 4 сдвиговых регистра а как они подключены? последовательно? каждый отдельно? объясняйте словами или схему показывайте :)
(ещё вчера бы показали, многие вопросы бы и отпали.
Не понимаю, человек приходит за помощью, но ничего не хочет делать, что бы ему помогли...)
beam пишет:как можно добится мигания по очередности всех 32 светодиодов?
То есть сделать "бегущий огонь" ?
beam пишет:этой программой можно управлять четырьмя регистрами?
без переделки кода - нет.
Вид переделки кода зависит от того, как вы подключили сдвиг. регистры. |
|
|
nest |
Отправлено: 11 Июля, 2010 - 17:23:42
|
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
|
beam, эта картинка хотя и в PNG, но сохранена сначала в JPG.
И это не схема, а плата.
beam пишет:на всех ножках сразу ...+ в логических схемах нет понятия "+".
Есть только "1", "0" и иногда "Z".
Вам нужно разобраться, как работает защёлка, а потом уже будет всё ясно как солнечный день. Сначала учатся ползать, а потом ходить.
Сначала учатся на велосипеде, а вы сразу хотите на самосвал сесть.
Вы хотите быстрее получить результат, ни в чём не разбираясь.
Если всё таки захотите разобраться, то ещё раз перечитайте,
и спросите, если что не ясно:
Описание работы D-триггера.
(на этой картинки входы R и S не показаны)
При переходе с низкого лог. уровня на высокий ("фронт" сигнала) логическое состояние со входа D передаётся на выход Q. В остальных случаях лог. состояние на входе D не имеет значения.
Можно сказать, что D-триггер работает как "защёлка". При фронте на входе C сигнал со входа C защёлкивается на выход Q. Среди электронщиков название "защёлка" применяется часто. (существует ещё и "прозрачная защёлка").
если не хотите разбираться, то вот вам код:
/***************************************************************
Реализация алгоритма "заполнения" регистра 74HC164 для WinAVR
Частота работы МК меньше 10 МГц
***************************************************************/
#include <avr/io.h>
#include <util/delay.h>
int main(void) /* основная программа */
{
DDRD |= (1<<0); /* PD0 сконфигурировать как выход, тактовый выход */
DDRD |= (1<<1); /* PD1 сконфигурировать как выход, Data выход */
DDRD |= (1<<2); /* PD2 сконфигурировать как выход, RESET выход */
char var_0 = 0b10000000; /* переменная определяет содержимое регистра 0 */
char var_1 = 0b01000000; /* переменная определяет содержимое регистра 1 */
char var_2 = 0b00100000; /* переменная определяет содержимое регистра 2 */
char var_3 = 0b00010000; /* переменная определяет содержимое регистра 3 */
int k; /* переменная для цикла */
PORTD |= (1<<0); /* установить "1" на линии 0 порта D */
PORTD &= (~(1<<1)); /* установить "0" на линии 1 порта D */
PORTD &= (~(1<<2)); /* установить "0" на линии 2 порта D */
PORTD |= (1<<2); /* поднимаем и держим RESET в 1 */
while(1) /* бесконечный цикл */
{
;#############
; выводим регистр 0
;#############
for(k=7; k>=0; k--) {
if( var_0 & (1<<k) ) {
PORTD |= (1<<1); /* установить "1" на линии 1 порта D */
}
else {
PORTD &= (~(1<<1)); /* установить "0" на линии 1 порта D */
}
PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
PORTD |= (1<<0); /* поднимаем в 1 тактовый выход */
}
_delay_ms(1000); /* задержка 1 c. */
;#############
; выводим регистр 1
;#############
for(k=7; k>=0; k--) {
if( var_1 & (1<<k) ) {
PORTD |= (1<<1); /* установить "1" на линии 1 порта D */
}
else {
PORTD &= (~(1<<1)); /* установить "0" на линии 1 порта D */
}
PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
PORTD |= (1<<0); /* поднимаем в 1 тактовый выход */
}
_delay_ms(1000); /* задержка 1 c. */
;#############
; выводим регистр 2
;#############
for(k=7; k>=0; k--) {
if( var_2 & (1<<k) ) {
PORTD |= (1<<1); /* установить "1" на линии 1 порта D */
}
else {
PORTD &= (~(1<<1)); /* установить "0" на линии 1 порта D */
}
PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
PORTD |= (1<<0); /* поднимаем в 1 тактовый выход */
}
_delay_ms(1000); /* задержка 1 c. */
;#############
; выводим регистр 3
;#############
for(k=7; k>=0; k--) {
if( var_3 & (1<<k) ) {
PORTD |= (1<<1); /* установить "1" на линии 1 порта D */
}
else {
PORTD &= (~(1<<1)); /* установить "0" на линии 1 порта D */
}
PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
PORTD |= (1<<0); /* поднимаем в 1 тактовый выход */
}
_delay_ms(1000); /* задержка 1 c. */
PORTD &= (~(1<<2)); /* опускаем в 0 RESET */
_delay_ms(1000); /* задержка 1 c. */
PORTD |= (1<<2); /* поднимаем и держим RESET в 1 */
_delay_ms(1000); /* задержка 1 c. */
_delay_ms(1000); /* задержка 1 c. */
} /* закрывающая скобка бесконечного цикла */
|
|
|
beam |
Отправлено: 11 Июля, 2010 - 18:53:20
|
Главнокомандующий
Сообщений всего: 278
Дата рег-ции: Дек. 2009
|
Я сначала понял что к примеру ...двоичная система счисления значит ...f=7,...выдаем первый(старший)бит,..он равен 7....потом выдаем второй,7 делим на 2 =3,5-это второй бит,третий бит -3,5 делим на 2=1,75,и тд делить на 2,писал такое но ничего не вышло,
(Добавление)
буду дома покажу што написал |
|
|
nest |
Отправлено: 11 Июля, 2010 - 19:29:25
|
Администратор
Сообщений всего: 4866
Дата рег-ции: Сент. 2009
|
beam пишет:двоичная система счисления значит ...f=7,...выдаем первый(старший)бит,..он равен 7....потом выдаем второй,7 делим на 2 =3,5-это второй бит,третий бит -3,5 делим на 2=1,75,и тд делить на 2,писал такое но ничего не вышло,
всё не так.
f=7 потому что у нас в байте восем битов, считаем: 0,1,2,3,4,5,6,7 (нулевой не забываем!)
про деление на два
при делении на два биты в байте сдвигаются вправо.
возмём, к примеру, 0b10000000;
после деления его на два будет:
0b01000000;
ещё раз разделим на два:
0b00100000;
ещё раз:
0b00010000;
.. и так далее. Заметте, что биты сдвигаются вправо после каждого деления.
Это деление делается из за того, что нам нужно все биты перебрать поочерёдно и в зависимости от состояния каждого из них ("0" или "1") "взевести" или "сбросить" ногу данных.
...
ещё раз посмотрел этот код . Не нужно там отдельно делить на два. Там всё автоматом делается... (код там ещё раз поправил) |
|
|
cjA |
Отправлено: 11 Июля, 2010 - 21:25:36
|
Генерал
Сообщений всего: 3291
Дата рег-ции: Янв. 2010
|
mihail пишет:Тут нет ошибки?
нет, судя по последней картинке, там перемычки наверное. Вполне красивенько.
еще можно 7 набрать в calc и перевести в двоичный код - получится 00000111
последний бит справа - это данные (pd0) (это наш первый бит, который станет старшим после 32 циклов)
второй справа- синхро, так как у нас такие дурацкие регистры, его нужно сбросить и поднять в конце цикла (pd1)
третий справа- резет, ево вообще можно не трогать вроде? заплюсовать и все (pd2)
(2 nest, ремарочка, деление на два и сдвигвлево - совершенно разные комманды, но думаю компилятор амров это понимает и оптимизирует, на intel8086 на первой ты потерял бы два байта памяти) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (7): « 1 2 3 4 [5] 6 7 » |
« Делимся опытом » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|