PIC18F452のデータメモリを使ってみて |
データメモリについて MPASM を使って実験してみました。 アクセスバンク PIC18FXX2シリーズでは命令語のオペコードに f や d のほか a があります。 プログラムにおいて a を 0 にするとデータメモリの BANK0 前半の128バイトとスペシャルファンクションレジスタ(SFR)が配置されている BANK15 の後半128バイトの値が直接アクセスできます。マイクロチップ社のデータシートではこれをアクセスバンクと呼んでいます。 プログラム中に使用するレジスターをデータメモリに割り振るとき REGISTER_0 EQU 000h REGISTER_1 EQU 001h REGISTER_2 EQU 002h ・・・・・ ・・・ ・・・・ ・・・・・ ・・・ ・・・・ のようにして、使用するメモリーが合計128個以内(000h〜07Fh)ならアクセスバンク の方法が使えます。 アクセスバンク は MOVF f[,d[,a] や MOVWF f[,a]、DECFSZ f[,d[,a] など35個の命令のオペコード [,a] を [,0] と記述します。 例えば MOVF REGISTER_1,1,0 DECFSZ REGISTER_2,1,0 のようになります。 この [,0] は実験の結果全て省略しても差支えないことがわかりました。 BSR(Bank Selector Resister) データメモリを多く使用するプログラムではオペコードの [,a] を [,1] にして BSR の値によりデータメモリのバンクを選択することができます。 どのバンクを選択するかは MOVLB 命令で4ビットの数値を BSR へ入れることにより決まります。例えば Bank 1 のとき MOVLB 2 とすると Bank 2 に替わります。 データメモリのバンクの BANK0〜BANK5 を BSRで選択する場合、 [,a] の[,1] は省略できます。 BANK15 は BSRで選択して使うことはないでしょうが、試してみたところこの BANK だけは [,1] を省略するとアッセンブラは成功してもプログラムは動きません。 すべてのBANKに関連しますが、オペコードに[,1] だけ記述して BSR を設定しないとアッセンブルは成功してもプログラムは動きませでした。 プログラム中に使用するレジスタを BANK2 のデータメモリへ割り当てるとき、 例えば ;BANK2 REGISTER_0 EQU 200h REGISTER_1 EQU 201h REGISTER_2 EQU 202h REGISTER_3 EQU 203h REGISTER_4 EQU 204h REGISTER_5 EQU 205h としても、それぞれのレジスタを操作するプログラムの前で BANK2 が選択されていなければなりません。 BSRにより選択される各 BANKのデータメモリは 00h〜FFh までの256個ですからレジスタに割り当てたメモリ番地の 201h や 202h の上位の 2 は単に BANK2 を使用するという覚え書き程度のものです。その数値で BANK が決まるのではありません。 プログラム中で間接アドレッシングによりメモリを操作することがあるならそのように12ビットまで書いておけばプログラムを制作する上で便利かも知れません。 BSR による方法に限って述べるならメモリの番地は 8 ビットの数値 00h〜05hでも差支えありません。 メモリ番地が 200h〜205hであっても BSR を BANK4 とか BANK5 にした場合も無事アッセンブルでき、プログラムは走りました。 メモリ番地を実際には存在しない BANK6 に相当した 600h〜605h にしても BANK0〜BANK5 までのどれかを選択すればプログラムは動きました。 BSRによる方法 では BANKを選択/決定すのは MOVLBで BSRに入る 0〜5、Fh の4 ビットの数値であって、メモリアドレスは BANKの選択/決定には関与しないことを確認しました。 BSRRBSRによる方法ではデータメモリのバンクを選択しますが、そのプログラムの中でSFRの操作はわざわざ BANK15 に指定することなく、アクセスバンクの方法を使ってよいことも確認しました。 2003.2.24 改定 2003.3. 3 |
PIC目次へ トップページへ |