Anbindung des Arduino an den Bandanschluss des C64


8

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):

Bandanschluss des C64

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?


Das PWM-Signal vom Arduino geht zum WRITE-Pin (nicht zum READ-Pin).
Telaclavo

Ich emuliere den Datensatz gerne mit dem Arduino, daher sollte ich eine Schnittstelle zum READ-Pin herstellen, da dort der C64 Eingaben akzeptiert.
NagyI

Soweit ich das Format der Daten verstehe, wiederholen Sie die Impulse nicht wie ein klassisches PWM-Signal - sondern es ist die Kombination von langen, mittleren und langen Impulsen, die die Daten übertragen. Kann der Arduino solche PWM-Signale senden?
Johncl

Antworten:


4

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...

Arduino zu C64 V1

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.


Wow, schöne Schaltpläne. Ich denke, ich werde zuerst versuchen, den PWM-Ausgangspin von Arduino direkt mit D-4 zu verbinden, da er ebenfalls 5 V verwendet. Trotzdem danke! :)
NagyI

@ NagyI Es sollte funktionieren.
Adam Lawrence

Oh mein Gott, ich habe diese Antwort nicht akzeptiert? Schande über mich. Wie auch immer, ich habe gerade den Bandkantenanschluss bestellt, um dies auszuprobieren, und meine Lötstation kommt nächste Woche an. Also hoffentlich kann ich das bald testen :)
NagyI

Da ich keinen 2N7002 bekommen konnte, schlug mir mein Kollege stattdessen den BS170 vor. Die Signalisierung funktioniert perfekt. Die Motorerkennung ist jedoch fehlerhaft. Arduino liest Logik immer niedrig. Es ist egal, ob ich Gate auf Low oder High setze, Arduino liest immer Logik Low. Ist das das Problem des BS170 oder etwas anderes? Ich habe es mit einem anderen BS170 versucht, aber das Problem bleibt bestehen. Es scheint mir, dass BS170 nur GND schalten kann, aber keine Spannung.
NagyI

2

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:

0000-1100 - Ausgabe eines 20us-Hochs, gefolgt von einem 24-60us-Tief (in Vielfachen von 3us)
1101 - Ausgang 40us niedrig
1110 - Ausgang 80us niedrig
1111 - Bytewerte von $ FF werden ignoriert
          - Andere Byes mit einem Nybble gleich 1111 könnten verwendet werden, um das zu simulieren
             Tasten des Bandmotors oder Anzeige der Anzeige "OK, um hier anzuhalten".

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.


Danke für die Ideen. Eigentlich streame ich die TAP-Dateidaten direkt auf das Arduino. Es gibt jeden Impuls mit einem Byte an. (siehe: c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders ) Um die Störungen der Datenübertragung zu überwinden, verwende ich einen 1-kB- Kreispuffer auf dem Arduino, der in der Hauptschleife gefüllt wird. Die Daten werden von der Interrupt-Funktion verbraucht, die an das Übereinstimmungsereignis des PWM-Generators angehängt ist. Dies wird zweimal pro Impuls aufgerufen. Dort ändere ich den PIN-Pegel und beim High-Low-Übergang schreibe ich den neuen Übereinstimmungsregisterwert entsprechend dem nächsten Byte.
NagyI
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.