スリープモード(p.254、非公式訳)

AVRには、内部クロックの一部をスリープ状態にしておくさまざまなスリープモードがあります。何らかの割り込みが発生すればスリープから復帰します。使っていないハードウェアを任意のタイミングでシャットダウンしておいて、CPUでの処理が必要な割り込みやタイマーが発生したらCPUを復帰することにしておけば消費電力が抑えられる、というのがスリープモードの基本的な考えです。

たとえば、_delay_ms()ルーチンを使わなくても、タイマーをシステムティックとして使えば時間の処理ができることはすでに学びましたね。タイマーで時間を処理しているときにCPUで実行すべきことがほとんどないのであれば、少しのあいだだけCPUを眠らせておくのは悪いことではありません。この場合は、スリープモードの中でも一番眠りの浅いIdleモードを使うのが最適です。Idleモードでは、CPUクロックはシャットダウンされますが、何か割り込みが発生すればCPUは目を覚まします。タイマークロック、ADCクロック、各種I/Oクロックはすべてバックグラウンドで動いたままですので、ビジーウェイトの代わりにIdleモードが使えるだけでなく、ISRをコールするタイマーオーバーフローの発生するたびにCPUがスリープから復帰します(前に学んだシステムティックと同様です)。シリアルI/Oで何かを送受信している場合であっても、シリアル入力をISRで処理することにしたうえで忘れずに割り込みを有効化しさえするのであればIdleモードが利用できます。

ADC Noise Reductionモードが本項で使うモードです。このモードでは、CPUクロックとI/Oクロックとがシャットダウンされるだけではなく、CPUの停止後にAD変換が実行され、AD変換後にすべてが復帰します。すてきですね? (ただしADCサンプリングの最中にやり取りされるI/Oは失われます)。

Power-downモードは、わたくしがよく使うもうひとつのスリープモードです。スリープモードの中でも最も深い眠りに入るモードであり、内部生成されるクロックとペリフェラルとがすべてシャットダウンされます。電力消費の点からすると、基本的にはIC全体をオフにしたのと同じことです。ただし、ボタンが押されるなどの外部割り込みを受信すれば復帰します。これは、オン/オフボタンを実現したいときに便利です。リセットピンをリセット以外に使わないのであれば、Power-downモードからの復帰用としてリセットピンを電源オンボタンとして使うのがよいでしょう。

他のスリープモードもすべて、データシートの「Power Management and Sleep Modes」のセクションに載っています。このセクションの表を見ると、どのペリフェラルがどのモードでオフになるのかについてや、どの割り込みでスリープモードから復帰するのかがわかりやすく示してあります。