- 9609. バンク切り替えと配列 [すあま] 2006/02/13 17:55
- はじめまして。
CCS-C (PCM) 3.242でPIC16F913を使い、以下のプログラムを書いてみて、
(不要な部分は省略しました)
int dim[10], i;
#locate dim = 0x0120
#locate i = 0x0130
void main() {
for (i=0; i<10; i++) dim[i] = 0;
}
コンパイルすると以下のコードになります。
22: for (i=0; i<10; i++) {
04B 1283 BCF 0x3, 0x5
04C 1703 BSF 0x3, 0x6
04D 01B0 CLRF 0x30
04E 0830 MOVF 0x30, W
04F 3C09 SUBLW 0x9
050 1C03 BTFSS 0x3, 0
051 2858 GOTO 0x58
23: dim[i] = 0;
052 3020 MOVLW 0x20
053 0730 ADDWF 0x30, W
054 0084 MOVWF 0x4
055 0180 CLRF 0
24: }
056 0AB0 INCF 0x30, F
057 284E GOTO 0x4e
これをMPLAB SIMと実際のデバイスで動かしてみると、変数iは問題なく
bank2である0x0130に割り当てられ、実際にRAMの0x0130がカウントアップ
しているのですが、dim[i] = 0;の部分はなぜかbank0である0x0020から
始まるRAMがクリアされていってしまいます。
プログラムアドレス0052の MOVLW 0x20 はこの場合bank2の0x0120に対して
行われるのではないのでしょうか?
#locateの指定を外せば問題なく動くのですが、実際のプログラムでは
LCDDATAxをいじりまくっているので、同じbank2に配置した方が不要な
バンク切り替えが減るため、dim[10]もiもbank2に配置したいのですが・・・
- 9610. Re: バンク切り替えと配列 [PICマスター] 2006/02/13 20:06
- >プログラムアドレス0052の MOVLW 0x20 はこの場合bank2の0x0120に対して
>行われるのではないのでしょうか?
C言語の中でdim[]として処理される分には問題は無いように見受けられますが、なにか困るのでしょうか?。
- 9612. Re: バンク切り替えと配列 [すあま] 2006/02/13 20:12
- read_bank()とwrite_bank()を使うことで解決できました。
板汚し申し訳ありません。