Pembaruan : implementasi praktis ini dilakukan dalam proyek Tapuino yang dibuat oleh Peter Edwards. Lihat, semuanya bersumber terbuka: https://github.com/sweetlilmre/tapuino
Saya sedang mengerjakan proyek di mana saya menggunakan Arduino saya untuk melakukan streaming file data TAP tape dari PC saya ke C64. Sisi perangkat lunak dari proyek ini berjalan dengan baik namun saya masih baru di bidang elektronik dan saya tidak suka menggoreng Commodore saya. Jadi saya butuh bantuan antarmuka perangkat keras sebenarnya.
Kaset C64 menggunakan modulasi PWM untuk menyimpan program pada kaset dan saat membaca kembali data pemicu opamp + schmitt mengubah sinyal audio menjadi gelombang persegi. Setiap transisi tinggi-rendah memicu interupsi di mesin dan jarak antara dua interupsi (yang merupakan panjang pulsa) mewakili bagian atom dari aliran.
Pinout port kaset terlihat seperti ini (bagian atas dan bawah memiliki pin yang sama dua kali):
A-1 , GND, Ground
B-2 , + 5V, 5 Volt DC
C-3 , MOTOR, Kontrol Motor, kira-kira. Catu daya 6 Volt motor
D-4 , BACA, Input Data, baca data dari dataset
E-5 , MENULIS, Output Data, menulis data ke dataset
F-6 , SENSE, Detection, jika salah satu tombol MAIN, REKAM, F. FWD atau REW ditekan
Ide saya saat ini adalah sebagai berikut:
Berdasarkan C64 Interfacing Blue Book (mulai dari halaman 29) mesin menggunakan level TTL pada port READ dan WRITE jadi saya kira saya dapat langsung menghubungkan pin PWM dari Arduino ke pin READ.
Saya juga perlu berinteraksi dengan pin SENSE. Saya pikir saya dapat langsung menghubungkan itu juga ke salah satu PIN digital dan menulis RENDAH digital di sana ketika saya perlu sinyal keadaan tombol ditekan. Apakah itu benar?
Kemudian saya ingin mendeteksi keberadaan sinyal + 6V pada pin MOTOR. Beberapa loader menghentikan dataset di tengah proses pemuatan sehingga saya harus mendeteksi itu juga untuk meniru rekaman dengan benar. Haruskah saya menggunakan semacam resistor untuk membatasi arus di sana atau dapatkah saya menghubungkannya secara langsung juga? Mungkin saya harus menggunakan relay di sana?
Jawaban:
Menurut dokumen yang Anda berikan, port dataset sedang mencari sinyal digital murni dengan siklus kerja yang bervariasi (0,75 untuk H, 0,25 untuk L).
Selama pin Arduino dapat menggerakkan arus yang cukup (seharusnya bisa) dan beroperasi pada 5V, koneksi langsung akan berfungsi. Anda mungkin ingin menyelidiki menggunakan buffer TTL antara Arduino dan C64 (buffer akan didukung dari pasokan +5 dari port dataset, dan ground akan menjadi umum untuk C64 dan Arduino).
Adapun SENSE, akan lebih mudah untuk menggunakan output digital untuk menggerakkan MOSFET sinyal kecil (seperti 2N7002) - logika tinggi menyalakan MOSFET, yang menarik pin SENSE (terhubung ke saluran pembuangan) ke tanah (terhubung ke sumber) tanpa Arduino harus menenggelamkan arus sama sekali.
Pin MOTOR juga dapat digunakan untuk menggerakkan gerbang MOSFET. Tiriskan akan ditarik ke tegangan suplai Arduino dengan pullup lemah (sekitar 10k atau lebih), sumber terhubung ke ground. Tiriskan juga akan pergi ke pin logika digital. Ketika MOTOR tinggi, input logika rendah, dan sebaliknya, dan Arduino melihat sinyal logika bersih.
Sebagai contoh...
Catatan menggunakan dua gerbang NAND sebagai penyangga. (Bisakah Anda memberi tahu bahwa saya dulu mencari bagian?)
TTL cukup kuat. Saya tidak berpikir ada banyak peluang untuk merusak apa pun.
sumber
Kedengarannya seperti proyek yang menarik. Ingatan saya adalah bahwa perangkat keras VIC-20 mengumpankan pulsa dari Datasette ke sirkuit deteksi tepi (saya lupa apakah itu mendeteksi tepi yang naik atau turun); rutinitas beban-pita C64 kompatibel dengan yang ada pada VIC-20, jadi saya tidak berpikir loader standar bisa menggunakan trik apa pun yang tidak didukung oleh VIC-20, meskipun loader kustom mungkin. Saya tidak pernah bermain-main dengan barang-barang pada hari itu cukup untuk menentukan apakah Datasette itu sendiri mengubah tepi naik dan turun menjadi pulsa (misalnya dengan memberi makan sinyal tertunda dan tidak tertunda ke gerbang XOR). Saya datang dengan rutin untuk mengubah data menjadi lebar pulsa, tetapi tidak pernah menemukan cara menggunakan detektor tepi sama sekali.
Berkenaan dengan mendapatkan data dari PC ke C64, jika Anda tidak ingin menggunakan kartu suara (beberapa kartu suara memiliki pemrosesan gambar stereo dan sedemikian rupa sehingga dapat menimbulkan kekacauan dengan fase audio keluar) ada dua pendekatan saya. mungkin menyarankan: (1) mengirim data interval-pulsa dari PC ke Arduino, dan cukup dengan pulsa keluar individual Arduino time. Mungkin menyandikan format data dengan dua pulsa per byte, menggunakan sesuatu seperti penyandian berikut:
Saya tidak berpikir skema pemuatan apa pun akan mencoba menghitung waktu pulsa dengan ketepatan lebih baik dari 3us, dan skema ini akan memungkinkan data dikirim melalui UART pada 115200. PC harus menambahkan 0xFF padding byte sehingga menilai data yang dikirim ke Arduino akan cukup sesuai dengan tingkat di mana Arduino mencatatnya. Karena setiap nybble akan membutuhkan waktu antara 44 dan 80 mikrodetik untuk diproses, Arduino hanya perlu melakukan polling UART-nya antara nybbles dan dapat menonaktifkan interupsi di dekat akhir setiap pulsa. Jika PC mengisi data dengan cukup efektif, orang dapat (1) meminta PC mencoba mengirim data sedikit lebih cepat daripada yang dikeluarkan oleh Arduino, dan menggunakan perangkat keras atau perangkat lunak untuk memperlambatnya, atau (2) memiliki Arduino mencukur mikrodetik dari setiap pulsa saat buffernya hampir penuh, atau tambahkan mikrodetik ke setiap pulsa saat buffernya hampir kosong. Untuk menghindari gangguan audio yang dihasilkan dari gangguan PC sesaat, orang dapat meminta Arduino menangguhkan keluaran pada byte "oke untuk berhenti sebentar di sini" jika buffernya hampir tidak penuh.
sumber