どうやってテストする

先週、マイコンに接続する制御ボードの半田付けを終えた
哲さん。今日は、愛犬ロボの狂犬病予防注射の帰りとなり
いつもより、遅くなった。注射のためか、ロボは少し動き
が鈍い。啓二さんの愛犬は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分ほど)
   スイッチを押してみると。おー、鳴った、鳴った。

そのとき、部屋のドアをノックする音が。啓二さんがドア
を開けてみると、なんと哲さんの奥さん、瑞希さんがいる。
亭主が浮気をしているのではと疑い、尾行していたのだ。
が、知合いの啓二さんのアパートで、マイコンの手ほどき
を受けていることを、開け放した窓から聞こえる声で知り
ドアをノックしたのだった。

哲  :あれ、瑞希、何でここにいるの。
瑞希:それは、こっちのせりふ。何にしてたのよ、まったく。
哲  :いや、あの、その、愛がロボットを作りたいと言って
   いたんで、ロボットに使うマイコンのことを、太田に
   教わっていたんだ。
瑞希:何か怪しいと思っていたのよ。何故、隠していたの。
   この前イルミネーションを持ってきたときから、怪
   しいと思っていたんだけど。その前は、ジンギスカン
   の臭いをつけて帰ってきたし。
   結婚するとき、隠しごとはなしだったはずよね。
哲  :ごめん。驚かしてやろうと思ってさ。
瑞希:少しは、家事の手伝いをしてよねえ。遊んでばかりで。
哲  :実は、料理も教えてもらってたんだ。
   (苦し紛れに、嘘を言う)
瑞希:あっ、そう。じゃあ、今度から、土曜と日曜の夕飯は
   作ってくれるのねえ。助かるわ。
哲  :はい、はい、やります。やらして、頂きます。
   (奥さんには、弱い)
瑞希:それじゃあ、ロボを連れて帰ってるから。
哲  :もう少ししたら、帰るから。
瑞希:じゃあ、太田さん、お邪魔様。
啓二:バイビー!

こうして、嵐は過ぎていった。

戻る