ラベル ArduinoMega の投稿を表示しています。 すべての投稿を表示
ラベル ArduinoMega の投稿を表示しています。 すべての投稿を表示

2020年7月18日土曜日

ArduinoMega2560カードの紹介その後のその後

4月10日に紹介した「ArduinoMega2560カードの紹介その後(完結編)」で完結したつもりでしたが、その後行ったいくつかの試みを紹介します。
(1)部品配置を多少変更した新しい基板を製作しました。
(2)リフレッシュの方法を変更してみました。
(3)任意のファイルを指定してArduino2560からFM-7に送り込めるようにしました。

(1)ですが、USBケーブルを挿入しやすくするためにArduino2560カードの位置を少し左に移動し、カード上のリセットボタンが押しにくかったので基板上にリセットボタンを新設しました。
(2)ですが、リフレッシュ法を桜井さまが試された方法に変更してみました。
オリジナルのカードの考案者であるFS-Micro Corporationの桜井さまはDRAMのリフレッシュについて2つの方法を試みられました。
一つ目はMega2560の割り込みを用いる方法で、これはリフレッシュの仕様を完全には満たすことができない上にCPUがほとんどリフレッシュにかかりきりになってしまうので実用的ではないとのことです。二つ目はPICを増設しそれによってハード的にリフレッシュ信号を作るというもので、これは完全にリフレッシュの仕様を満たすことができ、CPUにも余裕があるので良い方法だそうです。

参考までに、桜井さまから頂いたPICを使用した基板を示します。


PIC使用の基板



しかし、FM-7上でArduino2560を動作させてメモリデータを読み出したり、データやプログラムを送り込んだりさせたいと考えていた思い付きハードでソフトに七転八倒のshujiakitaさんや私にとっては、殆どのCPU時間をリフレッシュに取られるにしても、残りのわずかな時間にデータ等の読み書きができて、その後6809に戻れれば良いので、ソフトのみでリフレッシュを行う手法もそれなりに有用だと考えました。

(3)ですが、任意のファイルをArduino2560が読み込んでFM-7のメモリに書き込めるようにスケッチを変更しました。

ということで、PICの追加なしでソフトのみでD-RAMのリフレッシュを行なうArduino2560カードを、WindowsとFM-7の間でプログラムやデータのやり取りを行うツールとして製作しました。


新基板
新基板


使い方ですが、Arduino2560へのスケッチの書き込みに使用したポートをそのまま使用しますので、TeraTermのポートをそのポートに指定し(もちろん、ArduinoIDEのポート指定はずらしておきます)、バイナリ指定をしてファイル送信を実行します。
送信するファイルの先頭には保存アドレス(2バイト)、ファイルサイズ(2バイト)を付けておきます。

動作中の様子


下のFM-7の画面で分かりますように、RUN直後にArduino2560に切り替わり、処理が終了した後、6809に戻り20行のLISTを実行しています。もちろん、複数回実行してもちゃんと6809に戻ってきます。


転送後に6809に戻っている


TeraTermの実行画面です。
データファイルの先頭4文字の保存アドレス、転送バイト数を読み取り、以降のデータを指定アドレスに書き込み、その後、そのデータを読み出しています。
続いてBOOT ROMの内容を読み出した後、6809に戻っています。


転送結果


以上、動作的には以前の割り込みを使用しないソフトでのリフレッシュ法の場合とそれほど違ってはいないように見えますが、不完全かもしれませんが正式のリフレッシュ法を用いているという安心感が得られました。

なお、割り込みによるリフレッシュ法の詳細とその適用結果については、FS-Micro Corporationの桜井さまがブログのArticle#256~265の10回に亘って詳細に解説されていますので、そちらをご参照ください。本稿に直接関係するのはArticle#261です。


2020年4月10日金曜日

ArduinoMega2560カードの紹介その後(完結編)

ArduinoMega2560カードが正常に動作するようになりました


