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

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

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

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

Комментарии (5)


  1. gleb_l
    19.11.2021 18:26
    +5

    Русский язык в метках и переменных выглядит а-ля СССР 80-х, что режет глаз в современных реалиях (ликвидные на рынке программисты способны читать как минимум технический текст на английском, и грамотно именовать переменные/макросы/метки итд на том же английском). Поэтому, когда в 2021 году видишь метки транслитом - начинаешь подозревать синдром Диогена (изолированность от среды/аутизм), либо профдеформацию от работы в росструктурах ;). В остальном - прикольно.


    1. jrimski Автор
      19.11.2021 19:25
      +4

      Спасибо за отклик. Не все язык учили, я не про себя)


    1. Int_13h
      20.11.2021 05:14
      +1

      Это вам просто повезо, если вы не разбирали сырцы немецких, итальянских или китайских погромистов. И если у последних только с комментариями квест, то у первых двух не только переменные, но и функцыи загадочно обзываются :)


    1. Alexeyslav
      21.11.2021 15:01
      -2

      Нет, это просто проблема 8-битных символов и кодировок, существовавшая ранее довольно долго из-за чего существовали строгие ограничения на используемый язык - зарубежные компилляторы не поддерживали кирилицу в принципе и в случае использования кирилических символов(казалось бы какая разница компилятору какие символы используются?) возникали весьма разнообразные эффекты. Поэтому довольно долгое время брали за правило использовать только латиницу. Но сейчас это кажется весьма странным. И единственное неудобство - необходимость частого переключения между языками, т.к. операторы и ключевые слова остались на латинице.


  1. oleshii
    20.11.2021 14:08

    Однозначный плюс, решпект, уважуха !