MSP430G2553 - タイマ
概要
MSP430G2553マイコンには、3つのタイマモジュールが搭載されている。
- Timer_A3
- 16ビットのタイマ / カウンタ
キャプチャ / 比較レジスタを3つ備えている。 - Timer_A3モジュールは、3つのキャプチャ/比較レジスタ (CCR0、CCR1、CCR2) を備えている。
- 16ビットのタイマ / カウンタ
- Timer_A2
- 16ビットのタイマ / カウンタ
キャプチャ / 比較レジスタを2つ備えている。
- 16ビットのタイマ / カウンタ
- Watchdog Timer+
- ウォッチドッグタイマとして機能する16ビットのタイマ
インターバルタイマとしても使用可能である。
- ウォッチドッグタイマとして機能する16ビットのタイマ
これらのタイマは、時間管理、イベントのスケジューリング、パルス幅変調 (PWM) の生成、外部信号のキャプチャ等、様々な用途に使用されている。
タイマの主な仕組みを以下に示す。
- カウント動作
- タイマはクロック信号に同期してカウント値を増加または減少させる。
- クロックソースは、内部クロック (SMCLK、ACLK)、外部クロック (TACLK) から選択できる。
- 動作モード
- タイマは、連続モード (カウンタが最大値に達すると0に戻る)、アップモード (カウンタが最大値に達すると停止)、アップ / ダウンモード (カウンタが最大値と0の間で増減を繰り返す) 等の動作モードを選択できる。
- 割り込み
- タイマは、カウンタが特定の値に達した場合や、キャプチャ / 比較イベントが発生した場合にに割り込みを生成することができる。
- これにより、CPU負荷を最小限に抑えながらタイミングイベントを処理できる。
- キャプチャ / 比較機能
- タイマのキャプチャ / 比較レジスタを使用すると、外部信号のエッジ (立ち上がりまたは立ち下がり) を検出したり、PWM信号を生成したりすることができる。
- ウォッチドッグ機能
- ウォッチドッグタイマは、システムの異常動作を検出して、リセットを行うために使用される。
- 定期的にウォッチドッグタイマをリセットしないと、システムがリセットされる。
MSP430G2553マイコンのタイマは、低消費電力動作とシンプルな設定が特徴である。
タイマの設定は、制御レジスタ (TACTLレジスタ、TACCTLxレジスタ) を通じて行う。
これらのレジスタを適切に設定することにより、目的に応じたタイマの動作を実現することができる。
Timer_A3モジュール
Timer_A3モジュールとは
MSP430G2553マイコンには、Timer_A3という16ビットのタイマ / カウンタモジュールが搭載されている。
このTimer_A3モジュールは、3つのキャプチャ / 比較レジスタ (CCR0、CCR1、CCR2) を備えており、それぞれがタイマA0、タイマA1、タイマA2として機能する。
複数の割り込みソース
- TA0CCR0
- タイマA0のカウンタが、TA0CCR0レジスタの値に達した場合に発生する割り込み
- TA0CCR1
- タイマA0のカウンタが、TA0CCR1レジスタの値に達した場合に発生する割り込み
- TA0CCR2
- タイマA0のカウンタが、TA0CCR2レジスタの値に達した場合に発生する割り込み
- TA0IFG
- タイマA0の上記以外の割り込みフラグが設定された場合に発生する割り込み
TA0IVレジスタの値と対応する割り込みソースを、以下に示す。
- 0x00
- 割り込みなし
- 0x02
- TA0CCR1
- 0x04
- TA0CCR2
- 0x0A
- TA0IFG (カウンタオーバーフロー等)
- 0x0E
- TA0IFG (カウンタクリア等)
PWM動作モードでは、TA0CCR0の値がPWM周期を決定、TA0CCR1の値がデューティ比を決定する。
TA0CCR1に関連する割り込みは、PWM周期ごとに発生する。
例えば、TA0IVレジスタの値が0x02
になる場合は、PWM周期ごとにTA0CCR1に関連する割り込みが発生していることを示す。
この割り込みを利用して、PWMのデューティ比を動的に変更することもできる。
タイマA0 / タイマA1 / タイマA2の違い
先述の通り、MSP430G2553マイコンのTimer_A3モジュールには、3つのキャプチャ / 比較レジスタ (CCR0、CCR1、CCR2) があり、それぞれがタイマA0、タイマA1、タイマA2として機能する。
これらのタイマは基本的に同じ仕様であるが、いくつかの細かな違いがある。
- タイマA0 (TA0)
- キャプチャ / 比較レジスタ0 (TACCR0) を使用
- TACCR0レジスタは、タイマのカウント値を設定するために使用されることが多い。
- アップモード、アップ / ダウンモードで、カウンタの最大値を設定するために使用する。
- タイマA1 (TA1)
- キャプチャ / 比較レジスタ1 (TACCR1) を使用する。
- キャプチャモードと比較モードをサポート。
- 外部信号のエッジ検出やPWM生成に使用可能である。
- タイマA2 (TA2)
- キャプチャ / 比較レジスタ2 (TACCR2) を使用する。
- キャプチャモードと比較モードをサポート。
- 外部信号のエッジ検出やPWM生成に使用可能である。
主な違いは、TACCR0レジスタがタイマのカウント値を設定するために使用されることが多いのに対して、TACCR1レジスタとTACCR2レジスタはキャプチャや比較操作に使用されることが多い。
ただし、これらのレジスタは柔軟に使用できるため、用途に応じて各レジスタの役割を変更することができる。
また、タイマA1とタイマA2は、キャプチャモードと比較モードの両方をサポートしているが、タイマA0は主に比較モードで使用される。
それ以外の機能、such as動作モード、クロックソース、クロック分周、割り込み、出力モード等は、3つのタイマで同じである。
したがって、タイマA0、タイマA1、タイマA2は、基本的には同じ仕様であるが、それぞれのキャプチャ / 比較レジスタの用途に応じて使い分けることができる。
タイマA0
動作モード
- アップモード
- カウンタが
0
からTACCR0レジスタに設定した値まで増加して、TACCR0レジスタに設定した値に達するとカウンタが0
に戻る。
- カウンタが
- 連続モード
- カウンタが
0
からFFFFh
まで増加して、FFFFh
に達すると<ode>0に戻る。
- カウンタが
- アップ / ダウンモード
- カウンタが
0
からTACCR0レジスタに設定した値まで増加して、TACCR0レジスタに設定した値に達するとTACCR0レジスタの値から0
まで減少する。
- カウンタが
クロックソース
- TACLK
- 外部クロック信号を使用する。
- ACLK
- 補助クロック (32.768[kHz]) を使用する。
- SMCLK
- サブメインクロック (最大16[MHz]) を使用する。
- INCLK
- 内部クロック (DCOCLK) を使用する。
クロック分周
1
、2
、4
、8
分周が可能である。
割り込み
- TACCR0と比較一致割り込み (CCIFG)
- カウンタオーバーフロー割り込み (TAIFG)
出力モード
- 比較モード
- TACCR0レジスタとの比較一致に基づいて出力信号の状態を変更する。
- セットアップモード
- TACCR0レジスタとの比較一致でセット、カウンタの再スタートでリセットする。
- トグルモード
- TACCR0レジスタとの比較一致で出力信号をトグルする。
- リセットモード
- TACCR0レジスタとの比較一致でリセット、カウンタの再スタートでセットする。
タイマA1
タイマA1の設定
- TACTL
- タイマAの制御レジスタ
- TACCTL1
- キャプチャ / 比較制御レジスタ1
- TACCR1
- キャプチャ / 比較レジスタ1
これらのレジスタを適切に設定することにより、目的に応じたタイマA1の動作を実現できる。
タイマA1は、PWM信号の生成、外部信号のエッジ検出とキャプチャ、一定間隔でのイベント処理等、様々な用途に使用できる。
特に、キャプチャモードを利用することにより、外部信号の周期やパルス幅を測定することができる。
動作モード
- アップモード
- カウンタが
0
からTACCR1レジスタに設定した値まで増加して、TACCR1レジスタに設定した値に達するとカウンタが0
に戻る。
- カウンタが
- 連続モード
- カウンタが
0
からFFFFh
まで増加して、FFFFh
に達すると0
に戻る。
- カウンタが
- アップ / ダウンモード
- カウンタが
0
からTACCR1レジスタに設定した値まで増加して、TACCR1レジスタに設定した値に達するとTACCR1レジスタから0
まで減少する。
- カウンタが
クロックソース
- TACLK
- 外部クロック信号を使用
- ACLK
- 補助クロック (32.768[kHz]) を使用
- SMCLK
- サブメインクロック (最大16[MHz]) を使用
- INCLK
- 内部クロック (DCOCLK) を使用
クロック分周
1
、2
、4
、8
分周が可能である。
割り込み
- TACCR1と比較一致割り込み (CCIFG)
- キャプチャ割り込み (CCIFG)
出力モード
- 比較モード
- TACCR1レジスタとの比較一致に基づいて出力信号の状態を変更する。
- セットアップモード
- TACCR1との比較一致でセット、カウンタの再スタートでリセットする。
- トグルモード
- TACCR1レジスタとの比較一致で出力信号をトグルする。
- リセットモード
- TACCR1レジスタとの比較一致でリセット、カウンタの再スタートでセットする。
キャプチャモード
- 立ち上がりエッジ
- 入力信号の立ち上がりエッジでキャプチャする。
- 立ち下がりエッジ
- 入力信号の立ち下がりエッジでキャプチャする。
- 両エッジ
- 入力信号の両エッジでキャプチャする。
タイマA2
タイマA2の設定
タイマA2の設定は、以下に示すレジスタを使用して行う。
- TACTL
- タイマAの制御レジスタ
- TACCTL2
- キャプチャ / 比較制御レジスタ2
- TACCR2
- キャプチャ / 比較レジスタ2
これらのレジスタを適切に設定することにより、目的に応じたタイマA2の動作を実現することができる。
タイマA2は、PWM信号の生成、外部信号のエッジ検出とキャプチャ、一定間隔でのイベント処理等、様々な用途に使用できる。
特に、キャプチャモードを利用することにより、外部信号の周期やパルス幅を測定することができる。
動作モード
- アップモード
- カウンタが
0
からTACCR2レジスタに設定した値まで増加して、TACCR2レジスタの設定した値に達するとカウンタが0に戻る。
- カウンタが
- 連続モード
- カウンタが
0
からFFFFh
まで増加して、FFFFh
に達すると0
に戻る。
- カウンタが
- アップ / ダウンモード
- カウンタが
0
からTACCR2レジスタに設定した値まで増加して、TACCR2レジスタに設定した値に達するとTACCR2レジスタから0
まで減少する。
- カウンタが
クロックソース
- TACLK
- 外部クロック信号を使用
- ACLK
- 補助クロック (32.768[kHz]) を使用
- SMCLK
- サブメインクロック (最大16[MHz]) を使用
- INCLK
- 内部クロック (DCOCLK) を使用
クロック分周
1
、2
、4
、8
分周が可能である。
割り込み
- TACCR2と比較一致割り込み (CCIFG)
- キャプチャ割り込み (CCIFG)
出力モード
- 比較モード
- TACCR2レジスタとの比較一致に基づいて出力信号の状態を変更する。
- セットアップモード
- TACCR2レジスタとの比較一致でセット、カウンタの再スタートでリセットする。
- トグルモード
- TACCR2レジスタとの比較一致で出力信号をトグルする。
- リセットモード
- TACCR2レジスタとの比較一致でリセット、カウンタの再スタートでセットする。
キャプチャモード
- 立ち上がりエッジ
- 入力信号の立ち上がりエッジでキャプチャする。
- 立ち下がりエッジ
- 入力信号の立ち下がりエッジでキャプチャする。
- 両エッジ
- 入力信号の両エッジでキャプチャする。
Timer_A2モジュール
Timer_A2モジュールとは
MSP430G2553マイコンには、Timer_A2という16ビットのタイマ / カウンタモジュールが搭載されている。
このTimer_A2モジュールは、2つのキャプチャ / 比較レジスタ (CCR0、CCR1) を備えており、それぞれがタイマA0 (TA0) とタイマA1 (TA1) として機能する。
Timer_A2モジュールの設定
Timer_A2モジュールの設定は、以下に示すレジスタを使用して行う。
Timer_A2モジュール共通
- TACTL
- タイマAの制御レジスタ
Timer_A2モジュールのタイマA0の設定
- TACCTL0
- キャプチャ / 比較制御レジスタ0
- TACCR0
- キャプチャ / 比較レジスタ0
Timer_A2モジュールのタイマA1の設定
- TACCTL1
- キャプチャ / 比較制御レジスタ1
- TACCR1
- キャプチャ / 比較レジスタ1
上記のレジスタを適切に設定することにより、目的に応じたTimer_A2モジュールの動作を実現することができる。
Timer_A2モジュールは、PWM信号の生成、外部信号のエッジ検出とキャプチャ、一定間隔でのイベント処理等、様々な用途に使用することができる。
タイマA0 (TA0)
キャプチャ / 比較レジスタ0 (TACCR0) を使用する。
動作モード
- アップモード
- カウンタが
0
からTACCR0レジスタに設定した値まで増加して、TACCR0に設定した値に達するとカウンタが0
に戻る。
- カウンタが
- 連続モード
- カウンタが
0
からFFFFh
まで増加して、FFFFh
に達すると0
に戻る。
- カウンタが
- アップ / ダウンモード
- カウンタが
0
からTACCR0レジスタに設定した値まで増加して、TACCR0レジスタに設定した値に達するとTACCR0に設定した値から0
まで減少する。
- カウンタが
割り込み
- TACCR0と比較一致割り込み (CCIFG)
- カウンタオーバーフロー割り込み (TAIFG)
タイマA1 (TA1)
キャプチャ / 比較レジスタ0 (TACCR1) を使用する。
動作モード
- アップモード
- カウンタが
0
からTACCR1レジスタに設定した値まで増加して、TACCR1レジスタに設定したに達するとカウンタが0に戻る。
- カウンタが
- 連続モード
- カウンタが
0
からFFFFh
まで増加して、FFFFh
に達すると0
に戻る。
- カウンタが
- アップ / ダウンモード
- カウンタが
0
からTACCR1レジスタに設定した値まで増加して、TACCR1レジスタに設定した値に達するとTACCR1レジスタの値から0
まで減少する。
- カウンタが
割り込み
- TACCR1と比較一致割り込み (CCIFG)
- キャプチャ割り込み (CCIFG)
キャプチャモード (タイマA1のみ)
- 立ち上がりエッジ
- 入力信号の立ち上がりエッジでキャプチャ
- 立ち下がりエッジ
- 入力信号の立ち下がりエッジでキャプチャ
- 両エッジ
- 入力信号の両エッジでキャプチャ
タイマA0 / タイマA1共通
クロックソース
- TACLK
- 外部クロック信号を使用
- ACLK
- 補助クロック (32.768[kHz]) を使用
- SMCLK
- サブメインクロック (最大16[MHz]) を使用
- INCLK
- 内部クロック (DCOCLK) を使用
クロック分周
1
、2
、4
、8
分周が可能である。
出力モード
- 比較モード
- TACCRxとの比較一致に基づいて出力信号の状態を変更する。
- セットアップモード
- TACCRxとの比較一致でセット、カウンタの再スタートでリセットする。
- トグルモード
- TACCRxとの比較一致で出力信号をトグルする。
- リセットモード
- TACCRxとの比較一致でリセット、カウンタの再スタートでセットする。
Watchdog Timer+
MSP430G2553マイコンには、Watchdog Timer+と呼ばれる16ビットのタイマモジュールが搭載されている。
Watchdog Timer+は、システムの異常動作を検出して、リセットを行うために使用される。
また、インターバルタイマとしても使用可能である。
Watchdog Timer+の設定は、WDTCTLレジスタ (ウォッチドッグタイマ制御レジスタ) を使用して行う。
このレジスタを適切に設定することにより、目的に応じたWatchdog Timer+の動作を実現することができる。
ウォッチドッグ機能を使用する場合は、定期的にWDTCTLレジスタに特定の値を書き込んでウォッチドッグをリセットする必要がある。
インターバルタイマとして使用する場合は、WDTCTLレジスタを設定して割り込みを有効にすることにより、一定間隔でイベントを生成できる。
Watchdog Timer+は、システムの信頼性を向上させるための重要な機能であり、適切に設定・使用することが重要である。
ウォッチドッグ機能
- システムの異常動作を検出して、リセットを行う。
- ウォッチドッグタイマをリセットしないと、システムがリセットされる。
- ウォッチドッグ機能は、ソフトウェアの無限ループやハングアップから復旧するための安全装置である。
インターバルタイマ機能
- 一定間隔でイベントを生成するためのタイマとして使用可能である。
- 割り込み要求を生成して、特定のタスクを実行するトリガーとして使用する。
クロックソース
- ACLK
- 補助クロック (32.768[kHz]) を使用する。
- SMCLK
- サブメインクロック (最大16[MHz]) を使用する。
- VLOCLK
- 内部の低電力低周波クロック (約12[kHz]) を使用する。
- XCLK
- 外部クロック信号を使用する。
クロック分周
の分周が可能である。
1
、2
、4
、8
、16
、32
、64
ウォッチドッグ間隔
- クロックソースとクロック分周の設定により、ウォッチドッグ間隔を調整可能
- 最短で1msから最長で16秒までの間隔を設定可能
割り込み
- ウォッチドッグタイマの割り込み (WDTIFG) が生成可能である。
- 割り込みを使用して、特定のタスクを実行したり、システムの状態を監視したりすることが可能である。
ウォッチドッグ動作モード
- ウォッチドッグモード
- システムリセットを行うためのモード
- インターバルタイマモード
- 一定間隔で割り込みを生成するためのモード
サンプルコード
以下の例では、タイマA0 CCR0の比較一致割り込み (CCR0の割り込みサービスルーチン) により、LEDを1秒ごとにトグルしている。
タイマA0の設定を以下に示す。
- CCR0の比較一致割り込みを有効する。
- CCR0に を設定して、1秒間隔で割り込みが発生するように設定する。 (ACLKは、32.768[kHz])
- タイマA0のクロックソースをACLKに設定して、アップモードで動作させる。
#include <msp430.h>
#define LED_PIN BIT0 // LEDが接続されているピン (例: P1.0)
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
P1DIR |= LED_PIN; // LEDピンを出力に設定
// タイマA0の設定
TA0CCTL0 = CCIE; // CCR0の比較一致割り込みを有効化
TA0CCR0 = 32768 - 1; // 1秒間隔 (ACLK = 32.768[kHz])
TA0CTL = TASSEL_1 | MC_1; // ACLKを選択して、アップモード
// 低電力モード3 (LPM3), 割り込みを有効化
__bis_SR_register(LPM3_bits | GIE);
// 空の操作 (コンパイラの最適化を防ぐため)
__no_operation();
}
// タイマA0 CCR0の割り込みサービスルーチン
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
P1OUT ^= LED_PIN; // LEDの状態を切り替え
}
また、Timer_A3モジュールのタイマA0を使用する場合、Timer_A3モジュールの割り込みベクトル名はTIMER0_A1_VECTOR
であるため、割り込みベクトル名を変更する必要がある。
したがって、変更点は、割り込みサービスルーチンの宣言部分のみとなる。
#pragma vector=TIMER0_A1_VECTOR