PIC

8 color 320x240 graphic display using PIC32MX

2013年8月10日

PIC32MX150F128Bを用いて、8色320x240ピクセルの、グラフィックディスプレイを作ってみた。
2013-08-10-AUT17901.jpg
8色320x240ピクセルのデーター保存には最低288000バイト必要だから、PIC32MX150F128BのRAM容量・32768 bytesはぎりぎりである。同じPICマイコンを使ったグラフィックディスプレイとしては、ケンケンさんの32768色240x224ピクセルの作品があって、これは素晴らしい。今回の物は、性能的には劣るが、一石で仕上げるということ、目標とするMZ-700のディスプレイの規格は満たせること、私自身のカラービデオシグナル作成の勉強を兼ねるということで、8色320x240ピクセルで作ってみた。

カラーNTSCビデオシグナルの規格に関しては、ChaNさんのRS-170A NTSCビデオ信号タイミング規格の概要が詳しいので、そちらを参照して頂きたい。ここで、カラーシグナルを生成するためには、カラーバーストと呼ばれる基準信号とカラーサブキャリアと呼ばれる信号(どちらも、3579545Hz)との間で、位相のずれと呼ばれているものが大事なようである。これは、ケンケンさんのページやそのほかのページでも詳しく解説されているので、そちらを参照して欲しい。

KM-Z80 miniなどでは、ビデオシグナルの生成に2ビット使用していたが、これは0 V, 0.3 V, 1.0 Vの3種類の電圧変化で良かったためで、カラーだとそうはいかない。マイクロチップ社のアプリケーションノート・AN655を参考にして、5ビットのD/Aコンバーターを作成して利用した。回路図は、次の通りである。
2013-08-10-schematic.png
(水晶発振子の周波数は、正確には14.31818 MHz)

これで、0-31のデジタル出力に対して、無負荷で0-1.1 Vの電圧が得られる仕様。ビデオ端子の負荷(75 Ω)を考えれば、それより少し低い電圧になるはずで、たいていのディスプレイに対応できると思う。

PIC32MXは、14.31818 MHzを3.5倍した50.11363 MHzで動かしている。規格の50 MHzより若干オーバークロックだが、これぐらいのオーバークロックなら実用範囲内だろうと思う。結果として、カラーサブキャリア周波数・3579545Hzは、14サイクルのCPU命令に対応することになる。バーストシグナルは、ビデオモニターにカラー信号であることを認識させるのに重要だから、なるべく正確に出力したいので、14サイクルすべてでD/Aコンバーターによる電圧を変化させ、次のような波形を出力することとした。
2013-08-10-burst.png

カラーサブキャリア信号の方は14サイクルすべてで電圧変化させることは出来ないので、14サイクル中に4回、電圧を変化させる仕様とした。ところで、webでカラーサブキャリア信号の事を色々調べた結果、バーストシグナルとの位相のズレで表現されることは理解できたのだが、この「位相のズレ」というのが、どこの解説でも0°から360°までの角度で表現されいる。例えば、赤を出力する場合は103.4°となっているのだが、このズレを信号で表現する場合、103.4°ぶん早く出力するのか遅く出力するのか、よく分からなかった。両方の可能性について実際にテストして色をビデオモニターで出力させた結果、次のグラフのように出力すれば良いとくことが分かった。
2013-08-10-colors.png
縦軸は電圧(31が1.0 Vに相当)、横軸は時間(14が、0.28 μ秒に相当)

320x240ピクセルを表現するため、縦の240ピクセルはNTSCの表示領域・241行のほとんどを使用し、横の320ピクセルは、1ピクセルあたり0.14 μ秒(3579545Hzの半分; 7 命令に相当)とした。7命令の間に2回電圧を変化させるので、画像データーの読み込みには5命令しか使えないことになるが、試行錯誤の結果、なんとか5命令でぎりぎり実装できた。上記の動画に使用したPIC32MX150F128Bのプログラムは、次のリンクからダウンロードできるので、興味がおありの方は、参照して頂きたい。

ver051.zipは、ここからダウンロードできます。 ライセンスはLGPL2.0。

