PICマイコンでの省電力制御の解決篇
2009-08-13


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」がどういう意味なのか、指定したらどうなるのかなどは面倒なので調べていません。

解決の手順

  1. CCSのサンプルプログラムを試す
  2. 基板無改造ではサンプルプログラムは動かないことが判明
  3. 一時保留

CCSのサンプルプログラム

CCSのサンプルプログラムはINT0にスイッチをつけてON/OFFを行うことでSLEEPモードと復帰動作を切り替えるものです。 今回私が実装していたものはINT0にRTCからの割り込みパルスが入るようになっており、サンプルでも当然動くものと思っていたのでした。

基板の改造

ターゲット機器のオリジナルの回路ではRTCのINTピンがPIC18F2525のINT0ピンに接続されていますが、これではサンプルプログラムの動作を確認できないので、以下のように改造しました。

  1. PICのINT0とRTCのINTの間にジャンパピンを設置して切り離せるようにする
  2. PICのINT0をプルアップできるようにジャンパピンと抵抗を接続して5Vに接続
  3. PICのINT0をGNDにショートできるようにジャンパピンを経由してGNDに接続

これにより、サンプルプログラムの挙動を確かめることができました。 確かに割り込みは発生します。

オリジナルの基板でサンプルプログラムの割り込みが発生しなかったのはRTCのレジスタ操作で割り込み許可していないからでした。

[組込み]
[PICマイコン]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット