PICマイコンでの省電力制御の解決篇 ― 2009年08月13日 23時26分11秒
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の記述は以下のようになります。
- INT0 → EXT
- INT1 → EXT1
- INT2 → EXT2
勘違いしたのはCCSのマニュアルにも問題があると思います。 マニュアルには以下のように書かれています。
- #INT_EXT 外部割り込み
- #INT_EXT1 外部割り込み #1
- #INT_EXT2 外部割り込み #2
- #INT_EXT3 外部割り込み #3
要するに外部割り込みは3つしか存在しないのに4つ書かれているわけです。私が最初にこれを見たときの解釈は「#INT_EXT」は3つ同時に操作するもので、個別に使う場合は「#INT_EXT1~3」を使うのだと。しかもあえてゼロオリジンではなく1オリジンで番号を振ったのだな、と解釈してしまったわけです。
マニュアルでは細かい説明はされていません。「#INT_EXT3」がどういう意味なのか、指定したらどうなるのかなどは面倒なので調べていません。
解決の手順
- CCSのサンプルプログラムを試す
- 基板無改造ではサンプルプログラムは動かないことが判明
- 一時保留
CCSのサンプルプログラム
CCSのサンプルプログラムはINT0にスイッチをつけてON/OFFを行うことでSLEEPモードと復帰動作を切り替えるものです。 今回私が実装していたものはINT0にRTCからの割り込みパルスが入るようになっており、サンプルでも当然動くものと思っていたのでした。
基板の改造
ターゲット機器のオリジナルの回路ではRTCのINTピンがPIC18F2525のINT0ピンに接続されていますが、これではサンプルプログラムの動作を確認できないので、以下のように改造しました。
- PICのINT0とRTCのINTの間にジャンパピンを設置して切り離せるようにする
- PICのINT0をプルアップできるようにジャンパピンと抵抗を接続して5Vに接続
- PICのINT0をGNDにショートできるようにジャンパピンを経由してGNDに接続
これにより、サンプルプログラムの挙動を確かめることができました。 確かに割り込みは発生します。
オリジナルの基板でサンプルプログラムの割り込みが発生しなかったのはRTCのレジスタ操作で割り込み許可していないからでした。
コメント
トラックバック
このエントリのトラックバックURL: http://kumikomi.asablo.jp/blog/2009/08/13/4510594/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
※投稿には管理者が設定した質問に答える必要があります。