Форум myROBOT.ru » Шаг за шагом » Делаем роботов » Светодиодная панель

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

121. cjA - 08 Февраля, 2011 - 20:05:34 - перейти к сообщению
попробуйте абстрагироваться от того что картинка влезает в два байта.

ваш byte ram [4][4]
то же самое что и bit ram[4][4][8]

но это подразумевается, потому что типа bit в Си наверное нет. (хотя не знаю)
поэтому писать придется не
ram [a][b][номер_кадра]
а
ram [a][b] >> номер_кадра // и возможно добавлять & 1
122. skyburn - 08 Февраля, 2011 - 20:09:39 - перейти к сообщению
Цитата:
Вы загружаете в него байт последовательно, на табло этот же байт выводится параллельно.

Я это все понимаю. Правильно, последовательно загрузили, а потом защелкнули, и все параллельно вывелось.

Меня интересует момент реализации конкретно программы. Как мне оставить младшую часть байта такой как я написал, ибо мне ее изменять не нужно. А только менять старшую часть, и все это заталкивать в сдвигвоый регистр?
(Добавление)
Да, в C нет такого типа данных как bit и byte
123. cjA - 08 Февраля, 2011 - 20:28:20 - перейти к сообщению
skyburn
не хотите вы меня послушать
в сдвиговом регистре вам придется менять все биты, нужные - повторить.

кам менять?
а что вам нужно поменять
char up = data & 0b11110000;
char down = data & 0b00001111;
//меняете как хотите up или down
.
.
data = up | down ;
Мне непонятно зачем вам, компилятор говорит о нехватке памяти?
124. Белый Волк - 08 Февраля, 2011 - 20:34:38 - перейти к сообщению
skyburn
Никак. Логика работы сдвигового регистра этого не позволяет. Необходимо каждый раз передавать байт в сдвиговый регистр. Пример:

unsigned int data = 0b1111100110011111; //квадрат
unsigned char buf;

while(1)
for(char i = 0; i < 4; i++)
{
buf = ((unsigned char)(data & 15) << 4) | (~(1 << i) & 15);
data >>= 4;
/*
Здесь необходимо вывести переменную buf в сдвиговый регистр и сделать паузу, чтобы загоревшаяся строка была видна.
*/
}


При проектировании табло 16х16 следует подключить к отдельным выводам пары регистров отвечающих за строки и за столбцы, чтобы включать следующую строку одним импульсом.
125. skyburn - 08 Февраля, 2011 - 20:35:44 - перейти к сообщению
)
(Добавление)
Цитата:
Здесь необходимо вывести переменную buf в сдвиговый регистр и сделать паузу, чтобы загоревшаяся строка была видна

Зачем, если изображение статично, то оно будет цельным, по идее
(Добавление)
Цитата:
Мне непонятно зачем вам, компилятор говорит о нехватке памяти?

Не не говорит, но 15% памяти МК уже занято.
(Добавление)
Цитата:
skyburn
Никак. Логика работы сдвигового регистра этого не позволяет. Необходимо каждый раз передавать байт в сдвиговый регистр. Пример:

Вы меня не правильно поняли. Понятное дело что в сдвиговый регистр нужно только по новой перезаписывать. Я имел в виду программно. И можете подсказать какой примерно вид будет иметь переменная buf после всех выше описанных операций? Примерно такой 0bXXXXXXXX?
То есть регистр сразу заберет себе весь байт целиком, ну проглотит за 1 раз?
126. cjA - 08 Февраля, 2011 - 21:27:28 - перейти к сообщению
"...а сейчас взлянул как у вас на схеме- нетривиально довольно.
вы загоняете в сдвиговый регистр в верхнии четыре бита значения анодов ледмтрицы, а в нижние четыре бита- значение катодов ледматрицы. Так вы только дагональными ледами сможете управлять вроде, а остальные будут ее дублировать..."

