デジタル降魔録TOPページへ

thank you for your access

【5】頭から煙が・・・

 FPICのポートが回路のどの部品に接続されているか、だいたい解りましたので次に少しソフト寄りのお話に入っていきます。まずは簡単なところから、ポートの状況を読み取るとはどういうことなんでしょうか。

 読み取ったポートの状況は〝H〟や〝L〟の状態で内部に入ります。ここまでは解りますが、ここから先が真っ暗闇ですね。そこでFPICの内部を簡単に図にしてみました。



 内部にはたくさんのレジスタファイルというメモリー(ピンク色部分)とプログラムメモリーが並んでいます。各ポートもレジスタファイルに属しています。レジスタファイルはブロック図の中ではあちこちに点在していますが、プログラムメモリーのように0番から20番まで番号が付けられたメモリーとして並んでいます。また、解析実行部というのは実際にプログラムを読んで実行している部分です。それ以外にWレジスタやスタックメモリーという特別なメモリーもあります。

補:本によってはレジスタファイルをファイルレジスタと書かれているものあり、混乱してしまいます。
ここでは単に〝レジスタ〟と呼びます。

 実際のPICとFPICとの大きな違いは、I/O部分のコントローラーしか搭載していないことです。割り込み機能もウォッチドッグタイマー機能もありません。また、プログラムメモリーの大きさとレジスタの数も縮小されていますが、あくまでもプログラムの勉強用ですのでご了承ください。全体の動きは実際のPICと同じように動きますので基本的な説明は同じになります。

 PICはリセット信号が〝L〟から〝H〟の状態になりますとプログラムカウンタを0にして動き出します。解析実行部はこのプログラムカウンタの指すプログラムメモリーの場所から命令を取り出して実行します。このカウンタの数値のことをアドレスと呼びます。プログラムの所在を突き止める番地(住所の)という意味です。ですのでプログラムカウンタのことをアドレスカウンタとも呼んでいます。アドレスはレジスタにも割り当てられています。プログラムエリアとは別場所に存在しますが、レジスタについては後で書きますので、まずはプログラムメモリーから・・・。

 アドレスカウンタの最小値は〝0〟で最大値はPICの規模により、16F84で〝1023〟番地まで、16F877で〝8191〟番地まであります。FPICの場合は〝511〟番地までです。0~511番地までの小部屋に分かれていると考えられますので、512個の命令を入れることが可能です。



 解析実行部は取り込まれた命令を解析してイロイロな処理を実行します。例えば、命令が〝ポートBの全状況を読み込め〟でしたら、すぐさま、指定されたポートBの全端子の状況をWレジスタというメモリーに取り込みます。
 計算に使う数値やポートに送るデータ、ポートから読み取ったデータ類は必ずこのWレジスタを経由するようになっています。これがWレジスタが他のレジスタと異なった位置に配置されている理由です。

 さてこれから、ややこしい話が連続しますので、頭から煙が出ないように注意してください。
 プログラムの話にはたくさんの数字が出てきます。私たちが一般社会生活で使用している数値は0~9の10種類の数値を使った10進表記で、タバコは〝290〟円とか表現していますが、プログラムの世界では0~9の数字だけでは表現しにくく、2進数を基本に数値表現が作られています。2進数というのは〝H〟か〝L〟の2値だけですべてを表現しようというものです。例えばFPICのポートBのRB7端子からRB0端子の H/Lの状況が仮に下図のようになっていたとします。

 この場合〝H〟を〝1〟に、〝L〟を〝0〟に置き換えますと、〝00010101〟となります。ひとつの〝1〟や〝0〟が基本の2進数で、これをビットという単位で呼びます。ただ何ビットも並べると長ったらしく解りにくなり、ひと目見て何のことか瞬間的に解りません。そこで昔の人は工夫しました。1ビットで表現できる数値は〝0〟と〝1〟の2種類ですが、2ビット単位にしますと、〝00〟〝01〟〝10〟〝11〟の4種類です。同様に4ビット単位にすると16種類の表現ができるようになります。この16種類に数値を割り当てて、人間に解りやすくしました。0~9まではそのままですがその先の数値がありませんので、〝A〟~〝F〟を割り当てます。これが16進数と呼ばれる新しい数値表現方法です。だらだらと〝0〟と〝1〟を羅列するより飛躍的に解りやすくなります。基本は2進数のビット単位ですが、それを4ビット単位で括り、16進数に直してプログラムで使おうというものです。

 では、先ほどのポートBが〝00010101〟となっていた場合を16進数に変換して見ましょう。4ビットで括って16進表で調べると〝1 5〟となります。



 このように、レジスタ9番地のポートBの端子状況は8ビットの2進数〝00010101〟で、16進数なら〝15〟となりますが、10進数の〝15〟と混乱しますので、16進数を表す数値の時は、頭に〝0x〟(ゼロと小文字のエックス)をつけるようにします。
 Windowsをお使いの方なら、付属の電卓アプリケーションを立ち上げて[表示]→[関数電卓]に変更すると簡単に10進→16進→2進変換が可能ですのでお奨めします。16進数〝0x15〟は10進数で〝21〟となることを確認してみてください。

 2桁の16進数は4ビット単位で括った8ビットの2進数になることから、8ビット単位の2進数をバイトと呼びます。ちなみに、4ビット単位で括ることをニブルと呼びます。

 もうお解かりになりましたでしょうか。ポートがなぜ8本の端子でグループ別けされていたのか・・・。そうです。ミッドレンジPICではデータの通り道、データバスが1バイトになっているために、各ポートが8本の端子でグループ別けされていたのです。
 ブロック図のラインに斜線を引いて描かれている数値がそのラインが何ビットの数値が流れているかを表しています。
 プログラムメモリーから吐き出される命令はプログラムバスという14ビットのラインに乗って流れてきます。これがミッドレンジPICが14ビット命令と呼ばれる理由です。

 PICを動かすプログラムは14ビット命令ということですので、〝0〟や〝1〟が14個並んだ数字の羅列です。16進に直しても数字は数字で理解しがたいモノです。でもひとつひとつに意味があります。詳しくは【7】Flash PICの起動・・・で述べます。

 アドレスカウンタもプログラムの中では16進表記で進めます。FPICの場合は最大511番地ですので16進で〝0x1FF〟となります
 16F877のプログラムアドレスの最大値は8191番地まででしたので、Windowsの電卓アプリケーションで2進数に変換してみますと〝1111111111111〟と1が13個並びます。そこで下位桁から4ビットずつに括って〝1_1111_1111_1111〟 これを16進表に照らし合わせますと〝1_F_F_F〟となります。電卓アプリケーションでもその通りの答えが出ます。


 2進→16進の変換は16進表さえ暗記してしまえば簡単ですので、なるべく頭に焼き付けましょう。慣れてくると2進の〝1010〟は16進で〝0x0A〟で偶数、〝1101〟が〝0x0D〟で奇数だというのが瞬時に解るようになります。

 プログラムではポート端子1本だけを指す時もあります。このような時はビット位置の番号で指定します。例えばRB3の端子だけを〝H〟にする場合は、RB0をビット0としますので〝ポートBのビット3を〝H〟にせよ〟となります。


【5】頭から煙が・・・ ----------(ここまで)