10. システムのコントロールとリセット

10.1 AVRをリセットする

 リセットが発生すると、すべてのI/Oレジスタは初期値に設定され、リセット・ベクトルからプログラム実行が開始されます。ATmega168では、リセット・ベクトルにある命令は必ずJMP(絶対ジャンプ)にして、リセット処理ルーチンへジャンプしなければなりません。ATmega48, ATmega88では、リセット・ベクトルにある命令は必ずRJMP(相対ジャンプ)にして、リセット処理ルーチンへジャンプしなければなりません。ただし、プログラムが割込みを無効にして全く使用しない場合、割込みベクトルは使用されず、これらの領域には通常のプログラムを配置することができます。これは、アプリケーション領域にリセット・ベクトル、割込みベクトルがブート領域にある場合、またはその逆の場合も同様です(ATmega88/168のみ)。Figure10-1の回路ブロック図はリセット回路の内容を表しています。Table28-3には、リセット回路の電気的特性が記されています。

 AVRの入出力ポートはリセット要因がアクティブ状態になると即座に初期状態にリセットされます。この際、クロック源が動作している必要はありません。

 全てのリセット要因が非アクティブになると、遅延カウンタが動作開始して内部リセット期間を延長します。これにより、電源が安定した電圧レベルに到達してから通常動作を開始することが可能になります。遅延カウンタのタイムアウト期間はSUTおよびCKSELヒューズ・ビットによって指定されます。「クロックの供給源」(p.27)に様々な遅延時間の設定方法が記載されています。

10.2 リセット要因

 ATmega48/88/168 には4つのリセット要因があります。

Figure 10-1. リセット回路

10.3 パワーオン・リセット

 パワーオン・リセット(POR)のパルスは、内蔵の検出回路により生成されます。検出電圧レベルは、「システムおよびリセットの特性」(p.306)に記されています。PORはVCCが検出電圧レベルより低くなった場合は常に発生します。POR回路はスタートアップ・リセットの開始トリガーとして使用され、また、供給電圧の異常を検出するためにも使用されます。

 パワーオン・リセット(POR)回路によりデバイスは電源投入時に確実にリセットされます。パワーオン・リセットのスレッショルド電圧に到達すると、遅延カウンタが始動してVCCの立ち上がりの後、どのくらいの時間デバイスをリセット状態に保持しておくかを決定します。VCCが検出電圧レベルよりも低下した場合、一切の遅延なしでRESET信号が再度アクティブ状態になります。

Figure 10-2. MCUスタートアップ動作、VCCに接続されたリセット信号

Figure 10-3. MCUスタートアップ動作、外部からのリセット延長

10.4 外部リセット

 外部リセットは、RESET端子がLowレベルになることで発生します。既定の最小幅(「システムおよびリセットの特性」(p.306)参照)よりも長い時間のリセット・パルスにより、クロックが動作していない場合であってもリセットが発生します。短いパルスではリセットの発生は保証されません。印加された信号の立ち上がりにおいて、リセットのスレッショルド電圧(VRST)に到達したとき、タイムアウト時間(tTOUT)経過後に遅延カウンタによりMCUが始動します。外部リセットはRSTDISBLヒューズ・ビットにより無効にできます。Table 27-6 (p.286) を参照してください。

Figure 10-4. MCU動作中の外部リセット

10.5 ブラウン・アウト検出

 ATmega48/88/168 には内蔵のブラウン・アウト検出(BOD)回路があり、VCCの電圧を固定されたトリガー電圧とをMCUの動作中に比較して監視しています。BODのトリガー電圧レベルはBODLEVELヒューズ・ビットにより選択できます。トリガー電圧レベルにはヒステリシス特性があり、ブラウン・アウト検出においてスパイクが発生しないようになっています。検出レベルのヒステリシス特性は、VBOT+ = VBOT + VHYST/2 と VBOT- = VBOT - VHYST/2となっています。BODが有効になっているとき、VCCがトリガー電圧(Figure 10-5のVBOT+)よりも低い電圧になるとブラウン・アウト・リセットが即座に発生します。VCCがトリガー電圧(Figure 10-5のVBOT+)よりも高くなると、遅延カウンタがタイムアウト時間tTOUTの経過後、MCUを始動させます。

 BOD回路は、「システムおよびリセットの特性」(p.306)に記されたtBODよりも長い時間、トリガー電圧レベルよりも低い状態になっている場合のみ、VCCの低下を検出します。

Figure 10-5. MCU動作中のブラウン・アウト・リセット

10.6 ウォッチドッグ・システム・リセット

 ウォッチドッグはタイムアウトしたときに、1CKサイクル期間の短いリセット・パルスを生成します。このパルスの立ち下がりで、遅延カウンタがタイムアウト時間tTOUTのカウントを開始します。詳細については、ウォッチドッグ・タイマー(p.48)を参照してください。

