PICで気圧、温度、湿度計 by 24FJ64GA002 その7

スリープとウェイクアップ


ここまで出来れば、ほぼ完成と思ったらそうは行きません。

なぜならば、単体で持ち歩いて、オフラインで観測データをPIC内部に記憶して、それを自宅に持ち帰って、記憶した観測データーを今度はオンラインでパソコンへ送信したいのです。

PIC24FJ64GA002 では、ここまでで、プログラムメモリーを約1/5、データメモリー約1/20程しか使っていませんので、日時や気圧、気温、湿度をたっぷり記憶する事は可能と思われますが、それをどのくらいの間記憶していられるかという問題が有るのです。

今まで使った、PIC12FやPIC16F、PIC18LFには、PICにEEPROMを内蔵していましたが、PIC24FにはEEPROMは内蔵していないので、パッテリー駆動で単体で持ち歩いて商用電源の無いところでも観測が出来ますが、電源を切ったり、バッテリーが消耗した時には、メモリーに記憶しておいた観測データは消失してしまいます。

現状の総消費電流値は10mA弱ですから、アルカリ単三電池2本で大雑把に2〜3日位は電源を入れたままでも持ちそうですが・・もう少し何とかならない物なのでしょうか?

現状でも、ノートパソコンを一緒にもって出て、ノートパソコンとオンラインで接続して観測データーを持って帰れば良いのですが、私はものぐさなので、ノートパソコンを一緒にもって出るのもるのは嫌なのです。


さて、PIC24FJ64GA002での押しボタンによるスリープモードへの移行と、押しボタンによるスリープモードからのウェイクアップが出来る様になりました。

でも実は、なかなか難関でした。
(1)ポート状態変化検知機能を有効等の必要な設定をして、C30ではC言語中にアセンブラー命令を
asm "PWRSAV #SLEEP_MODE";

という様に1行挿入で書いています。

ところが、SLEEP_MODE は、アセンブラーのインクルードファイル中に宣言されているので
C30では参照できずコンパイルエラーになってしまうのです。

これは、PIC24FJのマニュアルを良く読むと
「SLEEP_MODEと、IDLE_MODEは、ここのデバイスのアセンブラー用インクルードファイル内で定義されています。」
と注意書きになっていました。

そこで、自分でアセンブラー内の「SLEEP_MODE」定義を探して、実際の数値を探ってみました。

MPLAB ASM30 Suite > Support > PIC24F > inc > p24FJ64GA002
の中のインクルードファイル内をSLEEP_MODEで検索すると、

 .equiv SLEEP_MODE, 0x0
 .equiv IDLE_MODE, 0x1
と定義がありました。そこで、

asm "PWRSAV #0";

と書き換えると、一発でスリープモードに突入!
あれ?!ボタンを押してもスリープしたままで復帰できない・・
画面が表示されたまま凍結して、眠ったまんまです!

(2)ポート状態変化検知機能を有効等の諸設定をして・・
と言っても、結構いろいろなパラメータをいじらなくてはならないのですが、
PIC24FJのマニュアルに

「CNモジュールはスリープまたはアイドルモード中も継続して動作します。
(途中略)
CN割り込みに割り当てられた優先レベルが、現行の CPU 優先レベルに等しいか低い場合、
デバイス実行はスリープまたはアイドルの命令のすぐ次の命令から継続します。
CN割り込みに割り当てられた優先レベルが、現行の CPU 優先レベルよりも高い場合、
デバイス実行はCN割り込みベクタアドレスから継続します。」

つまり、スリープは復帰時に、CPUとの割り込みレベルによって、
復帰後CNインタラプトルーチンベクトルへ飛ぶ。
あるいは、中断した箇所の次の命令から実行するというように選択できるはずなのですが・・

どうも復帰後CN割り込みベクタアドレスへ飛んで、何も書いてないので、
リセットルーチンへ飛んでいるようなので、試しに、CN用割り込みルーチンをC30で書き加えると、今度はリセットされずにちゃんとCN用割り込みルーチンを実行後に継続ができました。

そして、スリープ解除後も時刻がずれる事無く正しく表示されるので、スリープ中RTCC機能はスリープしないでそのまま正確に時間を刻んでいる事も検証できました。良かった!

スリープ中のシステム全体の消費電流値ですが、
通常実行時7.99mA(7.90〜7.99mA)ーー>スリープ中は、2.19mA完全固定!なんと、PIC24Fをスリープするだけで、5.8mAも下がりました。ちょっと驚きです!
このぐらいの消費電流値ならば、アルカリ単3乾電池でしっかりメモリー上の観測データーを長い間安心してしっかり保持できます。

でも、考えてみると、バッテリー駆動で計測を行う場合には、このシステム全体で8.0mAも電流が流れるのですから、測定時のバッテリー駆動可能時間が短かく、あっという間に電池切れになってしまうのでは、計測データーそのものを十分に得る事が出来ません。

日時表示は出来ませんが殆ど同一の観測が出来るPIC16F886のシステムでの動作消費電流は、たったの4mAなのです。結果的には、日時の表示を得る為に、2倍の消費電流を必要としたという事になります。これはなんとかしなければなりません。

この装置の実行環境は、気圧センサーユニットが560ms毎に測定完了信号を規則的に送ってくる事!そして、今までに、その560msの間の190msの時間を使って、その他の処理を全てやり終えて、残りの370msは次の気圧センサーユニットからの測定完了信号を待っている状態だという事です。



中央の波形が何も無い時間が待ち時間の370msで、全サイクルの66%も占めているのです。だったら、この間はスリープしてしまって、次の気圧センサーユニットからの測定完了信号でウェイクアップすれば良いじゃないか?と気がつきました。

そうすれば、常時8.0mAも電流を消費しなくても済むわけです。66%をスリープモードにする場合の電力を計算してみると、殆どPIC16F886の通常運転時の電力に等しくなる事が期待できるようです。電力が絶えず変化する状況で現実と計算値が何処まで合っているかは分かりませんが、スリープした方が遥かにバッテリー運転時の電池の寿命が延びる事は間違い有りません。

これも、やってみたら出来てしまいましたが、割り込み処理部分では注意すべき事がある事も分かりました。

(1)状態変化検出割り込み処理の中では、割り込み関係の必要最小限の処理だけを行うこと。他の関数等の呼び出しをこの処理内では行うと、割り込む前の処理に戻れなくなてしまう場合がある。

という事です。

下記に、気圧センサーユニットからの測定完了信号を待っている間はスリープして消費電力を抑え押しボタンによる
◎スリープ & ウェイクアップ、
◎押しボタンによるプロット間隔変更、そして、
◎押しボタンによる日時の変更
が可能なサンプルプロジェクトをリンクしておきます。ハードウエアの変更は有りません。

×メモリー上に計測データの保存はまだ出来ていません。

2464002prrhrt09.zip 2464002prrhrt10.zip 2464002prrhrt12.zip (Oct. the31th 2010)





押しボタンの名称とハードウエア上の回路名称ですが、

◎Reset ボタン:PSW1(写真下側の中央、赤色のタクトスイッチ)PICを強制リセットします。

◎Mode ボタン:PSW4(RA2、写真右下側の3個の左端、黄色のタクトスイッチ)モード変更をします。

◎2nd. Digit ボタン:PSW2(RB0、写真右下側の3個の中央、緑色のタクトスイッチ)日時の変更時に2桁目の数値のみを増加させます。
 通常の計測運転時に2nd.Digit ボタンを押しながらモードボタンを押し、2nd.Digit ボタンを押したままでモードボタンだけ離すと、2nd.Digit ボタンを押し続けている間グラフィックプロット間隔の変更モードになります。

◎1st. Digit ボタン:PSW3(RB1、写真右下側の3個の右端、灰色のタクトスイッチ)日時の変更時に1桁目の数値のみを増加させます。
 通常の計測運転時にこのボタンを押すと、スリープモード※1になります。スリープモード中にこのボタンを押すとスリープが解除されて、通常運転を継続します。

※1 スリープモード時にはLCD画面にSleep!と表示されてPIC内部のシステムクロックが停止状態になり、PICの主動作が停止し、I/O出力ポートへの電力供給も止まり省電力状態になります。RTCCはスリープモード中もSOSCクロックで動作を続けますので正しい時刻をカウントし続けます。スリープモード中入力ポートのRB1には、状態変換検出機能※2を設定してあります。

※2 状態変換検出機能によりスリープ中のBR1ビットの入力状態の変化を監視し、BR1ビットの入力状態に変化が有ればPICをウェイクアップしてCN割り込みを発生させます。

今回の日時設定変更手順は、前回と同じです。直したいところも有りますが、とりあえずそのままです。

なお、例によってこのソースプログラムは、
Windows XP Pro v2002 SP3上で、
現時点において最新で無償の、
MPLAB-IDE v8.56、
MPLAB C30 C Compiler [pic30-gcc.exe] v3.24
にてコンパイルしています。

今回のプロジェクトファイルでも、PIC24F用のUART用ライブラリーを使用しています。uart.h をインクルードして使う事に成りますが、MPLAB C30 のご利用のバージョンに合ったライブラリーを正しくリンクさせる為に、その都度MicroChipのディレクトリー内のファイルをリンクさせてください。配布用のサンプルプロジェクト内にはそのライブラリーの実体が含まれません。

また、単純にインクルード宣言をするだけでは正しくライブラリーを参照する事が出来ません。

まず、PIC24FJ64GA002用の uart.h をリンクさせるには、
C:¥Program Files¥Microhip¥MPLAB C30¥lib¥PIC24F¥libpPIC24Fxxx-coff.a
を、プロジェクトファイルのLibrary Files に登録してください。

また、プロジェクトファイルのLinker Scriptに、
C:¥Program Files¥Microhip¥MPLAB C30¥support¥PIC24F¥gld¥p24FJ64GA002.gld
を登録してください。

この2つが正しく登録されていて始めて、
#include <uart.h>
が正しくコンパルが通る様になります。

なお、PIC24F用のHI-TECH C は、現在は残念ながら対応していません。今回のプロジェクトは MPLAB C30 用なのでお間違え無い様にして下さい。

プログラミングは、秋月電子通商のPICkit2互換機を使っています。MPLAB C30 コンパイラーから直接秋月PICkit2互換機を通じてICSP接続で書込みをしています。

気圧センサー部分を含むプログラムの大部分を、パレットソフトさんの HI-Tech C 用ソースプログラムを利用し、私が変更に、変更を加えて使用しています。

プログラムの構成方法を、パレットソフトさんのプログミング形式を利用し、ソースリストのデバッグや、再利用がしやすい様にしています。

ノキア5110表示用のライブラリー部分は、
CQ出版の「トランジスタ技術2006年3月号」に掲載された、
R8C/15付録マイコン基板活用企画 
第9回 小型グラフィック液晶表示器で作る簡易温度計 山本 秀樹氏 のR8C/15用ソフトウエアをHI-TECH C Compiler用に移植したものを、さらに MPLAB C30 C Compiler用に再利用しています。

湿度センサーSHT-11とのインターフェース部分は、エレキジャックさんのソースを利用して変更を加えて使用しています。
(Oct. the 28th 2010)

注意事項
General disclaimer
トッ プページへ

なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで