超小型Z80マイコン(その7)メモリカードエラーとBASICの移植 [Z80]
20 ピンの PIC を使った 3 チップ構成の小型 Z80 基板を引き続き検討中です。前回の記事では制御信号を兼用したことに起因する問題と解決方法について書きましたが今回は TF(SD) カードの接続状況等について書いてみたいと思います。
状況としては初期化コマンドは通ったもののブロックの読込みと書込みのコマンドに対してエラーが返ってくる状況です^^;
ロジアナ波形も含めて自分へのメモ書きの意味も込めて書き留めておきます。
初期化コマンドに関しては下図(CMD0)のように TF カード側から想定した応答が返ってきています。
下図は応答部分を拡大したものです。初期化コマンド送出時のクロックは Timer2で作成していて 400kHz にしています。
下図はブロックリードコマンド(CMD17)を送信している波形例ですが、何故か 0x20( address error )が返ってきます。続けて送出しているコマンドはブロックライト(CMD24)ですがこれに対しても同様に 0x20 の応答が返ってきます。アクセス対象のブロックアドレスは下図のように 0x00000004 ですのでエラーになるような値ではないはずです。次のコマンドの送出中に 0x00 の応答が返ってくるのも気になりますね。
下図は応答部分を拡大したものです。初期化コマンド発行後はクロックを 1MHz(動作確認のために低めに設定)に切替えてコマンドを送信しています。
PIC18F14K50 の SPI 送信は PIC24 と違いダブルバッファではないので先頭の bit の前に少し隙間が空いてしまいますが、先頭の部分のクロック幅が設定したクロック値より短くなることがあり、気になります。NG 応答の原因はタイミングなのか信号レベルなのか・・・
現状でもプログラムのロード&実行は可能なので Twitter で見かけた Aki.h さんのミニアセンブラに関するコメントで書かれていた Github で公開されている Grant’s BASIC を移植してみました。
アセンブラに M80 を使用したところ "LD HL,65529/10" の部分で HL に 0000H がロードされてしまい(符号付演算されゼロになった模様)少し嵌りましたが、それ以外の問題は無くすんなり動きました。
今回は USB 機能内蔵の 20 ピン PIC(PIC18F14K50)を使っているので PIC に直に USB ケーブルを接続でき、TeraTerm 側の通信速度設定に関係なく爆速で通信できるので BASIC の Hex ファイルも瞬時にダウンロードできて頗る快適です。
asciiart.bas を実行したところ、実行時間は丁度 100 秒でした。Z80 のクロックは PIC から供給されている 12MHz(USB用のクロック)です。以前開発した Z80Gal の記事「Z80GALの構想(その8)Blocking/Deblockingの実装」で書いた 16MHz 動作の Pic24CPM が 75 秒なのでクロック周波数と反比例した計算値( 100s = 75s x 16 / 14)と合致していますね。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
状況としては初期化コマンドは通ったもののブロックの読込みと書込みのコマンドに対してエラーが返ってくる状況です^^;
ロジアナ波形も含めて自分へのメモ書きの意味も込めて書き留めておきます。
初期化コマンドに関しては下図(CMD0)のように TF カード側から想定した応答が返ってきています。
CMD0 コマンドとその応答(サンプリング:32MHz) |
|
下図は応答部分を拡大したものです。初期化コマンド送出時のクロックは Timer2で作成していて 400kHz にしています。
CMD0 コマンドに対する応答部分の拡大(サンプリング:32MHz) |
|
下図はブロックリードコマンド(CMD17)を送信している波形例ですが、何故か 0x20( address error )が返ってきます。続けて送出しているコマンドはブロックライト(CMD24)ですがこれに対しても同様に 0x20 の応答が返ってきます。アクセス対象のブロックアドレスは下図のように 0x00000004 ですのでエラーになるような値ではないはずです。次のコマンドの送出中に 0x00 の応答が返ってくるのも気になりますね。
CMD17 コマンドとその応答(サンプリング:32MHz) |
|
下図は応答部分を拡大したものです。初期化コマンド発行後はクロックを 1MHz(動作確認のために低めに設定)に切替えてコマンドを送信しています。
PIC18F14K50 の SPI 送信は PIC24 と違いダブルバッファではないので先頭の bit の前に少し隙間が空いてしまいますが、先頭の部分のクロック幅が設定したクロック値より短くなることがあり、気になります。NG 応答の原因はタイミングなのか信号レベルなのか・・・
CMD17 コマンドの応答部分の拡大(サンプリング:32MHz) |
|
現状でもプログラムのロード&実行は可能なので Twitter で見かけた Aki.h さんのミニアセンブラに関するコメントで書かれていた Github で公開されている Grant’s BASIC を移植してみました。
アセンブラに M80 を使用したところ "LD HL,65529/10" の部分で HL に 0000H がロードされてしまい(符号付演算されゼロになった模様)少し嵌りましたが、それ以外の問題は無くすんなり動きました。
今回は USB 機能内蔵の 20 ピン PIC(PIC18F14K50)を使っているので PIC に直に USB ケーブルを接続でき、TeraTerm 側の通信速度設定に関係なく爆速で通信できるので BASIC の Hex ファイルも瞬時にダウンロードできて頗る快適です。
asciiart.bas を実行したところ、実行時間は丁度 100 秒でした。Z80 のクロックは PIC から供給されている 12MHz(USB用のクロック)です。以前開発した Z80Gal の記事「Z80GALの構想(その8)Blocking/Deblockingの実装」で書いた 16MHz 動作の Pic24CPM が 75 秒なのでクロック周波数と反比例した計算値( 100s = 75s x 16 / 14)と合致していますね。
ASCIIART.BAS 実行結果 |
|
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
マウスの電池カバーの修理 [修理]
超小型Z80マイコン(その6)制御信号兼用の問題 [Z80]
前回の記事から時間が空いてしまいましたがメモの意味も兼ねて状況を書いて置きたいと思います。
今回は USB 機能を搭載した 20 ピンの PIC(PIC18F14K50)を使用しているため I/O 数が非常に少なく「超小型Z80マイコン(その1)USBシリアル対応とピンアサイン」の記事に書いたように超ケチケチ設計で 1 ビットの制御信号で複数の制御を行っていたりします。
このため I/O 数に余裕があり専用の制御を行っていればなんら問題にならないような部分でも色々問題が発生してしまいます。今回は 2 つの問題について解決方法も含めてメモとして書き残しておきます。
以上の対処で SD カードを物理的に接続した状態でも Z80 が安定して動作するようになりました。
次は SD カードのアクセスですが、今回使用している PIC(PIC18F14K50)は汎用メモリと特殊機能レジスタ及び USB 用のデュアルポートRAMの合計で 768 バイトしかなく、SD カードのセクタ長が 512 バイト固定なので USB 送受信用のバッファを SD 用のバッファに切替えながら使う必要があります。このようにメモリに関してもキツキツの状態であり、お楽しみ要素が豊富にありますw
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
今回は USB 機能を搭載した 20 ピンの PIC(PIC18F14K50)を使用しているため I/O 数が非常に少なく「超小型Z80マイコン(その1)USBシリアル対応とピンアサイン」の記事に書いたように超ケチケチ設計で 1 ビットの制御信号で複数の制御を行っていたりします。
Z80PicCompact ピンアサイン(再掲) |
|
このため I/O 数に余裕があり専用の制御を行っていればなんら問題にならないような部分でも色々問題が発生してしまいます。今回は 2 つの問題について解決方法も含めてメモとして書き残しておきます。
- SDI 接続後の問題
Z80 へのリセット信号を生成する時のみ、PIC 側が出力ポートに変更して、5V 駆動によりトランジスタが ON になるように 3V のツェナーダイオードを使用する予定でした。
しかし、3.3V にプルアップした SDI を接続するだけで RESET/ がアクティブになってしまいました。シミュレータで確認したところ、下図のように 4.7V のツェナーでさえ 2.5V 程度でトランジスタが ON になってしまいます。
ツェナーダイオードの挙動
ツェナーの特性は下図の例のようにツェナー電圧より数ボルト程度低い電圧でも少量の電流は流れるのでトランジスタが ON してしまいます。特にツェナー電圧が低い場合にはこの現象は顕著に表れるので注意が必要です。
ツェナーダイオードの特性例
対策として下図のようにベース電圧を抵抗で分圧して与える方式に変更し、3.8V くらいでトランジスタが ON するようにしました。
変更後のリセット生成回路のシミュレーション結果
リセット信号発生部の回路図も貼っておきます。
対処後のリセット信号発生部の回路
- SDCS/ 接続後の問題
SDCS/ を接続する RB7 は上記のピンアサインの表に示すように IORQ/ と WAIT/ にも接続されています。SDCS/ は 3.3V 制御の SD カード側とインターフェースを取るために ショットキーバリアダイオードを介して 3.3V にプルアップしています。この為、IORQ/ で WAIT/ をアクティブにする際のディレーが大きくなり下図の赤丸印部分のように稀に IORQ/ による wait が入らず wait から直ぐに抜けて( I/O 命令では自動的に wait が 1 サイクル入る)暴走してしまう現象が発生しました。
SDCS 接続後の問題
対処として IORQ/ と接続している抵抗の値を 1K から 510 に変更することで安定に動作するようになりました。小さすぎる気もしますが PIC 側との競合は瞬間的なので問題無いと思います。
以上の対処で SD カードを物理的に接続した状態でも Z80 が安定して動作するようになりました。
次は SD カードのアクセスですが、今回使用している PIC(PIC18F14K50)は汎用メモリと特殊機能レジスタ及び USB 用のデュアルポートRAMの合計で 768 バイトしかなく、SD カードのセクタ長が 512 バイト固定なので USB 送受信用のバッファを SD 用のバッファに切替えながら使う必要があります。このようにメモリに関してもキツキツの状態であり、お楽しみ要素が豊富にありますw
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]