8 ферзей на AVR-ассемблере

Фанатам ассемблера посвящается.

Всем привет! Решил подключить матрицу светодиодов 8×8 и вывести на неё решение задачи о 8 ферзях. [Описание см. на Википедии]

Процессор

В качестве процессора я выбрал компактный и шустрый процессор attiny85. Программа будет написана на ассемблере. С небольшими настройками программа должна работать на любом другом процессоре AVR: attiny и atmega.

Дисплей

В качестве дисплея используем матрицу светодиодов, которая состоит из 8 вертикальных рядов и 8 горизонтальных строк со светодиодами.

Матрица светодиодов 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 к компьютеру и нашему миниатюрному процессору. Жду ваши комментарии и вопросы.

Я пишу то, что вам интересно!
Благодарю за внимание!

Скачать исходники можно здесь

© Habrahabr.ru