2018年10月27日土曜日

アセンブラでのPIAとRTCの間のI2C通信に成功しました

アセンブラでPIAを経由してRTCの時刻の読み出しができました


使用したRTCモジュールはアマゾンで入手したHiLetgoのZS-042です。このモジュールにはDS3231というチップが使われており、I2C通信で時刻の設定や読み出しを行うようになっています。
I2C通信については、名前を知っているだけで具体的なことは全く知らなかったのですが、FLEXの起動時の日付の入力が煩わしいので、RTCからの自動読み込みに挑戦することにしました。

しかし、ネット上の情報は多くがArduinoとの接続の場合で、しかもWireライブラリを使うものがほとんどで、私もRTCモジュールが動作するかどうかをArduinoで確認しましたが、30分もあればできるという簡便さは誠にありがたいのですが(ライブラリを作成してくれた方には感謝です...)、6809のアセンブラでI2C通信プログラムを書きたい場合には全く役に立ちません。

また、PICやAVRなどのマイコンのアセンブラでI2C通信をしているものも幾つか見つけましたが、これらもマイコン自身にI2C通信機能を備えたものを使用している場合がほとんどで、これも役には立ちません。また、I2C通信機能を持たないPICやAVRでのケースもありましたが、これらのマイコンはポートのビット処理命令を持っているので、ビット処理命令を持たない6809ではプログラムの参考にはあまりなりませんでした。

ということで、結局、I2C通信の解説とDS3231のデータシートを読みながら、自力でプログラムを組むことになりました。

6821とRTC間の接続

6821とRTC間は下図のように配線しました。
図中のプルアップ抵抗はPortAの内蔵抵抗で代用しています。
6821のPortAはオープンドレインで、しかも5kΩの抵抗でプルアップされていますので、I2C通信に適しているということと、入出力の切り替えが不要で、出力に設定したままで入力も可能(但し、予めHを出力しておく必要あり)なので、プログラムが書きやすいと考えました。

RTC配線図


ロジアナを所有していないので、デジタルオシロで波形を見ながら試行錯誤を続けましたが、手順の最初のスレーブアドレスの書き込みからして成功しているのかどうかも分からず、全くACKが返ってこない状態が続き、間にPICでも挟まないとダメかとあきらめかけたこともありました。

最終的には、SDA信号は、Lowは0を出力するのに対して、Highは1を出力するのではなく開放、つまりHi-Zにするのだということに気づき、それに対応するように書き直すことで、ようやく読み込みができるようになりました。

読み出しに成功

下図で表示されたデータは、RTCの最初の7レジスタを読んだもので、順に、秒、分、時、曜日、日、月、年を表しています。

RTCから日付と時刻を読み取り

現段階では、ようやく読み取りができたというところまでですが、あとは書き込みルーチンを作成し、それを常駐プログラムの形式にして、FLEXの初期化ルーチン中の日付入力ルーチンと置き換えれば完成です。
(完成しましたらプログラムは公開します。)

[11月4日 追加] 完成したプログラムは11月3日のブログで公開しています。

2018年10月15日月曜日

6809/6802両用基板が完成しました

6809/6802両用基板を修正しました


最初に製作した6809/6802両用基板は、9月15日の投稿で述べたように、修正箇所があったこととPIA(6821)を載せたかったので修正基板を製作しました。

これは最初に製作した基板ですが、

6809 / 6802 両用基板の第1作


このようにPIA(6821)を外付けすると修正基板と同機能となります。


6821を追加しました


ブレッドボード風に使用できるようにピンを立ててみました。

6821基板


これが修正基板です。

修正基板(6821を追加しました)



回路図を掲載します。
6809と6802の切り替え部を簡略化し、それに応じて不要になった74HC08を除き、空いたスペースを利用して68B21を追加しました。



修正基板の回路図


これで当初の目標であった、シングルボードコンピュータで6809用、6800用のFLEXを動作させることができるようになりました。

===== 一応の完成! =====

あと残っている課題ですが、FM77AV40SX上のFLEXを使っていた時には、起動時に、内蔵されているリアルタイムクロックから現在時刻を取得して起動時の日付の入力を自動化していましたので、同様なことができないだろうかと考え、arduinoなどで使われているRTC基板ZS-042と6821との間でI2C通信を試みているのですが、今のところうまくいっていません。
(2MHzのMPUではI2Cの推奨の最低値である100KHzはとても無理で50KHz程度の速度しか出ないようなのですが、これが原因ではないとは思いますが。。。)


RTCとの通信実験中


これができたら、基板の製作は一応打ち止めにして、あとはFLEX上のソフトを活用して、プログラムの制作に本腰を入れようかと思います。

実現したいものとしては、まずはツール類の充実と、あとは願望ですが、
 MC09の改造、6809用コンパイラの自作、OS-9Level1の移植
などがあるのですが、いずれも難度が高いものばかりですので、どうなりますやら。。。

(いずれにしても趣味の世界ですので、無駄な「タイヤの再発明」をモットーとしており、ツール類を始めとしてアセンブラや逆アセンブラ等もすべて自作したものを使用することにしていますので、言語類も自作したいのです。。。究極はOSの自作でしょうか。)

OS-9の移植ですが、手元にFM-7用Level1、FM77AV40用Level2のライセンスがあり、Level1の方は今は使用していないので、これを使えればと考えています。
(以前、FM77AV40上でOS-9用のROM,RAMディスクとWindows上の仮想ドライブを製作した経験がありますので、それを生かせれば何とかなるかなあ。。。)