プログラムメモリの使い方


【プログラムメモリ】

 命令そのものを格納するメモリで16ビットのビット幅があります。
アドレスは、プログラムカウンタで指定されます。このプログラムカウンタ(PC)が
PIC18シリーズでは21ビット構成となりましたので、プログラムメモリアクセス領域
としては2Mという非常に大きな範囲を直接指定できるようになりました。
 つまり従来の「ページ切替」が必要なく、常に全てのメモリ空間を直接指定できる
ということになりました。これでプログラムを組むのが大変楽になりました。

 さらに16ビット幅のプログラムメモリは、実際のメモリとしては8ビット幅のものが
使われていて、8ビット単位(つまりバイト単位)で扱うように変更されています。
つまり、2MBの空間のプログラムメモリですが、命令は16ビットですので、2バイトで
1命令ということになります。
しかしPIC18シリーズでは一度に2バイトの命令を直接取り出すことが出来るように
なっています。そのため、プログラムカウンタの最下位ビットは常に0で命令実行毎に
+2されて行くようになっています。
従って、プログラム空間としては1Mワードということになります。


プログラムメモリについては、これ以外にベクタがいくつか設定されています。

 (1) リセットベクタ = 0x000000 番地
   リセット発生時にはかならず0番地から始まります。
 (2) 高レベル割込みベクタ = 0x000008 番地
   高位の割込み発生時の飛び先で固定です。
 (3) 低レベル割込みベクタ = 0x000018 番地
   低位の割込み発生時の飛び先で固定です。

これを図で表すと下図のようになります。
1Mワードの空間ですが実際に実装されているのは、これより少ないサイズで
PICの種類ごとに異なっていますので、注意が必要です。
この実装されていない空間をアクセスした時には全て「0」として読み出されるので
NOP命令」として実行されます。







このプログラムメモリ内への命令の格納のされ方は、バイト単位で見ると、
上図のように下位、上位の順です。

 1Mワードのジャンプが直接できるようにするため、ジャンプ命令に2ワード
構成の命令が追加となりました。
例えば、GOTO命令は下図のようにジャンプ先として、21ビットの内の最下位
ビットを除いた20ビット全部をジャンプ先データとして指定できる、2ワードの
命令となりました。(21ビットの最下位ビットは常に0)





 このような2ワード命令の場合の、プログラムメモリへの格納順序は、
上位ワード、下位ワードの順で、かつワード内は下位バイト、上位バイトの
順序で並びます。


【プログラムカウンタの構成】

 プログラムカウンターが21ビット構成になったことにより、プログラムカウンタ設定用
のレジスタが追加されました。
下図のようにプログラムカウンタへのアクセスは3つのレジスタに分解されて命令に
よりアクセスすることが出来ます。
ここで上位のPCH、PCUレジスタは直接には命令でアクセスすることはできず、それ
ぞれPCLATH、PCLATUレジスタ経由となります。
PCLATH、PCLATUレジスタはプログラムで自由に読み書きが出来ます。

PCLATH、PCLATUからPCの上位への Read/Writeのタイミングは、PCLレジスタへの
Read/Writeタイミングと同期するようになっています。
つまり、PCLに書き込む時に、あらかじめPCLATH、PCLATUに書き込まれていた内容
が、PCH、PCUレジスタに書き込まれます。
またPCLレジスタを読み込むと、一緒にPCH、PCUレジスタから、PCLATH、PCLATU
レジスタに読み込まれます。
これで21ビットへの読み書きが同時にできることになります。








   目次ページへ