PIC18F14K50を使った、キャラクターディスプレイ(製作編)
2012年1月23日
PIC18F14K50を用いて、パチパチマイコン用のキャラクターディスプレイ・インターフェースを作成中。

まだ作成途中なので、ソースコードの公開は、後ほどにしたい。エッセンスだけ、メモ。
PICにビデオ信号を作成させている。このような形でキャラクターディスプレイを作成しようとしたきっかけは、ラジオ技術のある記事、「ワンチップ・マイコン PIC16C84でビデオ・ゲームを作る」である。この記事を読んで、いずれ自分でビデオ信号を作成したいと考えていた。
パチパチマイコンが完成した今、次のステップとしては、キャラクターディスプレイとキーボードの接続である。PICマイコンの使い方も会得した。これ(PICを用いたキャラクターディスプレイ)を今作らなくて、いつ作る!…ということになった。
ビデオ信号(NTSC)として、どのように出力すればよいかは、次のページが大いに参考になる。
RS-170A NTSCビデオ信号タイミング規格の概要
まず、回路図から。

PICのRB4とRC7の2つの出力を用いて、ビデオ信号を作る。RB4は、水平同期信号、RC7は映像信号に相当する。この2つの出力により、0 V (水平同期時)、0.3 V (黒色信号) 1 V (白色信号)を作成している。これらの電圧が意味するところは、上記リンク先「RS-170A NTSCビデオ信号タイミング規格の概要」を参照されたい。
NTSCビデオ信号では、63.5 μ秒ごとに一行分のシグナルを送出することになるが、この時間計測に Timer0を16ビットモードで用いた。以下は、PICのソースコードのうち、同期部分である。
0xFD05から0x10000までの763カウントを、12 MHzの水晶発振のクロックで行うので、ほぼ63.5 μ秒に相当する。
以下は、映像信号出力コードの一部。
ここは、最もスピードが要求されるところで、インラインアセンブラで記述されている。CG-ROMは、PICのプログラムメモリーに埋め込んであるが、これを「TBLRD」という命令で読み込んで、ポートCのビット7にセットする。あとは、左シフトを7回行うことで、1バイト(8ビット)分を出力する仕組み。32文字を出力するのに、12 MHzのスピードがちょうどよかった。ちなみに、40文字表示させようとすると、16 MHzのスピードが必要になる。
PIC18F14K50は、RAMを768バイト保有している。これがすべて使えれば、32文字×24行の表示が可能であるが、実際にはスタックや演算のための領域が必要なので、32文字×20行とすることにした。パチパチマイコン用なら、これでも十分だろう。
下の写真は、とりあえず、お決まりの「HELLO WORLD!」を出力してみたところ。

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

まだ作成途中なので、ソースコードの公開は、後ほどにしたい。エッセンスだけ、メモ。
PICにビデオ信号を作成させている。このような形でキャラクターディスプレイを作成しようとしたきっかけは、ラジオ技術のある記事、「ワンチップ・マイコン PIC16C84でビデオ・ゲームを作る」である。この記事を読んで、いずれ自分でビデオ信号を作成したいと考えていた。
パチパチマイコンが完成した今、次のステップとしては、キャラクターディスプレイとキーボードの接続である。PICマイコンの使い方も会得した。これ(PICを用いたキャラクターディスプレイ)を今作らなくて、いつ作る!…ということになった。
ビデオ信号(NTSC)として、どのように出力すればよいかは、次のページが大いに参考になる。
RS-170A NTSCビデオ信号タイミング規格の概要
まず、回路図から。

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!」を出力してみたところ。

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