ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:rairarai PICのSleepからの復帰に関して
困り度:
  • すぐに回答を!
INTピンを使ってsleepから割り込み復帰したいのですが、
思ったとおり動いてくれません。

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

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

list p=12f629
include p12f629.inc

RELOOP1 equ 0x20
CT_DELAYNMS equ 0x21
PCLATH_TEMP equ 0x2a
W_TEMP equ 0x2b
STATUS_TEMP equ 0x2c
stu equ 0x2d

org 0x0
goto start
org 0x4
;レジスタの退避
movwf W_TEMP
swapf STATUS,W
clrf STATUS
movwf STATUS_TEMP
movf PCLATH,W
movwf PCLATH_TEMP
clrf PCLATH
;割り込み要因のチェック
btfss INTCON, INTF
goto INT_NEXT1
;ここから割り込みプログラム

省略

INT_NEXT1
;レジスタの復帰
movf PCLATH_TEMP,w
movwf PCLATH
swapf STATUS_TEMP,W
movwf STATUS

swapf W_TEMP,F
swapf W_TEMP,W

retfie

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

bcf STATUS, RP0

clrf INTCON
clrf GPIO
bsf STATUS, RP0
clrf OSCCAL
clrf TRISIO
bsf TRISIO,2
movlw B'01000101'
movwf OPTION_REG

bcf STATUS, RP0


;割り込み許可する
movlw B'11010000'
movwf INTCON

nop
sleep
nop
goto $-3
end

こんな感じのプログラムなのですが、INTピンからの割り込みと
いうことでプリスケーラなどは使っていません。
データシートも読んだのですが今市理解ができていない状況です。
お願いします。
質問投稿日時:08/03/19 13:00
質問番号:3876026
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答10pt

回答者:ore100 No.1の者です。
私の勘違いでした。大変申し訳ありません。
http://www.cqpub.co.jp/hanbai/books/37/37391/37391_7syo.pdf
を参考としてください。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/03/21 16:49
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:ore100 retfieを実行しても、戻らないということですが、
retfieを実行する直前のスタック・ポインタの内容はどのようになっていますか?
retfieを実行しても、戻らないということはその時点でのスタック・ポインタに戻りアドレスが格納されていないということではないでしょうか?
スタックの初期設定はされていないようです。
割り込みの中でレジスタを戻しているのは何故でしょうか?
通常はレジスタを割り込み中でセーブするために、退避させると思います。スタック・ポインタの内容を調査すべきと思います。
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:08/03/19 14:59
回答番号:No.1
この回答への補足ありがとうございます。
スタックポインタというのは特に設定しておりませんでした。
データシートのどの辺りをみればわかるのでしょうか?

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

念のため再確認しておきます。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示