Menggabungkan Arduino ke port tape C64


8

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

Port tape C64

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?


Sinyal PWM dari Arduino menuju pin MENULIS (bukan BACA).
Telaclavo

Saya suka meniru dataset dengan Arduino jadi saya harus berinteraksi dengan pin BACA karena di situlah C64 menerima input.
NagyI

Dari apa yang saya pahami format data, Anda tidak mengulangi pulsa seperti sinyal PWM klasik - tetapi kombinasi dari pulsa panjang, sedang dan panjang yang membawa data. Bisakah Arduino mengirim sinyal PWM seperti itu?
Johncl

Jawaban:


4

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

Arduino ke C64 V1

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.


Wow, skema yang bagus. Saya pikir saya akan mencoba menghubungkan pin PWM Arduino langsung ke D-4 karena menggunakan 5V juga. Pokoknya terima kasih! :)
NagyI

@ NagyI Ini seharusnya bekerja.
Adam Lawrence

Ya ampun, saya belum menerima jawaban ini? Memalukan untukku. Pokoknya saya baru saja memesan konektor tepi pita untuk mencoba ini dan stasiun solder saya tiba minggu depan. Jadi mudah-mudahan saya dapat menguji ini segera :)
NagyI

Karena saya tidak bisa mendapatkan 2N7002 kolega saya menyarankan saya BS170 sebagai gantinya. Pensinyalan indra bekerja dengan sempurna. Namun deteksi motor rusak. Arduino selalu membaca logika rendah. Tidak masalah jika saya menempatkan Gerbang ke Rendah atau Tinggi, Arduino selalu membaca logika rendah. Apakah ini masalah BS170 atau sesuatu yang berbeda? Saya sudah mencobanya dengan BS170 lain tetapi masalahnya tetap. Sepertinya saya bahwa BS170 hanya dapat mengganti GND tetapi tidak bertegangan.
NagyI

2

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:

0000-1100 - Output 20us tinggi diikuti dengan 24-60us rendah (dalam kelipatan 3us)
1101 - Output 40us rendah
1110 - Output 80us rendah
1111 - Nilai Byte dari $ FF akan diabaikan
          - Bye lainnya dengan satu nybble sama dengan 1111 dapat digunakan untuk mensimulasikan
             rekatkan tombol motorik atau tunjukkan indikasi "boleh berhenti sebentar di sini".

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.


Terima kasih untuk idenya. Sebenarnya saya sedang streaming data file TAP langsung ke Arduino. Ini menentukan setiap pulsa dengan satu byte. (lihat: c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders ) Mengatasi gangguan dari transfer data saya menggunakan buffer bundar satu kB pada Arduino yang sedang diisi dalam loop utama. Data dikonsumsi oleh fungsi interupsi yang melekat pada acara pencocokan generator PWM. Ini dipanggil dua kali pulsa. Di situlah saya mengubah level PIN dan pada transisi tinggi-rendah saya menulis nilai register pencocokan baru sesuai dengan byte berikutnya.
Nagyi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.