[Homepage][BBS][Blog][YouTube][asablo]

エアーバリアブルBBS
新エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
PIC18F14K50でのスリープとピン状態変化割り込みについて
PIC18F14K50でのスリープとピン状態変化割り込みについて

本家Microchipのフォーラムでも検索しましたがヒットしませんでしたので質問させてください。
開発環境はMPLAB+C18で18F14K50を使用して、電池駆動の温度計を制作中です。書き込みはPickit3です。
消費電力を押さえるため、電源投入後10秒程度でスリープし、スイッチ操作によってスリープ解除する仕様としました。
スリープへの移行はできたのですが、次にポート状態変化割り込みを設定すると、ポート変化していないにもかかわらずスリープから復帰してしまいます。
以下が関連する設定箇所です。

   WPUAbits.WPUA5 = 1;
   WPUAbits.WPUA4 = 1;
   INTCON2bits.RABPU = 0;  //weak pull-up enable

   INTCON2bits.RABIP = 0;  //PORT CHANGE 優先度=低
   INTCONbits.RABIE = 1;   //port change interrupt enable
   IOCAbits.IOCA5 = 1;   //RA5 port change enable
   IOCAbits.IOCA4 = 1;   //RA4 port change enable
   INTCONbits.RABIF = 0;

--中略--

   if(sec==13){
    Sleep();
    Nop();
    Lcd_dat();  //LCDに”SLEEP”表示


スイッチはRA4,RA5に接続されていて、上記の様に内蔵プルアップを有効にしていますが、ここを無効として外付けプルアップとしても同様でした。
スリープに入ったかどうかは、Sleep()命令の後にLCDに表示させて確認させています。
上記設定のままだと、一瞬LCDにスリープした表示がでるのですが、すぐに復帰してしまいます。
そこで、IOCAbits.のIOCA5とIOCA4をコメントアウトするとスリープに入ります。ただし、当然のことながらスイッチ操作で復帰はしません。
同様に、INTCONbits.RABIE=0としても、スリープに入りますが復帰しません。

ポート状態変化の設定をコメントアウトするとスリープするということは、他の要因で復帰していないということだと考えています。
設計仕様通りに、ある時間が経過後スリープして、ボタン操作でwake upするには、どうすればよいのでしょうか。
ごく一般的な仕様なので、同様の経験をした方はいませんか。
それとも、全く見当違いのことをやっているのでしょうか。
アドバイスをお願いします。
  • いち
  • 2014/04/24 (Thu) 15:04:44
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
いちさん
はじめまして、nです。

Errataをご確認ください。
現在のシリコンリビジョンでは、複数のポート(RA4とRA5の両方)を指定すると、
ポート状態変化割込みが正常に機能しません。

スイッチの信号を外部の回路で合成して単独のポートに接続する等の対策が必要です。

単独のポートでテストした結果を教えてください。
  • n
  • 2014/04/26 (Sat) 09:41:43
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
nさんこんにちは。
さっそくErrataを確認し、ひとつのポートだけで確認してみましたがうまくいきませんでした。
(当初、うまく動作したと勘違いして投稿してしまいましたので、削除しました。)
もう少しいろいろ試して、だめだったら本家の掲示板でも尋ねてみようと思います。
解決したら報告します。

ありがとうございました。
  • いち
  • 2014/04/30 (Wed) 13:57:34
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
こんにちは、

もう解決済みかもしれませんが...

状態変化割込みは最後にポートを読んだ状態からの変化で割込みが発生します。
割込みFLAGをクリアする前にポートを読んでおかないとFLAGが直ぐに'1'となってしまうのでSLEEPしても直ぐ起きてしまいます。
  • natu
  • 2014/05/09 (Fri) 13:16:19
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
natuさん、こんにちは。

その後、少しだけ前進したので報告です。
まず、ご指摘の『最後にポートを読んだ状態からの変化で・・』については、クリアしていると思います。
いろいろ試して、スイッチ入力ポートの内蔵プルアップを諦め、外付け抵抗でプルダウンして論理をHアクティブにすれば希望の動作となることがわかりました。
また、内蔵プルアップはオフで、外付け抵抗、プルアップでLアクティブとすると、やはりスリープからすぐに復帰してしまいました。
原因が特定されたわけではありませんし、折角の内蔵プルアップを使えないのは残念なのですが、これで我慢することにします。
同様の問題でお困りの方がおられたら、一度試してみてください。

ありがとうございました。
  • いち
  • 2014/05/12 (Mon) 14:57:53
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
こんにちは、

   WPUAbits.WPUA5 = 1;
   WPUAbits.WPUA4 = 1;
   INTCON2bits.RABPU = 0;  //weak pull-up enable
   INTCON2bits.RABIP = 0;  //PORT CHANGE 優先度=低
   IOCAbits.IOCA5 = 1;   //RA5 port change enable
   IOCAbits.IOCA4 = 1;   //RA4 port change enable

dummy = PORTA;   //内部の割込み原因をクリア

   INTCONbits.RABIF = 0;  //プルアップON時のラッチされたフラッグをクリア
   INTCONbits.RABIE = 1;   //port change interrupt enable

私も、この順で正常にならないとお手上げです。
  • natu
  • 2014/05/15 (Thu) 15:16:44
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
natuさんへ

念のため、ご教示いただいた設定の順序でやってみましたがだめでした。
その場合でも、weak pull upなし、外付け抵抗でHアクティブにしたら動作しました。
ありがとうございました。
  • いち
  • 2014/05/19 (Mon) 18:42:45
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
こんにちは、

ムムッ!デバイスのバグでしょうか?こうなると厄介ですね。
解決策を見つけられた事に感動してます。
  • natu
  • 2014/05/20 (Tue) 18:24:41
Re: PIC18F14K50でのスリープとピン状態変化割り込みについて
こんにちは。

断言はできませんが、デバイスの不具合の気がしています。
時間ができたら本家のBBSにもポストしようと思います。
  • いち
  • 2014/05/21 (Wed) 12:05:48

返信フォーム






プレビュー (投稿前に内容を確認)