dポイントプレゼントキャンペーン実施中!

INTピンを使ってsleepから割り込み復帰したいのですが、
思ったとおり動いてくれません。

メインをSLEEPにし、割り込みが入ると割り込み側の
プログラムを実行し、終わるとメインのSLEEPに
もどってINTの割り込みに備えるようにしたいのです。

現段階では割り込みをするとSLEEPから割り込み
には行くのですが、そのまま割り込み側のプログラムを
永遠に繰り返してしまいます。

listp=12f629
includep12f629.inc

RELOOP1equ0x20
CT_DELAYNMSequ0x21
PCLATH_TEMPequ0x2a
W_TEMPequ0x2b
STATUS_TEMPequ0x2c
stuequ0x2d

org0x0
gotostart
org0x4
;レジスタの退避
movwfW_TEMP
swapfSTATUS,W
clrfSTATUS
movwfSTATUS_TEMP
movfPCLATH,W
movwfPCLATH_TEMP
clrfPCLATH
;割り込み要因のチェック
btfssINTCON,INTF
gotoINT_NEXT1
;ここから割り込みプログラム

省略

INT_NEXT1
;レジスタの復帰
movfPCLATH_TEMP,w
movwfPCLATH
swapfSTATUS_TEMP,W
movwfSTATUS

swapfW_TEMP,F
swapfW_TEMP,W

retfie

;初期設定
start:
;aLED単独の輝度

bcfSTATUS,RP0

clrfINTCON
clrfGPIO
bsfSTATUS,RP0
clrfOSCCAL
clrfTRISIO
bsfTRISIO,2
movlwB'01000101'
movwfOPTION_REG

bcfSTATUS,RP0


;割り込み許可する
movlwB'11010000'
movwfINTCON

nop
sleep
nop
goto$-3
end

こんな感じのプログラムなのですが、INTピンからの割り込みと
いうことでプリスケーラなどは使っていません。
データシートも読んだのですが今市理解ができていない状況です。
お願いします。

A 回答 (2件)

No.1の者です。


私の勘違いでした。大変申し訳ありません。
http://www.cqpub.co.jp/hanbai/books/37/37391/373 …
を参考としてください。
    • good
    • 0

retfieを実行しても、戻らないということですが、


retfieを実行する直前のスタック・ポインタの内容はどのようになっていますか?
retfieを実行しても、戻らないということはその時点でのスタック・ポインタに戻りアドレスが格納されていないということではないでしょうか?
スタックの初期設定はされていないようです。
割り込みの中でレジスタを戻しているのは何故でしょうか?
通常はレジスタを割り込み中でセーブするために、退避させると思います。スタック・ポインタの内容を調査すべきと思います。

この回答への補足

ありがとうございます。
スタックポインタというのは特に設定しておりませんでした。
データシートのどの辺りをみればわかるのでしょうか?

レジスタの退避は参考書を写したものでほかの
プログラムで使ったときも、
このやり方で問題なく動作しておりますので
問題ないと思うのですが、、

念のため再確認しておきます。

補足日時:2008/03/19 19:04
    • good
    • 0

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