Реле Tianbo - ресурс 10 млн переключений

Светодиодная матрица 11×10 на одном микроконтроллере

PIC16F688

В сети Интернет можно найти множество различных проектов светодиодных матриц, бегущих строк и анимационных экранов, основное применение которых предусматривается в рекламных технологиях. Как правило, большинство конструкций выполнено на микроконтроллерах и отличается своим функционалом, а следовательно и сложностью конструкции, но даже самая простая светодиодная бегущая строка или экран потребуют много времени на разработку, сборку и наладку электронной части, не говоря уже о написании программы микроконтроллера с соответствующим алгоритмами управления светодиодами.

Технология правильного хранения аккумуляторов и батареек по рекомендациям FANSO и EVE Energy

В статье мы рассмотрим самый простой вариант светодиодной матрицы с разрешением 11×10 светодиодов, управляет которой только один микроконтроллер. Проект представляет интерес по нескольким причинам, и управление огромной светодиодной матрицей одним 8-разрядным микроконтроллером лишь одна из них. При разработке проекта автор исходил из доступности электронных компонентов: 110 светодиодов и микроконтроллер PIC16F688 с 11-линиями ввода/вывода. Существует несколько способов управления таким числом светодиодов от одного микроконтроллера, но чаще всего используются различные программные техники мультиплексирования линий ввода/вывода, которые имеют свои преимущества и недостатки. Автор решил реализовать один из методов, который получил название Charlieplexing (мультиплексирование «методом Чарли»).

В разделе «Схемы» сайта Радиолоцман публиковалось несколько статей, посвященных методу мультиплексирования Charlieplexing, поэтому рекомендуется предварительно ознакомиться с основными принципами построения светодиодной матрицы и алгоритмом работы.

К сожалению, автор не предоставляет ни схему светодиодной матрицы, ни схему подключения ее к микроконтроллеру. Однако для желающих повторить конструкцию непременно будет полезен ресурс [2], на котором доступен простой инструмент выбора различных конфигураций светодиодных матриц для метода Charlieplexing, а также схемы подключения их к портам микроконтроллеров и карта значений в регистрах портов ввода/вывода для включения отдельного светодиода в матрице.

Вариант схемы светодиодной матрицы 11×10 представлен на Рисунке 1. Резисторы, указанные на схеме, можно исключить. Подключение матрицы к микроконтроллеру автор описывает следующим образом: 11 линий управления готовой светодиодной матрицы подключаем к 6 выводам порта С и 6 выводам порта A микроконтроллера, за исключением порта RA3 (вывод сброса MCLR). На демонстрационном видео ниже можно сопоставить авторскую схему подключения светодиодов со схемой на Рисунке 1.

Рисунок 1. Схема варианта светодиодной матрицы 11×10 и подключение ее к портам микроконтроллера при использовании метода мультиплексирования Charlieplexing.

Основным недостатком метода Charlieplexing является то, что из любых двух светодиодов в один момент времени может быть включен только один. Но справедливо, что некоторые комбинации светодиодов могут включаться одновременно. Таким образом, чтобы использовать такую матрицу светодиодов для отображения какой-либо информации, необходимо достаточно быстро сканировать всю матрицу и последовательно выполнять включение требуемого светодиода. Небольшое замечание: если сканировать матрицу только по светодиодам, которые необходимо включить, то чем больше светодиодов будет включено, тем ниже будет их яркость свечения. Это слегка раздражает, поэтому необходимо всегда сканировать всю матрицу, но включать только нужные светодиоды. Если придерживаться этого правила, то временной интервал сканирования матрицы будет постоянен, и все светодиоды в матрице будут иметь одинаковый рабочий цикл (1/110) и яркость свечения, независимо от количества включенных светодиодов.

Насколько быстро нужно сканировать матрицу светодиодов? При решении этой задачи необходимо полагаться на инерционность зрительного восприятия, чтобы яркость свечения зрительно воспринимались достаточной. Для человеческого глаза, чтобы получить эту иллюзию, каждый светодиод должен включаться как минимум 25 раз в секунду. Автор выбрал оптимальное значение 30 раз в секунду. Учитывая тот факт, что у нас всего используется 110 светодиодов, это значение увеличивается до 30×110=3300 раз в секунду. Это много! Писать программный код для выполнения таких задач  не является эффективным подходом, поэтому необходимо использовать прерывания. Для микроконтроллера PIC16F688 (на тактовой частоте 8 МГц имеющем производительность 2 MIPS) это означает, что прерывания будут вызываться довольно часто. В этом случае тактирование встроенного таймера Timer0 осуществляется без предделителя (значение инкрементируется один раз за инструкцию), и за время между выходом из обработчика прерывания и вызовом следующего может быть выполнено только 32 инструкции. Таким образом, на техническом языке это означает: в обработчике прерывания по переполнению таймера Timer0 обновляется информация о том, какой светодиод включен, в конце обработчика прерывания счетный регистр таймера перезагружается со значением 0×D0, заставляя его снова переполниться через время, равное выполнению 0×20 инструкций. Для микроконтроллера PIC16F1823 это реализуется немного проще, поскольку он может работать на частоте 32 МГц (производительность 8 MIPS). В этом случае тактирование таймера выполняется через предделитель 1/8,а в счетный регистр таймера загружается значение 0×60.

