前回 MicroSDカードボードとSRAMボードで、ちくらっぺさんのSD-DOSを動かす環境ができました。前回の記事でも書きましたが、SDカードにプログラムをセーブするのに正しい日時がPC-8001に設定されていて欲しいのですが、8001内蔵のRTCはバッテリーバックアップされていないのです。毎回日時を手入力はツライ…
【2020/2/8追記】
この記事の回路だと、電気二重層コンデンサにたまったバックアップ電源が数時間で枯渇してしまうことが分かりまして、改良してみました。別記事をご覧ください。
https://kuninet.org/2020/02/08/pc-8001%e3%81%ab%e5%a4%96%e4%bb%98%e3%81%91%e3%81%a7%e6%99%82%e8%a8%88icrtc%e3%82%92%e8%a3%85%e5%82%992/
外付けRTCボードを作ろう
PC-8001内蔵のRTC uPD1990Cはバッテリーバックアップされていないというのもありますが、月、日、曜日と時分秒しか保持できず、また電源ONやハードリセット時に初期化されてしまうのです。年号はN-BASICのワークエリアに2桁だけもっています。ちょっとRTCとしては仕様が古い。
思い切ってPC-8001の外部にRTCを接続するのが良いと思いました。以前もKZ80マイコンにつけたパラレルIC 8255(PPI)経由でセイコーエプソンのシリアルRTC RTC-4543SAをコントロールして実験したことがありました。(I2Cとかではなく、純粋にシリアル通信(シフトレジスタ的?)の石です)
RTC-7301DGを使ってみる
PC-8001にRTCを装備してみたいという話をTwitterでしていたところ、ちくらっぺさんがRTC-4543SAのDIP化基板をPC-8001に接続して成功しておられました。
以前、秋月電子通販で私もRTC-4543SAを買ったときに 別のDIPタイプ パラレルRTC IC(RTC-7301DG)を買って部品箱の肥やしにしていたのを思い出しました。私はそちらをPC-8001に装備してみたいと思い立ちまして….パラレルI/Fなので8bitパソコンにうってつけです。
回路設計
基本的な回路はRTC-7301DGのアプリケーションマニュアルの最後の方に出ていたサンプル回路を参考に実部品をあてはめてみることにしました。日本語のアプリケーションマニュアル…素晴らしい。
RTC-7301DGはSRAMと同じ感じで#CS1(負論理)とCS(正論理)の2つの端子を持っています。今回RTCに設定した日時情報をバッテリーなどでバックアップしたいので、主電源が切れた時に適切にこれらの端子をコントロールする必要があります。サンプル回路では、電源断検知にボルテージデテクタを使用しています。ここは、昨年 なんとなく欲しくて秋月電子通販で購入したリセットIC PST600Eを使いたいと思います。形状もトランジスタと同じTO-92Aパッケージ(つまり三本脚の部品)なので取り扱いが楽ちんそう。しかし今は秋月電子での取り扱いが終了したようです、残念だなぁ。
バックアップ電源としてはボタン電池 CR2032でも良いのですが、ここは これまた買って死蔵していた1Fの電気二重層キャパシタを使ってみたいところです。電池交換の必要もないですし。
アドレスデコーダはいつもの74HC138を使用します。HCTタイプの手持ちが無かったので、PC-8001からの信号線は全部プルアップすることにしました。
I/OアドレスはPC-8001のユーザー開放?されているアドレスが$80以降みたいなので$80〜F0までベースアドレスを変更できるジャンパを装備してみます。(といっても使えるのは$80、$90、$A0ぐらい??) #IOREQ信号もアドレスデコーダのCEに入れてしまって、RTCへはZ80 CPUの#RD/#WR(読み書き)信号を直接つないでしまおうと思います。いつもの74HC32(ORゲートIC)を1つ減らせるかもと。
電源からRTCへの電源供給ラインに順方向電圧が小さいであろうショットキーバリアダイオードを配置。電気二重層キャパシタが空っぽのときに突入電流が流れるという話を聞いたので100Ωを直列に配置、電源断時のために電気二重層コンデンサから抵抗器をパスするスイッチングダイオード1N4148を配置。という感じです。
回路完成→ハマり→解決
このような考えて部品をあてはめて引いてみた回路図がこちら。DIP ICx2と周辺部品で作れそう。
アプリケーションマニュアルの回路を真似して作成したので、わりとすぐ動くかと思っていたんですが、ユニバーサル基板で試作してみたものの最初はうんともすんとも言わず困りました。
まずは74HC138アドレスデコーダのE3(イネーブル端子3)につないだアドレスバスA7を何を思ったかプルダウンしていたのが変で、PC-8001のTTLレベル信号のHレベルが2V程度だったとしたらいつまでたっても74HC138のE3端子がイネーブルになりません。ここはプルアップとします。
2つ目が致命傷だったんですが、PST600のOUT端子のプルアップ忘れがありました。というか使い方をあまり知らなかったというのが正しいのですが….
下のデータシート(共立電子さんのサイトですが…^^);;)のVcc vs VoutのグラフみたいにRTCのCS1端子の電圧が変化すると思い込んでいたのですが、実際に電源をつないでテスタをあててみるとほぼ0Vでした。
PST600データシート より
それもそのはずで、上記の電圧変化を測定した回路図を見るとVout端子をプルアップしているのであります。このリセットICをわかってる方には当たり前だと思いますが、思い込みで回路を考えていたので…とほほ。このICの使い方はマルツパーツさんのサイトでも紹介されています。
というわけで、リセットICのOUTにもプルアップが必要でありました。最終版の回路図はこちらです。(githubにもUPしてあります。)
N-BASICでコントロールプログラム
RTC-7301DGはパラレルI/Fを持ったICですので、N-BASICのOUT命令、INP関数で十分扱えると踏んで書き込み、読み出し制御のプログラムを書きました。RTC-7301DGはアドレスバス、データバスも4bitです。アプリケーションマニュアルを見ていただくと分かりますが内部では3バンク分のレジスタを持ってますので、設定や読み出しのときにはOUT命令で$F番地のレジスタを使ってバンク切り替えをしながらということになります。
N-BASICで初期設定/日時読み出し/日時設定のためのツールを書いてみたものをgithubにUPしています。以下はBASICプログラムをテキストに吐き出してみたものです。girhubの同じディレクトリにCMT形式やカセットテープ音声(wav)もUPしていますので、興味のある方は実機にロードしてみてください。
SD-DOSのmount時に日時自動設定
さて、最終目標の日時自動設定ですが….
SD-DOSには、HELLO.CMTというファイルをSDをマウントする mount
命令実行時に自動で実行するという機能があります。N-BASICで作成したプログラムの一部を使って HELLO.CMTとして保存し、起動時にRTCから自動で日時を取得してDATE$、TIME$へ設定するプログラムを作りました。以下はその起動時の写真です。曜日も取得できるので画面上には出してみました。PC-8001のBASIC命令では曜日を設定するところは無いですが….
こちらのHELLO.CMTもgithubにUPしてあります。
これで、SD-DOSでSDをマウントし直すたびにDATE$、TIME$を手動で設定する作業から解放されて、大変便利になりました。
ちなみに、githubのsrcディレクトリに知る人ぞ知るTL/I-PCでRTCのデータを読み出すサンプルプログラムも作ってUPしてあります。そちらもぜひご覧ください。TL/Iを本格的に使ったのは40年近く前にテープASCIIでTL/Iコンパイラを買って以来初めてかもしれません….