Вы издеваетесь? Самоцитирование- это включение пулемета.
Посмотрите внимательно по фотке как все спаяно. Я по описанию тоже думал что вначале зажигаются верние четыре, потом нижние четыре. Учитывая инерционность - все кажется плавно.
Но у него не так.
127. skyburn - 08 Февраля, 2011 - 21:44:53 - перейти к сообщению
Нет!!! Вы не правы! Я могу вывести любое изображение! Внимательно посмотрите на алгоритм!
(Добавление)
Я выводил кружочек, букву А, ну и все что на ум взбрело, в размерах 4х4)
(Добавление)
(Добавление)
CODE:
#include <avr/io.h>

unsigned int data = 0b1111100110011111; //квадрат
unsigned char buf;


main(void)
{
DDRB=0xff;
while(1)

for(char i = 0; i < 4; i++)
{
buf = ((unsigned char)(data & 15) << 4) | (~(1 << i) & 15);
data >>= 4;

PORTB |=buf<<0; // вопрос в этой строчке, как мне правильно отправить Buf в HC595???
PORTB |=~(1<<1);
PORTB |=1<<1;

PORTB |=1<<2;
PORTB %=~(1<<2);

}

}
128. cjA - 08 Февраля, 2011 - 22:28:11 - перейти к сообщению
не прав. только весь смысл его пропадает- сдвиговый резистор используется только как электрический буффер. квадрат 4х4 можно и без него было сделать.
но зато теперь вы знаете как программить сдвиговый регистр и легко сделаете 16х16
а второй порт для клавы можно оставить.
(Добавление)
unsigned int [10] data = {0b1111100110011111, 0b0110100110010110, } ;
да, для Си наверное так проще массив изображений делать, чем как я предлагал.
129. skyburn - 08 Февраля, 2011 - 22:54:31 - перейти к сообщению
Цитата:
не прав. только весь смысл его пропадает- сдвиговый резистор используется только как электрический буффер. квадрат 4х4 можно и без него было сделать.но зато теперь вы знаете как программить сдвиговый регистр и легко сделаете 16х16


Верно, я для этого 4х4 и делал! Что б разобраться как и что устроенно)
(Добавление)
Белый Волк пожалуйста посмотрите на тот код, что я выложил, для WinAVR а то что то не получается. Вродь импульс генерирую нормально, и защелка закрывается. А вот на матрице полная ерунда выходит! Не понятное изображение строит. Не могли б вы немного разьяснить по поводу этих строчек

CODE:
buf = ((unsigned char)(data & 15) << 4) | (~(1 << i) & 15);
data >>= 4;

Зачем вы там использовали ИЛИ? Разве так можно?
130. nest - 08 Февраля, 2011 - 23:13:21 - перейти к сообщению
что то я пропустил... а где схема была?
131. skyburn - 08 Февраля, 2011 - 23:21:19 - перейти к сообщению
мм какая схема?) Макета моего?
132. nest - 08 Февраля, 2011 - 23:26:08 - перейти к сообщению
угу. все говорят о какой то схеме ...
133. skyburn - 08 Февраля, 2011 - 23:32:57 - перейти к сообщению
Я все с головы делал, я писал, что расставил детали примерно, а потом по датащиту подключал всю в кучу.
134. cjA - 09 Февраля, 2011 - 00:01:56 - перейти к сообщению
cjA пишет:
"...а сейчас взлянул как у вас на схеме- нетривиально довольно.
вы загоняете в сдвиговый регистр в верхнии четыре бита значения анодов ледматрицы, а в нижние четыре бита- значение катодов ледматрицы. Так вы только дагональными ледами сможете управлять вроде, а остальные будут ее дублировать..."

Вы издеваетесь? Самоцитирование- это включение плюсомета.
Посмотрите внимательно по фотке как все спаяно. Я по описанию тоже думал что вначале зажигаются верхние восемь, потом нижние восемь. Учитывая инерционность - все кажется плавно.
Но у него не так .
(Отредактировано автором: 08 Февраля, 2011 - 23:58:10)
135. skyburn - 09 Февраля, 2011 - 09:22:05 - перейти к сообщению
У меня загорается по 4, и так до самого низа!