• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PICの「SWAPF」の意味について)

PIC「SWAPF」の意味と使い方について

このQ&Aのポイント
  • PICのバイト命令「SWAPF」の意味がわかりません。上位4ビットと下位4ビットを入替えると何が起こるのでしょうか?
  • 「SWAPF」命令を利用した割り込み時のレジスタの待避、復帰方法について教えてください。
  • 「SWAPF」を使って「上位4ビットと下位4ビットを入替え」た後でないと、STATUSのHとLを取り出すことができないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8533/19399)
回答No.2

>質問1: 動作的には、それで合ってます。 >質問2: 「転送の際に、STATUSレジスタの値が変化しない命令を使わないと、退避と復帰が出来ないから」です。 で「転送しても、STATUSレジスタの値が変化しない命令」は「SWAPF命令しかない」ので、SWAPF命令を使うのです。 SWAPF命令で、上位と下位の4ビットが入れ替わってしまうのは「副作用」であって、本当は、入れ替わって欲しくないのです。 でも、SWAPF命令を使う限りは「勝手に上位と下位が入れ替わっちゃう」ので、戻す時にもSWAPF命令を使って、ツジツマを合わせているだけです。 もし「転送しても、STATUSレジスタが変化しない命令」が他に存在するなら、SWAPF命令なんか使わないで、そっちを使います。でも「そんなのは存在しない」ので、仕方なく「SWAPF命令で代用している」のです。 >質問3: 取り出すだけなら、SWAPF命令なんか要りません。普通の転送命令で取り出せます。 でも、取り出した値をどこかにしまって置いて、後でSTATUSレジスタに戻す時の事を考えてみて下さい。 どこかにしまってあった値をSTATUSレジスタやWレジスタに戻す時に、普通の転送命令を使うと、STATUSレジスタが変化してしまいます。 STATUSレジスタを元に戻す為の転送命令で、転送後にSTATUSレジスタの値が変わってしまったら「元に戻ってない」ですよね? なので「元に戻す為に使う命令は、転送してもSTATUSレジスタの値が変化しない命令」じゃないといけないのです。 んで「転送してもSTATUSレジスタの値が変化しない命令」は「SWAPF命令だけ」で他に方法が無いので「SWAPF命令を使って、元に戻す」のです。 元に戻す時に「SWAPF命令を使うしかないので、上位と下位の4ビットが入れ替わってしまうと言う、余計な副作用が起きてしまう」ので、最初に取り出す時も、副作用が副作用で打ち消し合うように「SWAPF命令を使って取り出す」のです。 肝心なのは「どうやったら、STATUSレジスタの値を変更する事無く、値の復帰が出来るか?」であって、上位と下位の4ビットがどうなるかなんてのは「関係ない」のです。

chy_farm
質問者

お礼

chie65535さま ご教示ありがとうございました。 >「上位と下位の4ビットが入れ替わってしまうと言う、余計な副作用が起きてしまう」 というところが、とても分かり易かったです。 「ナンだ、そうだったのか!」という感じです。初学のものに丁寧にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.1

PICに限らず、割り込みに入る時にはステータスレジスタ(その他必要なレジスタ)を退避しておいて、割り込みから抜け出す時に復帰する必要が有ります。 以下はPIC特有の問題です。 PICにはステータスレジスタを直接退避する命令が無く、一旦WREGにステータスレジスタの値を転送してからメモリに退避する必要が有ります。 ところが、MOV命令でステータスレジスタをWREGに転送するとステータスレジスタの値が変化してしまい、退避の役目を果たしません。 そこで、ステータスをWREGに転送する際にステータスが変化しないSWAPF命令を使用します。 復帰する時にもSWAPF命令を使用しないと上下4ビットが元通りになりません。

chy_farm
質問者

お礼