前回、FM-7の40Pスロットで動作するArduinoMega2560カードを紹介しましたが、その際、動作後に6809に戻すためにはFM-7のメインRAMのリフレッシュ信号が必要であること。それをMega2560のソフトで実現したいが、なかなかうまく行かず、F-BASICに戻ってはくるがエラーメッセージが出てしまうという報告をしました。

そのブログを読んで下さったtomi9さんから、すぐに具体的なアドバイスをいただきました。

オートリフレッシュを用いる

それは、FM-7のDRAMであるMB8265はオートリフレッシュ(RFSH Refresh)でリフレッシュできるということ(など)でした。私のDRAMに関する知識は数十年前のもので、RASオンリリフレッシュでリフレッシュするものだと思い込んでおりましたので、まさに目からうろこでした。
早速そのようにプログラムを修正し、リフレッシュ信号などのパルス幅もできる限りデータシートの値に近づけてみました。

その結果、かなり動作が安定し、相変わらずエラーメッセージが出るものの、いつも同じエラーメッセージが表示されるようになりました。

Z80W信号がHighになることを確認する

さらにtomi9さんからの追加のアドバイスによって、Mega2560から6809へ復帰するために$FD05に0を書き込んだ後に、Z80W信号が実際にHighに変わるのを確認するためのwhile文を追加したことで、ほぼ確実に6809に戻ってくるようになりましたが、まだ、BREAKキーを押して戻す必要がありました。

ついに

その後、「思い付きハードで七転八倒」さんによる動作確認の結果やお二人からのプログラムの修正案をいただきながらプログラムの細かい見直しをした結果、ついに、常に正常に復帰させることができるようになりました。


連続実行の結果


ご覧のように、何回連続実行してもちゃんとF-BASICに復帰して、20行が実行されてLISTが表示されています。

FM-7の個体差か

しかし、私の2台のFM-7ではどちらも正常に動作しましたが、tomi9さんや「思い付きハードで七転八倒」さんのFM-7でも同様に正常に動作するというわけではないようです。
同じFM-7でも微妙な個体差があるようで、リフレッシュや6809への切り替え時のタイミングの調整で対応する必要があるということでしょうか。


資料

「思い付きハードで七転八倒」さんより提供された回路図を示します。


回路図


FM-7とMega2560の動作のシーケンスを下に示します。

動作のシーケンス

まとめ

FM-7の40Pスロットに他のボードを装着して動作させる場合には、6809がHALTしているので、ボード側でDRAMのリフレッシュを行なわなければならないが、それをソフトで行う試みについて報告しました。

この試みから得られた知見

(1)6809から別のCPUに制御を移した場合は、そのCPUでDRAMのリフレッシュを行う必要があるが、そのリフレッシュ方法としてはオートリフレッシュ(RFSH Refresh)が使用できる。
(2)6809から別のCPUに制御を移すには$FD05に1を書き込むだけで良いが、6809に戻すには$FD05に0を書くだけでなく、QB, EBの制御も必要。
(訂正:ご指摘を受けて間違っていることに気づきましたので、訂正します。戻るときも$FD05に0を書くだけで良いです。)
(3)同じFM-7という機種でも、このような場合には「個体差」が結果に影響することがある。
(追記:この手法そのものがFM-7には不適切なために「個体差」が影響したと言うべきでした。)

最後に、オリジナルのボードを考案されたFS-Micro Corporationさん、そのボードを目的に合うように改造され、動作確認やアドバイスを下さった「思い付きハードで七転八倒」さん、そして重要なアドバイスをいただいたtomi9さんの諸氏に感謝いたします。

なお、Mega2560ボードの回路図とスケッチはOneDriveで公開しております。


2020年3月28日土曜日

FM-7の40Pスロットで動作するArduinoMega2560カードの紹介

FM-7の40Pスロットで動作するArduinoMega2560カードを紹介します


オリジナルのカード

このカードを着想されオリジナルを製作されたのは「FS-Micro」さんで、FM-7のROMの内容を読み出すために考案されたものです。
FS-Microさんはこのカードを用いて、FM-7本体をいじることなくメインROM,サブROMの内容を読み出しておられます。