Figure 10-6. MCU動作中のウォッチドッグ・システム・リセット

10.7 内蔵の電圧リファレンス

 ATmega48/88/168 には、内蔵のバンドギャップ電圧リファレンスが搭載されています。この電圧リファレンスはブラウン・アウト検出、および内蔵のアナログ・コンパレータへの入力やA/Dコンバータに使用されます。

10.7.1 電圧リファレンスのイネーブル信号とスタートアップ時間

 電圧リファレンスにはスタートアップ時間があり、その影響を考慮して正しく使用する必要があります。「システムおよびリセットの特性」(p.306)にスタートアップ時間が記載されています。省電力を抑えるため、電圧リファレンスは常にオンになっているとは限りません。電圧リファレンスは次のような状況下でオンとなります。

  1. BODが有効になっている場合 (BODLEVEL [2:0] ヒューズ・ビットにより設定)
  2. バンドギャップ電圧リファレンスがアナログ・コンパレータに接続されている場合 (ACSRレジスタのACBGビットにより設定)
  3. A/Dコンバータが有効になっている場合

 したがって、BODが有効になっていない場合、ACBGビットの設定またはA/Dコンバータを有効に設定した後、ユーザーはアナログ・コンパレータの出力やA/Dコンバータの使用の前に電圧リファレンスを始動する必要があります。パワーダウン・モードでの消費電力を抑えるため、ユーザーは上記3つの条件が成立することを回避しておくことで、パワーダウン・モードに入る前に電圧リファレンスを確実にオフにしておくことができます。

10.8 ウォッチドッグ・タイマー

10.8.1 機能

Figure 10-7. ウォッチドッグ・タイマー

 ATmega48/88/168 には高機能のウォッチドッグ・タイマー(WDT)があります。WDTは独立した内蔵の128kHz発振器のクロックをカウントするタイマーです。WDTは、、指定されたタイムアウト値に達すると、割込み、あるいはシステム・リセットを発生させます。通常の動作モードでは、システムはWDR命令(ウォッチドッグ・タイマー・リセット)を使用して、カウンターがタイムアウト値に達する前に再スタートさせる必要があります。システムがカウンターを再スタートしない場合、割込み、あるいはシステム・リセットが発生します。

 割込み動作モードでは、WDTはタイムアウト時に割込みを発生させます。この割込みにより、デバイスをスリープ・モードからウェークアップすることができ、また汎用のシステム・タイマーとして使用することもできます。使用の一例は、ある操作において最大時間を指定されている状況で、予想よりも長時間の操作を行った場合に割込みを発生させるような用途です。

 システム・リセット動作モードでは、WDTはタイムアウト時にリセットを発生させます。これは、システムが正しく復帰しないコードによってハングアップするのを防止する典型的な用途に使用されます。

 3番目の動作モード、割込み後システム・リセット動作モードでは、まず割込みを発生させ、その後システム・リセット動作モードに切り替える、他の二つの動作モードの組み合わせです。このモードにより、例えばシステム・リセットを行う前に重要なデータをセーブすることで安全なシャットダウンを行うようなことが可能になります。

 ウォッチドッグ常時オン(WDTON)ヒューズ・ビットがプログラムされていると、ウォッチドッグ・タイマーを強制的にシステム・リセット動作モードに設定します。このヒューズ・ビットはシステム・リセット動作モード・ビット(WDE)と割込み動作モード・ビット(WDIE)をそれぞれ1、0に固定します。プログラムの安全性をさらに高めるためには、ウォッチドッグの設定変更を決められた時間と手順により設定します。WDEのクリアとタイムアウト設定の変更手順は次のようになります。

  1. 一動作で、ウォッチドッグ変更許可ビット(WDCE)とWDEに1を書き込みます。前回のWDEの設定値に関係なく、WDEには1を書き込まなければなりません。
  2. つづく4クロック期間以内で、WDEとウォッチドッグ分周設定ビット(WDP)を希望の値に設定します。ただしWDCEビットはクリアします。この動作を1命令で行います。

 下記のアセンブリ言語、およびC言語のコーディング例はウォッチドッグ・タイマーをオフにする手順です。これらの例では、割込みは禁止されており(例えば、グローバル割込み許可ビットにより無効化)、この関数実行中には割込みが発生しないものという前提です。

アセンブリ言語による例(1)

 WDT_off:
	 ; 割込みをすべて禁止
	 cli
	 ; ウォッチドッグ・タイマーをリセット
	 wdr
	 ; MCUSRレジスタのWDRFをクリア
	 in	r16, MCUSR
	 andi	r16, (0xff & (0<<WDRF))
	 out	MCUSR, r16
	 ; WDCEとWDEに1を書き込み
	 ; 意図しないタイムアウトが発生しないように、分周比の前回設定はそのままにする
	 lds	r16, WDTCSR
	 ori	r16, (1<<WDCE) | (1<<WDE)
	 sts	WDTCSR, r16
	 ; WDTをオフにする
	 ldi	r16, (0<<WDE)
	 sts	WDTCSR, r16
	 ; 割込み許可
	 sei
	 ret
