Mise à jour : une implémentation pratique de cela est effectuée dans le projet Tapuino réalisé par Peter Edwards. Vérifiez-le, tout est open source: https://github.com/sweetlilmre/tapuino
Je travaille sur un projet où j'utilise mon Arduino pour diffuser des fichiers de données de bande TAP de mon PC vers le C64. Le côté logiciel du projet se passe bien, mais je suis encore nouveau dans l'électronique et je n'aime pas faire frire mon Commodore. J'ai donc besoin d'une aide pour l'interface matérielle.
Les bandes C64 utilisent la modulation PWM pour stocker le programme sur une cassette et lors de la lecture des données, un déclencheur opamp + schmitt convertit le signal audio en ondes carrées. Chaque transition haut-bas déclenche une interruption dans la machine et la distance entre deux interruptions (qui est la longueur de l'impulsion) représente une partie atomique du flux.
Le brochage du port de cassette ressemble à ceci (le haut et le bas ont les mêmes broches deux fois):
A-1 , GND, masse
B-2 , + 5V, 5 Volt DC
C-3 , MOTEUR, commande moteur, env. Alimentation 6 Volt du moteur
D-4 , LIRE, Entrée de données, lire les données de la base de données
E-5 , ÉCRITURE, sortie de données, écriture de données dans la base de données
F-6 , SENSE, Détection, si l'une des touches PLAY, RECORD, F.FWD ou REW est enfoncée
Mon idée actuelle est la suivante:
Basé sur le livre bleu d'interface C64 (à partir de la page 29), la machine utilise le niveau TTL sur les ports READ et WRITE, donc je suppose que je peux connecter directement une broche PWM de l'Arduino à la broche READ.
J'ai également besoin d'interfacer avec la broche SENSE. Je pense que je peux également connecter directement cela à l'un des PIN numériques et y écrire Digital LOW lorsque j'ai besoin de signaler l'état du bouton pressé. Est-ce exact?
Plus tard, je souhaite détecter la présence d'un signal + 6V sur la broche MOTOR. Certains chargeurs arrêtent le jeu de données au milieu du processus de chargement, je dois donc également le détecter pour émuler la bande correctement. Dois-je utiliser une sorte de résistance pour limiter le courant là-bas ou puis-je simplement le brancher directement? Peut-être que je devrais utiliser un relais là-bas?
Réponses:
Selon le document que vous avez fourni, le port de la base de données recherche un signal numérique pur avec un rapport cyclique variable (0,75 pour H, 0,25 pour L).
Tant que la broche Arduino peut conduire un courant suffisant (il devrait pouvoir) et fonctionne à 5V, une connexion directe fonctionnera. Vous voudrez peut-être étudier l'utilisation d'un tampon TTL entre l'Arduino et le C64 (le tampon serait alimenté par l'alimentation +5 du port de la base de données et la masse serait commune au C64 et à l'Arduino).
En ce qui concerne le SENSE, il serait plus facile d'utiliser une sortie numérique pour piloter un MOSFET à petit signal (comme un 2N7002) - un niveau logique élevé active le MOSFET, ce qui tire la broche SENSE (connectée au drain) à la masse (connectée à la source) sans que l'Arduino ait à absorber de courant.
La broche MOTOR peut également être utilisée pour entraîner une porte MOSFET. Le drain serait tiré jusqu'à la tension d'alimentation Arduino avec un faible pullup (10k ou plus), la source connectée à la terre. Le drain irait également à une broche logique numérique. Lorsque le MOTEUR est haut, l'entrée logique est basse, et vice versa, et l'Arduino voit un signal logique propre.
Par exemple...
Notez l'utilisation de deux portes NAND comme tampon de toutes sortes. (Pouvez-vous dire que j'avais l'habitude de chercher des pièces?)
TTL est assez robuste. Je ne pense pas qu'il y ait beaucoup de chance d'endommager quoi que ce soit.
la source
Cela ressemble à un projet intéressant. Si je me souviens bien, le matériel du VIC-20 a envoyé des impulsions de la Datasette dans un circuit de détection de front (j'oublie s'il a détecté des fronts montants ou descendants); les routines de chargement de bande C64 étaient compatibles avec celles du VIC-20, donc je ne pense pas que le chargeur standard aurait pu utiliser des astuces que le VIC-20 ne prendrait pas en charge, bien que des chargeurs personnalisés puissent le faire. Je n'ai jamais suffisamment joué avec des trucs dans la journée pour déterminer si la Datasette elle-même convertissait les fronts montant et descendant en impulsions (par exemple en injectant un signal retardé et non retardé dans une porte XOR). J'ai trouvé une routine pour convertir les données en largeurs d'impulsion, mais je n'ai jamais trouvé comment utiliser le détecteur de bord.
En ce qui concerne l'obtention de données du PC vers le C64, si vous ne souhaitez pas utiliser une carte son (certaines cartes son ont un traitement d'image stéréo et tel que cela pourrait faire des ravages avec la phase de l'audio sortant), il existe deux approches I pourrait suggérer: (1) envoyer des données d'intervalle d'impulsion du PC à l'Arduino, et simplement avoir les impulsions sortantes individuelles de l'heure Arduino. Peut-être encoder le format de données avec deux impulsions par octet, en utilisant quelque chose comme l'encodage suivant:
Je ne pense pas que les schémas de chargement essaieront de synchroniser les impulsions avec une précision meilleure que 3us, et ce schéma permettrait d'envoyer des données sur un UART à 115200. Le PC devrait ajouter des octets de remplissage 0xFF pour que le débit auquel les données soient envoyées à l'Arduino correspondra raisonnablement bien à la vitesse à laquelle l'Arduino le synchronise. Parce que chaque nybble prendra entre 44 et 80 microsecondes à traiter, l'Arduino n'aurait qu'à interroger son UART entre les nybbles et pourrait désactiver les interruptions vers la fin de chaque impulsion. Si le PC remplit ses données de manière raisonnablement efficace, on pourrait soit (1) faire en sorte que le PC essaie d'envoyer des données légèrement plus rapidement que l'Arduino ne les produirait, et utiliser une négociation matérielle ou logicielle pour les ralentir, ou (2) avoir l'Arduino raser une microseconde sur chaque impulsion lorsque son tampon est presque plein, ou ajouter une microseconde à chaque impulsion lorsque son tampon est presque vide. Pour éviter que des pépins audio ne résultent de hoquets momentanés sur PC, l'Arduino pourrait suspendre la sortie à un octet "OK pour faire une pause ici" si son tampon n'était pas presque plein.
la source