Update : Eine praktische Umsetzung erfolgt im Tapuino-Projekt von Peter Edwards. Probieren Sie es aus, alles ist Open Source: https://github.com/sweetlilmre/tapuino
Ich arbeite an einem Projekt, in dem ich mit meinem Arduino TAP-Banddatendateien von meinem PC auf den C64 streame. Die Software-Seite des Projekts läuft gut, aber ich bin noch neu in der Elektronik und ich mag es nicht, meinen Commodore zu braten. Also brauche ich eigentlich Hilfe bei der Hardware-Schnittstelle.
C64-Bänder verwenden PWM-Modulation, um Programme auf Kassetten zu speichern und beim Zurücklesen der Daten ein Opamp + Schmitt-Trigger wandelt das Audiosignal in Rechteckwellen um. Jeder High-Low-Übergang löst einen Interrupt in der Maschine aus, und der Abstand zwischen zwei Interrupts (dh die Länge des Impulses) repräsentiert einen atomaren Teil des Stroms.
Die Pinbelegung des Kassettenanschlusses sieht folgendermaßen aus (die obere und die untere Seite haben zweimal die gleichen Stifte):
A-1 , GND, Masse
B-2 , + 5 V, 5 Volt Gleichstrom
C-3 , MOTOR, Motorsteuerung, ca. 6 Volt Stromversorgung des Motors
D-4 , READ, Dateneingabe, Daten aus der Datasette lesen
E-5 , SCHREIBEN, Datenausgabe, Daten in Datasette schreiben
F-6 , SENSE, Detection, wenn eine der Tasten PLAY, RECORD, F.FWD oder REW gedrückt wird
Meine aktuelle Idee ist folgende:
Basierend auf dem C64 Interfacing Blue Book (ab Seite 29) verwendet das Gerät den TTL-Pegel am READ- und WRITE-Port, sodass ich einen PWM-Pin vom Arduino direkt mit dem READ-Pin verbinden kann.
Ich muss auch mit dem SENSE-Pin verbinden. Ich denke, ich kann das auch direkt mit einer der digitalen PINs verbinden und dort digital LOW schreiben, wenn ich den Status einer gedrückten Taste signalisieren muss. Ist das korrekt?
Später möchte ich das Vorhandensein eines + 6V-Signals am MOTOR-Pin feststellen. Einige Lader stoppen den Datensatz mitten im Ladevorgang, daher muss ich dies ebenfalls erkennen, um das Band korrekt zu emulieren. Sollte ich einen Widerstand verwenden, um den Strom dort zu begrenzen, oder kann ich das auch direkt anschließen? Vielleicht sollte ich dort ein Relais verwenden?
Antworten:
Gemäß dem von Ihnen bereitgestellten Dokument sucht der Datasette-Port nach einem rein digitalen Signal mit variierendem Arbeitszyklus (0,75 für H, 0,25 für L).
Solange der Arduino-Pin ausreichend Strom treiben kann (dies sollte möglich sein) und mit 5 V betrieben wird, funktioniert eine direkte Verbindung. Möglicherweise möchten Sie die Verwendung eines TTL-Puffers zwischen dem Arduino und dem C64 untersuchen (der Puffer wird über die + 5-Versorgung des Datasette-Ports mit Strom versorgt, und die Erdung ist sowohl für den C64 als auch für den Arduino gleich).
Was den SENSE betrifft, wäre es einfacher, einen digitalen Ausgang zum Ansteuern eines Kleinsignal-MOSFET (wie eines 2N7002) zu verwenden - ein logisch hoher Wert schaltet den MOSFET ein, wodurch der SENSE-Pin (mit dem Drain verbunden) auf Masse (verbunden) gezogen wird zur Quelle), ohne dass der Arduino überhaupt Strom aufnehmen muss.
Der MOTOR-Pin könnte auch zum Ansteuern eines MOSFET-Gates verwendet werden. Der Drain würde mit einem schwachen Pullup (ca. 10k) auf die Arduino-Versorgungsspannung hochgezogen, wobei die Source mit Masse verbunden wäre. Der Drain würde auch zu einem digitalen Logikstift gehen. Wenn MOTOR hoch ist, ist der Logikeingang niedrig und umgekehrt, und der Arduino sieht ein sauberes Logiksignal.
Zum Beispiel...
Beachten Sie die Verwendung von zwei NAND-Gattern als eine Art Puffer. (Kannst du sagen, dass ich früher nach Teilen gesucht habe?)
TTL ist ziemlich robust. Ich glaube nicht, dass es eine große Chance gibt, etwas zu beschädigen.
quelle
Klingt nach einem interessanten Projekt. Ich erinnere mich, dass die Hardware des VIC-20 Impulse von der Datasette in eine Flankenerkennungsschaltung eingespeist hat (ich vergesse, ob sie steigende oder fallende Flanken erkannt hat). Die C64-Bandladeroutinen waren mit denen des VIC-20 kompatibel, daher glaube ich nicht, dass der Standardlader irgendwelche Tricks hätte verwenden können, die der VIC-20 nicht unterstützen würde, obwohl benutzerdefinierte Lader dies könnten. Ich habe früher nie genug mit Sachen herumgespielt, um festzustellen, ob die Datasette selbst sowohl steigende als auch fallende Flanken in Impulse umwandelte (z. B. indem ein verzögertes und ein nicht verzögertes Signal in ein XOR-Gatter eingespeist wurden). Ich habe mir eine Routine ausgedacht, um Daten in Impulsbreiten umzuwandeln, aber nie herausgefunden, wie man den Kantendetektor überhaupt benutzt.
Wenn Sie keine Soundkarte verwenden möchten (einige Soundkarten verfügen über eine Stereobildverarbeitung, die die Phase des ausgehenden Audios zerstören kann), gibt es zwei Ansätze, um Daten vom PC auf den C64 zu übertragen könnte vorschlagen: (1) Pulsintervalldaten vom PC an das Arduino senden und einfach die Arduino-Zeit einzelne ausgehende Impulse haben. Codieren Sie das Datenformat möglicherweise mit zwei Impulsen pro Byte, wobei Sie die folgende Codierung verwenden:
Ich glaube nicht, dass Ladeschemata versuchen werden, Impulse mit einer Genauigkeit von mehr als 3us zu messen, und dieses Schema würde es ermöglichen, Daten über einen UART bei 115200 zu senden. Der PC sollte 0xFF-Füllbytes hinzufügen, damit die Rate, mit der Daten gesendet werden Der Arduino wird ziemlich gut mit der Geschwindigkeit übereinstimmen, mit der der Arduino ihn ausstempelt. Da die Verarbeitung jedes Nybbles zwischen 44 und 80 Mikrosekunden dauert, müsste der Arduino seinen UART nur zwischen den Nybbles abfragen und könnte Interrupts gegen Ende jedes Impulses deaktivieren. Wenn der PC seine Daten einigermaßen effektiv auffüllt, könnte man entweder (1) den PC versuchen lassen, Daten etwas schneller zu senden, als das Arduino sie ausgeben würde, und entweder Hardware- oder Software-Handshake verwenden, um sie zu verlangsamen, oder (2) das Arduino haben Rasieren Sie eine Mikrosekunde von jedem Impuls, wenn sein Puffer fast voll ist. oder fügen Sie jedem Impuls eine Mikrosekunde hinzu, wenn sein Puffer fast leer ist. Um zu vermeiden, dass Audiostörungen durch kurzzeitige PC-Probleme verursacht werden, kann das Arduino die Ausgabe mit einem Byte "Okay, um hier anzuhalten" unterbrechen, wenn sein Puffer nicht annähernd voll ist.
quelle