「天文屋のためのマイコン入門」プログラム解説続き
ロータリースイッチのプログラム解説の続きですが、ここはほとんど説明の必要もないとこでしょう。
0から9までの表示をする処理を記述しています。そえぞれ、PA6とポートBにデータを出力して、最後に無限ループの先頭にジャンプします。
さて、今回の7セグメントLEDを表示するプログラムを見直して見ましょう。
スイッチからの10通りの入力を場合分けする部分、ここがキーポイントですね。このようにデータを片っ端から比較、選別する処理はわかりやすいですが、効率は悪そうです。
もし、スイッチからの入力が1なら、運よく一回の比較で、処理を選別できます。最悪は0の場合です。この場合、9回比較した後に、ようやく選別できます。
今、Nとおりのパターンを選別するときの比較回数を計算してみると、最良の場合は1回、最悪の場合はN-1回です。平均するとN/2回です。
もうちょと、効率の良い選別方法はないでしょうか?
2分検索という方法があります。方法は簡単です。データパターンを2つにわけ、どちらに入っているか調べます。そして入っているほうを更に2つに分けてどちらに入っているか調べます。これを繰り返していけば、すべてのパターンを検索できます。
2つに分けるというと、なにやら難しそうですが、2進法で考えるとわけないです。ビットパターンを端から順に、0か1の場合で場合分けしていけばよいのです。今回の場合はスイッチの入力は4ビットですから、上位のビットから1の場合と0の場合で場合分けしていきます。
b3=0
b2=0
b1=0
b0=0 ->0
b0=1 ->1
b1=1
b0=0 ->2
b0=1 ->3
b2=1
b1=0
b0=0 ->4
b0=1 ->5
b1=1
b0=0 ->6
b0=1 ->7
b3=1
b2=0
b1=0
b0=0 ->8
b0=1 ->9
b1=1
ありえない
b2=1
ありえあない
場合分けは、BTFSC命令などでやっていけばよいでしょう。このアルゴリズムでは、N通りのパターンを場合分けする比較回数は√Nです。N=10くらいなら大差ないですが、Nが大きくなると、この差が効いてきます。
さて、実は、もっともっと効率の良い、そしてプログラムももっと小さくなる処理方法があります。間接参照というデータアクセス方法を使えば、比較処理など一切なしで一発で処理できる方法があります。
この間接参照というのは、マイコンではとても基本的なもので、必ず覚えなければならないものですが、当面必要ないので、また折をみて説明したいと思います。
今日はここまで。
| 固定リンク
コメント