• 検索結果がありません。

誤り保護部

ドキュメント内 mega16U4.pdf (ページ 103-106)

PINF 6 PINF 5 PINF 4 - - PINF 1

12. タイマ/カウンタ0、タイマ/カウンタ1、タイマ/カウンタ3の前置分周器

15.10. 誤り保護部

タイマ/カウンタ4は外部事象が起動される場合にPWM出力ピンを禁止にできる誤り保護部を併設します。出来事を指示する外部信号は 外部割り込みINT0経由、または代わりにアナログ比較器部経由で印加できます。誤り保護部は図15-20.で示される構成図によって表 されます。誤り保護部の直接の部分でない構成図の要素は青枠(訳注:原文は灰色背景)で示されます。

図15-20. 誤り保護部構成図

FPF4 (割り込み要求)

TC4H(8ビット)

TCNT4 (10/8ビット タイマ/カウンタ) TCNT4(8ビット) +

-エッジ検出器 雑音消去器

INT0

ACO

FPAC4 FPNC4 FPES4

アナログ比較器 FPEN4

誤り保護動作は誤り保護許可(FPEN4)ビットと外部割り込み(INT0)ピン、または代わりにアナログ比較器出力で論理レベル(事象)の変化に よって許可され、この変化がエッジ検出器の設定に通知して誤り保護が起動されます。誤り保護が起動されると、比較出力選択(COM 4x1.0)ビットが解除(00)され、比較出力はPWM出力ピンから切断されてPORTxレジスタ ビットがPWM出力ピンに接続されます。誤り保護許 可(FPEN4)はCOM4xビットが解除(00)されるのと同じシステム クロックで自動的に解除(0)されます。誤り保護割り込み許可(FPIE4)が設定 (1)なら、誤り保護割り込みが生成され、FPEN4ビットが解除(0)されます。代わりにFPEN4はタイマ/カウンタが誤り保護動作へ移行されてし まった時を了解するのにソフトウェアによってポーリングすることもできます。

15.10.1. 誤り保護起動元

誤り保護部に対する主な起動元は外部割り込み(INT0)ピンです。代わりにアナログ比較器出力が誤り保護部に対する起動元として使 用できます。アナログ比較器はタイマ/カウンタ4制御レジスタD(TCCR4D)の誤り保護アナログ比較器(FPAC4)ビットの設定(1)によって選択され ます。起動元変更が誤り保護動作を起動し得ることに注意してください。従って起動元変更、エッジ検出器設定、または誤り保護許可 後に誤り保護割り込み要求フラグ(FPF4)を解除(0)することが推奨されます。

外部割り込み(INT0)ピンとアナログ比較器出力(ACO)入力はTnピン(55頁の図12-1.参照)についてと同じ技法を使用して採取されます。

エッジ検出器も全く同じです。けれども雑音消去が許可されると、付加論理回路がエッジ検出器の前に挿入され、そして遅延を4システム クロック周期増やします。誤り保護動作はINT0ピンのポートを制御することによってソフトウェアでも起動できます。

15.10.2. 雑音消去器

雑音消去器は簡単なデジタル濾波器機構を使用することによって雑音耐性を改善します。雑音消去器の入力は4採取に渡って監視 され、エッジ検出器によって使用される方向転換となる出力を変更するには4回全てが同じでなければなりません。

雑音消去器はタイマ/カウンタ4制御レジスタD(TCCR4D)の誤り保護雑音消去許可(FPNC4)ビットの設定(1)によって許可されます。許可した 時に雑音消去器は入力に印加した変更から4システム クロック周期の追加遅延をもたらします。雑音消去器はシステム クロックを使用し、従っ て前置分周器によって影響を及ぼされません。

15.11. 10ビット レジスタのアクセス

10ビット値がTCNT4とOCR4A/B/C/Dレジスタに書かれる場合、その10ビット レジスタは2回の読みまたは書き操作を使用して8ビット バス経 由でAVR CPUによってアクセスできます。10ビット レジスタは10ビット アクセスの上位2ビットの一時保存用に共通2ビットのタイマ/カウンタ1上位バイ ト(TC4H)レジスタを持ちます。全ての10ビット レジスタ間で、この同じTC4Hレジスタが共用されます。下位バイト アクセスが10ビット読み書き動 作を起動します。10ビット レジスタの下位バイトがCPUによって書かれると、TC4Hレジスタに格納した上位バイトと書かれた下位バイトは同じ クロック周期で10ビット レジスタに両方が複写されます。10ビット レジスタの下位バイトがCPUによって読まれると、10ビット レジスタの上位バイト は下位バイトが読まれるのと同じクロック周期でTC4Hレジスタに複写されます。

10ビット書き込みを行うために上位バイトは下位バイトが書かれるのに先立ってTC4Hレジスタへ書かれなければなりません。10ビット読み 込みについては下位バイトが上位バイトに先立って読まれなければなりません。

次のコード例は割り込みがTC4Hレジスタを更新しないことが前提の10ビット タイマ/カウンタ レジスタのアクセス法を示します。OCR4A/B/C/Dレ ジスタのアクセスに対して同じ原理が直接的に使用できます。

