2009/10/02(金)デジットLCDでテトリス完成

数日前に一段落していたのですが、更新は今日になりました。先日からいじっているデジットジャンクLCDに、前回予定していたフォント表示機能を追加しました。これで漸くソレらしいサンプルプログラムになりました。一段落の状態として、

 ・ベースボードはとある講習会の支給品を改造(w
 ・ATMEGA644P@8MHz
 ・デジットLCDの左半分64x64dotを使用
 ・VRAMはマイコン内部メモリ
 ・画像ドット命令、5x7フォント描画機能
 ・ゲームはテトリス
 ・ハイスコアはEEPROMに記録
 ・ブザーによる効果音

です。結局、フォント表示は思い通りにすぐに処理できました。以下に動かしている写真と負電圧生成回路が実装されている状態を貼っておきます。

LCD180_TETRIS1.jpg
LCD180_TETRIS2.jpg


グラフィック液晶に文字表示などできてるし、ゲームが動くとかなり楽しいものです。やってると昔流行ったキーチェーンゲームを思い出します。
今回でデジットLCDいじりは一旦終結する予定で、LCDの最終就職先は・・・どうしようかなぁ最近秋月に簡易ストレージオシロキットが出ましたがそれと似たような自分開発版を作ってみるかな?

今後、このグラフィック液晶路線を鍛錬していくなら、やっぱりOLEDとかかなぁ。
aitendoで安いのが売られているし、ネットでは既に情報がかなりあるし。コミケに出展できそうなゲームとかも作れるかも?

2009/09/26(土)グラフィック液晶用フォント

先日から弄って遊んでいるデジットジャンクLCDですが、漸く落ち着いて今のところは、
・ATMEGA644P@8MHzにて、右半分の表示を捨てれば何とか許せる描画スピード
・画面左半分でテトリス作って遊ぶ
ところまでやって色々試しています。グラフィック液晶を使う上ではやはり、VRAM描画の部分の最適化やプログラム的に利用するときの使いやすさも重要になってきます。
命名は自己流ですが、ドットを打つPSET関数、線を引くLINE関数、円を書くCIR関数、文字を書くFONT関数などのことです。で、自分は、実力不足でPSETしか実装していません。何せ、VRAMが164x64ドット / 8bit = 1024byte なのですが、ビット演算盛りだくさんで処理しているし(かなりてこずった)、線や円なんてどうやって処理を作るか、最適化するか…自分にはまだ勉強するところが多い。orz
で、できる機能でかつ実用性あるのがFONT命令かなと思うし、これならいけそうです。文字が打てるとテトリスのスコア表示とかできるし色々用途も広がります。

先にも書いたように、現在のスペックでは画面を左半分しか使いません。つまり64x64ドットです。さらにゲーム画面として32x64は使用済みです。残るのは32x64、横幅32ドットで以下に良い感じに文字を表示するかです。ここでは、表示文字をローマ字の大小+数字+記号に絞り込みました。キャラクターコードで言うところの0x20~0x7Fです。そして、1文字あたりのサイズですが、プログラム的にきりの良い1byte(8ドット)を横幅にすると4文字しか入りません。そこで1byteの下位3ビットを捨てて5ビット(ドット)にしました。高さも8ドットは縦に長すぎるので7ドットに絞り込み、そうしておいて、
・5x7ドットサイズのフォント
・1列あたり1byte消費(下位3bitは無視)
・1byte x 縦7ドット = 7byteで1文字
・文字の隣接防止のため右1ドットは出来るだけ使わない
と設定しました。こうすることで32x64ドット内にびっちり詰めれば6文字 x 9行 = 54文字表示できる計算です。安直に8x8フォントだと32文字で1行4文字であまりにもきつ過ぎるので、それから比べればかなり良い結果になりそうです。

で、構想は出来ましたが肝心のフォントを製作しないと意味がありません。というわけで早速Excelのマス目を利用して地道に書いてHEXデータも見ながら全て手計算しました。本当はExcelのマクロなどでHEXデータは出せばよいかもしれません。というか、そのほうが早かったかも…。
5x7_font.png

ざーっとは綺麗にいけたかな?と思っています。あとは、コレをプログラムヘッダーファイルに適用させて、関数書いて、いざ表示テストして…結構先は長そう。でも、フォントデータって別に転用できるし秋月のグラフィック液晶使うときなどにも役立ちそう。

2009/09/14(月)ジャンクLCD、撃沈。

先日の話題の続き、デジットジャンクLCDはハード・ファーム共に
大ボケをして見事に撃沈しました。
で、漸くうまくいきだしたので負電圧生成の部分を復習+まとめをします。

まず、前回のチャージポンプ負電圧生成はLCDの負荷に耐えられず電圧降下が
著しく使い物になりませんでした。しかもデューティ比50%のためのダイオードも
意味不明に接続されています。あれは全く参考になりません。
しかも555タイマICのデューティー比50%動作はデータシートに書いてありましたorz
しかし、色々直してみるもののコンデンサの値、発振周波数行き当たりばったりで
色々変更したのですがうまくいきませんでした。(先日の基板がすごいことに・・・)

それで結局、参考Webのところにあったシュミットインバータ使用の方式に切り替えました。
参考にして作った回路と写真を以下に記します。
invIC_-12V.png
invIC_-12V(C).jpg
invIC_-12V(S).jpg

コンデンサは発振部とパスコンを除いてタンタルコンデンサを使いました。
今回は、余裕をみて4段チャージポンプにしてみたところ-15V以上出ました。
今度はこれだと高すぎるので13Vのツェナーダイオードを出力段に接続、
これでちょっと高いですが-12.8Vを安定して出力するようになりました。
LCDの負荷接続しても電圧降下が見られず、またツェナーDに流れる電流も1mAほどで
今回はうまくいったかなと言うところです。
これで漸くLCD制御のプログラムに集中できるようになりました。
とりあえず、一段落したのはここまで。

現在、マイコンプログラムにかかっており、表示方法自体はうまくいってますが
AVRマイコンが8MHz動作だとフレームレートが低すぎて、殆ど表示だけに処理を
食われてしまい、さらにLCDのちらつきが激しい状態です。
LCD表示関数部分をアセンブラにすればもっと頑張れそうですが、
今後は20MHzセラロックで動作させてみる予定です。

2009/09/09(水)ジャンクLCD用の負電圧生成

ずいぶん前に日本橋のデジットでジャンクLCDを購入しました。
モノはM社のPC-PZ60Dと書かれておりグラフィックモノクロ液晶だろうと
いうところは分かっていたのですが、そのままずっと放置状態が続いていました。
最近になって、これの情報をWebで調べたところ2件ほど詳しく解説されている
サイトを探しました。
1.180円で買ったグラフィック液晶を動かす
2.ドット液晶 (128Wx64H) PC-PZ60D を使ってみる

LCDの表示操作はこれらを参考にさせてもらうことで、できそうということが分かりました。
ただ、両サイトの解説でもあるようにこの液晶は、微弱ながらVEE電圧に-12Vが必要
になっています。そのため、液晶操作のマイコンに使う+5Vのほかに負電圧を
用意する必要があります。そこで今回はそれの実験回路として、
発振回路の定番「555タイマ」と、チャージポンプの「コッククロフトウォルトン回路」を
使用して負電圧2倍電圧の+5V→-10V回路を製作してみました。
以下が、回路と製作した基板の様子、LCDに(あまりよくないですが)電源だけを
接続した状態の写真です。

-10V_555.png
-10V_555C.jpg
-10V_555S.jpg
digit_lcd.jpg


回路図のメモにも書いてある通り、現在の回路では電流が取れず単純計算値=-10Vが-4.5Vまで低下しています。しかしLCDに繋いでみると黒く表示されるのでとりあえず
これで進めようと思います。写真は真っ黒表示ですが信号線をOPENに
しているので表示は白黒やら黒ラインがバタついたりしています。(危険?)

とりあえず、今回は実験成功ということにして次のステップ、マイコン側プログラムに
入りたいと思います。