PICのプログラムメモリ構造

【プログラムメモリとは?】

プログラムメモリはPICの機能を実現するためのプログラム
そのものを格納するメモリで、ROM(Read Only Memory)と
なっています。
このメモリへの書き込みには、「PICライタ」が使われます。


【プログラムメモリの構造】

特にプログラムメモリの構造について詳しく見て行きます。
プログラムメモリのマップは下図の様になっており、プログ
ラムカウンタ(PC)が13ビットの長さがあるので、最大8K
バイトのメモリ空間を直接扱うことが出来ます。



【アドレスの問題と解決法】

全部で8kバイトもの空間を用意出来てはいるのですが、上図
の下側に示す様に、GOTOやCALLなどの命令でアドレス出来
る空間は、命令のアドレスリテラル部が11ビットしか無いので
2Kバイトの範囲しか出来ません。
この問題を解決するため、「PAGE」という概念が生まれました。
このPAGEとは下図に示すような働きをします。
つまり、8Kバイトを2Kバイト単位の「PAGE」と呼ばれる4個の
単位に分け、さらに「PCLATH」レジスタを追加して設け、PCの
上位ビットとして追加し、命令のアドレスリテラル11ビットに、
このPCLATHを足して合計13ビットのアドレス長としています。
これでGOTO命令も、CALL命令も直接8kバイトのメモリ空間
を扱うことが出来る様になります。

このPCLATHの働きを下図で詳しく示しています。
  (PCLATH=Program Counter Latch High)

(1) ADDWF  PCLなどの命令の時

下位8ビットのPCL分は
演算結果がロードされ、
上位5ビット分はPCLATH
からロードされて13ビット
のアドレス長とする。


(2) GOTO、CALL命令の時

下位11ビット分は
命令のリテラルが
使われ、上位2ビット
分は、PCLATHが
使われて13ビット
のアドレスとして
実行される。







(3) RETURN,RETFIE、RETLW命令の時

スタックメモリより13ビット
が直接戻される。
従ってこの命令の時には
PCLATHは不要。



【プログラミングテクニック】

全メモリ空間を対象としたときのプログラミングの仕方を
説明します。

(1) 別のPAGEのサブルーチンをCALLする方法
  現在のPAGEから別のPAGEにあるサブルーチンを使う場合
  には下記の様にコーディングします。

        MOVLW   HIGH (SUB_1)   ;サブルーチンの
                    上位アドレス
     MOVWF  PCLATH  ;上位をPCLATHへ
     CALL   SUB_1  ;サブルーチンへ
     ---------
     ---------
       
SUB_1   ---------     ;別pageにある通常の
     ---------     ;サブルーチン
     RETURN

(2) 直接PCLATHを設定する方法
  PCLATHはSFRとしてアクセス出来ます。そこでPCLATH
  を直接設定し、そのあとCALLやGOTO命令を実行します。
  このとき、PCLATHを設定してもそれが有効になるのは
  次の命令の実行時ということがポイントです。

  またRETURN命令の時は全てスタックから戻るので
  PCLATHの設定は必要ありません。

     ORG   0x500
     BSF   PCLATH,3  ;page 1を指定
     CALL   SUB_P1  ;サブルーチンへ
     ---------
     ---------
     ORG   0x900   ;page1  
SUB_1   ---------     ;別pageにある通常の
     ---------     ;サブルーチン
     RETURN

【無いメモリをアクセスしたら?】

8kバイトのメモリ空間がありますが、実際に物理的には
PICのシリーズにより実装されている容量は0.5kバイト
から8kバイトまで異なっています。
そこで、もし、実際には実装されていないメモリをアクセス
したらどうなるのでしょうか?

結果は、プログラムカウンタの上位ビットは無視され、
実装されているアドレスがアクセスされます。
例えば下記のように無い空間のアドレス上位は0とされ
実装されている空間がアクセスされます。

 実装メモリ   アクセスアドレス  実際のアクセス
 2kバイト    0000〜07FF     0000〜07FF
          0800〜0FFF     0000〜07FF
          1000〜17FF     0000〜07FF



   次のページへ        目次ページへ