質問 |
||
| 質問者: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 |
|
| この回答への補足 | ありがとうございます。 スタックポインタというのは特に設定しておりませんでした。 データシートのどの辺りをみればわかるのでしょうか? レジスタの退避は参考書を写したものでほかの プログラムで使ったときも、 このやり方で問題なく動作しておりますので 問題ないと思うのですが、、 念のため再確認しておきます。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |