avr-libc  2.0.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

Example Projects

関数
<avr/sleep.h>: 電力管理とスリープモード

関数

void sleep_enable (void)
 
void sleep_disable (void)
 
void sleep_cpu (void)
 
void sleep_mode (void)
 
void sleep_bod_disable (void)
 

説明詳細

#include <avr/sleep.h>

SLEEP命令の使用で、おおくのアプリケーションの電力消費を削減できます。AVRデバイスは、異なるスリープモードに入ることができます。使用しているデバイスに関する詳細は、データシートを参照ください。

実際にデバイスをスリープモードへするために、このヘッダファイルではいくつかのマクロを提供している。最も簡単な方法は、set_sleep_mode()で目的のスリープモードに設定し、sleep_mode()を呼び出すことです(通常は、CPUはスリープ状態になりますが、すべての周辺回路とクロックは動作するアイドルモードになります)。このマクロは自動的にスリープ許可ビットをセットして、スリープになり、そしてスリープ許可ビットをクリアします。

例:

#include <avr/sleep.h>
...
set_sleep_mode(<mode>);

注意として、CPUの完全なロック(ハードウェアによるリセットまで)が目的でない限り、スリープになる前に割込みが許可される必要があります。

sleep_mode()マクロは、いくつかの状況で競合が発生するかもしれませんが、それぞれの動作のステップは、スリープ許可(SE)ビットを許可し、SLEEP命令を実行し、sleep_enable()sleep_disable()sleep_cpu()マクロで提供します。これにより、スリープからデバイスが起動する割込みを欠かさないよう取り扱うテスト&スリープ計画が可能になります。

例:

#include <avr/interrupt.h>
#include <avr/sleep.h>
...
set_sleep_mode(<mode>);
cli();
if (some_condition)
{
sei();
}
sei();

このシーケンスは、いくつかの状態の小さなテストにおいて、割込みを無効にします。条件が満たされれば、スリープモードが準備され、SEI命令の後すぐSLEEP命令がスケジュールされます。SEI直後にすることで、割込みが入る可能性がある前に実行されることが保証され、デバイスは確実にスリープになります。

いくつかのデバイスは、スリープになる前に低電圧検出器(BOD:Brown Out Detector)を無効にする機能があります。これはまた、スリープ時の消費電力を削減します。この機能がある特定のAVRデバイスでは、sleep_bod_disable()マクロが定義されています。このマクロは、スリープする前にBODの無効化を時系列で正しく実装されたインラインアセンブラコードを生成します。しかし、BODを無効にしてデバイスがスリープするには決められたサイクルがあり、それ以外ではBODを実際には無効にできません。おすすめの方法は、次のようにBODを無効(sleep_bod_disable())にして、割込み許可(sei())し、デバイスをスリープ(sleep_cpu())にします。

#include <avr/interrupt.h>
#include <avr/sleep.h>
...
set_sleep_mode(<mode>);
cli();
if (some_condition)
{
sei();
}
sei();

関数説明

void sleep_bod_disable ( void  )

スリープ前にBODを無効にします。全てのデバイス使えるわけではありません。

void sleep_cpu ( void  )

デバイスをスリープモードにします。SEビットは、前もって設定されなければなりません。そして、その後クリアにすることが推奨されます。

void sleep_disable ( void  )

SE (sleep 許可)ビットをクリア。

void sleep_enable ( void  )

デバイスをスリープモードにする。デバイスがスリープモードから出る方法は、set_sleep_mode()関数で設定した特定のモードに依存する。さらに詳しくはデバイスのデータシートを参照。

SE (sleep 許可)ビットを設定。

void sleep_mode ( void  )

デバイスをスリープモードにします。事前にSEビットを設定し、その後クリアします。