プロが教えるわが家の防犯対策術!

現在PICマイコンの16f88を用いてアセンブラでAD変換の勉強をしています。とりあえずいろいろなサイトやデータシートを見てAD変換した結果をPORTBに出力させるテスト用のプログラムを完成させたのですが、AD変換の結果を格納するADRESLのデータをうまく読み込むことができませんでした。その時のプログラムは(結果は左詰め,X_Lは自分で定義した変数)
BSF STATUS,RP0
MOVF ADRESL,W
MOVWF X_L ;ADRESLの結果をX_Lに保存
BCF STATUS,RP0
MOVF X_L,W
MOVWF PORTB
こんな感じです。わざわざADRESLの結果をX_Lに保存しなくても直接出力することもできるんですが気にしないで下さい。で、このプログラムだとPORTBにつないだ全てのLEDが点灯します。
ところがプログラムを以下の様に書き変えたら見事にADRESLレジスタの中身が出力できました。何が起きたのでしょうか?バンクの切り替えの前にWレジスタをX_Lレジスタに書き込むのと、バンクを切り替えてからWレジスタをX_Lレジスタに書き込むのとでは結果が同じになると思うのですが、、、。
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF X_L
MOVF X_L,W
MOVWF PORTB

A 回答 (1件)

> 結果が同じになると思うのですが、、、。


書き込み先と読み込み元が別の場所を指していますので, 結果は同じとなりません.

※以下, RP1は0と仮定
上段のプログラムではRP0をセットしたままMOVしてますので,
Bank1のGPR(H'A0~H'FF)のどこかに保存されています.
RP0をクリアするとBank0のGPR(H'20~H'7F)がアクセス可能となります.

PIC16F88のRAM構成(Register File Map)については
データシートの2.2.1章(参考URLのp.15)にて図解されています.

X_LをH'70~H'7Fの範囲に確保すれば全バンクから参照可能です.

参考URL:http://ww1.microchip.com/downloads/en/DeviceDoc/ …
    • good
    • 0
この回答へのお礼

回答していただいてありがとう御座います。確かにおっしゃる通りですね。SFRのバンクはいつも気にしていましたが、GPRのバンクは気にしたことがありませんでした。本当に助かりました。また何かあったらよろしくお願いします。

お礼日時:2010/02/11 18:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!