Взаимодействие Arduino с ленточным портом C64


8

Обновление : практическая реализация этого сделана в проекте Tapuino, выполненном Питером Эдвардсом. Проверьте это, все с открытым исходным кодом: https://github.com/sweetlilmre/tapuino


Я работаю над проектом, в котором я использую Arduino для потоковой передачи файлов данных ленты TAP с моего компьютера на C64. Программная сторона проекта идет хорошо, но я все еще новичок в электронике, и я не люблю жарить мой Commodore. Так что на самом деле мне нужна помощь по аппаратному интерфейсу.

Ленты C64 используют ШИМ-модуляцию для сохранения программы на кассете, а при считывании данных триггер opamp + schmitt преобразует аудиосигнал в прямоугольные волны. Каждый переход с высокого на низкий уровень запускает прерывание в машине, а расстояние между двумя прерываниями (которое является длиной импульса) представляет атомную часть потока.

Распиновка порта кассеты выглядит следующим образом (верхняя и нижняя сторона имеют одинаковые контакты дважды):

C64 порт ленты

А-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. Некоторые загрузчики останавливают набор данных в середине процесса загрузки, поэтому я должен обнаружить это, чтобы правильно эмулировать ленту. Должен ли я использовать какой-то резистор для ограничения тока или я могу подключить его напрямую? Может быть, я должен использовать реле там?


ШИМ-сигнал от Arduino поступает на вывод WRITE (не READ).
Телаклаво

Мне нравится эмулировать набор данных с Arduino, поэтому я должен взаимодействовать с выводом READ, потому что именно здесь C64 принимает ввод.
Надя

Насколько я понимаю формат данных, вы не повторяете импульсы, как классический сигнал ШИМ - но это комбинация длинных, средних и длинных импульсов, которые переносят данные. Может ли Arduino отправлять такие сигналы ШИМ?
Johncl

Ответы:


4

Согласно предоставленному вами документу, порт набора данных ищет чистый цифровой сигнал с переменным рабочим циклом (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 видит чистый логический сигнал.

Например...

Arduino для C64 V1

Обратите внимание, что в качестве буфера используются два вентиля NAND. (Можете ли вы сказать, что я использовал для поиска деталей?)

TTL довольно устойчивый. Я не думаю, что есть большой шанс повредить что-либо.


Вау, хорошие схемы. Я думаю, что сначала я попытаюсь подключить PWM выход Arduino напрямую к D-4, потому что он также использует 5V. В любом случае, благодарю Вас! :)
NagyI

@NagyI Это должно работать.
Адам Лоуренс

О боже, я не принял этот ответ? Мне стыдно. Во всяком случае, я только что заказал коннектор ленты, чтобы попробовать это, и моя паяльная станция прибывает на следующей неделе.
Надеюсь,

Поскольку я не мог получить 2N7002, мой коллега предложил мне вместо этого BS170. Смысловая сигнализация работает отлично. Однако обнаружение двигателя не работает. Arduino всегда читает логику низко. Неважно, если я поставлю Gate на Low или High, Arduino всегда читает логику low. Это проблема BS170 или что-то другое? Я пробовал это с другим BS170, но проблема остается. Мне кажется, что BS170 может переключать только GND, но не напряжение.
NagyI

2

Похоже, интересный проект. Насколько я помню, аппаратное обеспечение VIC-20 подало импульсы из набора данных в схему обнаружения фронтов (я забываю, обнаружил ли он нарастающие или падающие фронты); подпрограммы загрузки ленты C64 были совместимы с таковыми в VIC-20, поэтому я не думаю, что стандартный загрузчик мог бы использовать какие-либо приемы, которые VIC-20 не поддерживал бы, хотя пользовательские загрузчики могли бы. Я никогда не играл с вещами в тот день достаточно, чтобы определить, преобразует ли сама База данных как восходящие, так и падающие фронты в импульсы (например, путем подачи отложенного и неотложенного сигнала в вентиль XOR). Я придумал процедуру преобразования данных в ширину импульсов, но так и не понял, как вообще использовать детектор контуров.

Что касается передачи данных с ПК на C64, если вы не хотите использовать звуковую карту (некоторые звуковые карты имеют обработку стереоизображения и такие, которые могут нанести ущерб фазе исходящего звука), есть два подхода: может предложить: (1) отправить данные об интервале импульсов с ПК на Arduino и просто иметь отдельные исходящие импульсы времени Arduino. Возможно, закодируйте формат данных двумя импульсами на байт, используя что-то вроде следующего кодирования:

0000-1100 - Выведите максимум 20 мс, а затем минимум 24-60 мкс (кратно 3 мкс)
1101 - Низкий выход 40us
1110 - Выход 80 мс
1111 - байтовые значения $ FF будут игнорироваться
          - Другие модели с одним nybble, равным 1111, могут быть использованы для имитации
             кнопки ленточного мотора или индикация «можно здесь остановиться».

Я не думаю, что какие-либо схемы загрузки будут пытаться синхронизировать импульсы с точностью лучше, чем 3us, и эта схема позволит отправлять данные через UART в 115200. ПК должен добавить байты заполнения 0xFF, чтобы скорость, с которой данные отправлялись в Arduino будет достаточно хорошо соответствовать скорости, с которой Arduino его разгоняет. Поскольку для обработки каждого nybble требуется от 44 до 80 микросекунд, Arduino должен будет опрашивать свой UART только между nybbles и может отключать прерывания в конце каждого импульса. Если ПК использует свои данные достаточно эффективно, можно либо (1) заставить ПК попытаться отправить данные немного быстрее, чем Arduino, чтобы выводить их, и использовать аппаратное или программное подтверждение для его замедления, либо (2) иметь Arduino сбрасывать микросекунды с каждого импульса, когда его буфер почти заполнен, или добавить микросекунду к каждому импульсу, когда его буфер почти пуст. Чтобы избежать глюков звука в результате кратковременных сбоев ПК, можно заставить Arduino приостанавливать вывод в байте «хорошо, чтобы приостановить здесь», если его буфер был почти не заполнен.


Спасибо за идеи. На самом деле я передаю данные из файла TAP прямо в Arduino. Он определяет каждый импульс одним байтом. (см. c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders ) Преодоление сбоев при передаче данных. Я использую кольцевой буфер размером 1 КБ на Arduino, который заполняется в основном цикле. Данные потребляются функцией прерывания, связанной с событием совпадения генератора ШИМ. Это вызывается дважды за импульс. Вот где я меняю уровень ПИН-кода, а при переходе с высокого на низкий уровень я записываю новое значение регистра совпадения в соответствии со следующим байтом.
Надя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.