PIC初心者用掲示板

★★ 質問する前に下記をチェック ★★
(PICに関する疑問は必ず解決するはず)
←←←「電子工作の実験室」へ
←←←← 

■最新ツリー一覧

□このツリー付近のツリー一覧

★新規ツリー作成

◆ 9609. バンク切り替えと配列 [すあま2006/02/13 17:55


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()を使うことで解決できました。
板汚し申し訳ありません。