Обновление : практическая реализация этого сделана в проекте Tapuino, выполненном Питером Эдвардсом. Проверьте это, все с открытым исходным кодом: https://github.com/sweetlilmre/tapuino
Я работаю над проектом, в котором я использую Arduino для потоковой передачи файлов данных ленты TAP с моего компьютера на C64. Программная сторона проекта идет хорошо, но я все еще новичок в электронике, и я не люблю жарить мой Commodore. Так что на самом деле мне нужна помощь по аппаратному интерфейсу.
Ленты C64 используют ШИМ-модуляцию для сохранения программы на кассете, а при считывании данных триггер opamp + schmitt преобразует аудиосигнал в прямоугольные волны. Каждый переход с высокого на низкий уровень запускает прерывание в машине, а расстояние между двумя прерываниями (которое является длиной импульса) представляет атомную часть потока.
Распиновка порта кассеты выглядит следующим образом (верхняя и нижняя сторона имеют одинаковые контакты дважды):
А-1 , земля, земля
B-2 , + 5 В, 5 В постоянного тока
C-3 , MOTOR, управление двигателем, ок. 6 Вольт питания двигателя
D-4 , READ, ввод данных, чтение данных из набора данных
E-5 , ЗАПИСЬ, Вывод данных, запись данных в набор данных
F-6 , SENSE, обнаружение, если нажата одна из клавиш PLAY, RECORD, F.FWD или REW
Моя текущая идея заключается в следующем:
На основе Синей книги сопряжения C64 (начиная со стр. 29) аппарат использует уровень TTL на порте READ и WRITE, поэтому я предполагаю, что могу напрямую подключить вывод PWM от Arduino к выводу READ.
Мне также нужно взаимодействовать с контактом SENSE. Я думаю, что я могу напрямую подключить это также к одному из цифровых ПИН-кодов и написать цифровое НИЗКОЕ значение, когда мне нужно будет сигнализировать о состоянии нажатой кнопки. Это верно?
Позже я хочу обнаружить наличие сигнала + 6V на выводе MOTOR. Некоторые загрузчики останавливают набор данных в середине процесса загрузки, поэтому я должен обнаружить это, чтобы правильно эмулировать ленту. Должен ли я использовать какой-то резистор для ограничения тока или я могу подключить его напрямую? Может быть, я должен использовать реле там?
Ответы:
Согласно предоставленному вами документу, порт набора данных ищет чистый цифровой сигнал с переменным рабочим циклом (0,75 для H, 0,25 для L).
Пока вывод Arduino может управлять достаточным током (он должен быть в состоянии) и работает при 5 В, прямое соединение будет работать. Возможно, вы захотите исследовать использование буфера TTL между Arduino и C64 (питание буфера будет осуществляться от источника питания +5 порта набора данных, а заземление будет общим для C64 и Arduino).
Что касается SENSE, было бы проще использовать цифровой выход для управления MOSFET с малым сигналом (например, 2N7002) - высокий логический уровень включает MOSFET, который выводит контакт SENSE (подключенный к стоку) на землю (подключенный к источнику) без Arduino, чтобы потопить любой ток вообще.
Вывод MOTOR также можно использовать для управления воротами MOSFET. Сток должен быть поднят до напряжения питания Arduino со слабым подтягиванием (10 кОм или около того), источник подключен к земле. Сток также будет идти к цифровому логическому выводу. Когда MOTOR имеет высокий уровень, логический вход низкий, и наоборот, и Arduino видит чистый логический сигнал.
Например...
Обратите внимание, что в качестве буфера используются два вентиля NAND. (Можете ли вы сказать, что я использовал для поиска деталей?)
TTL довольно устойчивый. Я не думаю, что есть большой шанс повредить что-либо.
источник
Похоже, интересный проект. Насколько я помню, аппаратное обеспечение VIC-20 подало импульсы из набора данных в схему обнаружения фронтов (я забываю, обнаружил ли он нарастающие или падающие фронты); подпрограммы загрузки ленты C64 были совместимы с таковыми в VIC-20, поэтому я не думаю, что стандартный загрузчик мог бы использовать какие-либо приемы, которые VIC-20 не поддерживал бы, хотя пользовательские загрузчики могли бы. Я никогда не играл с вещами в тот день достаточно, чтобы определить, преобразует ли сама База данных как восходящие, так и падающие фронты в импульсы (например, путем подачи отложенного и неотложенного сигнала в вентиль XOR). Я придумал процедуру преобразования данных в ширину импульсов, но так и не понял, как вообще использовать детектор контуров.
Что касается передачи данных с ПК на C64, если вы не хотите использовать звуковую карту (некоторые звуковые карты имеют обработку стереоизображения и такие, которые могут нанести ущерб фазе исходящего звука), есть два подхода: может предложить: (1) отправить данные об интервале импульсов с ПК на Arduino и просто иметь отдельные исходящие импульсы времени Arduino. Возможно, закодируйте формат данных двумя импульсами на байт, используя что-то вроде следующего кодирования:
Я не думаю, что какие-либо схемы загрузки будут пытаться синхронизировать импульсы с точностью лучше, чем 3us, и эта схема позволит отправлять данные через UART в 115200. ПК должен добавить байты заполнения 0xFF, чтобы скорость, с которой данные отправлялись в Arduino будет достаточно хорошо соответствовать скорости, с которой Arduino его разгоняет. Поскольку для обработки каждого nybble требуется от 44 до 80 микросекунд, Arduino должен будет опрашивать свой UART только между nybbles и может отключать прерывания в конце каждого импульса. Если ПК использует свои данные достаточно эффективно, можно либо (1) заставить ПК попытаться отправить данные немного быстрее, чем Arduino, чтобы выводить их, и использовать аппаратное или программное подтверждение для его замедления, либо (2) иметь Arduino сбрасывать микросекунды с каждого импульса, когда его буфер почти заполнен, или добавить микросекунду к каждому импульсу, когда его буфер почти пуст. Чтобы избежать глюков звука в результате кратковременных сбоев ПК, можно заставить Arduino приостанавливать вывод в байте «хорошо, чтобы приостановить здесь», если его буфер был почти не заполнен.
источник