PIND 6 PIND 5 PIND 4 PIND 3 PIND 2 PIND 1
20.5. 関係レジスタ
タイマ/カウンタ(TCNT1)、比較レジスタ(OCR1A,OCR1B)、捕獲レジスタ(ICR1)は全て16ビット レジスタです。16ビット レジスタをアクセスするとき、特 別な手順に従わなければなりません。これらの手順は「16ビット レジスタのアクセス」項で記述されます。タイマ/カウンタ1制御レジスタ(TCCR1A, TCCR1B,TCCR1C)は8ビット レジスタで、CPUアクセスの制限はありません。割り込み要求信号はタイマ/カウンタ1割り込み要求レジスタ(TIFR 1)で全て見えます。全ての割り込みはタイマ/カウンタ1割り込み許可レジスタ(TIMSK1)で個別に遮蔽(禁止)されます。TIFR1とTIMSK1はこ の図で示されません。
このタイマ/カウンタは内部的、前置分周器経由、またはT1ピンの外部クロック元によってクロック駆動されます。クロック選択論理部はタイマ/カウン タが値を増加(または減少)するのに使用するクロック元とエッジを制御します。クロック元が選択されないとき、タイマ/カウンタは動きません。ク ロック選択論理部からの出力はタイマ/カウンタ クロック(
clk
T1)として参照されます。2重緩衝化した比較レジスタ(OCR1A,OCR1B)はタイマ/カウンタ値と常に比較されます。この比較結果は比較出力(OC1A,OC1B)ピンで PWMまたは可変周波数出力を生成するための波形生成器によって使用できます。「比較出力部」をご覧ください。この比較一致発 生は比較出力割り込み要求の発生に使用できる比較一致割り込み要求フラグ(OCF1A,OCF1B)も設定(1)します。
捕獲レジスタ(ICR1)は捕獲起動(ICP1)ピンまたはアナログ比較器出力のどちらかの外部(エッジで起動された)事象でタイマ/カウンタ値を捕獲 (複写)できます。捕獲入力部は尖頭雑音を捕らえる機会を軽減するためにデジタル濾波器(雑音消去器)を含みます。
TOP値または最大タイマ/カウンタ値は、いくつかの動作種別で、OCR1A、ICR1、または一群の固定値のどれかによって定義できます。
PWM動作でTOP値としてOCR1Aを使用すると、OCR1AはPWM出力生成用に使用できません。けれどもこの場合、TOP値は動作中 に変更されるのをTOP値に許す2重緩衝化します。固定的なTOP値が必要とされる場合、ICR1が代わりに使用でき、PWM出力として 使用されるべきOCR1Aを開放します。
20.6. 16ビット レジスタのアクセス
TCNT1,OCR1A,OCR1B,ICR1は8ビット バス経由でAVR CPUによってアクセスできる16ビット レジスタです。この16ビット レジスタは2回の読み または書き操作を使用してバイト的にアクセスされなければなりません。16ビット タイマ/カウンタは16ビット アクセスの上位バイトの一時保存用に1 つの8ビットTEMPレジスタを持ちます。16ビット タイマ/カウンタ内の全ての16ビット レジスタ間で、この同じ一時レジスタが共用されます。下位バイ ト アクセスが16ビット読み書き動作を起動します。16ビット レジスタの下位バイトがCPUによって書かれると、現在TEMPに保存された上位バ イトと書かれつつある下位バイトは同じクロック周期で両方が16ビット レジスタに複写されます。16ビット レジスタの下位バイトがCPUによって読 まれると、16ビット レジスタの上位バイトは下位バイトが読まれるのと同じクロック周期でTEMPレジスタに複写され、その後に(上位バイトが)読ま れなければなりません。
注: 16ビット書き込みを実行するには下位バイトに先立って上位バイトが書かれなければなりません。16ビット読み込みについては上位バ イトの前に下位バイトが読まれなければなりません。
全ての16ビット アクセスが上位バイトに対して一時レジスタを使用する訳ではありません。OCR1AとOCR1Bの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ビット読み込み */
~ /* */
アセンブリ言語コード例はR17:R16レジスタ対にTCNT1値を戻します。
非分断読み込み
16ビット レジスタ アクセスが非分断操作であることに注意することが重要です。16ビット レジスタをアクセスする2命令間で割り込みが起き、割り 込みコードがその16ビット タイマ/カウンタ レジスタの同じ若しくは他の何れかをアクセスすることによって一時レジスタを更新する場合、割り込み 外のその後のアクセス結果は不正にされます。従って主コードと割り込みコードの両方が一時レジスタを更新するとき、主コードは16ビット アクセ ス中の割り込みを禁止しなければなりません。
次のコード例は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値で呼び出し元へ復帰 */
}
アセンブリ言語コード例は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)を復帰 */
}
アセンブリ言語コード例はR17:R16レジスタ対がTCNT1へ書かれるべき値を含むことが必要です。
関連リンク 14頁の「コード例について」
20.6.1. 上位バイト一時レジスタの再使用
書かれる全レジスタに関して上位バイトが同じ、複数16ビット レジスタ書き込みなら、上位バイトは1度書かれることだけが必要です。けれど も、直前で記述した非分断操作の同じ規則が、この場合にも適用されます。