Вывод сигналов с AVR на LED матрицу на Си

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Jokasito
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49
Контактная информация:

Вывод сигналов с AVR на LED матрицу на Си

Сообщение Jokasito »

Привет. Я начинающий. Нужна помощь. Подскажите как правильно организовать стробированый вывод сигналов с AVR на светодиодную матрицу к примеру 8х8. Нужен пример на Си с пояснениями. Видел подобные решения но исходников на Си непопадалось. Прилагаю подобную схему (матрица 10х10)
Вложения
002.jpg
(191.73 КБ) 1163 скачивания
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Jokasito
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49
Контактная информация:

Сообщение Jokasito »

привет. да проблем то особых нет. просто хочу научиться это дело на Си програмировать, мнебы разобраться на каком нибудь примере. как правильно расчитать время показа каждой из строк и как правильно расчитать время перехода от одной строки к другой а также организация этого вывода - и все это именно на Си.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

во-первых, "правильно" или нет - это вы решаете сами. есть минимум, который определяется инерционностью зрения, т.е. все. что мигает чаще 25 раз в секунду мы видим непрерывно светящимся. вот и все. а там хоть с частотой в мегагерцы мигайте :)

во-вторых, логика элементарна:
- вывели на строки из порта МК единички там, где надо зажечь светодиоды
- вывели нолик в столбец общих катодов, в котором эти светодиоды дожны гореть
- подождали некоторое время (см. рассуждения о частоте)
- вывели 1 во все столбцы (т.е. погачили все)
- подготовили очередные данные для следующего столбца
- перешли к началу
все это делается непрерывно, создавая эффект "развертки"... мне кажется, коворить о коде на Си тут просто смешно - настолько все элементарно

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jokasito
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб май 16, 2009 04:16:49
Контактная информация:

Сообщение Jokasito »

Привет. может комуто и элементарно писать на Си - я же начинающий, мне покачто сложновато (очень много времени уходит на элементарные вещи, потому и прошу хоть какиете наброски для изучения). И насколько я понимаю там есть разница как выводить информацию чтобы картинка неломалась, ведь основной цикл программы может притормаживать вывод картинки. А вообще буду очень ждать эту статью.
Реклама
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение 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

Вот и всё..
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Эх... ну, вроде статья готова... по-моему, учел все... что не учел - пишите, возможно, будут дополнения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

ARV, я согласно вашей статье наконец то разобрался с динамической индикацией, научился её фоново делать. И тут собственно дальше идти надо, а где почитать и как сделать - не знаю...
Вы пишите:
"Фоновая индикация позволит нам в главном цикле просто записать в нужный момент что-то в массив SCR[] – и оно мгновенно отобразится на дисплее!"

А как записать ? Точнее как прочитать из памяти (к примеру EEPROM) и прочитанное записать в SCR ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну вы даете!
записать в массив "экранной памяти" можно так:

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

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

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

SCR[0] = pgm_read_byte(&dannye_vo_flash);
, где dannye_vo_flash - это "переменная" (по факту - константа) в памяти программ[/code]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Спасиб ) Я что-то затупил, вечер поздний был, а подумать что то обленился ))) Научился из памяти читать и записывать в дисплей многомерный массив. Чуть попозжа выложу видео того что получилось ) Собственно сейчас буду пытаться разобраться с тем, как с карты памяти через SPI прочитать текстовый файл с массивом...

А пока вопросик, как организовать бегущую строку ? Но чтобы это было параллельно. Т.е. один массив выводится просто так в SCR[] по кадрам так сказать. А другой массив как бегущая строка. Таким образом матрица картинки показывает, но по определенному сигналу начинает гнать текст в виде бегущей строки.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение 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) у меня контролирует выход изображения за пределы матрицы - это важно!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»