ArduinoとC64のテープポートのインターフェース


8

更新:これの実用的な実装は、Peter Edwardsが作成したTapuinoプロジェクトで行われます。それをチェックしてください、すべてがオープンソースです:https : //github.com/sweetlilmre/tapuino


Arduinoを使用してTAPテープデータファイルをPCからC64にストリーミングするプロジェクトに取り組んでいます。プロジェクトのソフトウェア面は順調に進んでいますが、私はまだ電子工学に不慣れで、コモドールを揚げたくありません。だから私は実際にハードウェアインターフェースの助けが必要です。

C64テープは、PWM変調を使用してプログラムをカセットテープに保存し、データの読み取り時に、オペアンプ+シュミットトリガーがオーディオ信号を方形波に変換します。すべての高低遷移により、マシンで割り込みがトリガーされ、2つの割り込み間の距離(パルスの長さ)はストリームのアトミック部分を表します。

カセットポートのピン配列は次のようになります(上面と底面に同じピンが2回あります)。

C64のテープポート

A-1、GND、グラウンド

B-2、+ 5V、5ボルトDC

C-3、モーター、モーター制御、約。モーターの6ボルト電源

D-4、読み取り、データ入力、データセットからのデータの読み取り

E-5、書き込み、データ出力、データセットへのデータの書き込み

F-6、SENSE、検出、キーPLAY、RECORD、F.FWDまたはREWのいずれかが押された場合

私の現在のアイデアは次のとおりです。

C64インターフェイスブルーブック(29ページ以降)に基づいて、マシンはREADおよびWRITEポートでTTLレベルを使用するため、ArduinoからREADピンにPWMピンを直接接続できると思います。

SENSEピンとのインターフェースも必要です。私はそれをデジタルPINの1つに直接接続して、押したボタンの状態を通知する必要があるときにデジタルLOWを書き込むことができると思います。あれは正しいですか?

後で、MOTORピンの+ 6V信号の存在を検出したいと思います。一部のローダーは、ロードプロセスの途中でデータセットを停止するため、テープを正しくエミュレートするためにそれも検出する必要があります。そこに電流を制限するために何らかの抵抗器を使用する必要がありますか、それとも直接接続することもできますか?たぶん私はそこでリレーを使うべきですか?


ArduinoからのPWM信号はWRITE(READではない)ピンに送られます。
テラクラボ

Arduinoでデータセットをエミュレートしたいので、C64が入力を受け入れる場所であるREADピンとインターフェースを取る必要があります。
NagyI

私がデータのフォーマットを理解していることから、古典的なPWM信号のようにパルスを繰り返さないでください。ただし、データを運ぶのは、長パルス、中パルス、長パルスの組み合わせです。ArduinoはそのようなPWM信号を送信できますか?
Johncl、2015年

回答:


4

あなたが提供したドキュメントによると、データセットポートは、デューティサイクルが変化する純粋なデジタル信号を探しています(Hで0.75、Lで0.25)。

Arduinoピンが十分な電流を駆動でき(可能なはずです)、5Vで動作している限り、直接接続が機能します。ArduinoとC64の間でTTLバッファーを使用して調査することをお勧めします(バッファーはデータセットポートの+5電源から給電され、グランドはC64とArduinoの両方に共通です)。

SENSEに関しては、デジタル出力を使用して小信号MOSFET(2N7002など)を駆動する方が簡単です。ロジックHighでMOSFETがオンになり、SENSEピン(ドレインに接続)がグランド(接続ソースへ)Arduinoが電流をまったくシンクする必要はありません。

MOTORピンは、MOSFETゲートの駆動にも使用できます。ドレインは弱いプルアップ(10k程度)でArduino電源電圧にプルアップされ、ソースはグランドに接続されます。ドレインはデジタルロジックピンにも接続されます。MOTORがHighの場合、ロジック入力はLow(またはその逆)であり、Arduinoはクリーンなロジック信号を認識します。

例えば...

ArduinoからC64 V1

ソートのバッファとして2つのNANDゲートを使用することに注意してください。(私は部品を探し回っていたと言えますか?)

TTLはかなり堅牢です。何かを傷つける可能性はあまりないと思います。


