Для реализации проекта понадобится 4 светодиодных матрицы 8х8, 4 сдвигающих регистра 74HC595 и управляющий микроконтроллер TINY13A. Задача заключается в том, чтобы зажечь все 256 светодиодов от нашего 8-выводного микроконтроллера TINY13A. Для этого дела выводов на данном микроконтроллере явно маловато, по этому будем расширять порты регистрами сдвига.
Что бы всё работало я написал небольшую “детскую” программку, которая просто дрыгает тремя ногами в нужной нам последовательности.
Никаких протоколов, чистая классическая дерготня.
Расположение портов (выводов) микроконтроллера TINY13A в программе следующее: порт B0 (5) данные, порт B1 (6) синхронизация, B2 (7) защёлка регистров, B3 (2) кнопка переключения «статика-движение».
Сама программа берёт данные с EEPROM и последовательно выдаёт их побитно в регистры сдвига. Так как регистры включены последовательно, то за один раз выдаётся 32 бита. Срабатывает защёлка регистров и мы имеем на светодиодной матрице одну строку. Затем процесс повторяется ещё 15 раз и далее по кругу.
Код изображения хранится в EEPROM микроконтроллера TINY13A для того что бы вы могли её самостоятельно переписывать и рисовать что душе угодно.
В регистры мы подаем сперва 16 разрядов данных затем 16 разрядов развёртки.
Мы можем прописать всю строку данных и развертку совместно одной строкой в EEPROM.
Емкость EEPROM контроллера TINY13A составляет 64 байта по 8 бит. И того, у нас памяти 512 бит.
Этой ёмкости как раз хватает на данные, плюс развертка 32 бита на 16 строк. Но мы немного сделаем по другому, разделим изображение и развёртку, а развертку перенесём в программный код, там есть ещё место для этого. В результате у нас в памяти EEPROM останется место на два полных кадра 16х16.
Таким приёмом мы получаем две статичных картинки. Для того что бы получить динамику или по другому бегущую строку, надо циклично смещать развёртку в одну или другую сторону, после каждого полного кадра. Как только первый кадр сместится на 16 строк вниз включается второй кадр.
Частота кадров при выставленной конфигурации бит на 4 МГц составляет 16 кадров в секунду. Ну и неплохо было бы добавить статичный режим картинки. Для такой цели я сделал опрос 3 порта контроллера на который повесил кнопку. Если кнопка разомкнута у нас бегущая строка, нажимаем кнопку и картинка останавливается, но кадры на экране продолжают чередоваться.
Во время отладки кода изображения, что бы отследить работу каждой строки, необходимо переключится на частоту внутреннего генератора 128 кГц. Для этого необходимо выставить бит конфигурации как показано ниже.
Ещё одна особенность работы с регистрами сдвига заключается в следующем. Читая данные с памяти, мы обычно читаем младший байт первым и сразу подаём его в регистры. В результате сдвига в регистрах наш младший байт оказывается старшим, а старший который читается вторым, становится младшим. Эту особенность нужно учитывать при написании кода изображения. И тут есть два приёма: Первый это писать код в том порядке как он выходит на регистры. Второй способ это написать как есть и затем сделать «перестановка байт» в любом программаторе или редакторе кода. Я жутко ленивый, по этому пользуюсь вторым способом
Один важный момент. Так как в матрице у нас светодиоды то для засветки поля матрицы необходимо подать на развертку 1, а на данные 0. Это не очень удобно когда кодируешь таблицу изображений, по этому я сразу прописал инверсию данных при выводе из порта микроконтроллера TINY13A, что бы не делать это вручную.
Второй способ создать анимацию на экране заключается в том что мы двигаем читаемую адресную строку данных в сторону второго кадра. Здесь плюс в том что изображение плавно перетекает из одного кадра в другой. Вторая программа в проекте как раз показывает как это действие происходит на экране.
Переходим к работе с EEPROM.
Для редактирования изображения в формате 16х16 пикселей можно использовать любой подходящий редактор графики. Так же возможно делать это просто на листе бумаги.
И так у нас есть вот такая конструкция экрана, на котором нарисован робот.
Тут мы видим в каком направлении двигаются строки и как записываются данные в строку.
Каждую строчку на картинке прописываем начиная снизу вверх в двоичном режиме, где светодиод горит там 1 где потушен там 0 .
Итого получилось 16 строк с данными для первого кадра:
0000110000011000
0000010000010000
0000010000010000
0001111111111100
0000111111111000
0000011111110000
0001111111111100
0010000111000010
0000000010000000
0001111111111100
0001000010000100
0001011010110100
0001011010110100
0001000010000100
0001111111111100
0000000000000000
Берем калькулятор Windows и переводим данные каждой строки в hex формат.
Получаем:
0C18\0410\0410\1FFC\0FF8\07F0\1FFC\21C2\0080\1FFC\1084\16B4\16B4\1084\1FFC\0000
После чего нам необходимо прописать эти данные в таблицу EEPROM вашего программатора для TINY13A.
Обратите внимание что старший и младший байты в таблице поменяны местами, о чем я выше уже писал. Две нижних строчки в таблице это второй кадр, придумайте сами, что туда прописать.
Биты конфигурации для программирования выставляются как на картинке ниже:
В приложенном архиве вы найдёте программу , схему и несколько картинок в коде.
Видео демонстрация:
Примеры картинок 16Х16:
- http://pxlshp.com
- http://www.drawbang.com
Autor: Сучков Роман. г Соликамск.