роботы
робототехника
микроконтроллеры
Главная
Как сделать робота
Новости
Спорт
Статьи
Wiki
Форум
Downloads
Ссылки
Контакты  


 Страниц (11): В начало « ... 3 4 5 6 7 [8] 9 10 11 »   

> Без описания
skyburn
Отправлено: 08 Февраля, 2011 - 11:10:21
Post Id



Маршал


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





Неа, все не как не могу с ними разобраться!!! Но очень хочу!

(Отредактировано автором: 08 Февраля, 2011 - 11:23:58)

 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 16:29:02
Post Id



Маршал


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





А про SPI толком найти ничего не могу =((( Только какие то отдельные куски, и ничего дельного
(Добавление)
ЧТо то я окончательно запутался. Вот нашел на форуме каком то
Цитата:
Пусть даже есть куча портов, вывод из массиа и ввод в массив - это горсть обращений к памяти, для avr - lds+out или lds+in на байт, 4 такта на байт.
Для SPI - lds/sts "растворяются" в обмене по SPI, для тех же AVR получаем 16 тактов на байт плюс чтение из памяти первого байта перед циклом и запись после.. Вроде как аж в четрыре раза медленнее.

ТАк смысл в этом SPI?
 
 Top
Белый Волк Супермодератор
Отправлено: 08 Февраля, 2011 - 17:40:21
Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  





skyburn
За подобными данными следует обращаться к технической документации. В datasheet от Atmel подробно описана работа с SPI. То, что вы привели в цитате - неверно.

Оператор ">>" - сдвиг вправо.
Пример:

x = 0b00001010;
x >>= 1; //сдвиг вправо на одну позицию

После действия x == 0b00000101.

Сдвиг влево - "<<".
После аналогичных действий, x == 0b00010100.

Пример последовательного вывода байта в PD0 (WinAVR):

CODE:

char data = 0b01101001;
for(char i = 0; i < 8; i++)
{
PORTD = data & 1;
data >>= 1;
}
 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 17:59:05
Post Id



Маршал


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





хмм.. а если мне к примеру нужно вывести картинку в виде круга? Ну на моей 4х4?
Все равно не понимаю, почему именно на PD0 и что значит PORTD=data & 1;?
И что, 595й примет сразу 8 бит?А если я хочу на PB4 к примеру. Вот этим мне ВинАвр не понравилось. Как то замудро все.
 
 Top
lamakazzz
Отправлено: 08 Февраля, 2011 - 18:08:29
Post Id



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


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





почитайте http://ru.wikipedia.org/wiki/Битовые_операции и всё поймете

чтобы нарисовать круг - воспользуйтесь уравнением окружности
 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 18:19:54
Post Id



Маршал


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





Мне главное понять как оно работает. Я вот лично понять не могу что из этого выйдет?
CODE:
char data = 0b01101001;
for(char i = 0; i < 8; i++)
{
PORTD = data & 1;
data >>= 1;
}

Это за каждый проход будет идти сдвиг в право. А записываться то что будет? И почему 8 раз повторять это нужно, матрица то 4х4, а если мы записываем по 8 байт, то зачем цикл такой длинный. Не понятно =(
Сейчас почитаю, что вы мне скинули. Может что то найду для себя, вернее, пойму что то
 
 Top
lamakazzz
Отправлено: 08 Февраля, 2011 - 18:46:30
Post Id



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


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





Вам это дали как пример.
Смотрите - у Вас есть матрица размером 4*4 - это получается 16 элементов (или светодиодов).
Один байт - это восемь битов (не путаем байт с битом!). То есть один байт может обслужить половину Вашей матрицы, а два байта покроют всю матрицу.

Поскольку один байт содержит 8 бит, то для Вашей матрицы удобно разбить байт на младшую часть и старшую часть(т.е. по 4 бита в каждой) - это получатся как раз две строки матрицы

в двочиной системе число 240 будет выглядеть как 11110000
пусть это будет наш один байт.
теперь мы можем разбить его на старшую (1111) и младшую часть (0000)
теперь пусть младшая часть этого байта - будет нулевая строка матрицы, а старшая часть - первая строка. Тогда получим матрицу такого вида:

0000
1111

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

0000
1111
0011
1100

С байтами разобрались. Теперь читайте о побитовых сдвигах. Как прочитаете, то возьмите нарисуйте результат каждой итерации примера, который Вам привел Белый Волк и напишите сюда, чтобы было понятно, что мы "говорим на одинаковых языках". Если Вам и так уже ясно, то вперед за работу!
Работа программиста - это в первую очередь правильное проектирование, оно больше всего занимает время, а написание кода - это уже мелочь. Поэтому всё что Вы придумаете - пишите и рисуйте сначала на бумаге, разрабатывайте алгоритм, и написать код уже будет намного легче.
 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 18:46:40
Post Id



Маршал


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





=)

(Отредактировано автором: 08 Февраля, 2011 - 19:13:19)

 
 Top
lamakazzz
Отправлено: 08 Февраля, 2011 - 19:14:20
Post Id



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


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





PORTD - этой штукой мы присваиваем значение порту D, об этом Вы должны были почитать вот тут http://myrobot.ru/stepbystep/pr_mcports.php
PORTD = data & 1; - эта строчка постоянно будет записывать в нулевой бит порта D единицу, если нулевой бит data =1 и 0, если 0. Остальные биты будут нулевыми. "&1" для вывода всего байта там лишняя.
А в цикле мы сдвигаем вправо переменную data. Надеюсь с этим Вы уже ознакомились

(Отредактировано автором: 08 Февраля, 2011 - 19:47:41)

 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 19:17:15
Post Id



Маршал


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





А как мы можем разбить на старшую и младшую часть 1 байт?
(Добавление)
1001
0110

0100
0011

1010
0001

1101
0000
и тд, привально понял?

(Отредактировано автором: 08 Февраля, 2011 - 19:19:30)

 
 Top
lamakazzz
Отправлено: 08 Февраля, 2011 - 19:30:57
Post Id



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


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





я же Вам написал в сообщении выше, как разбить. Или я не понял вопроса?
Вы правильно разбили байт. Теперь только не нужно путать, где какая часть, чтобы рисунок на матрице был правильный.

(Отредактировано автором: 08 Февраля, 2011 - 19:33:53)

 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 19:36:18
Post Id



Маршал


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





Ну я разбил, и записал как вы показали. только я все равно не вижу в этом никакого смысла. Что с этим делать дальше? Ну со сдвигом я разобрался вроде, значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение. Так ведь?
(Добавление)
Просто как я могу делать алгоритм не понимаю как оно работает =(
 
 Top
cjA
Отправлено: 08 Февраля, 2011 - 19:55:56
Post Id



Генерал


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





Но старик Си - это же язык с нестрогой типизацией?
зачем
PORTB.0 = (ram [a][b] >> номер_кадра) & 1 ; //?

размерность PORTB.0 очевидно равна еденице и компилятор просто должен откинуть старшие семь битов и записаь младший нулевой что бы привести байт к биту?
Хотя возможно от компилятора зависит.

lamakazzz, у топик стартера уже работающая схема, остались чисто программские вопросы.

(нету в Си никаких битов переноса.)

(Отредактировано автором: 08 Февраля, 2011 - 19:57:47)

 
 Top
skyburn
Отправлено: 08 Февраля, 2011 - 19:57:06
Post Id



Маршал


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





Ну как бы младшая часть должна выглядеть так

1110
хххх

1101
хххх

1011
хххх

0111
хххх

Где х это мои биты самого рисунка? верно? ну младшая часть байта задвигается в регистр в конец, то есть на Q4-Q7, к которым у меня подключены минусы строк светодиодов.
(Добавление)
Цитата:
(нету в Си никаких битов переноса.)

Ну так написано в Вике +)

(Отредактировано автором: 08 Февраля, 2011 - 19:57:47)

 
 Top
Белый Волк Супермодератор
Отправлено: 08 Февраля, 2011 - 20:04:28
Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  





lamakazzz
Результатом операции (data & 1) будет байт, нулевой бит которого равен нулевому биту переменной (то есть, 0b00000001 или 0b00000000). То, что описали Вы, записывается строкой:
PORTD = 1;

skyburn
WinAVR обладает почти стандартным синтаксисом C. Операции &, |, &&, ||, >>, <<, ~ - есть в стандартном C.
Что касается решаемой задачи: сдвиговый регистр представляет собой байт оперативной памяти (два, если быть точным). Вы загружаете в него байт последовательно, на табло этот же байт выводится параллельно.
 
 Top
Страниц (11): В начало « ... 3 4 5 6 7 [8] 9 10 11 »
« Делаем роботов »


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





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown