« PRO-10買いました | トップページ | 「天文屋のためのマイコン入門」サブルーチンの導入 »

2014年6月14日 (土)

「天文屋のためのマイコン入門」プログラム解説続き

ロータリースイッチのプログラム解説の続きですが、ここはほとんど説明の必要もないとこでしょう。

1406132_2
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が大きくなると、この差が効いてきます。

さて、実は、もっともっと効率の良い、そしてプログラムももっと小さくなる処理方法があります。間接参照というデータアクセス方法を使えば、比較処理など一切なしで一発で処理できる方法があります。

この間接参照というのは、マイコンではとても基本的なもので、必ず覚えなければならないものですが、当面必要ないので、また折をみて説明したいと思います。

今日はここまで。

|

« PRO-10買いました | トップページ | 「天文屋のためのマイコン入門」サブルーチンの導入 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« PRO-10買いました | トップページ | 「天文屋のためのマイコン入門」サブルーチンの導入 »