ライン

大容量メモリ搭載PIC32MXシリーズによる高解像度ビデオ信号出力実験2(PIC32MX370F512H版)

ライン

2015年3月28日

 以前128KバイトRAM搭載のPIC32MX695F512Hを使用して、300×225ドット、256色同時表示が可能なビデオ出力システムの実験を行いましたが、より安価で高性能なPIC32MX370F512Hを用いて、同様の実験を行いました。システムクロックが前回のものよりアップしたことで信号出力間隔も短くなっているので、画質もやや向上しています。
 1ドットあたりの信号出力のタイミングは、拡大縮小回転機能付きビデオ出力実験で作ったものと同じのため、特に苦労することなく実験は成功しました。

実験結果画像

実験回路

 回転スクロールシューティングゲーム「VELUDDA」で製作した回路をそのまま流用したので、入力スイッチや音声出力が付いていますが、今回の実験では使用していません。この記事の実験を再現するだけであれば、特に接続は不要です。
 画像ファイルを読み込むため、マイクロSDカードスロットを接続しました。使用したのは秋月電子のこちらの製品です。このスロットには、カード挿入検出ピンがあるので、マイコンでチェックするようにしました。カード挿入中はカード検出ピンのAとBがショートされるようになっており、未挿入時はプルアップ抵抗でH、挿入中はLとなるようにしています。カード検出機能を使用しない場合は、常にLとなるよう、RF0ポートを単純にGNDに接地してください。
 なお、マイクロSDカードと標準サイズのSDカードはピン配置が異なるので注意が必要です。また、カード自体に書込み禁止機能がないので、Write Enable(WE)用の端子(RF1)はGND接続しています。

回路図

ハードウェア製作

 今回もブレッドボード上で実験しています。使用したPIC32MX370F512Hは、0.5mmピッチ64ピンのTQFPのため、変換基板で2.54mmピッチにし、ピンソケットでワイヤを使ってブレッドボード上の回路と接続しています。

製作写真

システム設計

 マイコンを用いたカラーコンポジット信号生成については、最初に実験を行ったこちらに詳細を記載しています。
 正方画素を実現するには、カラーサブキャリアの5分の3周期を1ドットとする必要があります。そのため、クロック周波数はカラーサブキャリアの周波数3.579545MHz(fsc)の4倍の水晶を用い、内部で3分周しPLLで20倍することで、fscの3分の80倍、約95MHzとしました。やや巧妙ですが、こうすることで1ドットは16命令サイクルとなり、4命令サイクルごとに信号出力、1ドットあたり4回の信号出力を実現しています。

波形

 ビデオメモリの構成はPIC32MX695F512Hで行った実験と同じで、要素数300×225のunsigned charの一次元配列を用意し、1ドットに1バイトのパレット番号を割り当て256色同時表示としています。色はパレット設定関数で指定します。
 解像度300×225ドットの縦横比はちょうど4:3のため、デジカメで撮影した4:3の画像ファイルは縦横比の変更なく、画面いっぱいに表示可能です。

ビデオメモリ構成

 水平1ライン中の信号のタイミングは以下のようにしました。

水平1ラインのタイミング


ダウンロード

 コンポジット信号出力システムとグラフィックライブラリ、サンプルプログラムのソースを公開します。下記よりダウンロード可能です。MPLAB X環境でビルドしてください。なお、CコンパイラはXC32 v1.32以下に対応しています。v1.33から仕様が変更となり、ライブラリとしてplib.hを使用すると警告が出るようになりました。最適化オプションは特に指定してもしなくても、問題なく動作していますが、レベル1以上をお勧めします。
 グラフィックライブラリの使い方についてはPIC32MX695F512H版のページに詳細を記載しています。

ソースプログラムのダウンロード


サンプルプログラムと実験結果

 PIC32MX695F512H版とほぼ同じサンプルプログラムで実験を行いました。

サンプル1

 いつものサンプルプログラムです。ライブラリの基本的な使用方法の参考にしてください。
<プロジェクトに追加するファイル>
 video300x225demo1.c (mainプログラム)
 video300x225.c (システム本体)
 video300x225.h
 graphlib.c (グラフィックライブラリ)
 graphlib.h

サンプル写真1

サンプル2

 3Dグラフィックの1手法であるレイトレーシングプログラムです。実行速度を上げるため計算中は表示を止めています。約45秒で描画が完了します。(最適化レベル1で計測)
<プロジェクトに追加するファイル>
 video300x225demo2.c (mainプログラム)
 video300x225.c (システム本体)
 video300x225.h
 graphlib.c (グラフィックライブラリ)
 graphlib.h

サンプル写真2

サンプル3

 今回の新たな試みで、SDカードに保存のGIF形式の画像ファイルを順次表示します。
 GIF形式が扱える色数は256色までで、フルカラーから選ばれた256個分のパレット情報を保有しており、本システムで扱うには最適です。一般的に自然画像は最低でも16ビット色程度必要なようですが、画像ソフトによってはフルカラーの画像をGIF形式に変換する際に最適な減色処理を行ってくれるので、あまり違和感なく表示することができます。
 GIFファイルのデコードにはMicrochip社が提供しているライブラリを利用していますが、256色表示というシステムは想定されていないため、無理やりソースプログラムを書き換えて、画像表示の最初にパレット設定を行うようにしました。解像度が300×225ドットより大きい場合は、整数分の1に縮小して表示されます。
 マイクロSDカードの読み取りも、これまで同様、Microchip社が提供しているライブラリを利用しています。ファイル数は多くなりましたが、下記ファイルは全部必要ですので、あまり深く考えずにプロジェクトに追加してビルドしてください。
<プロジェクトに追加するファイル>
 video300x225demo3.c (mainプログラム)
 video300x225.c (システム本体)
 video300x225.h
 graphlib.c (グラフィックライブラリ)
 graphlib.h
(以下はSDカード関連)
 Compiler.h
 FSconfig.h
 FSDefs.h
 FSIO.c
 FSIO.h
 GenericTypeDefs.h
 HardwareProfile.h (ポートの指定等はここで行う)
 SD-SPI.c
 SD-SPI.h
(以下はGIFファイル処理関連)
 GifDecoder.c
 GifDecoder.h
 ImageDecoder.c
 ImageDecoder.h
 ImageDecoderConfig.h

サンプル写真3

サンプル写真4

GIF画像が表示されたテレビ画面を撮影

最後に

 今回の実験は、PIC32MX695F512Hで行った300×225ドット正方画素表示の実験と、PIC32MX370F512Hで行った拡大縮小回転機能付き出力の実験が出来ていることから、問題なく出来上がることは最初から分かっていましたが、システムとしての完成度や実用度がこれまでより高いと考えられるので、あえて製作することにしました。今後はこのシステムを使って応用作品が作れるとよいと思っています。

Copyright (C) KenKen All Rights Reserved.