[1]の記事を見た時には、ワンチップマイコンでビデオ信号を直接作ることができることに驚きました。また、[2]~[4]では、マイコンの内蔵メモリをVRAMとして使い、基本的な関数群を用意することにより、ビデオ装置のプログラム開発が容易になることを知りました。以下の装置はこれらを参考に製作したものです。
なお、表示内容をプログラムできる小型ビデオ表示装置の初期のアイディアは2004年度の情報技術演習(院)の中で高橋学氏より出されたものです。また、表示内容を変えられるわけではありませんが、「ビデオバルブ」という小型のビデオ装置も商品化されているようです[5]。
TV電光掲示板・字幕オーバレイ |
TVクロック・オーバレイ | |||
---|---|---|---|---|
発表会用タイマー |
多目的タイマー |
タイムエイド |
PONGゲーム |
マイコンはATMEL社のAVRマイコンATtiny45を使いました。ビデオ信号の発生方法については、主にBruce Land氏の資料[2][3]を参考にしました。プログラムはWinAVRのgcc-avrでコンパイルします。
タイマーや電光掲示板のカラー表示は、サブキャリア(SC)の4倍の周波数(14.32MHz)のクロックでマイコンを動作させ、サブキャリアバーストに対して位相を90°ずつ変えることにより、4色を表現しています。ただし、タイミングもレベルも規格外のため、テレビによってはうまく表示できないことがあるかもしれません。以下のプログラムで、1ドットにつきSC2周期分の波形を作っています。予め、r16にVRAMの1バイト分、r17には0x00、r18には0x02を入れておき、以下のプログラムを8回繰り返すと8ドット分の信号となります。次の1バイト分は予め別のレジスタに入れておき、同様のプログラム(r16の箇所が変わる)とします。このように6バイト分続ければ水平48ドット分のカラー信号となります。レジスタ数が多いAVRならではです。
2017.1.18 アセンブラでビデオ信号
アセンブラで単純なビデオ信号を作ってみました。1MHzの内蔵クロックを利用しています。内蔵クロックにはジッタがあることが知られており、結果、表示されるビデオ画像はゆらゆらと揺らぎます。また、規格外のビデオ信号なのでテレビによってはうまく表示できないかもしれません。でも、とにもかくにもテレビに画像が表示されるので、初めてビデオ信号を作って表示させた時は感激します。
以下は、所定のパターンで1ライン表示させた例(写真左)と、「イ」の文字を表示させた例(写真右)です。後者では、プログラム冒頭に以下のように8×8ビットのデータを置いています。
(写真)
(回路図と製作例)
(プログラム)...video1line.asm,video8x8.asm
このプログラムで作られるビデオ信号は以下のようなものです。ビデオのラインは0~255の256本で、0~2を垂直同期信号(VSYNC)にしています。video1line.asmでは、第64ラインだけに所定のドットパターン(プログラム中のdot patternの箇所)を表示させています。video8x8.asmでは、同じ表示を16ライン繰り返すことで、8ライン分を128ライン(第64~191ライン)に表示させています。
はじめに書いたようにここで作ったビデオ信号は規格外のものでテレビがうまく表示してくれる保証はありません。しかし、かつて広く利用されたVHSなどのビデオデッキは、テープの劣化やテープ走行の揺らぎのため、かなりヨレヨレのビデオ信号になっていますが、それでもテレビは可能な限り表示してくれるように「寛容に」できています。プログラム中のコメント欄には参考までクロック数を記載してあります。水平1ラインを63クロック(63μs)、1画面を63μs×256=16msにしています。
ここでは1024バイトのSRAMの内の960バイトを横96×縦80ドットのモノクロビデオRAMとして用いました。同じラインを2本ずつ繰り返すことで縦160ラインの表示にしています。
文字表示には16×16ドットのbdfフォントを用いました。日本語フォントをすべてメモリ上に持つことはできません。
ペイントで描いた96×80ドットモノクロBMP画像ファイルを表示できるようにしてみました。BMPファイルをdumpで出力し、awkプログラム(96x80.awk)でCのソースファイル(96x80.h)に変換しています。
(写真)
(回路図)
(文字表示プログラム)...16x16.c, 16x16lib.c, bdf8.awk, bdf16a.awk, bdf16b.awk, bdf16c.awk, 16x16.bat
(BMP画像表示プログラム)...96x80.c, 96x80.awk, 96x80.bat
以前、アセンブラで書いたカラーバー信号のプログラムをCで書いてみました。また、チップはATtiny45を使い3ビットDACにしました。VRAMのビットマップ画像に自由に色をつけられるということではありませんので念のため。
(写真)
(回路図)
(プログラム)...color45.c(WinAVR-20060421のgccで-Osのオプションをつけてコンパイル)
2004.6.24 アセンブラで書いた初期のバージョン
AVRマイコンを使ったビデオ信号ジェネレータです。テレビのAV端子に接続すると、
AVRマイコン(AT90S2313-10)はクロックの上限を超えて使用しているので、再現性があるかどうかはわかりません。ビデオ信号は簡単な4ビットDAC回路で作っています。また、AVRをカラーサブキャリア(SC)の4倍のクロックで動作させ、プログラムで90°ずつ位相を変えて4色のカラーを表示しています。少し工夫すれば色数は増やせるかもしれません。
(写真)
(回路図)
(プログラム)...col2313.asm, video.inc
[1] 瀬戸口豊: ワンチップ・ブレークアウト・ゲームの製作, トランジスタ技術, 1997年5月号, pp.353-360.
[2] Bruce Land: AVR Video Generator with an AVR Mega163, Atmel Application Journal, Vol.3, pp.8-10(2004).
[3] Bruce Land: Video Generation with Atmel AVR microcontrollers(Cornell Univ. EE476), http://instruct1.cit.cornell.edu/courses/ee476/video/
[4] Bruce Land: Designing with Microcontrollers(Cornell Univ. ECE476), http://instruct1.cit.cornell.edu/courses/ee476/
[5] クワクボリョウタ: ビデオバルブ, http://www.vector-scan.com/, 2000.
[6] ChaN: NTSCビデオ信号タイミング規格(RS-170A)概要, http://elm-chan.org/docs/rs170a/spec_j.html