PIC AVR 工作室->TopPage->AVRの工作->テキスト画面

テキスト画面

テキスト画面の概要

テキスト画面サムネール

TINY2313を使ってNTSCのテキスト画面を表示するプログラムです。AVRを使ったはじめての作品です。かなり無謀な挑戦でした。

UARTからASCIIコードを入力して、13文字×7行のテキスト文字がNTSCのビデオ信号として出力されます。モノクロ表示のみ。

キャリッジリターンで改行したりスクロールしたりするバージョンと、単にX軸Y軸指定でテキストを表示するバージョンの2つがあります。

フォントは、メモリ節約のため5×6ドットのオリジナルフォントを使っています。

文字種は、英文字、英数字、その他記号、特殊コード(キャリッジリターンや画面クリア、ベルコード、座標指定)に対応。

UARTでデータを入力し、それをテキストスクリーンに反映。NTSC(もどき)信号にして出力します。

VT100互換には程遠いですが、シリアルでキャラクターコードを送るだけで簡単に文字表示が出来ます。

サンプル:テキスト画面の出力例

テレビ画面をデジカメで撮ってgif画像にしました。電源on時の画面です。

テキスト画面のカーソル表示

このgifに写っているのはリターンコードで改行/スクロールに対応しているバージョンです。 対応しているバージョンではこのとおりカーソルが点滅したり、表示が最下行まで行くと自動的にスクロールしたりと、 80年代のPCっぽい感じをいい雰囲気に再現しています。

対応していない方のバージョンではカーソル表示されず、文字だけが表示されます。

サンプルムービー:テキスト画面のキャプチャ画面

キャプチャー画面をフラッシュムービーにしました。画面をクリックすると再生します。

テストボードV1を使用して、説明書に掲載してあるサンプルプログラムを実行した画面です。 UARTの転送速度が1200bps(1画面全部を塗るのに約0.8秒)と遅いですが、画面が広くないので それほど気にならないレベルかと思います。

使い方

メインCPU側からUART通信でASCIIコードを送信するだけでテレビ画面に文字が表示されます。 送信されたキャラクターコードはTINY2313内部のテキストV-RAMに反映され、 TINY2313はそのキャラクターコードに相当するビットマップイメージにデコードし、NTSC信号として出力されます。

UARTは1200bps、ノンパリ、ストップビット1。1バイト毎にウェイトを入れる必要ありません。連続データを受信できます。 なので、C言語のprintf関数など高級言語での文字列表示関数などから簡単にデータを送信できます。 液晶表示器(HD44780互換など)では表現が足りないとか、画面が狭いとか、ピンの数を減らしたいとか、そういう時の置き換えに使えます。

映像信号はPB0、同期信号はPD6から出力されます。PB0に470Ω、PD6に1kΩの抵抗をつなぎ、 カップリングコンデンサを経由してRCA端子でテレビに接続します。詳しくは、 テストボードV1の回路図をご覧下さい。

表示可能な文字は、以下のキャラクターコード表をご参照下さい。キャラクターコード表上に色が付いているところが 使用可能なキャラクターです。なお、緑色はカーソル移動などの制御コードを指しています。

そうそう。ベルコード(0x07)でBEEP出力する機能なんていうのも付いてます。

キャラクターコード

おおよそASCIIコードに対応できていると思いますが、アルファベットの小文字は大文字に変換して表示されます。(省メモリのため)

X軸指定、Y軸指定は、本来エスケープシーケンスコードを用いるべきなのでしょうが、2バイトデータを扱うのは 処理が大変だったので諦めて、表示非対象文字のコードの中から座標指定専用コードを割り当てました。

●キャラクターコード表(オリジナル版)

キャラクターコード表(オリジナル版)


●キャラクターコード表(改行対応版)

キャラクターコード表(改行対応版)


画面消去コード(0x0C)が送信されると、画面が全部クリアされます。

X軸指定コード(0x80~8C)が送信されると、カーソルのX軸が指定できます。

Y軸指定コード(0x90~96)が送信されると、カーソルのY軸が指定できます。 (ただし改行対応版は0x90~97まで。0x97にてY軸を7にすると画面がスクロールします)

改行対応版では、改行コード(0x0D)が送信されるとカーソル位置が1行下の最左端に移ります。 7行目(Y軸が6)の時に改行すると、画面がスクロールします。

ベルコード(0x07)が送信されると、PD4端子に約0.5秒間5Vが出力されます。この端子に圧電ブザーなどを繋ぐと BEEP音が出力できます。(ただしこの機能はブレッドボード上で動作確認しただけなので、これを利用した作品例は今のところありません。)

コメント

JS1RSVさんのサイトで公開されている PIC16F628を使ったビデオテキストジェネレータ (HAM Journal No103 2002年秋号にも特集有り) に感動して、AVRの開発環境が整ったら真っ先に作ろうと思っていたのがテキスト表示器でした。 80年代にBASIC言語でノロノロ動くプログラムを作っていた私にとって、こんな小さいマイコン1個でビデオ信号が 作れたりするという処理能力の速さには驚きでした!で、自分でもやってみたい!という自作の虫がムズムズと蠢き出したわけです。

とはいえ、同じような機能のものを作ってみても車輪の再発明なので、もっと色んな機能を組み込んでみました。 スクロールするとか、カーソルが点滅するとか、改行コードとか、BEEP出力とか… できるだけ80年代の PCっぽい機能を詰め込んでみようと。ここまで機能が載っていれば、実用には充分耐えるでしょう!(実用って???)

