2013.12.9
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第521回]


●PICサンプルプログラムの説明(システムレジスタの設定)

前回の続きです。
今回はシステムレジスタの設定について説明をします。

下は[第516回]でお見せしたサンプルプログラムの、実行文の先頭部分です。

     org 0
st0
     goto start
;
     org 04
        goto int
;
        org 05
;
start
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH


前回までに説明をした部分はプログラムの実行に必要な定義文に相当するところで、プログラムの実行命令は書かれていませんでした。

いよいよこれからがプログラムの実行部分の記述になります。
PICのプログラムもZ80などと同様に、アドレスの0番地からスタートします。
Z80や8080では0番地台の先頭に割込みプログラムのエントリポイントが置かれています(INT0〜INT7)。

PIC16F887の場合には割込みのエントリポイントはただ一箇所だけで、アドレス4番地に置かれています。
割込みを全く使わないならば、4番地を無視してしまって0番地からプログラムを書いていってもよいのですけれど、割込みを使う場合には4番地には実際の割込みプログラムへジャンプするためのgoto文を書きます。
そしてメインプログラムはその後ろの5番地から始めることにして、0番地には5番地へジャンプするためのgoto文を書きます。
この書き方は割込みを伴うプログラムを書くときの定番です。

参考までにPIC16F887のプログラムメモリのマップを下に示します。
この図は[第514回]でお見せしました。


[出典]Microchip Technology Inc. PIC16F887 Data Sheet

メインプログラムの先頭部分ではレジスタの設定を行ないます。
ここがPICの一番面倒なところです。

        org 05
;
start
        movlw 60;bk3
        movwf STATUS
        clrf ANSEL
        clrf ANSELH


PICのレジスタマップは[第520回]でお見せしました。
しかしその全部を設定しなければならないわけではありません。
ほとんどのレジスタはリセット時に初期値が入れられますし、使用するつもりのない機能については大抵は何もしなくても構いません。
必要なレジスタについて値を設定するためには、そのレジスタが置かれているバンクに切り換える必要があります。
ANSELとかTRISAとかというようなレジスタ名を使ったからアクセスできるかというと、そういう便利な仕組みにはなっていないことに注意する必要があります。
PIC16F887では、レジスタバンクはbank0〜bank3の4つあって、普通の使い方の場合にはSTATUSレジスタのビット6とビット5の2ビットを使って選択します。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

PIC16F887で真っ先に設定しなければならないレジスタはANSELとANSELHレジスタです。
PIC16F887はアナログ入力機能が強化されていて、多くのアナログ入力が通常のデジタル入出力と端子を共有しています。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

図中AN0〜AN13がアナログ入力で、RA0〜RE2がデジタル入出力です。
そして厄介なことにリセット後の初期状態ではアナログ入力が選択されます。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

表の188h、189hがアナログ、デジタル共用端子をアナログとして使うかデジタルとして使うかを決定するレジスタ(ANSEL、ANSELH)で、各端子に割り当てられたビットを1にすると、その端子はアナログ入力になり、0を指定するとデジタル入力になります。
表の右側部分を見ますとリセット後は全ビットが1になると書いてあります。

もっともこれは入力に限った話で、各端子をデジタル出力として使う分には、TRISレジスタの設定がANSEL、ANSELHの設定よりも優先されるようです。


[出典]Microchip Technology Inc. PIC16F882〜887Data Sheet

そういうことからしますと、今回のサンプルプログラムはポートを出力として使うだけですから、ANSEL、ANSELHの設定はしなくてもよい、ということになります。
(上記の考えには穴がありました。詳細は[第525回]を参照願います。2013.12.16)

ま、しかし、いつも出力のみのプログラムしか書かないというわけではないでしょうから、ここは「ころばぬ先の杖」ということで、いつもプログラムの先頭にANSEL、ANSELHについての設定文を書いておくほうがよろしいでしょう。

本日は時間がなくなってしまいました。
この続きはまた次回にすることにいたします。

ワンボードマイコンでCP/Mを![第521回]
2013.12.9upload
2013.12.16訂正

前へ
次へ
ホームページトップへ戻る