アセンブリ言語プログラム例

~ ;

;[10ビット($1FF)書き込み]

LDI R17,$01 ;$1FFの上位バイト値取得

LDI R16,$FF ;$1FFの下位バイト値取得

OUT TCnH,R17 ;上位バイト設定(TCnHレジスタ)

OUT TCNTn,R16 ;下位バイト設定(TCnH⇒上位バイト)

;[10ビット読み込み]

IN R16,TCNTn ;下位バイト取得(上位バイト⇒一時レジスタ)

IN R17,TCnH ;上位バイト取得(TCnHレジスタ)

~ ;

C言語プログラム例 unsigned int i;

~ /* */

/* [10ビット($1FF)書き込み] */

TCnH = 0x01; /* 上位バイト設定(TCnHレジスタ) */

TCNTn = 0xFF; /* 下位バイト設定(TCnHレジスタ⇒上位バイト) */

/* [10ビット読み込み] */

i = TCNTn; /* 下位バイト取得(上位バイト⇒TCnHレジスタ) */

i |= ((unsigned int)TCnH<<8); /* 上位バイト取得(TCnHレジスタ)合成 */

~ /* */

注: 5頁の「コード例」をご覧ください。

アセンブリ言語コード例はR17:R16レジスタ対にTCNT4値を戻します。

10ビット レジスタ アクセスが非分断操作であるのに注意することが重要です。10ビット レジスタをアクセスする2命令間で割り込みが起き、割り 込みコードがその10ビット タイマ/カウンタ レジスタの同じ若しくは他の何れかをアクセスすることによってTC4Hレジスタを更新する場合、割り込 み外のその後のアクセス結果は不正にされます。従って主コードと割り込みコードの両方がTC4Hレジスタを更新する時に主コードは10ビット アクセス中の割り込みを禁止しなければなりません。

次のコード例はTCNT4レジスタ内容の非分断読み込み法を示します。同じ原理を使用することにより、OCR4A/B/C/Dのどんな読み込 みも行えます。

アセンブリ言語プログラム例

RD_TCNTn: IN R18,SREG ;現全割り込み許可フラグ(I)を保存

CLI ;全割り込み禁止

IN R16,TCNTn ;TCNTn下位バイト取得(上位バイト⇒TCnHレジスタ)

IN R17,TCnH ;TCNTn上位バイト取得(TCnHレジスタ)

OUT SREG,R18 ;全割り込み許可フラグ(I)を復帰

RET ;呼び出し元へ復帰

C言語プログラム例

unsigned int TIM10_Read_TCNTn(void) {

unsigned char sreg; /* ステータス レジスタ一時保存変数定義 */

unsigned int i; /* TCNTn読み出し変数定義 */

sreg = SREG; /* 現全割り込み許可フラグ(I)を保存 */

_CLI(); /* 全割り込み禁止 */

i = TCNTn; /* 下位バイト取得(上位バイト⇒TCnHレジスタ) */

i |= ((unsigned int)TCnH<<8); /* 上位バイト取得(TCnHレジスタ)合成 */

SREG = sreg; /* 全割り込み許可フラグ(I)を復帰 */

return i; /* TCNTn値で呼び出し元へ復帰 */

}

注: 5頁の「コード例」をご覧ください。

アセンブリ言語コード例はR17:R16レジスタ対にTCNT4値を戻します。

次のコード例はTCNT4レジスタ内容の非分断書き込み法を示します。同じ原理を使用することにより、OCR4A/B/C/Dのどんな書き込 みも行えます。

アセンブリ言語プログラム例

WR_TCNTn: IN R18,SREG ;現全割り込み許可フラグ(I)を保存

CLI ;全割り込み禁止

OUT TCnH,R17 ;TCNTn上位バイト設定(TCnHレジスタ)

OUT TCNTn,R16 ;TCNTn下位バイト設定(TCnHレジスタ⇒上位バイト)

OUT SREG,R18 ;全割り込み許可フラグ(I)を復帰

RET ;呼び出し元へ復帰

C言語プログラム例

void TIM10_Write_TCNTn(unsigned int i) {

unsigned char sreg; /* ステータス レジスタ一時保存変数定義 */

unsigned int i; /* TCNTn書き込み変数定義 */

sreg = SREG; /* 現全割り込み許可フラグ(I)を保存 */

_CLI(); /* 全割り込み禁止 */

TCnH = (i>>8); /* 上位バイト設定(TCnHレジスタ) */

TCNTn = (unsigned char)i; /* 下位バイト設定(TCnHレジスタ⇒上位バイト) */

SREG = sreg; /* 全割り込み許可フラグ(I)を復帰 */

}

注: 5頁の「コード例」をご覧ください。

アセンブリ言語コード例はR17:R16レジスタ対がTCNT4へ書かれるべき値を含むことが必要です。

15.11.1. 上位バイト一時レジスタの再使用

書かれる全レジスタについて上位バイトが同じ複数10ビット レジスタ書き込みなら、上位バイトは1度書かれることだけが必要です。けれども 直前で記述した非分断操作の同じ規則が、この場合にも適用されることに注意してください。

ドキュメント内 mega16U4.pdf (ページ 103-106)