tadysさま 早速にご教示くださいまして感謝です。 PICではstatusが狂ってしまうのですね。zeroとかcarryとかが狂ってしまうと元に戻りませんしね。 この際ですからAVRとかではどうなのかも調べて学んでみます。分かり易いご教示ありがとうございました。またわからないときにはよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PIC/SWAP命令でWregをrestore?

    先日こちらで「SWAPF命令」についてご教示いただきました。ありがとうございました。 その後、いつも学習させてもらっている下記のページにある「割り込み例」の記述で、わからないところがあって、再度お世話になります。超初学者の質問です、どうぞよろしくお願いいたします。 -----ここから引用(ただし各行先頭の番号と:は行数指示のため追加)---------------- 01:【例】WレジスタとSTATUSレジスタの待避と復旧 02: 03:(0004)番地 04:    GOTO   PUSH    ;割込みジャンプ 05:    | 06:    | 07:PUSH  MOVWF  W_TEMP    ;Wレジスタ待避 08:    SWAPF  STATUS,W  ;STATUS取り出し 09:    MOVWF  ST_TEMP   ;STATUS待避 10:    | 11:    |(割込み処理) 12:     | 13:    SWAPF  ST_TEMP,W  ;STATUSを戻す 14:    MOVWF  STATUS   ; 15:    SWAPF  W_TEMP,F  ;Wレジスタを戻す 16:    SWAPF  W_TEMP,W 17:    RETFIE       ;割込み許可リターン -----ここまで引用---------------- (http://www.picfun.com/pic08.html) 基礎知識の確認事項: PIC特有の問題として、 1:PICにはステータスレジスタを直接退避する命令が無く、一旦WREGにステータスレジスタの値を転送してからメモリに退避する必要が有る。 2:MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。 3:これらの理由でステータスをWREGに転送する際は、ステータスが変化しないSWAPF命令を使用する。 4:ところがSWAPF命令を使うと、移動しようとするデータの上位4ビットと下位4ビットが入れ替わってしまういわば「副作用」が現れる。 4:それで復帰する時にもSWAPF命令を使用して上下4ビットを元へ戻す。 (前回ご教示いただいたことをまとめると上記のようになりますね。) 質問1: 引用した記述で7行目の「PUSH」は単にラベルとして使用しているだけで、命令としてはPICには無いものですね?PUSH~POPは単語の意味として、AVRに限らず使用できる一般的な意味のある単語なのでしょうか? (補足) AVR命令セットのPDFがアップされています。 http://www.atmel.com/images/doc0856.pdf こちらの13ページををみますと、表の下から2~1段目にPUSH~POPがあります。 しかしPICではPUSH~POPが命令セットに見あたりません。 それでPUSH~POPがAVR専用の命令語だとわかりました。 でも引用したページでは「POP」を使っています。 質問2: 引用した記述の7行目でMOVWF命令を使ってWレジスタをsaveしています。 ところが15行目、16行目では1回ずつSWAPFを使い、合計2回のSWAPFを使っています。7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使わないのに、どうしてrestoreするときはSWAPFを2回も使用するのでしょうか? (補足) 「合計2回のSWAPFを使う部分の機能」が上位~下位反転してしまったピットを戻す機能であることはわかります。 しかし、それであれば7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使えば良いように考えたのですが、、、 それでrestoreするときにSWAPFを再び使用したら良いのでは?と、、、 基礎知識の確認事項2で「MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。」としました。 7行目で移動するのは割り込み直前の「Wreg」で「status register」ではないのに、それでも移動すると値が変化してしまうということでしょうか? 初学者の質問で馬鹿らしいかもしれません。 ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • PIC(MOVFで何故、STATUS Zフラグが変わるのか)

    こんにちは。 PICマイコンで割り込みをやる場合、 MOVFはSTATUSのZフラグに影響を与えるので、 使わない、とありますが、 何故、MOVFでZフラグに影響を与えるのか、 どういう影響を与えるのか分かりません。 割り込みを使わなくても、STATUS<Z>を 条件判断に使っている限り、 MOVFは使えないのでしょうか。 また、 本によっては、 (割り込みのはじめ) MOVWF W_TEMP MOVF STATUS,W(*) MOVWF ST_TEMP    ~割り込みの内容 MOVF ST_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W (割り込み終わり) のように書いてあり、 この場合、*で、 STATUSのコピー前(同時)に、 MOVFを使っていますが、 これは、OKなのでしょうか。 何か分かる人がいましたら、 よろしくお願いします。

  • PIC アセンブラ TMR0の使い方がいまいちわかりません。

    *文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。 目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。 流れとしては 初期処理 ↓ TMR0割り込みが発生するまで無限ループ ↓ 割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリスケーラを256設定で1250回フラグをカウントすると1秒)1秒間分カウントが終わったら7セグの表示を切り替え無限ループに戻る どの数字まで表示したかは任意のレジスタに1を立てて判断する。PICはPIC16F628AなのでTMR1とかもあるんですが気分的にTMR0だけで時間を作ってみたかったのでTMR1とかは使ってません。で、3回くらいやり直してプログラムを作ったんですが全然動きません。 1、何処が悪いんでしょうか? 2、また、PIC16F628Aでは16番ピンがクロックの入力として使えますが その設定方法があってるかわかりません。 コンフィグ設定で OSCをHSにしてポートの設定でRA7を入力にしておけば良いんでしょうか?プログラム中の記述で合ってますでしょうか? 3,7セグをカウントアップするだけのプログラムなのに こんなに長くなる物なんですか? (プログラムが下手だから?アセンブラだから?) 4、1秒のカウント方法ですがプログラム中の記述で正確に1秒をカウントしてますか?(計算間違ってますでしょうか?) 以下、プログラムになります。 list p=pic16f628a include "p16f628a.inc" __CONFIG _LVP_OFF &_MCLRE_ON &_BODEN_OFF &_PWRTE_ON &_WDT_OFF &_HS_OSC time0 equ d'30' ;time4まで作る tcount equ d'43' count0 equ d'35' ;count7まで作る koko0 equ d'43' koko1 equ d'44' org 0 goto start org 4 goto wari start bcf intcon,gie movlw b'00000111' movwf cmcon bsf status,rp0 movlw b'00000111' movwf option_reg movlw b'10100000' movwf trisa clrf trisb bcf status,rp0 bcf status,z bcf intcon,t0if movlw b'00001000' movwf count0 ;この間に1から6の同じ処理が入ります。 movlw b'00000000' movwf count7 time movlw .30 movwf time0 bsf intcon,gie bsf intcon,t0ie clrf tmr0 roop btfsc tcount,0 call segout swapf count0,0 movwf portb swapf portb,0 movwf count0 ;この間に1から5が入ります swapf count6,0 movwf portb swapf portb,0 movwf count6 goto roop wari bcf intcon,t0ie bcf intcon,t0if incf time0,1 btfss status,z goto modori bcf status,z movlw .255 movwf time0 incf time1,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 incf time2,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 incf time3,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 movlw .255 movwf time3 incf time4,1 bcf status,z goto modori bcf status,z movlw .30 movwf time0 movlw b'00000001' movwf tcount modori bsf intcon,t0ie retfie segout clrf tcount btfss koko0,0 goto seg1 ;この中間にseg2からseg6が入ります。 btfss koko0,7 goto seg8 btfss koko1,0 goto seg9 nop goto seg0 seg1 bsfkoko0,0 movlw b'00000010' movwf count0 movlw b'00000100' movwf count1 movlw b'00000000' movwf count2 movlw b'00000000' movwf count3 movlw b'00000000' movwf count4 movlw b'00000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 nop return ;この中間にseg2からseg9が入ります seg0 clrf koko1 clf koko0 movlw b'00001000' movwf count0 movlw b'00000100' movwf count1 movlw b'00000010' movwf count2 movlw b'00000001' movwf count3 movlw b'10000000' movwf count4 movlw b'01000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 return end

  • PICマイコンをアセンブラでAD変換をした時に、、

    現在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

  • PIC、USART USART送信ができません

    下記のプログラムでUSART接続してPICマイコンからPCに送信しようとしています。 PICマイコンはP16F877 アプリにはTera Term というアプリケーションを使用しています。 このプログラムはUSARTの送信とステッピングモータを交互に動作させるプログラムです。 このプログラムを実行したところ、ステッピングモータが微小に動作したままとまってしまいました。 Tera Termにも文字は出力されませんでした。 そのため、1周目だけTXREGレジスタにデータを格納するところまでは出来ていると思います。 しかし、データ送信が行われないため、2週目以降はTSRレジスタがBUSY状態となりプログラムが進行しないのだと考えています。 以下のサイトを参考に模索しましたが、原因が分かりませんでした。 http://www.kimurass.co.jp/pic/0625p.htm http://www.picfun.com/pic19.html どのように対処したらよろしいでしょうか? 原因やアドバイスなど教えていただけたら幸いです。 ~~プログラム~~ list p=16F877 #include <p16F877.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF& _LVP_OFF w_temp EQU 0x0C status_temp EQU 0x0D ;変数 cblock 020h CNT15mS ;15mSカウンタ CNT5mS ;5mSカウンタ CNT1mS ;1mSカウンタ CNT50uS ;50μSカウンタ USART_TEMP ;USARTのワークレジスタ POINT ;point of table BUFFER ;buffer endc ;*************************割り込み退避************************** ORG 0x000 goto MAIN ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;************************************************************* MAIN ;-----------------------------設定---------------------------- ;BANK1 Setting bsf STATUS,RP0 clrf TRISA movlw B'11110000' clrf TRISB movlw B'01000000' movwf TRISC ;RXピンを入力に設定 movlw B'00100000' movwf TXSTA ;SET TX MODE movlw 0FH ;Set Baud Rate 19Kbps movwf SPBRG ;Set BRG ;BANK0 Setting bcf STATUS,RP0 clrf INTCON movlw 07H movwf ADCON1 ;------------------------------------------------------------ ;----------------------------初期化--------------------------- clrf PORTA clrf PORTB bcf STATUS,C bcf STATUS,Z ;------------------------------------------------------------ ;===========================MAIN_LOOP======================== MAIN_LOOP bsf STATUS,RP0 READY_CHECK btfss TXSTA,TRMT goto READY_CHECK bcf STATUS,RP0 movlw 'A' movwf TXREG call STEPPING_MOTTER goto MAIN_LOOP ;============================================================ ;================= STEPPING MOTORE ========================== STEPPING_MOTTER call wait1ms call wait1ms movlw B'00000001' movwf PORTB call wait1ms call wait1ms movlw B'00000010' movwf PORTB call wait1ms call wait1ms movlw B'00000100' movwf PORTB call wait1ms call wait1ms movlw B'00001000' movwf PORTB RETURN ;================= 15mS WAIT ================================ wait15ms MOVLW d'3' MOVWF CNT15mS wait15ms_loop CALL wait5ms DECFSZ CNT15mS,F GOTO wait15ms_loop RETURN ;================= 5mS WAIT ================================= wait5ms MOVLW d'100' MOVWF CNT5mS wait5ms_loop CALL wait50us DECFSZ CNT5mS,F GOTO wait5ms_loop RETURN ;================= 1mS WAIT ================================= wait1ms MOVLW d'20' MOVWF CNT1mS wait1ms_loop CALL wait50us DECFSZ CNT1mS,F GOTO wait1ms_loop RETURN ;================= 50μS WAIT ================================ wait50us ; 1サイクル(4クロック):0.2μS ; 50μS=0.2μS×250サイクル MOVLW d'82' ;1 MOVWF CNT50uS ;1 wait50us_loop DECFSZ CNT50uS,F ;1 GOTO wait50us_loop ;2 RETURN ;2+1 ;============================================================ ;------------------------------------------------------------ END

  • PICの命令DAWについて

    PICのアセンブラーを勉強中の初心者です。以前にも何度か質問させていただいております。 Wレジスタの値を2桁のBCDに変換するというDAWコマンドの働き方がよくわかりません。 使用中の教本では「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。」とあるのですが、これは次のように解釈してよいのでしょうか? 例えば10進で「85」という数値がWレジスタにあったとすると、これはバイナリーでは '01010101' ですが、これが’8’と’5’を表す '1000' と '0101' に変換されるということでしょうか?つまり、DAW実行後のWレジスターは '10000101' すなわち、「133」という数値になるということでしょうか? 詳しい方、どうぞよろしくお願いいたします。 それから、前もって申し上げておかないといけないのですが、ご回答をいただいても、こちらからお礼を出来ないということが頻繁にあります。お礼の文章を入力してボタンを押しても、その操作は出来ませんという旨のメッセージが出てきて、何度やり直しても出来ません。それで今まで最初の回答者さんをベストアンサーにして質問を締め切るということをやってきました。今回も、もしお礼を出せなくなっても、全てご回答をいただいた方々には深く感謝いたしますので、悪しからずご了承ください。

  • PICのプログラミングについて

    PICのSTATUSレジスタのz〔ゼロ〕フラグとC〔キャリー〕が同時に1になることはあるのでしょうか?以下のようなときのことなのですが・・・ movlw b'00000001' sublw b'00000001' このような時のZフラグとCフラグはどうなるのでしょう? PIC活用書等を読んでみたのですが、あまりわかりませんでした。 初心者な質問ですが宜しくお願いします。

  • PIC、TMR2とPWMについて。(再投稿)

    カテ違いなのか説明が悪いのか回答が付かなかったので 再投稿しました。 PWMでTMR2の10ビットの理屈がわかりません。 まず現状の理解ですが以下のとおりです。 ・分解能10ビットでPWMを使うにはPRxを255に設定する。  PRxに設定した値がTMR2のカウント最大値になる。  PRxを255に設定したのでTMR2も255までカウントされる。  (PRxに設定した値がPWMの周期として動作する最大値) ・パルスの幅はCCPRxL(上位8ビット)および、DCxB1,DCxB0(下位2ビット)の10ビットで設定する。 実際のPWMの動作は以下のとおり CCPRxL,DCxB1,DCxB0 の10ビット ↓コピー CCPRxH(10ビット) ↓比較 一致でPWMの出力が反転 TMR2(上位8ビット + 謎の下位2ビット) ↑比較 一致でTMR2 + 謎の下位2ビットがクリア PRx(8ビット) わからないぶぶんなんですが 1、TMR2の下位2ビットって具体的にどのレジスタなんでしょうか。 2、プリスケーラを設定しない場合(等倍)はPSという2ビットが付加されTMR2は10ビットカウンタとして 動作するとなっていましたが、0,1,2,...1023までカウントされるんでしょうか。 3、TxCKPS1,TxCKPS0 に値をセットしてプリスケーラを4,8,64等にした場合 TMR2の8ビットと下位2ビットはどういう関係になるんでしょうか。 単純に1024階調(0-1023) * 4tocs * プリスケール値 で0から1023までカウントされると考えていいんでしょうか。 4、PRxは8ビットしかないのにTMR2 + 2ビットの10ビットとどうやって比較されてるんでしょうか。 たとえばDCxB1,DCxB0(下位2ビット) のみ設定してCCPRxL(上位8ビット)を0にした場合、何と比較されるんでしょうか。 5、TMR2をスタートする前にカウンタをリセットしますが10ビット分リセットするにはTMR2のクリアと下位2ビットはどのレジスタをクリアすればいいんでしょうか。 PICは16F1936を使ってます。 MPLAB X + XC8で開発してます。 説明がわかりずらいかもしれませんが上記の部分がいまいち理解できません。 この辺の事に詳しい方、教えていただけると助かります。

  • PIC16F877について

    PIC16F877を使っているのですがBポートとCポートの中でマイクロスイッチの入力ができるポートとできないポートがありますコフィングの問題だとおもいますが原因がわかりません __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF ;__CONFIG _HS_OSC & _RC_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF ORG 0 ; リセットベクタ(0番地)を指定する GPR_1 EQU 020h ; GPRの1バイト目にGPR_1と言う名前を付ける 88移行 GPR_2 EQU 021h ; GPRの2バイト目にGPR_2と言う名前を付ける 88移行 GPR_3 EQU 022h ; GPRの3バイト目にGPR_3と言う名前を付ける 88移行 GPR_4 EQU 023h ; GPRの4バイト目にGPR_4と言う名前を付ける 88移行 GPR_5 EQU 024h ; GPRの5バイト目にGPR_5と言う名前を付ける 88移行 GPR_6 EQU 025h MAIN CLRF PORTA ;初期クリア 0クリア CLRF PORTB ;初期クリア 0クリア CLRF PORTC CLRF PORTD CLRF PORTE BSF STATUS,RP0 ;ファイルレジスタSTATUSのRP0(ビット5)をセット(1)する → バンク1 MOVLW 07H MOVWF ADCON1 MOVLW B'00000000' MOVWF TRISA ; ポートA全出力 MOVLW B'11111111' MOVWF TRISB ; ポートB全入力 MOVLW B'11111111' MOVWF TRISC ; ポートC全入力 MOVLW B'11111111' MOVWF TRISD ; ポートD全入力 MOVLW B'11111111' MOVWF TRISE ; ポートE全入力 BCF STATUS,RP0 ;STATUSのRP0をクリア(0) → バンク0

  • PIC16F88のアナログコンパレータ使用について

         LIST    P=PIC16F88 #INCLUDE<P16F88.INC> __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF &                    _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF &                    _PWRTE_ON & _WDT_OFF & _HS_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF VAR1 EQU 0x20 VAR2 EQU 0x21 ORG 0 start      BCF       STATUS,RP1      BSF       STATUS,RP0   ;bank1へ移動      CLRF      TRISB       ;PORTBをすべて出力      MOVLW     0xff      MOVWF     TRISA       ;PORTAをすべて入力      MOVLW      x05        ;コンパレータ1つのみ使用      MOVWF     CMCON      BCF       STATUS,RP0   ;bank0へ移動      CLRW      MOVWF     PORTB      MOVLW     0xff      MOVWF     PORTA 18ピンのPIC16F88の内蔵アナログコンパレータ(RA1/AN1とVINRA2/AN2/CVREFが入力、C2OUTが出力の1つのみ利用する設定)を使用しPORTBからLEDへ出力し電圧の大小の判定を行いたく、上記のような設定でプログラムをつくりコンパイルは通ったのですが動作せず、 MPLABのデバッグにて確認したところ『MOVWF PORTA』の部分でPORTAのレジスタ値が0x00から変化しておりませんでした。 『BCF STATUS,RP0』まではレジスタ値は変化しており、 STATUSは0x1cでbank0、TRISAは0x3fで入力、ANSELはデフォルトで0x7fでアナログ入力 になっているのですが、何故PORTAが値を入れても変わらないのか原因が分かりません。 分かる方、ご教授頂けますと幸いです。 宜しくお願い致します。