PIND 6 PIND 5 PIND 4 PIND 3 PIND 2 PIND 1
14. タイマ/カウンタ0とタイマ/カウンタ1の前置分周器
16.2. 概要
16. 16ビット タイマ/カウンタ (タイマ/カウンタ1)
70
ATmega8U2/16U2/32U2
16.2.1. 関係レジスタ
タイマ/カウンタ(TCNTn)、比較レジスタ(OCRnA,OCRnB,OCRnC)、捕獲レジスタ(ICRn)は全て16ビット レジスタです。16ビット レジスタをアクセスす るとき、特別な手順に従わなければなりません。これらの手順は71頁の「16ビット レジスタのアクセス」項で記述されます。タイマ/カウンタn制御 レジスタ(TCCRnA,TCCRnB,TCCRnC)は8ビット レジスタで、CPUアクセス制限はありません。割り込み要求信号はタイマ/カウンタn割り込み要 求レジスタ(TIFRn)で全て見えます。全ての割り込みはタイマ/カウンタn割り込み許可レジスタ(TIMSKn)で個別に遮蔽(禁止)されます。TIFRn とTIMSKnはこの図で示されません。
このタイマ/カウンタは内部的、前置分周器経由、またはTnピンの外部クロック元によってクロック駆動されます。クロック選択論理部はタイマ/カウン タが値を増加(または減少)するのに使用するクロック元とエッジを制御します。クロック元が選択されないとき、タイマ/カウンタは動きません。ク ロック選択論理部からの出力はタイマ/カウンタ クロック(
clk
Tn)として参照されます。2重緩衝化した比較レジスタ(OCRnA,OCRnB,OCRnC)はタイマ/カウンタ値と常に比較されます。この比較結果は比較出力(OCnA,OCnB, OCnC)ピンでPWMまたは可変周波数出力を生成するための波形生成器によって使用できます。75頁の「比較出力部」をご覧くださ い。この比較一致発生は比較出力割り込み要求の発生に使用できる比較一致割り込み要求フラグ(OCFnA,OCFnB,OCFnC)も設定 (1)します。
捕獲レジスタ(ICRn)は捕獲起動(ICPn)ピンまたはアナログ比較器出力(144頁の「アナログ比較器」参照)のどちらかの外部(エッジで起動され た)事象でタイマ/カウンタ値を捕獲(複写)できます。捕獲入力部は尖頭雑音を捕らえる機会を軽減するためにデジタル濾波部(雑音消去 器)を含みます。
TOP値または最大タイマ/カウンタ値は、いくつかの動作種別で、OCRnA、ICRn、または一群の固定値のどれかによって定義できます。
PWM動作でTOP値としてOCRnAを使用すると、OCRnAはPWM出力生成用に使用できません。けれどもこの場合、TOP値は動作中 に変更されるのをTOP値に許す2重緩衝化します。固定的なTOP値が必要とされる場合、ICRnが代わりに使用でき、PWM出力として 使用されるべきOCRnAを開放します。
16.2.2. 定義
次の定義は本資料を通じて広範囲に使用されます。
表16-1. 用語定義
用語 意味
BOTTOM カウンタが$0000に到達した時。
カウンタが$FFFF(65535)に到達した時。
MAX
カウンタがTOP値に到達した時(計数動作での最大値と等しくなった時)。TOP値は固定値($00FF,$01FF,$03FF)、
OCRnA値、ICRn値の何れか1つを指定できます。この指定は動作種別に依存します。
TOP
16.3. 16ビット レジスタのアクセス
TCNTn,OCRnA,OCRnB,OCRnC,ICRnは8ビット バス経由でAVR CPUによってアクセスできる16ビット レジスタです。この16ビット レジスタは2 回の読みまたは書き操作を使用してバイト アクセスされなければなりません。各々の16ビット タイマ/カウンタは16ビット アクセスの上位バイトの一 時保存用に1つの8ビット レジスタを持ちます。16ビット タイマ/カウンタ内の全ての16ビット レジスタ間で、この同じ一時レジスタが共用されます。
下位バイト アクセスが16ビット読み書き動作を起動します。16ビット レジスタの下位バイトがCPUによって書かれると、一時レジスタに保存した 上位バイトと書かれた下位バイトは同じクロック周期で両方が16ビット レジスタに複写されます。16ビット レジスタの下位バイトがCPUによって読 まれると、16ビット レジスタの上位バイトは下位バイトが読まれるのと同じクロック周期で一時レジスタに複写されます。
全ての16ビット アクセスが上位バイトに対して一時レジスタを使用する訳ではありません。OCRnA,OCRnB,OCRnCの16ビット レジスタ読み込 みは一時レジスタの使用に関係しません。
16ビット書き込みを行うために上位バイトは下位バイトに先立って書かれなければなりません。16ビット読み込みについては下位バイトが 上位バイトの前に読まれなければなりません。
次のコード例は割り込みが一時レジスタを更新しないことが前提の16ビット タイマ/カウンタ レジスタのアクセス法を示します。OCRnA,OCRnB, OCRnC,ICRnレジスタのアクセスに対して同じ原理が直接的に使用できます。C言語を使用するとき、コンパイラが16ビット アクセスを扱うことに 注意してください。
アセンブリ言語プログラム例
~ ;
;[16ビット($01FF)書き込み]
LDI R17,$01 ;$01FFの上位バイト値取得
LDI R16,$FF ;$01FFの下位バイト値取得
OUT TCNTnH,R17 ;上位バイト設定(一時レジスタ)
OUT TCNTnL,R16 ;下位バイト設定(一時レジスタ⇒上位バイト)
;[16ビット読み込み]
IN R16,TCNTnL ;下位バイト取得(上位バイト⇒一時レジスタ)
IN R17,TCNTnH ;上位バイト取得(一時レジスタ)
~ ;
C言語プログラム例 unsigned int i;
~ /* */
TCNTn = 0x1FF; /* 16ビット($01FF)書き込み */
i = TCNTn; /* 16ビット読み込み */
~ /* */
注: 5頁の「コード例」をご覧ください。
アセンブリ言語コード例はR17:R16レジスタ対にTCNTn値を戻します。
16ビット レジスタ アクセスが非分断操作であることに注意することが重要です。16ビット レジスタをアクセスする2命令間で割り込みが起き、割り 込みコードがその16ビット タイマ/カウンタ レジスタの同じ若しくは他の何れかをアクセスすることによって一時レジスタを更新する場合、割り込み 外のその後のアクセス結果は不正にされます。従って主コードと割り込みコードの両方が一時レジスタを更新するとき、主コードは16ビット アクセ ス中の割り込みを禁止しなければなりません。
72
ATmega8U2/16U2/32U2
次のコード例はTCNTnレジスタ内容の非分断読み込み法を示します。同じ原理を使用することにより、OCRnA,OCRnB,OCRnC,ICRnの どの読み込みも行えます。
アセンブリ言語プログラム例
RD_TCNTn: IN R18,SREG ;現全割り込み許可フラグ(I)を保存
CLI ;全割り込み禁止
IN R16,TCNTnL ;TCNTn下位バイト取得(上位バイト⇒一時レジスタ)
IN R17,TCNTnH ;TCNTn上位バイト取得(一時レジスタ)
OUT SREG,R18 ;全割り込み許可フラグ(I)を復帰
RET ;呼び出し元へ復帰
C言語プログラム例
unsigned int TIM16_Read_TCNTn(void) {
unsigned char sreg; /* ステータス レジスタ一時保存変数定義 */
unsigned int i; /* TCNTn読み出し変数定義 */
sreg = SREG; /* 現全割り込み許可フラグ(I)を保存 */
__disable_interrupt(); /* 全割り込み禁止 */
i = TCNTn; /* TCNTn値を取得 */
SREG = sreg; /* 全割り込み許可フラグ(I)を復帰 */
return i; /* TCNTn値で呼び出し元へ復帰 */
}
注: 5頁の「コード例」をご覧ください。
アセンブリ言語コード例はR17:R16レジスタ対にTCNTn値を戻します。
次のコード例はTCNTnレジスタ内容の非分断書き込み法を示します。同じ原理を使用することにより、OCRnA,OCRnB,OCRnC,ICRnの どの書き込みも行えます。
アセンブリ言語プログラム例
WR_TCNTn: IN R18,SREG ;現全割り込み許可フラグ(I)を保存
CLI ;全割り込み禁止
OUT TCNTnH,R17 ;TCNTn上位バイト設定(一時レジスタ)
OUT TCNTnL,R16 ;TCNTn下位バイト設定(一時レジスタ⇒上位バイト)
OUT SREG,R18 ;全割り込み許可フラグ(I)を復帰
RET ;呼び出し元へ復帰
C言語プログラム例
void TIM16_Write_TCNTn(unsigned int i) {
unsigned char sreg; /* ステータス レジスタ一時保存変数定義 */
unsigned int i; /* TCNTn書き込み変数定義 */
sreg = SREG; /* 現全割り込み許可フラグ(I)を保存 */
__disable_interrupt(); /* 全割り込み禁止 */
TCNTn = i; /* TCNTn値を設定 */
SREG = sreg; /* 全割り込み許可フラグ(I)を復帰 */
}
注: 5頁の「コード例」をご覧ください。
アセンブリ言語コード例はR17:R16レジスタ対がTCNTnへ書かれるべき値を含むことが必要です。
16.3.1. 上位バイト一時レジスタの再使用
書かれる全レジスタについて上位バイトが同じ複数16ビット レジスタ書き込みなら、上位バイトは1度書かれることだけが必要です。けれども 直前で記述した非分断操作の同じ規則が、この場合にも適用されることに注意してください。