PIC18F2525でSLEEPモードにしてINT0割り込みでSLEEPから復帰しなかった問題ですが、解決しました。
原因はちょっと恥ずかしいのですが、CCSのPCHの割り込み処理のラベルを間違っていたことでした。
CCSのCコンパイラ用のソースプログラムでは以下のように割り込み処理を記述します。
#INT_EXT void int_ext_isr() { clear_interrupt(INT_EXT); 任意の処理; }
何が間違っていたのかというと、「INT_EXT」とすべきところを「INT_EXT1」としていたのでした。
PICマイコン上の表現はINT0,INT1,INT2なのですが、CCSの記述は以下のようになります。
勘違いしたのはCCSのマニュアルにも問題があると思います。 マニュアルには以下のように書かれています。
要するに外部割り込みは3つしか存在しないのに4つ書かれているわけです。私が最初にこれを見たときの解釈は「#INT_EXT」は3つ同時に操作するもので、個別に使う場合は「#INT_EXT1〜3」を使うのだと。しかもあえてゼロオリジンではなく1オリジンで番号を振ったのだな、と解釈してしまったわけです。
マニュアルでは細かい説明はされていません。「#INT_EXT3」がどういう意味なのか、指定したらどうなるのかなどは面倒なので調べていません。
CCSのサンプルプログラムはINT0にスイッチをつけてON/OFFを行うことでSLEEPモードと復帰動作を切り替えるものです。 今回私が実装していたものはINT0にRTCからの割り込みパルスが入るようになっており、サンプルでも当然動くものと思っていたのでした。
ターゲット機器のオリジナルの回路ではRTCのINTピンがPIC18F2525のINT0ピンに接続されていますが、これではサンプルプログラムの動作を確認できないので、以下のように改造しました。
これにより、サンプルプログラムの挙動を確かめることができました。 確かに割り込みは発生します。
オリジナルの基板でサンプルプログラムの割り込みが発生しなかったのはRTCのレジスタ操作で割り込み許可していないからでした。
セコメントをする