« 「天文屋のためのマイコン入門」命令とデータのまとめ | トップページ | 「天文屋のためのマイコン入門」LEDプログラムの解説 »

2014年6月 7日 (土)

「天文屋のためのマイコン入門」IOポートの使い方を調べる

PICマイコンの命令とデータ構造を一通り学びました。さあ、これで、自由自在にプログラミングといきたいところですが、そう簡単にはいきません。

命令とデータの知識だけでは、マイコンにたとえば"1+2=3"の計算をやらせるようなもので、これだけは何の役にもたちません。

IOポートに代表されるマイコンの内蔵機能を使うことを覚えて、初めて役に立つプログラミングができます。

ただ、内蔵機能は覚えるものではなく、その都度調べる物です。内蔵機能はマイコンの機種によって使い方が違いますし、そもそも使わない機能を覚えても仕方ありません。ですから、覚えるのではなく、正確に言えば、使い方を調べる方法を覚える。と言ったほうがいいでしょう。

では、どうやって調べるか、それはメーカーから発行されるマイコンの「データシート」を読み解くことです。

ちなみにPIC16F88のデータシートはPIC16F88で検索すればすぐ見つかります。

とはいえ、マイコン初心者が、英文のマニュアルを読みながら使い方を調べるのはそう簡単にはいきません。最初はサンプルプログラムや解説本、ネットの解説などを頼りにやっていくしかないでしょう。しかし、大事なことはマニュアルを読む力をつけることです。サンプルプログラムを使うにしても、少なくてもこの一文は何をやっているかくらいは理解しておかなければなりません。

それでは最初に2つあるIOポートのうちAグループの方の使い方を調べて見ましょう。

データシートの51ページに、IOポートの記述があります。最初に次ページのTABLE5-2を見てみます。これはIOポートに関連したレジスタの一覧があります。

1406071

これらのレジスタに値を書いたり、読んだりして、ポートの操作を行います。マイコンに慣れてくると、この表を見ただけでだいたいどんな機能かわかるよういなります。ちなみに私が最初にこの表を見て思ったことは、

1 PORTAは、そのままポートのデータ入出力のレジスタ。
2 TRISAは、入出力方向を設定するレジスタ。
3 ADCON1、ANSELはたぶんADコンバーターに関するレジスタ。なぜ、ここに書いてある???

最初に、この表の見方を説明します。表の左側から説明していきます。

●Address
レジスタのレジスタファイルの中での番地です。最後にhの記号があるので、16進数で書かれています。ここで大事なのは、この番地は通し番地で書かれていることです。たとえば、TRISAは85hと書かれていますが、これは10進数に直すと、133ですから、バンク0ではありません。バンク1ということが分かります。

なお、16進数で書かれた番地からバンクを知る方法は次の通りです。

1 二桁目が0~7ならバンク0
2 二桁目が8~Fならバンク1
3 二桁目、三桁目が10~17ならバンク2
4 二桁目、三桁目が18~1Fならバンク3

また、プログラムを記述する場合は、ここで書かれた16進数をそのまま書いて大丈夫です。

例 MOVWF  85h

85hなどの番地は、通し番地なので、本来は5に直すべきですが、このままでもビルドできます。ただし、バンク0ではないとのメッセージが表示されます。

●Name
表の2カラム目は名称です。レジスタの名称です。プログラマにとって分かりやすい名称になっています。実はこの名称ですが、前述の番地の変わりにプログラム中で使用できるのですが、ちょっとした設定が必要です。これについてはまた後で説明します。

●Bit7~Bit0
Bit7からBit0はレジスタの各ビットの名称です。または機能説明です。ここはIOポートの説明の文章を読むとき参照します。

●Value on POR、BOR
ここの値は、マイコンを起動した時のレジスタの初期値です。0また1またはxで表現されています。0または1は分かると思います。xですが、これは初期値が不定であることを意味します。

この初期値は非常に重要です。なぜなら、初期値のままでよいなら、わざわざのその値に設定する命令を記述する必要がないからです。

●Value on all other Resets
ここもリセット後の初期値ですが、この初期値は電源投入後の初期値ではなく、ウオッチドックタイマと呼ばれる再起動システムによる再起動の場合など、電源投入以外のリセットによる初期値です。uと書かれている場合は、unchangedで値は以前の値を保持するという意味です。

さて、レジスタの使い方の実際の説明は、この表の前のページに書かれています。英文なので、日本語で要約だけ書いておきます。

1 IOポートのピンは他の内蔵機能のピンと共通に使用されている。他の機能が有効ならIOポートのピンとして使用できない。

2 TRISAレジスタはポートAの入出力方向をビット単位で設定する。'1'の場合は入力ポート、'0'の場合は出力ポートである。

3 PORTAレジスタは、ポートAのデータレジスタで、入力ポートの場合、ポートAに入力されたデータがPORTAレジスタから読み出される。出力ポートの場合は、PORTAに書き込んだデータがポートAに出力される

4 ポートAのビット0から5は初期状態でADコンバーターの入力ピンとしての機能になっている。したがって、IOポートとして使用できない

5 ポートAのビット5は入力専用レジスタで出力には設定できない

このうち、4番が重要です。初期状態ではIOポートとして使用できません。IOポートとして使用するには、ADコンバーターの機能をOFFにしなければなりません。そのため、ADコンバーターのレジスタが、ここの表に同時に載っていたのです。ADコンバーターの機能をOFFにするのはANSELというレジスタの各ビットを0にします。

また、ポートの入出力方向ですが、各ビットでバラバラでもかまいません。すべて同じにする必要はありません。

以上の準備のもと、ではポートAを使うにはどのような設定が必要か書いてみましょう。

●入力ポートとして使う場合

1 バンクを1に設定する
2 ANSELレジスタの対応するビットを0にする
3 バンクを0に戻す
4 PORTAレジスタを読み出す

ANSELレジスタはバンク1なので、バンク1に設定する必要があります。また入出力方向の設定は初期値のままでよいので不要です。

●出力ポートとして使う場合

1 PORTAレジスタに初期値のデータを書き込む
2 バンクを1に設定する
3 ANSELレジスタの対応するビットを0にする
4 TRISAレジスタの対応するビットを0にする
5 バンクを0に戻す
6 PORTAレジスタに出力したいデータを書き込む

TRISAレジスタでポートの入出力方向を出力に設定した瞬間に、ポートからデータが出力されます。したがって、それ以前にPORTAに初期値データを書き込んでおくのが正しい作法です。そうしないと、マイコンにつながれた機器が誤動作する可能性があります。ただ、出力がLEDなどの場合は、さほど気にする必要はありません。

ポートにはもう一つポートBがありますが、ほとんど同じなので説明は省略します。

次回は、以前作った簡単なプログラムの説明です。

|

« 「天文屋のためのマイコン入門」命令とデータのまとめ | トップページ | 「天文屋のためのマイコン入門」LEDプログラムの解説 »

コメント

コメントを書く



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




« 「天文屋のためのマイコン入門」命令とデータのまとめ | トップページ | 「天文屋のためのマイコン入門」LEDプログラムの解説 »