C言語による例(1)

 void WDT_off(void)
 {
	 __disable_interrupt();
	 __watchdog_reset();
	 /* MCUSRレジスタのWDRFをクリア */
	 MCUSR &= ~(1<<WDRF);
	 /* WDCEとWDEに1を書き込む */
	 /* 意図しないタイムアウトが発生しないように、分周比の前回設定はそのままにする */
	 WDTCSR |= (1<<WDCE) | (1<<WDE);
	 /* WDTをオフにする */
	 WDTCSR = 0x00;
	 __enable_interrupt();
 }

注意:

  1. 「サンプル・コードについて」(p.7)を参照

注意:  例えば不正なポインタによる暴走やブラウン・アウト状態などでウォッチドッグが意図していないのに有効になると、デバイスはリセットされウォッチドッグ・タイマーは有効にセットされたままとなります。プログラム中でウォッチドッグへの対処がされていない場合、タイムアウト・リセットによる無限ループに陥る可能性があります。このような状況を防止するため、ウォッチドッグを使用しない場合であっても、アプリケーション・ソフトウェアは必ずウォッチドッグ・システム・リセット・フラグ(WDRF)とWDEコントロール・ビットを初期化ルーチン内でクリアしておく必要があります。

 下記のアセンブリ言語とC言語のコーティング例では、ウォッチドッグ・タイマーのタイムアウト時間を変更しています。

アセンブリ言語による例(1)

WDT_Prescaler_Change:
	; 割込みを全て禁止
	cli
	; ウォッチドッグ・タイマーのリセット
	wdr
	; 処理時間の決められている手順を開始
	lds	r16, WDTCSR
	ori	r16, (1<<WDCE) | (1<<WDE)
	sts	WDTCSR, r16
	; --   この時点から新しい値をセットするまで4サイクル以内であること -
	; 新しい分周比(タイムアウト)の値として64Kサイクル(約0.5 s)を設定
	ldi	r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
	sts	WDTCSR, r16
	; --   新しい値の設定完了、2サイクルを消費 -
	; 割込みを許可
	sei
	ret
C言語による例(1)

void WDT_Prescaler_Change(void)
{
	__disable_interrupt();
	__watchdog_reset();
	/* 処理時間の決められている手順を開始 */
	WDTCSR |= (1<<WDCE) | (1<<WDE);
	/* 新しい分周比(タイムアウト)の値として64Kサイクル(約0.5 s)を設定 */
	WDTCSR    = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
	__enable_interrupt();
}

注意:

  1. 「サンプル・コードについて」(p.7)を参照

注意: WDPビットの変更は、より短い値への変更の場合にタイムアウトを発生させる可能性があるため、WDPビットの変更の前に、ウォッチドッグ・タイマーをリセットする必要があります。

10.9 レジスタ詳細

10.9.1 MCUSR – MCU ステータス・レジスタ

 MCUステータスレジスタには、どのリセット要因によりMCUリセットが発生したかの情報が保持されています。

ビット 7 6 5 4 3 2 1 0
0x35 (0x55) - - - - WDRF BORF EXTRF PORF MCUSR
Read/Write R R R R R/W R/W R/W R/W
初期値 0 0 0 0 各ビットの説明を参照

 各リセット・フラグを利用してリセット要因を特定するためには、ユーザープログラムにおいて、できるだけ早い段階でフラグを読み取り、その後MCUSRレジスタをリセットする必要があります。他のリセット要因が発生する前にMCUSRレジスタをクリアするようにすれば、リセットフラグを検査することによってリセット要因を特定することができます。

10.9.2 WDTCSR – ウォッチドッグ・タイマー・コントロール・レジスタ

ビット 7 6 5 4 3 2 1 0
(0x60) WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0 WDTCSR
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
初期値 0 0 0 0 X 0 0 0

Table 10-2. ウォッチドッグ・タイマーの分周比選択

WDP3 WDP2 WDP1 WDP0 WDT発振器のサイクル数 VCC = 5.0V条件でのタイムアウト時間(typ)
0 0 0 0 2K (2048) サイクル 16 ms
0 0 0 1 4K (4096) サイクル 32 ms
0 0 1 0 8K (8192) サイクル 64 ms
0 0 1 1 16K (16384) サイクル 0.125 s
0 1 0 0 32K (32768) サイクル 0.25 s
0 1 0 1 64K (65536) サイクル 0.5 s
0 1 1 0 128K (131072) サイクル 1.0 s
0 1 1 1 256K (262144) サイクル 2.0 s
1 0 0 0 512K (524288) サイクル 4.0 s
1 0 0 1 1024K (1048576) サイクル 8.0 s
1 0 1 0 (予約)
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1


目次に戻る