PIC

PIC18F14K50を使った、キャラクターディスプレイ(製作編)

2012年1月23日

PIC18F14K50を用いて、パチパチマイコン用のキャラクターディスプレイ・インターフェースを作成中。

2012-01-23-IMG_9589_2.jpg

まだ作成途中なので、ソースコードの公開は、後ほどにしたい。エッセンスだけ、メモ。

PICにビデオ信号を作成させている。このような形でキャラクターディスプレイを作成しようとしたきっかけは、ラジオ技術のある記事、「ワンチップ・マイコン PIC16C84でビデオ・ゲームを作る」である。この記事を読んで、いずれ自分でビデオ信号を作成したいと考えていた。

パチパチマイコンが完成した今、次のステップとしては、キャラクターディスプレイとキーボードの接続である。PICマイコンの使い方も会得した。これ(PICを用いたキャラクターディスプレイ)を今作らなくて、いつ作る!…ということになった。

ビデオ信号(NTSC)として、どのように出力すればよいかは、次のページが大いに参考になる。

RS-170A NTSCビデオ信号タイミング規格の概要

まず、回路図から。

2012-01-23-NTSC-18F14K50.png

PICのRB4とRC7の2つの出力を用いて、ビデオ信号を作る。RB4は、水平同期信号、RC7は映像信号に相当する。この2つの出力により、0 V (水平同期時)、0.3 V (黒色信号) 1 V (白色信号)を作成している。これらの電圧が意味するところは、上記リンク先「RS-170A NTSCビデオ信号タイミング規格の概要」を参照されたい。

NTSCビデオ信号では、63.5 μ秒ごとに一行分のシグナルを送出することになるが、この時間計測に Timer0を16ビットモードで用いた。以下は、PICのソースコードのうち、同期部分である。

	do {} while(INTCONbits.TMR0IF==0);
	TMR0H=0xFD;
	TMR0L+=0x05;
	INTCONbits.TMR0IF=0;

0xFD05から0x10000までの763カウントを、12 MHzの水晶発振のクロックで行うので、ほぼ63.5 μ秒に相当する。

以下は、映像信号出力コードの一部。
MOVF POSTINC0, W, ACCESS       // 0 Copy the value in RAM to W, then increment the pointer
MOVWF TBLPTRL, ACCESS          // 0 Copy the value from W to TBLPTRL
TBLRD                          // 0 Read the CGROM data to TABLAT
MOVF POSTINC0, W, ACCESS       // 1 Copy the value in RAM to W, then increment the pointer
MOVWF TBLPTRL, ACCESS          // 1 Copy the value from W to TBLPTRL
MOVF TABLAT, W, ACCESS         // 0 Copy the value from TABLAT to W
TBLRD                          // 1 Read the CGROM data to TABLAT
// column 0
MOVWF LATC, ACCESS    // bit 7 // 0 Copy the value from W to LATC
NOP
RLNCF LATC, F, ACCESS // bit 6
NOP
RLNCF LATC, F, ACCESS // bit 5
NOP
RLNCF LATC, F, ACCESS // bit 4
NOP
RLNCF LATC, F, ACCESS // bit 3
MOVF POSTINC0, W, ACCESS       // 2 Copy the value in RAM to W, then increment the pointer
RLNCF LATC, F, ACCESS // bit 2
MOVWF TBLPTRL, ACCESS          // 2 Copy the value from W to TBLPTRL
RLNCF LATC, F, ACCESS // bit 1
MOVF TABLAT, W, ACCESS         // 1 Copy the value from TABLAT to W
RLNCF LATC, F, ACCESS // bit 0
TBLRD                          // 2 Read the CGROM data to TABLAT
// column 1
MOVWF LATC, ACCESS    // bit 7 // 1 Copy the value from W to LATC
NOP
RLNCF LATC, F, ACCESS // bit 6
NOP
RLNCF LATC, F, ACCESS // bit 5
NOP
RLNCF LATC, F, ACCESS // bit 4
NOP
RLNCF LATC, F, ACCESS // bit 3
MOVF POSTINC0, W, ACCESS       // Copy the value in RAM to W, then increment the pointer
RLNCF LATC, F, ACCESS // bit 2
MOVWF TBLPTRL, ACCESS          // Copy the value from W to TBLPTRL
RLNCF LATC, F, ACCESS // bit 1
MOVF TABLAT, W, ACCESS         // 2 Copy the value from TABLAT to W
RLNCF LATC, F, ACCESS // bit 0
TBLRD                          // Read the CGROM data to TABLAT
// column 2
MOVWF LATC, ACCESS    // bit 7 // 2 Copy the value from W to LATC

ここは、最もスピードが要求されるところで、インラインアセンブラで記述されている。CG-ROMは、PICのプログラムメモリーに埋め込んであるが、これを「TBLRD」という命令で読み込んで、ポートCのビット7にセットする。あとは、左シフトを7回行うことで、1バイト(8ビット)分を出力する仕組み。32文字を出力するのに、12 MHzのスピードがちょうどよかった。ちなみに、40文字表示させようとすると、16 MHzのスピードが必要になる。

PIC18F14K50は、RAMを768バイト保有している。これがすべて使えれば、32文字×24行の表示が可能であるが、実際にはスタックや演算のための領域が必要なので、32文字×20行とすることにした。パチパチマイコン用なら、これでも十分だろう。

下の写真は、とりあえず、お決まりの「HELLO WORLD!」を出力してみたところ。

2012-01-23-IMG_9588_2.jpg

演算速度・RAMの容量・ピンの数など、PIC18F14K50の性能を十分に発揮できているように思う。

コメント

コメントはありません

コメント送信