Страница 1 из 1
Вывод сигналов с AVR на LED матрицу на Си
Добавлено: Чт июл 23, 2009 03:31:25
Jokasito
Привет. Я начинающий. Нужна помощь. Подскажите как правильно организовать стробированый вывод сигналов с AVR на светодиодную матрицу к примеру 8х8. Нужен пример на Си с пояснениями. Видел подобные решения но исходников на Си непопадалось. Прилагаю подобную схему (матрица 10х10)
Добавлено: Чт июл 23, 2009 07:11:47
ARV
а в чем проблема-то? вывод ничем не отличается от обычной динамической индикации, о которой говорено-переговорено миллион раз...
Добавлено: Чт июл 23, 2009 10:56:58
Jokasito
привет. да проблем то особых нет. просто хочу научиться это дело на Си програмировать, мнебы разобраться на каком нибудь примере. как правильно расчитать время показа каждой из строк и как правильно расчитать время перехода от одной строки к другой а также организация этого вывода - и все это именно на Си.
Добавлено: Чт июл 23, 2009 11:11:14
ARV
во-первых, "правильно" или нет - это вы решаете сами. есть минимум, который определяется инерционностью зрения, т.е. все. что мигает чаще 25 раз в секунду мы видим непрерывно светящимся. вот и все. а там хоть с частотой в мегагерцы мигайте
во-вторых, логика элементарна:
- вывели на строки из порта МК единички там, где надо зажечь светодиоды
- вывели нолик в столбец общих катодов, в котором эти светодиоды дожны гореть
- подождали некоторое время (см. рассуждения о частоте)
- вывели 1 во все столбцы (т.е. погачили все)
- подготовили очередные данные для следующего столбца
- перешли к началу
все это делается непрерывно, создавая эффект "развертки"... мне кажется, коворить о коде на Си тут просто смешно - настолько все элементарно
в-третьих, я тут задумал статеечку по поводу динамической индикации, текст написал, теперь надо нарисовать картинки и буду размещать... так что если хватит терпения - дождетесь вскоре

Добавлено: Чт июл 23, 2009 12:39:43
Jokasito
Привет. может комуто и элементарно писать на Си - я же начинающий, мне покачто сложновато (очень много времени уходит на элементарные вещи, потому и прошу хоть какиете наброски для изучения). И насколько я понимаю там есть разница как выводить информацию чтобы картинка неломалась, ведь основной цикл программы может притормаживать вывод картинки. А вообще буду очень ждать эту статью.
Добавлено: Чт июл 23, 2009 18:49:38
Pe3ucTop
Постараюсь помочь:
Здась главный вопрос не в матрице светодиодов, а в том как эта матрица будет подключатся к контроллеру!
По виду матрицы - она как индикатор уровня - из этого вопрос - загораться они должны столбиками или могут независимо например - только пятый в втором столбце ??
Во первых, общие катоды обычно подключают через транзистор на землю, или через нагрузочные буферные элементы.
Во вторых, для столбцов (общих катодов) - советую дешифратор ставить, хотя можно и с портов - если их так много :)
Конечно всё немножко усложняется по причине того, что ячейка 10х10,
хранить данные надо или с терянием не занятых битов или продумывать структуры хранения посложнее..
Для матрицы 8х8 простая схема вывода (желательно это даже делать в периодичном прерывании - допустим таимера ):
Есть вектор "a[]" (одномерный массив) с данными свечения светодиодов для столбцов.
Далее есть переменная "b" - номер столбца (изначально 0)..
(это были глобальные переменные - вектор и номер столбца)
А далее каждое прерывание таимера :
Порт светодиодов = a[b];
Порт столбцов = 1 << b;
if (b > 7) b=0; // 8 - максимальное количество столбцов, а считаются они с 0
Вобшем-то и вся идея для матрицы 8х8..
Если больше по строкам то надо для них тоже масивчик.. или же предидущий массив расширить до ~ int...
и тогда 16 х 8 :
Порт светодиодов младших = a[b] & 0xFF;
Порт старших светодиодов = a[b] >> 8;
Если больше по строкам 8 х 16 - то чуточку сложнее :
if( b < 8)
{
Порт младших столбцов = 1<< b;
Порт старших столбцов = 0;
}
else
{
Порт младших столбцов = 0;
Порт старших столбцов = 1<< (b - 7);
}
if( b > 15 ) b=0; // 16 - максимальное количество столбцов, а считаются они с 0
Вот и всё..
Добавлено: Сб июл 25, 2009 19:32:59
ARV
Эх... ну, вроде
статья готова... по-моему, учел все... что не учел - пишите, возможно, будут дополнения
Добавлено: Чт ноя 05, 2009 18:31:50
Symbiosis
ARV, я согласно вашей статье наконец то разобрался с динамической индикацией, научился её фоново делать. И тут собственно дальше идти надо, а где почитать и как сделать - не знаю...
Вы пишите:
"Фоновая индикация позволит нам в главном цикле просто записать в нужный момент что-то в массив SCR[] – и оно мгновенно отобразится на дисплее!"
А как записать ? Точнее как прочитать из памяти (к примеру EEPROM) и прочитанное записать в SCR ?
Добавлено: Чт ноя 05, 2009 19:23:37
ARV
ну вы даете!
записать в массив "экранной памяти" можно так:
разумеется, вместо 12 вы можете использовать или любое число, или любую переменную. если вы работаете с WinAVR, то считать что-то из flash можно так:
, где dannye_vo_flash - это "переменная" (по факту - константа) в памяти программ[/code]
Добавлено: Сб ноя 07, 2009 10:01:10
Symbiosis
Спасиб ) Я что-то затупил, вечер поздний был, а подумать что то обленился ))) Научился из памяти читать и записывать в дисплей многомерный массив. Чуть попозжа выложу видео того что получилось ) Собственно сейчас буду пытаться разобраться с тем, как с карты памяти через SPI прочитать текстовый файл с массивом...
А пока вопросик, как организовать бегущую строку ? Но чтобы это было параллельно. Т.е. один массив выводится просто так в SCR[] по кадрам так сказать. А другой массив как бегущая строка. Таким образом матрица картинки показывает, но по определенному сигналу начинает гнать текст в виде бегущей строки.
Добавлено: Сб ноя 07, 2009 10:52:04
ARV
я делал бегущую строку так:
Код: Выделить всё
void run_str_P(char *str){
int k = strlen_P(str); // strlen_P - вычисление длины строки во flash
int tx;
char *s;
char tc;
for(int x=10; x > (-k*8-10);x--){ // 10 - это число столбцов в моей матрице
s = str;
tx = x;
tc = pgm_read_byte(s);
clear(); // очистка экранной области
while(tc){
print_char(tx,3,tc);
tx += 8;
s++;
tc = pgm_read_byte(s);
}
_delay_ms(50);
}
}
здесь собственно вывод символа в экранную область делается функцией
print_char(x,y,c), у которой параметры
x и
y задают координаты верхней левой точки на матрице, начиная с которой будет выведен символ, а
с - это сам символ. строки я хранил во
flash, поэтому символы строки загружаю при помощи
pgm_read_byte (писал для
WinAVR)
функция
print_char(x,y,c) у меня контролирует выход изображения за пределы матрицы - это важно!