8 ферзей на AVR-ассемблере
Фанатам ассемблера посвящается.
Всем привет! Решил подключить матрицу светодиодов 8×8 и вывести на неё решение задачи о 8 ферзях. [Описание см. на Википедии]
Процессор
В качестве процессора я выбрал компактный и шустрый процессор attiny85. Программа будет написана на ассемблере. С небольшими настройками программа должна работать на любом другом процессоре AVR: attiny и atmega.
Дисплей
В качестве дисплея используем матрицу светодиодов, которая состоит из 8 вертикальных рядов и 8 горизонтальных строк со светодиодами.
Матрица светодиодов 8×8
У меня матрица с общим катодом, это значит, чтобы задействовать выбранный ряд, на него нужно подать Ноль, а на строки Единицы. Тогда в местах пересечения ряда и строк мы получим включённые светодиоды.
Сдвиговые регистры
У матрицы 16 выводов и все нужно задействовать, чтобы управлять 64 светодиодами. У нашего процессора всего 6 выводов, из них доступны только 5, поэтому придётся увеличить число выводов данных. Проще всего это сделать с помощью сдвиговых регистров.
Работа сдвигового регистра
Регистр работает по протоколу SPI: принимает на вход последовательный сигнал: Биты данных и Сигнал тактирования и на их основании формирует 8 параллельных битов данных. Для нашей схемы, чтобы получить 16 выводов, потребуется 2 таких регистра.
Существуют матрицы светодиодов со встроенными регистрами сдвига, напр.: с микросхемой MAX7219 на борту, но у меня под рукой такой модели не оказалось, поэтому решил немного заморочиться, протянув от сдвиговых регистров к матрице большую связку проводов :). Однако такой подход позволяет быстрее разобраться в устройстве управления матрицей :).
Динамический вывод изображения
В каждый момент времени матрица может отображать только один ряд данных. Поэтому, чтобы сформировалось изображение, приятное глазу, нужно вывести первый ряд с включенным светодиодом, выдержать короткую паузу, перейти к следующему ряду, отключив предыдущий. И так доходим до последнего 8-го ряда.
Переключение светодиодов происходит почти мгновенно, поэтому глаз не успеет разглядеть включённые светодиоды. Поэтому давайте повторим обновление матрицы 50 раз, и всё будет хорошо :). Такой подход к выводу изображения называется динамическим выводом.
Рабочая схема
Среда разработки
Для написания программы на ассемблере я использую Notepad++. Здесь же выполняю компиляцию, контроль ошибок, загрузку машинных кодов в процессор attiny85 и здесь же начинал писать эту статью. :) Для настройки возможности компиляции и загрузки в процессор задействую стандартный плагин NppExec, который позволяет по кнопке F6 выбрать команду, которую нужно выполнить.
На видео показаны последовательно два процесса: компиляции и загрузки в процессор.
Исходный текст программы
Исходный текст программы на ассемблере разбит на несколько файлов. Так делать всегда не обязательно и небольшую программу можно целиком написать одним файлом.
В головном файле ferz_direct.asm описана инициализация процессора для работы со стеком, настройка выводов процессора на выход, запуск перебора вариантов и их динамическое отображение на матрице светодиодов.
Имя включаемого файла | Назначение |
attiny85.inc | Перечислены имена и номера регистров и имена и номера битов: DDRB, PORTB и др. |
pausa.inc | Пауза: цикл в цикле в цикле. Вполне подходит для нашей программы, т. к. мы не особо заботимся об энергоэффективности процессора. |
commands.inc | Содержит макрос, упрощающий запись в регистр ввода-вывода. |
SPI_master.inc | Тактирует вывод данных, управляет состоянием защёлки обоих сдвиговых регистров. |
next_variant.inc | Поиск решений расстановки ферзей: алгоритм был взят из ретро-книги по программированию на Фортране. :) |
Компиляция программы
А сейчас переходим к компиляции программы в двоичные коды. Я использовал компилятор avra.exe. Исходники можно скомпилировать с помощью GCC и получить исполняемый exe-файл. Я так и поступил. Компилятор avra.exe находится во вложении.
Программа на ассемблере для процессоров AVR компилируется в файл hex, который с помощью загрузчика можно перенести в наш процессор.
Процесс компиляции показан на видео выше.
Запись программы в процессор
Полученный hex-файл с помощью программы avrdude.exe сначала выгружается в программатор, в его роли выступает Arduino Uno. Затем Arduino транслирует hex-файл в электрические сигналы, необходимые для загрузки файла в процессор attiny85.
Процесс компиляции с помощью avrdude.exe показан на видео выше.
А вы заметили?
Имена меток и прочие имена приходится писать на латинском языке, насколько вам это удобно? Никто ведь не запрещает использовать кириллические имена, напр.: Метка1 вместо LabelNumber1 или Цикл_по_строкам вместо cycle_by_strings. Достаточно сделать небольшую доработку, и тогда ваша программа станет более удобочитаемой.
Результат
В итоге мы получили работающую программу.
Чего хотят хакеры?
Уважаемые, хакеры, чтобы разобраться во всех тонкостях работы процессора, ассемблера и схемы подключения, нужно аккуратно вникнуть во всем эти тонкости. Это требует определённого времени и усилий с вашей стороны.
В этой статье я показал демонстрацию работоспособность программы на ассемблере по поиску положения ферзей на шахматной доске и вывода результат на дисплей.
Изучать работу процессора на низком уровне весело, полезно и интересно. Это помогает лучше разобраться в железе и программировании. А вы обратили внимание на размер получившейся программы? Кстати, размер можно уменьшить, было бы только желание! :)
Напишите, пожалуйста, что бы хотели узнать о работе схемы про 8 ферзей, и я отвечу в следующей статье. Возможно, вас заинтересует программа на ассемблере, а может и нет. Я ещё не успел рассказать, откуда взялся файл avrdude.exe и как подключить arduino к компьютеру и нашему миниатюрному процессору. Жду ваши комментарии и вопросы.
Я пишу то, что вам интересно!
Благодарю за внимание!
Скачать исходники можно здесь