Страница 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
ну вы даете!
записать в массив "экранной памяти" можно так:

Код: Выделить всё

SCR[0] = 12;
разумеется, вместо 12 вы можете использовать или любое число, или любую переменную. если вы работаете с WinAVR, то считать что-то из flash можно так:

Код: Выделить всё

SCR[0] = pgm_read_byte(&dannye_vo_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) у меня контролирует выход изображения за пределы матрицы - это важно!