カラーバーに続いて、数秒おきに4枚の画像を順に表示する。うち3枚は160x120ピクセルの写真から作成した物で、これは添付の8color.htmlでCのコードに変換して埋め込んである。残りの1枚は、MZ-700のカラーキャラクターディスプレイを模した物で、たぶん本物ほど綺麗ではないのだろうが、ちゃんと文字も読み取れるし、実用の範囲内で表示できることが分かった。これは、朗報。

コメント

e.naka (2013年8月11日 05:32:34)

さすがに当時目を疑った、アイマスMADをMZ-700実機で再生する、みたいな無茶はできなさそう。
カラーになるとサブキャリアを作るのが大変なので、コンポーネント信号でD端子でTVに繋ぐ方が簡単になってしまうという。

ケンケン (2013年8月24日 01:41:34)

偶然たどりつきました。自分の名前が出ていてちょっと驚きました。
RAMが32KBあると、結構遊べそうですね。ところで、横320ドットをテレビに出力しようとすると、縦に細い線が変な色になってしまって、きれいに出ませんでした。どうですか?
KM-Z80すごいですね。頑張ってください。私はPC-8001ユーザーだったので、できればそちらも期待したいのですが。

Katsumi (2013年8月24日 13:05:58)

ケンケンさん

コメントをどうも有り難うございます。ケンケンさんのPICでのカラー出力にずいぶん刺激されて、大いに参考にさせて頂いています。どうも有り難うございます。パックマンは、本当にびっくりしました。

変な色になるという件、上記の条件(ライン262本)では確認できていません。この条件では文字の細かな所が綺麗に表示されないのでライン525本のモードを色々試しているのですが、525本モードだと文字が綺麗に表示されるものの、おっしゃるようにカラーバーで色むらが出ます。試行錯誤していますが、私の技術力ではいかんともしがたい所まで来ているように感じています。カラーに関してはNTSCよりVGAの方が扱いやすそうなので、そちらを使う方を準備中です。

PC-8001もやってみたいですね。日立ベーシックマスターも。ただ、これらのマイコンを扱う場合、ROMの著作権の問題があって、色々難しいです。互換ROMを開発するなどの方法は取れそうです(TK-80のケースではこれをやりました)が、私が実機を手に入れる事が必要で、なかなかそうも行かない環境にいます。

ケンケン (2013年8月24日 22:41:25)

ちょっと書き方がよくなかったのか、伝わらなかったようですが、例えば黒バックに白い文字などを表示しようとすると横320ドットの解像度だとピンクとか緑とかの色が出てきて、正常な色になりません。エッジがなまっているのでしょうか。VGAなら問題ないでしょうね。

エミュレータ製作には著作権という苦労があるんですね。放棄してくれればいいのに、と思います。

最近、PICでテレビに映すテトリスを作って公開しました。よかったら見てください。
http://www.ze.em-net.ne.jp/~kenken/tetris/index.html

Katsumi (2013年8月25日 13:05:55)

そちらのテトリス(いいですね!)をみて、おっしゃる不具合の詳細が分かりましたので、こちらの環境でもテストしてみました。

おっしゃるとおり、黒地に白で文字を表示させてみると、あちらこちらで色が出てしまいますね。ビデオ出力にキャパシタを入れたり、ダンピング抵抗を入れたりしても直らないので、エッジの問題ではなさそうです。

では、AV機器やTV放送ではどうなっているのだろうと思ってみてみると、同じぐらいの細かさの白い字がくっきり写っています。ただ、どの画面でも共通点があって、バックが黒ではなく青なんですね。それで、私の環境でもバックを黒から青に変えてみました。一部の例外(市松模様のキャラクタ)を除いて、変な色が出なくなりました。

このあたりがNTSCの限界のような気がします。実際の運用ではそういった不具合が出にくい条件を使っているのでは無いでしょうか。MZ-700でも、起動直後は青地に白の文字になっているので、なるほどと思いました。

ケンケン (2013年8月28日 09:58:03)

なるほど、MZ-700の青い画面にはそういう意味があったのですか。(?)
確かに背景色によって影響の出やすさとかがあるのでしょうね。
私もPIC32MX150F128Bを入手したので、これからちょっと実験していきたいと思います。

コメント送信