/ Top / Micro Computer /OLEDモジュール[VGM12864-3S]を使ってみる


1-12-2015


I use the VGM12864-3S oled module.
for
Z80(TMPZ84C015/12) CPU driving.


 OLEDモジュールを使ってみました
     事の発端は、/ソフトウェア/FACITの様な転送ツール です。また、こちら、マイコン全般のマシンの構築および、「くみこみん」等、 広範囲に及びます。

    これまで、3(3.3)V系ロジックは、主要ロジックの5V系との関係で、些か敬遠している部分があり、 完全に手をつけずにいた部分でも有りましたが、ご存知の通り、昨今の表示デバイスを始め、 様々なデバイスで採用されるに至り、このまま避け続ける訳にも行かない事態と成って居ります。 そこで、重い腰を上げ、3.3V系のロジックとの変換を余儀なくされるのですが、ここで、秋月電子さんから 発売されている相互変換素子のDIP化モジュール、FXMA108が目に留まりました。 「こりゃ便利」と、早速飛びついたのですが、実際に回路を組んで動かしてみると、大変なことが起きます。

    簡単にOLEDの初期化プログラムと、1画面分のデータ転送プログラムをアセンブラで記述して、 アセンブルしてEP-ROMを焼いて、電源を投入します。さて、

    何も起きない・・・。

    「まあ、初めて使うデバイスなんて、こんなもんだ」と、仕様書を片っ端から読み直します。 英文ドキュメントは和文ドキュメントとは違って、英語の苦手な僕は読むのに時間がかかります。 たったあれだけのボリュームでも、1日〜2日、ドキュメントの読み直しで時間を費やします。 OLED初期化手続きの中で、1ヶ所不明なコマンドと、1ヶ所、不明な引数があったものの、 サンプルプログラム通りなので、そのまま問題無しと判断します。


 表示デバイスの選定理由
     今回の実験の主な目的は、3.3V系ロジックとの共存と、データ転送速度の検証ですので、 制御(データ構造)が簡単な2値単色表示のデバイスとして、また、プロセッサからのバスとして、 8ビットパラレルで、バスに直結出来る事、そこそこ実用的な画素数、と言った条件で選定しました。

    サイズがちょっとアレだけど・・・


 やっぱり動いてない
     さて、話を戻して、やっぱり表示されません。そこで、仕方なく、オシロスコープでバスの信号を観察すると、 何だか見慣れない波形が・・・。

    何だか一直線です。(爆笑)

    そもそも、CPU部分が動いてないんです。これは明らかに何かがおかしいです。そこで、 レベル変換ICをソケットから外します。この時は、OLEDを切り離すと言う意味で外したのですが、 外すと何だかCPUは動いているように見えます。もう少し具体的な状態を知りたいので、いつものデバッグ手段を・・・。
    PIO-Aが本来キーマトリクス用に用意して有りますので、それを使って、LEDを点灯させます。 プログラムのステージ毎に、固有の点灯パターンを用意します。リセットから、どこまでプログラムが動いたか、 また、正常に動いているかを知ることが出来ます。これで、FXMA108を装着して電源を投入すると、 何も起きませんし、LEDも点きません。所が、FXMA108を外すと、予定通りの挙動を示します。

    この時点では、一体何が起きているのかサッパリ分かりません。


 FXMA108について調べる
     色々と調べるうちに、FXMA108の方向判断基準になる入力側インピーダンス(推測)に問題があることが分かりました。 これは、プルアップ及びプルダウン禁止と言う一文ですが、結構高いインピーダンスでも、それを入力と判定してしまうらしいんです。 と言う事で、どうやら、OLEDモジュール内部でのプルアップ(だと思う)抵抗が効いて仕舞い、メモリーからの出力よりも強力になのか、 CPUの-RD信号よりも強力なプルアップとしてなのか、5V系に出力を垂れ流しているような状態でした。
    また、運悪く、両方ともインピーダンスが下がると、何だか訳のわからない状態を作り出しているようにも思えます。

    本来、誤動作除けの為に付けるプルアップ抵抗が誤動作の原因に成るとは、なんとも皮肉な話ですね。



 ディスクリートで頑張る
     と言うわけで、レベル変換ICが使えないなら、素直に74VHCxxxとか、その辺のICを使うのが王道だと思うのですが、 それを用意するだけの手間とお金がありません。そこで、在庫の中から何とか使えそうなものを探すと、 ダイオードしかありません。しかし、こう言う時に限って、1S1588とか、在庫を切らしているもので、 何とか探し出せた在庫は、10D1(整流用ダイオード)です。順方向電圧は0.6V近辺ですから、 使えない事は無さそうですが、精神衛生上あまり良くありません。しかし、背に腹は代えられず、 1ビットにつき、10D1と抵抗各1本で、5Vから3.3Vの方向限定の即席レベル変換回路を作ります。


    この回路では、5V側がH(5V)の時は、ダイオードの働きで電流は流れません。そこで、3.3Vからのプルアップで、 3.3V側は3.3V(H)。逆に、5V側がL(0V)の時は、3.3Vからのプルアップ電流は、ダイオードを通り、5V側の0Vに吸収され、 3.3V側も0V(L)に成ります。所で、この回路の問題点は、前述の通り、3.3V側からの信号は5V側には反映されません。 正確には、3.3V側で信号がLに成れば、そこでプルアップ電流が吸収されるので、5V側もLに成りますが、5V側にプルアップ抵抗があれば、 5V側はHのままです。通常、TTL等の入力は、開放ではHに成りますので、この条件が成立してしまいます。
    それから、反応速度は遅いですから、あまり高速な信号の場合、レベルの変化が追いつかない現象も想定されます。

    ちなみに、こんな風にFXMA108を乗せていたソケットに実装してみました。




 スイッチON!
     さて、こんなインチキな回路ですが、電源を入れてみると、今までの苦労が嘘の様に1発で動作します。 仕様書を読み返し、オシロスコープで信号を観測し、デバッグランプまで使って苦労した1週間は何だったのでしょう。 動いてみればこんなもんですね。後は、それなりにBIOSとして汎用性のあるルーチンを記述すれば、 実用にはなるでしょう。これは、最初のステップです。動作確認が取れれば、 あとはもう少し広いカラー液晶などを検討したいところですが、ひとまず、完成させてしまいます。


 BIOSの仕様は・・・
     グラフィック表示ですから、表示の自由度が高い分、テキスト表示にはそれなりに面倒な部分が有ります。 これまでにも、3作ほど、グラフィック液晶の作品は作った事が有りますし、PC-9801等でも、 グラフィックプレーンにテキストを展開するルーチンは記述した事が有るので、問題は無いのですが、 如何せん、メモリーが少ないので、表示プレーンを何枚も展開し、論理合成すると言った芸当には限界が有ります。 それでも、テキストプレーンとグラフィックプレーンの合成は最低限必要になります。
    また、テキストをテキストで持たせればバッファは小さくて済みますが、 フォントの幅が変わった場合の処理などが後々困難になります。今回、128x64と言う、小さな表示領域を採用したのも、 バッファを小さく押さえたいということもありました。これ以上のサイズ、色数になった場合、 バッファを確保することは困難に成りますので、バッファを使わない方法を考えなければなりません。 尤も、簡単な枠(グラフィック)と、内部のテキスト(フォント固定)の場合、 テキストを、テキストのまま(グラフィック展開しない)でバッファを用意すれば、小さく済むのですが、 表示の更新(表示モジュールにデータを転送する)に時間がかかりそうです。
    逆に、今回の様に小さな領域の場合、更に、ソフト合成のスプライトとかも実装できそうですが、 それは後回しとします。




    スクリーンショットですが、スピードライト(ストロボライト)を使うと、表示が薄暗く見えてしまうので、 屋内照明のみで撮影したので、ブレて見苦しいですが、ご了承ください。
    ちなみに、下の写真が、ボードの全体像です。

    良く見ると、OLEDモジュールからの配線が・・・。実はこのモジュール、ピン間は0.1Inchピッチなのですが、 コネクタ間が変則で、(0.1Inchの万能基板へ)連結ピンを使っての実装が出来ないため、線材で裏から引き込んで留めています。 ブレッドボードに載せる方は、苦労なさっていると思われます。

    スクリーンショットの右下の写真が起動順の最後ですが、メモリーテスト後、(まだ、OSを移植してないので)やることが無いので、 折角RTCを積んでいるので、日時を表示してみました。RTC-BIOSは、UNIXのEPOCHに因んで、バックアップが切れている場合は、 1970年1月1日0時0分0秒からのスタートとしてあります。PS/2キーBIOSやら、マトリクスキーBIOSやら、シリアルBIOSを実装すれば、 その部分を利用して、時刻設定プログラムを記述すれば、正しい日時と成ります。この時点で、RTC-BIOSには、
  • GET_TIME
  • GET_DATE
  • SET_TIME
  • SET_DATE
  • が整備してあります。


 くみこみん
     さて、大まかにBIOS部分が出来てくると、オペレーティングシステムとして、くみこみんを移植したいと思いますが、 今回、結構BIOSが大袈裟に成ってしまったので、移植が遅れています。 そもそも、仕様があまり細かく完成していないので、簡単なタスク管理部分だけの移植となるような気もします。


 BIOSへの実装
     BIOSへは、グラフィックモジュール、RTC、4x4=16キースキャン、OPM-YM2151(MXDRV16下位準拠)までは完成したのですが、 肝心なシリアル通信部分と、MMCカードモジュールの部分が出来ていません。 (OPMドライバは必要ないかも)。シリアル通信部分は、 以前、PC-9801用に書いたプログラムと同じ仕様で問題ないので、大丈夫だとは思うのですが、 MMCカードの部分はカードのドライバと、ファイルシステムのドライバが必要になります。 BIOSレベルでは、最低限、セクタ・リード/ライトは実装する必要があり、ちょっと不安です。




ひとまずこれで、ちょっとお休みです。いつまで休むかは・・・

同時進行で、240x320xRGB位の液晶モジュールとか、256x128のモノクロ液晶の実験も進めたいのですが、 中々手が付けられません。そもそも、256x128液晶(手持ち)は、コントローラ無しなので、その部分から作らなければならず、 ちょっと頓挫必至な感じですね。


つづく・・・(かも)