FS-Microさん考案のカード


改造したカード

そのカードを見て「思い付きハードで七転八倒」さんがFM-7のRAMへの書き込みができるのではないかと着想し、その機能の実現のために必要な改造を施しました。

思い付きハードで七転八倒さん改造のカード

改造の要点は、アドレス線、制御線にバッファを入れ、リード/ライトに合わせて制御することです。


RAMにデータを書き込めました

その結果、FM-7のF-BASICからアドレス$FD05に1を書きこんで、Mega2560に切り替え、Mega2560に書き込んだ「思い付きハードで七転八倒」さんが作成されたプログラムによってメインRAMに必要なデータを書き込むことができましたが、書き込み後にMega2560側で$FD05に0を書き込んでもF-BASICに戻ってきませんでした。
ただし、FM-7をホットスタートすることで、F-BASICに戻って書き込んだデータを利用することができますので当初の目的は達成されました。
「思い付きハードで七転八倒」さんは、このカードを用いて、自作のFT-245RL利用の高速転送カードでFM-7とパソコン間の通信をするための、FM-7側のプログラムを送り込むために利用しておられます。


そのカードをいただきましたので

ちょうどその頃、私もZ80カードを製作しており、6809とZ80 カードとの切り替えに興味を持っているときでしたが、そのカードを頂きましたので、Mega2560のソフトをそのまま利用させていただいて、何とか$FD05に0を書き込んでF-BASICに戻ってくるようにできないものかと考えました。

Z80カードの製作経験から、FM-7のメインDRAMのリフレッシュが関係しているだろうと感じていましたし、6809系の経験が豊富な「カベキン」さんからもDRAMのリフレッシュが必要というアドバイスをいただいていましたので、Mega2560のソフトにリフレッシュルーチンを追加することで何とか実現できないかと試みました。
なお、以下は「思い付きハードで七転八倒」さんの構想による回路とMega2560のプログラムを元にして、度重なるアドバイスをいただきながら私が何とかリフレッシュルーチンをでっち上げることができたという、2人の共同作業による結果です。

リフレッシュ信号(もどき)の作成

まずは、FM-7本体のリフレッシュのタイミングをロジアナで観測してみました。


ロジアナでのタイミング観測


FM-7のF-BASIC動作中リフレッシュ信号を確認しました。
時間軸は0.2us/divです。


F-BASIC動作中のリフレッシュ信号

それを真似てリフレッシュ信号(もどき)を作成してみました。
時間軸は10us/divです。

Mega2560のリフレッシュ信号

ソフトで作成している信号ですので、形は似ていても速度がかなり異なりますが、これ以上は速くできませんでした。
2ms毎にデータをRAMに書き込むのを中断して、上記のリフレッシュ信号(もどき)をリフレッシュアドレス$00から$FFまで256回繰り返しています。

その結果は

その結果、RAMにデータを書き込んだ後、一応、F-BASICに戻ってくるようになりましたが、エラーメッセージが出ることがあります。
しかも不思議なことにそのエラーメッセージが毎回同じではありません。

エラーメッセージ

上のエラーメッセージは5回繰り返して実行したものですが、エラーが3回出ていますし、そのエラーメッセージが意味不明です。

とりあえずここまで

エラーメッセージが出たりするものの、一応、F-BASICに戻ってくるようになったので、これで良しとしようと思います。
ソフトでDRAMのリフレッシュ信号を生成しているつもりですが、時間的には本来のリフレッシュ信号とはかなり異なっていますので、リフレッシュ動作というよりもただRAMを読んでいるだけかもしれません。(そうであってもRAMの値が保持されれば良いわけですが...)
そもそもソフトでリフレッシュしようという方法が間違っている可能性もありますし、
こんな方法があるよというアドバイスなどをいただけたらありがたいです。

なお、Mega2560の回路図とスケッチは「思い付きハードで七転八倒」さんのブログで公開されます。