秋月電子通商では、20MHz動作のTINY2313-20PUが120円で売られています(2007年11月現在)。 これとセラロックやRCA端子などで文字表示器を作れば約200円程度となり、液晶表示器よりはるかに安価な表示器として使え、 表示画面も広く、なによりも小型マイコンにとって貴重なI/O端子も1つしか使いません。

作るにあたって悩ましかったのは、AVRのTINYシリーズはUSARTを搭載しているものがTINY2313だけしかなく、 フラッシュROMも2KBしか搭載していないこと。文字種やフォントのビット数を如何にして減らすかに腐心しました。 TINYシリーズでも4kB搭載のICもありますが、UART入力が使えるのは2313だけ。 UARTが使えるというところが重要なんです。

UARTなら2バイトのハードウェアバッファが働くので、その間にテキストVRAMの更新や文字表示ができるのですが、 USIでUART通信を使うとハードウェアのダブルバッファが働かないので受信処理が追いつかなくなる恐れが生じます。 だからといってMEGAシリーズを使うと、ICの単価が何倍にもなっちゃって、それなら最初から液晶表示器使えば…って話になっちゃう。

それと2313にはSRAMが128バイトしかないので、そのうち100バイト前後をテキストVRAMに 割り当てるとしても 単純計算で10文字×10行程度。縦横比や処理クロック数等も考慮すると、13×7=91文字程度が現実的な数値でした。

USIをUARTモードじゃなくSPIとして使えばダブルバッファも関係ないじゃん!というご意見もあるかと思いますが、 高級言語、例えばPIC用のCCS-Cコンパイラなどは、標準入出力関数にUARTを想定しており、 printf関数等でメッセージを表示しようとすると、やっぱりUARTの方が使い勝手がいいんですよねー。 他の高級言語でも似たような感じかと。

もっとSRAMが大きければ、行数を倍にしたり、横方向をもう少し縮めて文字数を多くしたりできたと思います。 2313のフラッシュROMとSRAMをもうちょっとだけ拡大したバージョンが発売されると嬉しいんですけどね…

実はこのテキスト画面表示器に、キーボード入力機能とBASICインタラプタを組み合わせて、 大昔のTINY-BASIC程度のスタンドアロンPCができると面白いと思っているんですが…

UARTのビットレートですが、なぜ1200bpsなのか?もっと速く出来なかったの?と思う方もいらっしゃるかと思います。 なにしろスプライト表示器はもっともっと速いですからね。

実はスプライト表示器に比べてて、スクロールやキャリッジリターン、画面消去等のスクリーンエディット機能や、 ASCIIコード→内部コードの変換など色々な処理に時間を取られてしまい、垂直同期期間内(1フレームを表示する間=1/60秒間) にUARTのバッファ分2バイト+α程度しかデータを受信できませんでした。なので、1秒間では2バイト×10ビット÷(1/60秒) =1200bpsとなったわけです。

(一方、スプライト表示器の場合は座標更新だけというシンプルさなので、水平同期信号生成の約4.7μ秒以内でUART関連処理を すべて終えてしまっています。つまり走査線1本につき1バイト受信可能です。座標更新だけで単純ですからね…)

しかも、実現には1200bpsですらかなり苦労していています。ちょっと、ムリしています。なので、送信側の速度が1200bpsより3%程度 上がってしまうとデータを読み飛ばしてしまうことも生じます。1200bpsより2%以上速い送信は行わないように してください。(遅い場合については、RS-232Cの規格と同等の5%程度は充分許容します)

もう少し文字の大きさを細かくして文字数を増やしたり、マルチウィンドウ対応もできるようにしたら、もうちょっと使い勝手がいいかも しれませんねぇ。いつか、SRAMやフラッシュメモリがもう少し大きいMEGAシリーズ用に別バージョンを作ってみたい気がします。 目下問題なのはメモリ容量だけ! 表示速度などは全然余裕があり、文字をもっと細かく表示したりすることは充分可能! いつか頑張ろう…

ダウンロード

テキスト画面用アーカイブ(クリックすると開きます)

(注)テストボードV1PLAYER上 で動作します。PLAYERの場合、背景表示器は必要ありません(背景表示器に何か書き込んであっても背景表示器は動作しません)。

アセンブラソースはかなりスパゲティー状態なので、当面非公開にしたいと思います。(質問受けても1つ1つに答えられないと思うので) スパゲティーだかミートソースだかわからんがソース見てみたいぞ!というご意見がたくさん集まるようでしたら公開したいと思います。

おまけ

ベル出力機能を圧電ブザーではなく、RCA端子から出力してテレビのスピーカーから音を出したいという方の為に、タイマーIC555を使った 発振回路を作ってみました。ブレッドボード上で組んでテキスト表示器と繋いでみたところ、なんと言うか、非常に懐かしい音が出ました。 (ちなみに555というのは、 秋月ではこんな感じで売られています。念のため。)

テキスト表示器のベル出力端子(PD4)を555のリセット端子(4番ピン)に繋ぐと、ベルコード出力(0x07)でブザー音が出ます。 約2200Hzになると思います。

回路と周波数設定の計算には、こちらのサイトを参考にしました。 (クリックすると参考のサイトを開きます)