うわー、素敵な回路図。ArduinoのPWM出力ピンも5Vを使用しているため、まずD-4に直接接続しようと思います。とにかくありがとうございました!:)
NagyI

@NagyI動作するはずです。
アダムローレンス

ああ、私はこの答えを受け入れていませんか?恥ずかしい。とにかく、これを試すためにテープエッジコネクタを注文したところ、私のはんだ付けステーションが来週到着しました。うまくいけば私はこれをすぐにテストすることができます:)
NagyI

2N7002を取得できなかったため、同僚からBS170が提案されました。センス信号は完全に機能します。ただし、モーター検出が壊れています。Arduinoは常にロジックLOWを読み取ります。GateをLowにするかHighにするかに関係なく、Arduinoは常にロジックLowを読み取ります。これはBS170の問題ですか、それとも別の問題ですか?別のBS170で試してみましたが、問題は解決しません。BS170はGNDのみを切り替え、電圧は切り替えられないようです。
NagyI 2013

2

興味深いプロジェクトのようですね。私の記憶は、VIC-20のハードウェアがDatasetteからのパルスをエッジ検出回路に供給したことです(立ち上がりエッジと立ち下がりエッジのどちらを検出したかは忘れます)。C64テープロードルーチンはVIC-20のそれと互換性があったので、カスタムローダーがサポートしていたとしても、標準ローダーがVIC-20がサポートしないトリックを使用できたとは思いません。Datasette自体が立ち上がりエッジと立ち下がりエッジの両方をパルスに変換したかどうか(たとえば、遅延した遅延のない信号をXORゲートに供給することによって)を判断するのに十分な日、私はいろいろと遊んだことはありません。データをパルス幅に変換するルーチンを思いつきましたが、エッジ検出器の使用方法をまったく理解できませんでした。

PCからC64へのデータの取得に関して、サウンドカードを使用したくない場合(一部のサウンドカードにはステレオ画像処理があり、発信オーディオのフェーズで大混乱を引き起こす可能性があります)、2つの方法があります。 (1)PCからArduinoにパルス間隔データを送信し、Arduino時間に個別の発信パルスを送信するだけです。おそらく、次のエンコーディングのようなものを使用して、バイトごとに2つのパルスでデータ形式をエンコードします。

0000-1100-20usの高を出力し、次に24-60usの低を出力します(3usの倍数)
1101-低出力40us
1110-出力80us低
1111-$ FFのバイト値は無視される
          -1111に等しい1つのニブルを持つ他のバイは、
             モーターボタンをテープで留めるか、「ここで一時停止してください」と表示します。

読み込み方式が3usを超える精度でパルスのタイミングを計ろうとは思わないと思います。この方式では、115200でUARTを介してデータを送信できます。PCは0xFFパディングバイトを追加して、データが送信される速度をArduinoは、Arduinoがクロックアウトする速度とほぼ同じです。各ニブルは処理に44〜80マイクロ秒かかるため、Arduinoはニブル間でUARTをポーリングするだけでよく、各パルスの終わり近くで割り込みを無効にできます。PCがデータを適度に効果的にパディングする場合、(1)Arduinoが出力するよりも少し速くPCにデータを送信させ、ハードウェアまたはソフトウェアのハンドシェイクを使用して速度を低下させるか、(2)Arduinoバッファがほぼいっぱいになると、各パルスからマイクロ秒を削ります。または、バッファがほとんど空になったときに、各パルスにマイクロ秒を追加します。一時的なPCのしゃっくりが原因でオーディオの不具合が発生するのを防ぐために、Arduinoのバッファがいっぱいになっていない場合は、「ここで一時停止してください」バイトで出力を一時停止できます。


アイデアをありがとう。実際、私はArduinoに直接TAPファイルデータをストリーミングしています。各パルスを1バイトで指定します。(参照:c64tapes.org/dokuwiki/doku.php?id=analyzing_loaders)メインループで満たされているArduinoで1 kBの円形バッファーを使用して、データ転送のグリッチを克服しています。データは、PWMジェネレーターの一致イベントに接続された割り込み関数によって消費されます。これはパルスの2回呼び出されます。ここで、PINのレベルを変更し、高から低への遷移時に、次のバイトに従って新しい一致レジスタ値を書き込みます。
NagyI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.