【メモリアーキテクチャの概要】
PIC18シリーズでのメモリは種類は他のミッドレンジと同じように、下記の3種類と
なっています。
(1) プログラムメモリ
命令つまりプログラムそのものを格納するメモリ。
(2) データメモリ
データ格納用のメモリですが、PICではレジスタファイルとなっています。この中
には、特殊レジスタ(SFR)と呼ばれる指定席のレジスタと、汎用変数領域の
レジスタとがあります。
(3) スタックメモリ
サブルーチンや割込みでの戻り番地を格納するための独立のメモリで、PIC18
シリーズでは従来より大幅に拡張されました。しかもスタックポインターレジスタが
追加され、かつPUSH、POP命令も追加されましたので、スタックメモリをプログ
ラム命令でRead/Writeすることが出来るようになりました。
【プログラムメモリ】
命令そのものを格納するメモリです。アドレスは、プログラムカウンタで指定されます。
このプログラムカウンタ(PC)がPIC18シリーズでは21ビット構成となりましたので、
プログラムメモリアクセス領域としては2MBという非常に大きな範囲を直接指定
できるようになりました。
つまり従来の「Pageの概念」を使わなくとも全てのメモリ空間を直接指定できる
ということになりました。これでプログラムを組むのが大変楽になりました。
しかし、その代わり、プログラムメモリをバイト単位(8ビット)で扱うように変更され、
従来のワード単位(16ビット)での扱いではなくなりました。
つまり、2MBの空間のプログラムメモリですが、命令は16ビットですので、2バイトで
1命令ということになります。
さらにPIC18シリーズでは一度に2バイトの命令を直接取り出すことが出来るように
なっています。そのため、プログラムカウンタの最下位ビットは常に0で命令実行毎に
+2されて行くようになっています。
従って、プログラム空間としては1Mワードということになります。
プログラムメモリについては、これ以外にベクタがいくつか設定されています。
(1) RESET Vector = 0x000000 番地
リセット発生時にはかならず0番地から始まります。
(2) High Priority Interrupt Vector = 0x000008 番地
高位の割込み発生時のとび先で固定です。
(3) Low Priority Interrupt Vector = 0x000018 番地
低位の割込み発生時のとび先で固定です。
これを図で表すと下図のようになります。
1Mワードの空間ですが実際に実装されているのは、これよりはるかに少ない
サイズとなっています。
この実装されていない空間をアクセスした時には全て「0」として読み出されるので
「NOP命令」として実行されます。
![]()
【プログラムカウンタの構成】
プログラムカウンターが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レジ
スタに読み込まれます。