先週、マイコンに接続する制御ボードの半田付けを終えた どうやってテストする
哲さん。今日は、愛犬ロボの狂犬病予防注射の帰りとなり
いつもより、遅くなった。注射のためか、ロボは少し動き
が鈍い。啓二さんの愛犬はAibo。Aiboには、注射
なんか必要ないよなあと思いつつ、歩いていく。餌も自分
で補給しに行くし、手がかからないよなあ、と溜息をつき
歩いていく。考えごとをしていたので、啓二さんが仕事の
ために借りているアパートを通り過ぎようとして、ロボが
吼えた。吼えた声に気がついて、啓二さんが窓を開けて顔
を出した。
啓二:おーい、今日は、2号さんのところにでも行くのか。 哲 :やめてくれよ。2号さんなんて、いないよ。 瑞希にでも聞かれたら、家庭内紛争が起きる。 考えごとをして、行き過ぎただけだ。 啓二:何を考えているんだよ。危ないぞ。 ロボが吼えたから、いいようなものの、一人で歩いて いたら、車に轢かれたかもしれない。 哲 :まったくだ。今日は、何をするんだ。 啓二:プログラムで、ハードウエアをテストするのさ。 哲 :半田付けならば、バッチリだぜ。 啓二:えらく自信をもっているんだなあ。 でも、確実に接続されているかを調べるにこしたことはない。 ソフトを開発している奴は、変な自信があるせいか、確認が 疎かなんだよなあ。 哲 :ああ、それはあるかもなあ。うちの新人もそうだ。絶対に 自分がやったことは、完璧だって頑張るんだ。困った奴だ。 啓二:お前、その新人君と同じことを言ったんだぞ。 現実の前には、謙虚でないと駄目だぞ。 哲 :へいへい、わかりましたよ。 ところで、ハードウエアをテストするときの定石 なんてあるのか。 啓二:うーん、人によるけど、自分で決めている方法はある。 哲 :どんな方法だ。 啓二:瑞希さんにイルミネーションを見せるときに使った方法だ。 哲 :あれ、何だったっけか。 啓二:カウンタとデコーダを使って、LEDをイルミネーションに しただろう。あれが、自分なりに決めている方法なんだ。 哲 :そうだったのか。でも、あれは出力だけだろう。 入力はないじゃないか。 啓二:出力をテストしてOKならば、入力に取りかかる。 入力は、出力が確実になってからで充分なんだ。 ただし、テストだから、複雑じゃない方がいいぞ。 哲 :じゃ、まず出力のテスト方法を教えてくれよ。 啓二:だから、カウンタとデコーダを使えばいいんだって。 お前、プログラマだろう。カウンタはどうやって作るのさ。 哲 :変数を用意して、0クリア後、+1ずつして、ある値に 達したら0クリアして、同じことを繰返す。 啓二:だろう。それを手順として書き出してみろよ。 哲 :こんなの簡単、簡単。 ステップ1 変数Aを0にする。 ステップ2 A+1→A。 ステップ3 A=Nならば、ステップ1に戻る。 ステップ4 ステップ2に戻る 啓二:後で判定するのか。あまり関心しないなあ。 前で判定しろよ。 哲 :プロにケチをつけるとは、大した奴だな。 ステップ1 変数Aを0にする。 ステップ2 A=Nならば、ステップ1に戻る。 ステップ3 A+1→A。 ステップ4 ステップ2に戻る 少し、汚いなあ。 啓二:やっぱり、Windowsマシンのプログラマ、SEだな。 哲 :何だよ。もっといい方法があるのかよ。 啓二:いつも、いつもうまくいくわけじゃないけれど、 次の方がすっきりする。 ステップ1 変数Aを0にする。 ステップ2 A+1→A。 ステップ3 AをNで割った余り→A。 ステップ4 ステップ2に戻る ってな具合だ。 哲 :剰余系を使うのか。言われてみれば、綺麗なアルゴリズムだ。 啓二:お前の半田付けした制御ボードには、RGBの3色を1パッ ケージにしたLEDがついている。だから、点灯と消灯を テストするには、0〜7をLEDの3つのピンに与えれる。 哲 :そうだよなあ。 じゃあ、カウンタだけで、デコーダは、いらないじゃないか。 啓二:この場合はな。でも、R、G、Bを1個1個点灯して調べたい こともあるよな。信号機みたいにさ。 哲 :確かに、そっちの方がわかりやすいかもな。 啓二:だろう。そこで、デコーダの出番さ。 ステップ0 (赤緑青)=(100) ステップ1 (赤緑青)=(010) ステップ2 (赤緑青)=(001) ステップ3 (赤緑青)=(010) ステップ4 ステップ0に戻る としてみる。 カウンタは、0〜3を刻んで、デコーダは、カウンタの出力を 入力として、パターンを出力すればいいのさ。 哲 :こっちの方が、応用は利きそうだな。 カウンタは、ハードウエアを気にしないでカウントする。 デコーダは、ハードウエアを意識してパターンを出力するか。 啓二:その通り。 カウンタは、次のように構成するだけいい。 ステップ0 変数Aを0にする。 ステップ1 デコーダにAを渡す。 ステップ2 A+1→A。 ステップ3 Aの下位2ビットを取得→A。 ステップ4 ステップ1に戻る こうして、無限ループを構成すると、変数Aは、0〜3を 繰返す。 哲 :論理積を使って、剰余系の代わりをさせているのか。 啓二:そう。ちなみに、変数Aを0にするのも、論理演算で充分なんだ。 排他的論理和を使えば、0クリアができる。 これを代入命令でやってしまうと、遅くなるし、プログラムメモリ を余分に消費する。 哲 :C/C++のコンパイラが、そこまでやっているか不安になってきた。 啓二:だろう。最適化オプションで、高速にしたりしても、どうやっている のかは、アセンブラのコードを吐出させて見た方がいいよ。 今のコンパイラは、賢いから、この程度の最適化はしていると思うが 確認はしておくべきだなあ。 哲 :で、デコーダは、どうするんだ。 高級言語ならば、配列を使って引っ張りだして、終わりにするけど。 啓二:それで、いいよ。 ただし、ROMの部分にパターンを書かないと駄目だけどね。 サブルーチンで、こんな風にするか。 ステップ0 テーブルのアドレスをTに代入。 ステップ1 T+A→T。 ステップ2 アドレスTからデータを取得し、Aに転送。 ステップ3 Aの値を出力する。 ステップ4 戻る 哲 :なんだ、テーブルルックアップか。簡単だな。 啓二:だから、ハードウエアをテストするには、時間をかけずに、 策を労することなく、作るのがいいんだって。 それなりの心得があれば、誰が見てもわかって作れるのが 理想なのさ。 哲 :うん。確かにそうだ。 これならば、中学生の子供にもわかりやすいしなあ。 お前、先生ができるぞ。 啓二:もう、専門学校や大学で教えているんだから、先生しているって。 哲 :じゃあ、今度は入力だな。 啓二:慌てるなって。まずソースコードを作って、アセンブル、リンク して、転送してテストしてみろよ。ピラミッドみたいに、1個の 石を置いて、着実に下から積み上げないと、どこでミスしたか 検討がつかないだろうが。 哲 :そうか。まあ、こんな程度ならば、軽い軽い。 (ソースを入力し、アセンブル、リンクしてダウンロードし走らせてみる) げえ、全部点灯しているぞ。何でだ。 こんな簡単なプログラムなのに、どこか間違ったか。 啓二:どれどれ、周波数チェッカーで、マイコンの出力を確認してみるか。 (何やら、ツールを出して、マイコンの出力にあててみる) ピッ、ピッと音がしているから、マイコンはちゃんと0と1を交互 に出しているなあ。 ああ、人間が認識できないほど高速に動いているんだ。 ウエイトを入れないと駄目だった。 哲 :何だ、そうか。空ループを回して、無駄時間を作ればいいのか。 ところで、その周波数チェッカーって何だ。 啓二:これか。これは、高速なクロックをカウンタに入れて、人間の 耳が感知できる周波数まで落として、動作を確認するためにと 作ったんだ。現場に測定器を持ちこむのが、面倒だったんで、 ありあわせの部品で作ったんだ。ひとつ作っておくと、便利だぞ。 哲 :じゃ、空ループを入れて、もう一度。 (コードを修正し、アセンブル、リンクしてダウンロードし走らせてみる) おー、できた、できた。色が1個1個変化していく。 啓二:じゃあ、次だ。入力のチェックを入れよう。 スイッチの値を読みこんで、そのまま、LEDに出力してやればいい。 哲 :それで、先に出力を作ったのか。 啓二:そういうこと。 まず手順を書いてみろよ。 哲 :ほいきた、きたか、さっさと。 ステップ0 スイッチの値を読みこみ、変数Aに入れる。 ステップ1 変数Aの値を出力。 ステップ2 ステップ0に戻る でいいだろう。 啓二:正論理と負論理を考えたら、デコーダを入れた方がいいな。 哲 :どういうことだよ。 啓二:78kは、プルアップ抵抗を内蔵しているから、お前の 制御ボードには、スイッチに抵抗をつけていない。その まま78kのピンに入れてある。 哲 :確かにそうだ。 啓二:で、この内蔵のプルアップ抵抗は、スイッチを押さないで 値を読みこむと論理の1を入力させる。 押したら、LEDが点く方がわかりやすいだろう。 哲 :そうだな。 啓二:スイッチを押すと、点灯。スイッチを押さないと、消灯。 これを考えると、手順は、次のようになる。 ステップ0 スイッチの値を読みこみ、変数Aに入れる。 ステップ1 変数Aの値を反転。 ステップ2 変数Aの値を出力。 ステップ3 ステップ0に戻る。 哲 :論理値を反転させるには、どうするんだ。 啓二:デコード用のサブルーチンを作ってもいいし、排他的論理和で 反転してもいい。この場合は、排他的論理和で充分かな。 じゃあ、やってみてくれ。内蔵のプルアップ抵抗を利用するの を忘れないようにな。 哲 :ほい、ほい。 (コードを作成し、アセンブル、リンクしてダウンロードし 走らせてみる。この間、約10分ほど) おー、できた、できた。スイッチを押すと、LEDが点灯する。 啓二:これで、おしまいだ。 哲 :待てよ。ブザーのテストが終わってないぞ。 啓二:忘れていた。スイッチのテスト用のプログラムの中で、どちらかの スイッチの出力を、ブザーにも出せばできるよ。 哲 :どれ、どれ。 (コードを修正し、アセンブル、リンクしてダウンロードし 走らせてみる。この間、約3分ほど) スイッチを押してみると。おー、鳴った、鳴った。 そのとき、部屋のドアをノックする音が。啓二さんがドア を開けてみると、なんと哲さんの奥さん、瑞希さんがいる。 亭主が浮気をしているのではと疑い、尾行していたのだ。 が、知合いの啓二さんのアパートで、マイコンの手ほどき を受けていることを、開け放した窓から聞こえる声で知り ドアをノックしたのだった。 哲 :あれ、瑞希、何でここにいるの。 瑞希:それは、こっちのせりふ。何にしてたのよ、まったく。 哲 :いや、あの、その、愛がロボットを作りたいと言って いたんで、ロボットに使うマイコンのことを、太田に 教わっていたんだ。 瑞希:何か怪しいと思っていたのよ。何故、隠していたの。 この前イルミネーションを持ってきたときから、怪 しいと思っていたんだけど。その前は、ジンギスカン の臭いをつけて帰ってきたし。 結婚するとき、隠しごとはなしだったはずよね。 哲 :ごめん。驚かしてやろうと思ってさ。 瑞希:少しは、家事の手伝いをしてよねえ。遊んでばかりで。 哲 :実は、料理も教えてもらってたんだ。 (苦し紛れに、嘘を言う) 瑞希:あっ、そう。じゃあ、今度から、土曜と日曜の夕飯は 作ってくれるのねえ。助かるわ。 哲 :はい、はい、やります。やらして、頂きます。 (奥さんには、弱い) 瑞希:それじゃあ、ロボを連れて帰ってるから。 哲 :もう少ししたら、帰るから。 瑞希:じゃあ、太田さん、お邪魔様。 啓二:バイビー! こうして、嵐は過ぎていった。