роботы робототехника микроконтроллеры


 Страниц (7): « 1 2 3 4 [5] 6 7 »   

> Описание: Не могу понять=)
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



Спасибо ,программа работает,...у меня стоит 4 сдвиговых регистра,к ним присоеденил 32светодиода,как можно добится мигания по очередности всех 32 светодиодов?
(Добавление)
этой программой можно управлять четырьмя регистрами да?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



beam пишет:
у меня стоит 4 сдвиговых регистра
а как они подключены? последовательно? каждый отдельно? объясняйте словами или схему показывайте :)
(ещё вчера бы показали, многие вопросы бы и отпали.
Не понимаю, человек приходит за помощью, но ничего не хочет делать, что бы ему помогли...)

beam пишет:
как можно добится мигания по очередности всех 32 светодиодов?

То есть сделать "бегущий огонь" ?
beam пишет:
этой программой можно управлять четырьмя регистрами?

без переделки кода - нет.
Вид переделки кода зависит от того, как вы подключили сдвиг. регистры.
 
 Top
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



Вот схемка в ПНГ=)
(Добавление)
PD1-Data
PD2-Reset
PD3-Тактовый
Прикреплено изображение
Схема1231.png

 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



добавить варьирование второго бита в программе mihail'а и побежит что нибудь.

PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
_delay_ms(100); /* задержка 0.1 c. */
PORTD |= (1<<0); /* поднимаем в 1 тактовый выход , разрешаем запись в следующем цикле*/
_delay_ms(100); /* задержка 0.1 c. */

PORTD &= (~(1<<2)); /* а это вообще не нужно */

mihail, было предлжено на языке высокого (гы-гы) уровня, а не на макроассемблере Подшучивать, дразнить
 
 Top
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



у меня просто выходит ,что на сдвиговом регистре ,на всех ножках сразу ...+..,а мне надо по очереди
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



А! ну так ты же все поменял!

я подправил прогу чтобы разбить на два полуцикла. Там где такт 1 - пишется, где 0- подготавливается к следующей записи.

PORTD &= (~(1<<0)); /* опускаем в 0 тактовый выход */
_________________/\_- вот тут 2
Ну а тут
else
{
PORTD &= (~(random<<1)); /*

______________________/\_ - вот тут 0
гдето в начале цикла что то типа
random = ((0b00010110 xor 0b0101010 and 0b10101001)'leftshift ) and 0b00000001;
(Добавление)
beam, не жалко тебе целую атмегу тратить? это можно былобы на аттини сделать? а звук- на еще одной аттини...

(Отредактировано автором: 11 Июля, 2010 - 16:29:47)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 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. */
} /* закрывающая скобка бесконечного цикла */
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



ну тут я бессилен... 4 бесконечных цикла Улыбка
nest, и куда выйдет программа после первого бесконечного цикла?
и наверное
int kr=32; /*32 это чтоб одна точка бегала только, при 7 будет бегать четыре*/
а ниже
for(k=kr;...
где-то нужно еще exit поставить в каждом цикле и еще сверху опаясать одним, просто для того чтобы МК работал Подмигивающий
2 beam, а у тебя то какие идеи, покажи свою программку?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
4 бесконечных цикла :)
и то верно, исправил :)

32 не надо. сделали каждый байт отдельно и всё.

мой код должен выводит каждый байт отдельно с паузами в 1 сек , затем ждёт пару сек, сбрасывает всё в нуль и начинает выводить опять.
выводимые байты:
char var_0 = 0b10000000; /* переменная определяет содержимое регистра 0 */
char var_1 = 0b01000000; /* переменная определяет содержимое регистра 1 */
char var_2 = 0b00100000; /* переменная определяет содержимое регистра 2 */
char var_3 = 0b00010000; /* переменная определяет содержимое регистра 3 */
 
 Top
beam Post Id



Главнокомандующий


Сообщений всего: 278
Дата рег-ции: Дек. 2009  



Я сначала понял что к примеру ...двоичная система счисления значит ...f=7,...выдаем первый(старший)бит,..он равен 7....потом выдаем второй,7 делим на 2 =3,5-это второй бит,третий бит -3,5 делим на 2=1,75,и тд делить на 2,писал такое но ничего не вышло,
(Добавление)
буду дома покажу што написал
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



beam пишет:

PD1-Data
PD2-Reset
PD3-Тактовый


Тут нет ошибки?

Я посмотрел Вашу схему, посмотрел datasheet на ATmega8 и 74HC164. У меня получилось так:
PD0 тактовый выход
PD1 RESET выход
PD2 Data выход
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 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") "взевести" или "сбросить" ногу данных.

...
ещё раз посмотрел этот код . Не нужно там отдельно делить на два. Там всё автоматом делается... (код там ещё раз поправил)
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



mihail пишет:
Тут нет ошибки?

нет, судя по последней картинке, там перемычки наверное. Вполне красивенько.
nest пишет:
всё не так.

еще можно 7 набрать в calc и перевести в двоичный код - получится 00000111
последний бит справа - это данные (pd0) (это наш первый бит, который станет старшим после 32 циклов)
второй справа- синхро, так как у нас такие дурацкие регистры, его нужно сбросить и поднять в конце цикла (pd1)
третий справа- резет, ево вообще можно не трогать вроде? заплюсовать и все (pd2)

(2 nest, ремарочка, деление на два и сдвигвлево - совершенно разные комманды, но думаю компилятор амров это понимает и оптимизирует, на intel8086 на первой ты потерял бы два байта памяти)
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
последний бит справа - это данные (pd0) (это наш первый бит, который станет старшим после 32 циклов)
второй справа- синхро, так как у нас такие дурацкие регистры, его нужно сбросить и поднять в конце цикла (pd1)
третий справа- резет, ево вообще можно не трогать вроде? заплюсовать и все (pd2)

куда? кто? какие pd1? какие pd2? как так сбросить? как заплюсовать и всё?!
Вы вообще о чём?!
надо попорядку каждый бит из байта вывести на одну ногу контроллера.
при этом дрыгать ногой CLOCK.
Чего вы тут городите? Не вводите людей в заблуждение.

сдвиг вправо - это деление на два.
сдвиг влево - это умножение на два.
можно проверить в любом калькуляторе.
компиляторы с оптимизаторами мне до фени, бо я пишу на асм.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



по картинке!!!
pd0 - вылезет (выставит логическую единицу) на ножке 13 микросхемы Reg4. (после 32 циклов)
pd1 - тактирующий импульс
pd2 - reset, закончилась программа- он сбросился.

правильная программа у тебя, что ты сразу ????

А деление на три? или умножение три?

nest
а с процессорами кроме риск - работал? а я вот с риск процессорами не работал-спорить не буду, но в интелоподобных (Zilog, Pentium, Duron...) деление на два или три - одна команда, а сдвиг- другая.

(Отредактировано автором: 11 Июля, 2010 - 22:16:07)

 
 Top
Страниц (7): « 1 2 3 4 [5] 6 7 »
« Делимся опытом »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru