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