Реализация управления светодиодной матрицей по прерываниям, означает, что для выполнения основного кода остается совсем мало процессорного времени, но его будет достаточно для формирования изображения, выводимого на дисплей. Автор написал несколько тестовых функций для отображения на светодиодном дисплее различных элементов, но мы рассмотрим пример отображения текущего времени в виде бегущей строки. В программе микроконтроллера используется простой растровый шрифт для визуализации на экране демонстрационной вертикальной строки, отображующей время. Несмотря на то, что в данном приложении используются только цифры и знаки пунктуации, в исходном коде поддерживаются все печатаемые символы таблицы ASCII в диапазоне 0×20 - 0×7F. Любой другой код, генерирующий изображение с разрешением 11×10, также будет работать.

Микроконтроллер PIC16F688 имеет одно преимущество по сравнению с PIC16F1823: объем оперативной памяти в два раза больше. Это позволяет использовать двойной буфер дисплейной памяти (передний, или кадровый буфер, и задний буфер), тем самым обеспечивая возможность реализации достаточно богатого набора программных функций для прорисовки элементов на экране:

  • appBufGet () – возвращает указатель на кадровый или задний буфер;
  • appBufFlip()  – меняет местами кадровый и задний буферы, обеспечивая мгновенную смену текущего изображения на экране изображением из заднего буфера;
  • appBufCopy () – копирование содержимого заднего буфера в кадровый буфер. В этом случае мгновенная смена изображения невозможна, но эта функция может использоваться в приложениях, которые не могут выполнить смену целых буферов;
  • appGetFrameNo () – возвращает номер текущего кадра из 8-разрядного счетчика (0-256);
  • appReadRtc () – возвращает текущее значение времени работы микроконтроллера в единицах RTC_TICKS_PER_SEC. Ввиду того, что используется основной осциллятор микроконтроллера, не стоит ожидать высокой точности отсчета времени при долговременной работе микроконтроллера;
  • appGetRand() – возвращает случайное 16-разрядное значение, при получении которого используется шум АЦП в качестве источника энтропии.

Относительно применения микроконтроллера PIC16F1823 в нашем проекте следует отметить один недостаток: объем ОЗУ недостаточен для реализации двойной буферизации экрана, но, за счет высокого быстродействия, этот недостаток можно компенсировать программно: основной код получает намного больше циклов для подготовки каждого кадра за время  между прерываниями для обновления дисплея.

Что касается микроконтроллера PIC16F688, то он слишком медленный. Добиться повышения его производительности было сложно, поэтому в программном коде используется достаточно много поисковых таблиц данных (lookup table). В одной из них содержатся соответствия номера светодиода паре соединительных линий, к которым он подключен. Затем в нескольких таблицах выполняется преобразование каждой соединительной линии в значения регистров TRIS (управляет режимом ввода/вывода каждой линии порта) и PORT (регистр ввода/вывода), необходимых для установки этой линии. В еще одной таблице хранятся числа битовых сдвигов. Поскольку микроконтроллеры PIC не поддерживают инструкцию сдвига значения влево или вправо произвольное число раз, то самым оптимальным и быстрым решением будет использование функции table[x] вместо (1 << x). Поисковая таблица led2wire (см. исходный код программы микроконтроллера) – это первая таблица, которую вам необходимо будет редактировать после сборки и подключения матрицы светодиодов к микроконтроллеру. В таблице содержится 55 значений: поскольку каждые два последующих светодиода включены параллельно, но в противоположной полярности, нам нет необходимости описывать 110 элементов, достаточно будет 55. Каждый элемент в поисковой таблице представлен один байтом. Старший полубайт обозначает линию, на которой необходимо установить состояние лог. 1, младший полубайт обозначает линию, на которой необходимо установить состояние лог. 0, чтобы включить соответствующий светодиод. Поскольку в нашем случае используются всего 11 линий,  нам вполне достаточно полубайтов. Взглянув на структуру таблицы в исходном коде, вы поймете, как подключается матрица светодиодов к микроконтроллеру, и без труда сможете составить ее для своей светодиодной матрицы. Последнее значение в этой таблице 0×BB означает установку лог. 1 и лог. 0 на 11 линии управления 11. Связано это с тем, что для 11 физических линий управления светодиодной матрицей в программе микроконтроллера используется диапазон 0-10, и, как упоминалось ранее, для того, чтобы яркость светодиодов была одинаковой мы добавляем еще два «виртуальных» светодиода. Они подключены к «несуществующей» 11 линии управления. Эти «виртуальные» светодиоды и соотвествующие линии управления учитываются и в оставшихся поисковых таблицах. Таблица преобразования линий управления в значения регистров TRIS предназначена для настройки выводов микроконтроллера на вход.

Демонстрационное видео

Загрузки и дополнительные материалы

  1. Исходный код программы микроконтроллера - скачать
  2. http://www.modelci.net/charlieplex/ - Метод мультиплексирования Charlieplexing: схемы подключения матрицы светодиодов к портам микрокотнтроллера и карта значений регистров ввода/вывода.

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: One-chip 11×10 LED matrix

53 предложений от 31 поставщиков
Микропроцессор PIC, Ядро 8bit, 7K-Flash 256B-SRAM 256B-EPROM, 20MHz, 2.0V…5.5V, -40°C…85°CМикроконтроллеры PIC (Peripheral Interface Controller) - это программируемые ППЗУ, имеют малое энергопотребление,...
ЗУМ-СМД
Россия
PIC16F688-I/SL
Microchip
36 ₽
PIC16F688-I/SL
Microchip
44 ₽
EIS Components
Весь мир
PIC16F688-I/SL
Microchip
88 ₽
PIC16F688-I
Microchip
от 175 ₽
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя