106. skyburn - 08 Февраля, 2011 - 11:10:21 - перейти к сообщению
Неа, все не как не могу с ними разобраться!!! Но очень хочу!
107. skyburn - 08 Февраля, 2011 - 16:29:02 - перейти к сообщению
А про SPI толком найти ничего не могу =((( Только какие то отдельные куски, и ничего дельного
(Добавление)
ЧТо то я окончательно запутался. Вот нашел на форуме каком то
ТАк смысл в этом SPI?
(Добавление)
ЧТо то я окончательно запутался. Вот нашел на форуме каком то
Цитата:
Пусть даже есть куча портов, вывод из массиа и ввод в массив - это горсть обращений к памяти, для avr - lds+out или lds+in на байт, 4 такта на байт.
Для SPI - lds/sts "растворяются" в обмене по SPI, для тех же AVR получаем 16 тактов на байт плюс чтение из памяти первого байта перед циклом и запись после.. Вроде как аж в четрыре раза медленнее.
Для SPI - lds/sts "растворяются" в обмене по SPI, для тех же AVR получаем 16 тактов на байт плюс чтение из памяти первого байта перед циклом и запись после.. Вроде как аж в четрыре раза медленнее.
ТАк смысл в этом SPI?
108. Белый Волк - 08 Февраля, 2011 - 17:40:21 - перейти к сообщению
skyburn
За подобными данными следует обращаться к технической документации. В datasheet от Atmel подробно описана работа с SPI. То, что вы привели в цитате - неверно.
Оператор ">>" - сдвиг вправо.
Пример:
x = 0b00001010;
x >>= 1; //сдвиг вправо на одну позицию
После действия x == 0b00000101.
Сдвиг влево - "<<".
После аналогичных действий, x == 0b00010100.
Пример последовательного вывода байта в PD0 (WinAVR):
За подобными данными следует обращаться к технической документации. В 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;
}
char data = 0b01101001;
for(char i = 0; i < 8; i++)
{
PORTD = data & 1;
data >>= 1;
}
109. skyburn - 08 Февраля, 2011 - 17:59:05 - перейти к сообщению
хмм.. а если мне к примеру нужно вывести картинку в виде круга? Ну на моей 4х4?
Все равно не понимаю, почему именно на PD0 и что значит PORTD=data & 1;?
И что, 595й примет сразу 8 бит?А если я хочу на PB4 к примеру. Вот этим мне ВинАвр не понравилось. Как то замудро все.
Все равно не понимаю, почему именно на PD0 и что значит PORTD=data & 1;?
И что, 595й примет сразу 8 бит?А если я хочу на PB4 к примеру. Вот этим мне ВинАвр не понравилось. Как то замудро все.
110. lamakazzz - 08 Февраля, 2011 - 18:08:29 - перейти к сообщению
почитайте http://ru.wikipedia.org/wiki/Битовые_операции и всё поймете
чтобы нарисовать круг - воспользуйтесь уравнением окружности
чтобы нарисовать круг - воспользуйтесь уравнением окружности
111. skyburn - 08 Февраля, 2011 - 18:19:54 - перейти к сообщению
Мне главное понять как оно работает. Я вот лично понять не могу что из этого выйдет?
Это за каждый проход будет идти сдвиг в право. А записываться то что будет? И почему 8 раз повторять это нужно, матрица то 4х4, а если мы записываем по 8 байт, то зачем цикл такой длинный. Не понятно =(
Сейчас почитаю, что вы мне скинули. Может что то найду для себя, вернее, пойму что то
CODE:
char data = 0b01101001;
for(char i = 0; i < 8; i++)
{
PORTD = data & 1;
data >>= 1;
}
for(char i = 0; i < 8; i++)
{
PORTD = data & 1;
data >>= 1;
}
Это за каждый проход будет идти сдвиг в право. А записываться то что будет? И почему 8 раз повторять это нужно, матрица то 4х4, а если мы записываем по 8 байт, то зачем цикл такой длинный. Не понятно =(
Сейчас почитаю, что вы мне скинули. Может что то найду для себя, вернее, пойму что то
112. lamakazzz - 08 Февраля, 2011 - 18:46:30 - перейти к сообщению
Вам это дали как пример.
Смотрите - у Вас есть матрица размером 4*4 - это получается 16 элементов (или светодиодов).
Один байт - это восемь битов (не путаем байт с битом!). То есть один байт может обслужить половину Вашей матрицы, а два байта покроют всю матрицу.
Поскольку один байт содержит 8 бит, то для Вашей матрицы удобно разбить байт на младшую часть и старшую часть(т.е. по 4 бита в каждой) - это получатся как раз две строки матрицы
в двочиной системе число 240 будет выглядеть как 11110000
пусть это будет наш один байт.
теперь мы можем разбить его на старшую (1111) и младшую часть (0000)
теперь пусть младшая часть этого байта - будет нулевая строка матрицы, а старшая часть - первая строка. Тогда получим матрицу такого вида:
0000
1111
Теперь пусть задан еще один байт вида 11000011
Точно также поступим и со вторым байтом. Тогда младшая часть второго байта будет второй строкой матрицы, а старшая часть второго байта - третьей строкой.
Получим матрицу вида:
0000
1111
0011
1100
С байтами разобрались. Теперь читайте о побитовых сдвигах. Как прочитаете, то возьмите нарисуйте результат каждой итерации примера, который Вам привел Белый Волк и напишите сюда, чтобы было понятно, что мы "говорим на одинаковых языках". Если Вам и так уже ясно, то вперед за работу!
Работа программиста - это в первую очередь правильное проектирование, оно больше всего занимает время, а написание кода - это уже мелочь. Поэтому всё что Вы придумаете - пишите и рисуйте сначала на бумаге, разрабатывайте алгоритм, и написать код уже будет намного легче.
Смотрите - у Вас есть матрица размером 4*4 - это получается 16 элементов (или светодиодов).
Один байт - это восемь битов (не путаем байт с битом!). То есть один байт может обслужить половину Вашей матрицы, а два байта покроют всю матрицу.
Поскольку один байт содержит 8 бит, то для Вашей матрицы удобно разбить байт на младшую часть и старшую часть(т.е. по 4 бита в каждой) - это получатся как раз две строки матрицы
в двочиной системе число 240 будет выглядеть как 11110000
пусть это будет наш один байт.
теперь мы можем разбить его на старшую (1111) и младшую часть (0000)
теперь пусть младшая часть этого байта - будет нулевая строка матрицы, а старшая часть - первая строка. Тогда получим матрицу такого вида:
0000
1111
Теперь пусть задан еще один байт вида 11000011
Точно также поступим и со вторым байтом. Тогда младшая часть второго байта будет второй строкой матрицы, а старшая часть второго байта - третьей строкой.
Получим матрицу вида:
0000
1111
0011
1100
С байтами разобрались. Теперь читайте о побитовых сдвигах. Как прочитаете, то возьмите нарисуйте результат каждой итерации примера, который Вам привел Белый Волк и напишите сюда, чтобы было понятно, что мы "говорим на одинаковых языках". Если Вам и так уже ясно, то вперед за работу!
Работа программиста - это в первую очередь правильное проектирование, оно больше всего занимает время, а написание кода - это уже мелочь. Поэтому всё что Вы придумаете - пишите и рисуйте сначала на бумаге, разрабатывайте алгоритм, и написать код уже будет намного легче.
113. skyburn - 08 Февраля, 2011 - 18:46:40 - перейти к сообщению
=)
114. lamakazzz - 08 Февраля, 2011 - 19:14:20 - перейти к сообщению
PORTD - этой штукой мы присваиваем значение порту D, об этом Вы должны были почитать вот тут http://myrobot.ru/stepbystep/pr_mcports.php
PORTD = data & 1; - эта строчка постоянно будет записывать в нулевой бит порта D единицу, если нулевой бит data =1 и 0, если 0. Остальные биты будут нулевыми. "&1" для вывода всего байта там лишняя.
А в цикле мы сдвигаем вправо переменную data. Надеюсь с этим Вы уже ознакомились
PORTD = data & 1; - эта строчка постоянно будет записывать в нулевой бит порта D единицу, если нулевой бит data =1 и 0, если 0. Остальные биты будут нулевыми. "&1" для вывода всего байта там лишняя.
А в цикле мы сдвигаем вправо переменную data. Надеюсь с этим Вы уже ознакомились
115. skyburn - 08 Февраля, 2011 - 19:17:15 - перейти к сообщению
А как мы можем разбить на старшую и младшую часть 1 байт?
(Добавление)
1001
0110
0100
0011
1010
0001
1101
0000
и тд, привально понял?
(Добавление)
1001
0110
0100
0011
1010
0001
1101
0000
и тд, привально понял?
116. lamakazzz - 08 Февраля, 2011 - 19:30:57 - перейти к сообщению
я же Вам написал в сообщении выше, как разбить. Или я не понял вопроса?
Вы правильно разбили байт. Теперь только не нужно путать, где какая часть, чтобы рисунок на матрице был правильный.
Вы правильно разбили байт. Теперь только не нужно путать, где какая часть, чтобы рисунок на матрице был правильный.
117. skyburn - 08 Февраля, 2011 - 19:36:18 - перейти к сообщению
Ну я разбил, и записал как вы показали. только я все равно не вижу в этом никакого смысла. Что с этим делать дальше? Ну со сдвигом я разобрался вроде, значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение. Так ведь?
(Добавление)
Просто как я могу делать алгоритм не понимаю как оно работает =(
(Добавление)
Просто как я могу делать алгоритм не понимаю как оно работает =(
118. cjA - 08 Февраля, 2011 - 19:55:56 - перейти к сообщению
Но старик Си - это же язык с нестрогой типизацией?
зачем
PORTB.0 = (ram [a][b] >> номер_кадра) & 1 ; //?
размерность PORTB.0 очевидно равна еденице и компилятор просто должен откинуть старшие семь битов и записаь младший нулевой что бы привести байт к биту?
Хотя возможно от компилятора зависит.
lamakazzz, у топик стартера уже работающая схема, остались чисто программские вопросы.
(нету в Си никаких битов переноса.)
зачем
PORTB.0 = (ram [a][b] >> номер_кадра) & 1 ; //?
размерность PORTB.0 очевидно равна еденице и компилятор просто должен откинуть старшие семь битов и записаь младший нулевой что бы привести байт к биту?
Хотя возможно от компилятора зависит.
lamakazzz, у топик стартера уже работающая схема, остались чисто программские вопросы.
(нету в Си никаких битов переноса.)
119. skyburn - 08 Февраля, 2011 - 19:57:06 - перейти к сообщению
Ну как бы младшая часть должна выглядеть так
1110
хххх
1101
хххх
1011
хххх
0111
хххх
Где х это мои биты самого рисунка? верно? ну младшая часть байта задвигается в регистр в конец, то есть на Q4-Q7, к которым у меня подключены минусы строк светодиодов.
(Добавление)
Ну так написано в Вике +)
1110
хххх
1101
хххх
1011
хххх
0111
хххх
Где х это мои биты самого рисунка? верно? ну младшая часть байта задвигается в регистр в конец, то есть на Q4-Q7, к которым у меня подключены минусы строк светодиодов.
(Добавление)
Цитата:
(нету в Си никаких битов переноса.)
Ну так написано в Вике +)
120. Белый Волк - 08 Февраля, 2011 - 20:04:28 - перейти к сообщению
lamakazzz
Результатом операции (data & 1) будет байт, нулевой бит которого равен нулевому биту переменной (то есть, 0b00000001 или 0b00000000). То, что описали Вы, записывается строкой:
PORTD = 1;
skyburn
WinAVR обладает почти стандартным синтаксисом C. Операции &, |, &&, ||, >>, <<, ~ - есть в стандартном C.
Что касается решаемой задачи: сдвиговый регистр представляет собой байт оперативной памяти (два, если быть точным). Вы загружаете в него байт последовательно, на табло этот же байт выводится параллельно.
Результатом операции (data & 1) будет байт, нулевой бит которого равен нулевому биту переменной (то есть, 0b00000001 или 0b00000000). То, что описали Вы, записывается строкой:
PORTD = 1;
skyburn
WinAVR обладает почти стандартным синтаксисом C. Операции &, |, &&, ||, >>, <<, ~ - есть в стандартном C.
Что касается решаемой задачи: сдвиговый регистр представляет собой байт оперативной памяти (два, если быть точным). Вы загружаете в него байт последовательно, на табло этот же байт выводится параллельно.