Прошло около года с момента успешного подключение музыкального синтезатора YM2149F к LPT-порту компьютера .
LPT — это, конечно, хорошо, но время не стоит на месте, и найти компьютер или ноутбук с LPT-портом становится все сложнее.
Да и сам автор (то есть я) устал каждый раз лезть под стол, где стоит системный блок, и втыкать плату LPT во что-то другое, например в программатор (у меня есть программатор Willem LPT, но не в этом суть) ).
Поэтому на этот раз мы подключим микросхему YM2149F к USB. И конечно, чтобы соответствовать требованиям эпохи, мы сделаем это на дешевом старинном микроконтроллере.
PIC16F628 .
Короче говоря, YM2149F (или его функциональный эквивалент AY-3-8910 ) — микросхема трёхголосного аудиосинтезатора, использовавшаяся в старых компьютерах, таких как Atari ST, Amstrad CPC, ZX Spectrum, MSX и некоторых других, для воспроизведения музыки.
В России чип приобрел некоторую популярность благодаря его установке в различные клоны ZX Spectrum. Во время шествия ZX Spectrum по территории бывшего СССР музыканты написали для этого программируемого звукового генератора тысячи мелодий.
И даже сейчас легко можно найти людей, создающих музыку специально для этого чипа.
В конце статьи будут ссылки на огромный архив чип-тюнов для YM/AY на сотни часов непрерывного прослушивания.
Демо
Как и в прошлый раз, перед началом сразу дам ссылку для прослушивания конечного результата: https://soundcloud.com/tronix286 Последние записи были сделаны с этого устройства.Записывал так себе плеером, который записывает MP3 максимум 128Кб/с, так что в реальности аппарат звучит «ярче».
Но общее представление о звуке получить можно.
Железо
Почему такой странный выбор контроллера? Почему бы не AVR/ARM/iCore i7/FTDI в худшем случае? Частично ответ на этот вопрос был дан в начале темы: для ретро-синтезатора - ретро-микроконтроллер! Более того, AY-3-8910 и Microchip, можно сказать, имеют общие корни.В общем, возникла череда странных обстоятельств.
Во-первых, я наткнулся в Интернете на библиотеку, реализующую программный стек USB 1.1 для микроконтроллеров PIC16F628 — вот эта библиотека: 16ФУСБ .
Во-вторых, у меня давно лежала и пылилась парочка PIC16F628A, с которой я не знал, что делать.
В-третьих, на компьютере уже было настроенное программное обеспечение (MPLABX, MPASM) и программатор для PIC. Ну, в отличие от программного стека V-USB на известном многим AVR мало или даже нет проектов на ПИКах без аппаратного USB. А это значит, что историческую несправедливость необходимо восстановить.
Вот типовая схема подключения с сайта библиотеки 16fusb:
В библиотеке 16fusb есть хороший пример под названием «direct-io».
Смысл простой — отправляем байт по USB и он «отображается» на восьми ножках микроконтроллера.
Также можно отправить два дополнительных сигнала управления, то есть еще два бита (или две ножки).
И в обратную сторону, то есть от контроллера к хосту (компьютеру).
Для управления YM2149F используется восьмибитная шина данных D0-D7 и три сигнала управления BC1, BDIR и RESET. BC1 и BDIR управляют выбором адреса регистра и его значения, а также переводят микросхему в неактивное состояние.
Сигнал RESET используется для сброса всех регистров в исходное значение.
Таким образом, чтение с PIC на компьютер не требуется; Все, что вам нужно, это возможность отправлять команды в YM. И нам нужен третий управляющий сигнал, а значит еще одна ножка МК.
В своей прошивке для управления конкретно YM2149F было сделано следующее:
- все, что связано с чтением сигналов с PIC на хост (компьютер), выкинуто для увеличения скорости обработки USB-запросов;
- состояние направлений портов ввода/вывода жестко запрограммировано при инициализации МК и не меняется в процедурах выдачи байтов в ноги.
- организован кольцевой буфер объемом 64 байта.
При декодировании запроса от хоста байты добавляются в буфер.
Когда есть свободное время, данные из буфера выводятся в YM.
- Оптимизирована скорость выдачи байт на ножки МК.
Частично из-за жестко запрограммированных направлений ввода-вывода, частично из-за знания предыдущего состояния битов управления.
- Исправлена ошибка с зацикливанием PIC после нескольких тысяч пакетов (расширен цикл RxLoop в файле isr.asm, вместо goto RxLoop вставлена проверка на признак конца пакета)
- что-то еще, я не помню
Можно было бы перенести на него функционал перехвата окончания USB-пакета (EOP) с ножки RB2, но это не так просто - в отличие от ножки RB2, ножка RA5 разделяет функционал с MCLR и VPP по программированию и вход организован внутри как триггер Шмитта.
После диодов просто не хватает напряжения для его срабатывания.
С другой стороны, для тактирования YM2149F собран генератор на микросхеме 74HC02 и кварце 3,579545 МГц.
Я мог бы попытаться использовать вторую свободную половину микросхемы для сборки аналогичного генератора для ПОС, но меня остановили два обстоятельства: 1) у меня нет кварца на 24 МГц (но у меня был кварцевый генератор от какой-то древней матери) 2) Я не знаю, как поведет себя 74HC02, если у него с «разных сторон» разные частоты, и одна из них довольно высокая (24 МГц — это все-таки очень высокая частота).
Еще один вариант освобождения ножки RA6 для кварца: Сигналы BC1 и BDIR принимают только следующие значения:
И никогда BC1 = 1, BDIR = 0. Это можно использовать как RESET, добавив логику НЕ и ИЛИ из половины микросхемы 74HC02 и инвертировав выходной сигнал с помощью транзистора.BC1 BDIR 0 0 0 1 1 1
Конечно, чтобы выводить BC=1 и BDIR=0, нужно немного подправить прошивку.
А еще, ножка RA4, управляющая сигналом BDIR, представляет собой открытый коллектор, поэтому ее необходимо подключить к источнику питания — на схеме это резистор R5 номиналом 10К.
Программное обеспечение
На компьютере в качестве музыкального проигрывателя выступает отличный кроссплатформенный проигрыватель чип-тюнинга.
ZX Тюнинг :
Он не поддерживает USB напрямую, но если находит в своем каталоге одну из библиотек dlportio.dll/inpout32.dll/inpoutx64.dll, то позволяет переключить настройки вывода звука на YM-LPT ( для предыдущего проекта ), а затем использует функцию __stdcall void DlPortWritePortUchar(unsigned short port, unsigned char val); для вывода байтов YM2149. Порт 0x378 данные, Порт 0x37a передача сигналов управления (D1 - ~BDIR, D2 - BC1, D3 - ~RESET).
Таким образом, можно написать небольшую библиотеку-заглушку с одной-единственной функцией DlPortWritePortUchar, в которой можно перенаправить вывод байтов на USB-устройство, что и было сделано.
Я просто взял исходники библиотеки вход32 за основу и написал функцию-заглушку для перенаправления вывода байтов на это устройство.
В итоге достаточно поставить вот эту библиотеку-заглушку input32.dll или inputx64.dll , в зависимости от версии используемого плеера (x86/x64), в одной директории с плеером ZX Тюнинг , запускаем его и перемещаем устройство в настройках звука айлпт до самого верха (как на скриншоте выше).
Скачать бесплатно и без СМС
Драйвера для Win XP, Win 7 (x32/x64) можно скачать здесь: 16FUSB_driver-libusb-win32-1.2.6.0.zip Схема устройства: ym-usb_scheme_1.0.rar Скомпилированная прошивка (.hex) и скомпилированные заглушки DLL: ym-usb_firmware_and_DLLs_v1.2.rar Исходники прошивки: ym-usb_PIC16F628A_source_v1.2.rar Исходные коды библиотеки-заглушки: inpout32-64_DLL_source_v1.2.rar Руководство по данным программируемого звукового генератора (PSG) General Instruments AY-3-8910/8912: http://bulba.untergrund.net/AY-3-8910.rar Тема на форуме ZX.PK.ru, из которой «родился» аппарат: http://zx-pk.ru/showthread.phpЭt=22202 Огромный архив трекерной музыки: Модланд ( FTP ) Музыка ZX онлайн: http://zxtunes.com/ Всего наилучшего! Теги: #Звук #ZX Spectrum #chiptune #PIC16 #PIC16 #ay-3-8910 #YM2149F #LPT
-
Конференции, Которые Ждут Нас В 2015 Году
19 Oct, 24 -
Обзор Программ Qt
19 Oct, 24 -
Стартап, Юридическая Сторона.
19 Oct, 24 -
Алгоритмы Сжатия Данных Без Потерь, Часть 2
19 Oct, 24