7.1 PSP概要 |
1. ハード構成
以前、秋月で買った5x7ドットの2色マトリックスLED 2個の使い道を考えながら、秋月のページを眺めていたらI/Oピン数の多い28ピンのPIC16F873Aが目に付いた。I/Oピンが22ピンもあり、PIC1個のみでマトリックスLEDを2個並べて表示できる。ペントミノのボードは6×10マトリックスなので十分だ。マトリックスLEDの各セルが四角なこともペントミノの表示に丁度良い。(このLEDはすでに秋月で扱っていない模様)
5x7ドット 2色マトリックスLED という訳でPIC 1個+マトリックスLEDで、ペントミノを解いて表示する専用マシンを作ってみることにした。
PIC16F873Aのデータメモリは192バイト(96バイト×2バンク)、プログラムメモリは4Kワード(2Kワード×2ページ)と、データメモリが非常に少ない。バンクに分かれていることもつらい。この少ないメモリでそこそこの性能のコードが書けるかかが課題。
クロックは最速の20MHzとし、外部発振子としてセラロックを使用する。電源は4V以上必要なのと、LEDが小さめなので単5電池を3本使用しコンパクトに作ることを目指す。(表面実装のPICやボタン電池を使えばさらに小さくできそうだが、そこまでは凝らない)
他に電源SW用に小型のスライドスイッチ1個と、動作を切り替えるためのタクトスイッチ1個、LEDの電流制限抵抗、プルアップ抵抗、ユニバーサル基板など。ケースは、東急ハンズで単5電池ホルダ3個と基板が入りそうな小さなアクリルケースを見つけた。部品代は合計1,500円程度。電池ホルダとケースが意外と高い。
2. 目標性能
PICでは使えるメモリが少なくて凝ったことはできそうにないので、実装するプログラムは、C言語版の最適化の3版をベースにすることにした。
当時、PentiumIII 800MHzを使って1.75秒で全解が求められている。これを元にCPU性能の違いから目標タイムを推定する。
- CPUクロック比
800MHz:20MHz で40倍の速度比- CPUビット数
32ビット:8ビットの比は4倍だが、処理能力は2の4乗で16倍位か以上から、40x16=640倍で、1.75秒×640=1,120秒(18分40秒) を目標とした。
アセンブラで書くのでもう少し速いかもしれないが、PICはデータメモリが少ないのでピース定義テーブルを配列で持てないなどの制約がある。また、計算中の進捗状況を表示するために多少CPUを使うので、ひとまずこの位を目標とした。平均すると0.5秒毎にひとつの解が得られる(1,120秒/2339解=0.47秒)。
大昔、APPLE-][のCPU 6502(1MHz動作)のアセンブラで解いたとき、一晩で50個程度しか解けなかったことがあるので心配。当時のコードはすっかり忘れてしまったが、盤面の長い辺に沿ってピースを置いたことが遅い理由だったと、今では思う。
3. 実際の性能
一応、速度を気にしてコードを書き、実際に動かしたら以下のように目標をクリアできた。約0.3秒毎に解が求まっている。もう少しは速くできると思う。
データメモリは結構ギリギリの175バイト使用。処理速度を多少犠牲にすればあと36バイト程度は削減可能。プログラムメモリは文字パターンなどを含めて1.8Kワードで済んだ。
※処理時間はPICの開発環境:MPLAB上のStopwatch機能で測定
No. 処理時間 対応内容 1 958秒 ・次の置き場所の1,2セルの孤立チェックなし
・進捗表示なし2 804秒 ・次の置き場所が1セル分しかない孤立チェックのみ実装
・進捗表示なし3 778秒 ・次の置き場所の1,2セルの孤立チェックあり
・進捗表示なし4 809秒 ・進捗表示あり 5 782秒 ・アセンブラコードを少し見直し 6 692秒 ・ピース定義を見直し 4. 機能概要
(1). 実行モード
- ステップ実行モード
- ひとつの解が求まると一旦止まり、その解番号と解の表示を行う。ボタンを押すまでその解の表示を繰り返す。ボタンを押すと次の解の計算を行う。ボタンを長押しすると、連続実行モードになる。
- 連続実行モード
- 止まらずに続けて計算し、求まった解数を随時表示する。途中でボタンを押すとステップ実行モードになり、その時点の解番号と解の表示を行う。
(2). プログレスバー
ひとつの解を求めるまでの様子を緑色LEDで表示する。置けたピース数を縦の1列で表示するが、1列7ドットなのでピース6〜12個の状況をバーグラフで表示。12個目は一瞬なのでほとんど見えない。
![]()
(3). 解数の表示
連続実行モード時に、解いた解数をプログレスバーのように表示する。4桁の結果を4行で表示する。
![]()
(4). 解番号の表示
表示部は7×10ドットのマトリックスで、そのままでは数字を表示できないので、スクロール表示する。解番号 No. 1 〜 No. 2339 までゼロサプレス(上位桁の不要な0を表示しない)で表示。
![]()
(5). 解の表示
ボードの左上から、配置した順にピース形状を順次表示する。1ピース当たり0.3秒くらい表示し、12ピース4秒位。
![]()
(6). その他
- 電源投入時のスプラッシュ表示
- 全解が求まったときの完了表示
- 自動パワーオフ(全解完了時、入力待ちでボタンが長時間押されないとき)
5. 動作中の様子
まだケースに入れる前の状態です。緑の輝度が少し低い。
連続モードで演算中の様子 解の表示の様子
Copyright (C) Nakamura 2008 |