Atmega2560ベースのチュートリアル(6) - 8ビットタイマ(TIM0 / 2)CTCモード

Atmega2560ベースのチュートリアル(6) - 8ビットタイマ(TIM0 / 2)CTCモード

、CTCの8ビットタイマは、通常5つのレジスタ、TCNTx、OCRxA、TCCRxAをとるように、2つの8ビットタイマ、タイマ0、タイマ2の合計Atmega2560 TCCRxB、TIMSKx(x = 0,2)、タイマ0と2は基本的に同じ構造であり、以下では、例えばタイマ0であります

1.作品

CTCモードは固定デューティ・サイクル、可変周波数モードです。値が再びTCNTxからインクリメントしながらのみOCRxAによってCTCモードOCRxAに増分だけ周波数タイマの結果は、タイマ値が上方にインクリメントされる照合値、、として、コンペアマッチフラグので、設定されています一致比較フラグがあるので、サイクルを往復、割り込み一致添加することができます。以下の式でCTCモードOCRxAプッシュ

発振器周波数ヘルツ、変換処理部、fclk_I / Oの周波数発振器周波数、Nは、周波数分割、fOCnx対象周波数であります

2.TCNTxレジスタ

カウントの開始点、および始点リロード

3.OCRxAレジスタ

エンドポイントを比較

4.TCCRxAレジスタ

主な意思決定、どのような行動のためのタイマーマッチングピン、およびCTCモードタイマー

次のように配置された詳細:

5.TCCRxBレジスタ

の数を分割する主要な意思決定

次のように配置された詳細:

6.TIMSKxレジスタ

メインは、割り込み有効

7.具体例

0にタイマー、例えば、あなたが友人タイマー2を必要とするには、タイマーを使用するためにどのレジスタに交換することができます2


/*
 * 定时器0,工作在CTC模式,PB7输出,匹配中断产生时PA0翻转
 */ 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>

float a=800;                           //800hz
int i=0;
int n=0;

int main(void)
{
	a=F_CPU/(a*2*256)-1;
	i=a;
	cli();
	DDRB|=_BV(DDB7);
	PORTB|=_BV(PB7);
	DDRA|=_BV(DDA0);
	PORTA|=_BV(PA0);
    OCR0A=i;
	TCCR0A |=_BV(WGM01)|_BV(COM0A0);      //CTC模式,产生匹配时,输出引脚PB7翻转
	TCCR0B |=_BV(CS02);                   //256分频
	TIMSK0 |=_BV(OCIE0A);                 //匹配中断使能
	sei();
	while (1)
	{
	}
}
ISR(TIMER0_COMPA_vect){
	cli();
	n++;
	if (n==2)
	{
		n=0;
		PORTA^=(1<<PA0);
	}
	sei();
}

波形チャート

公開された12元の記事 ウォンの賞賛2 ビュー4150

おすすめ

転載: blog.csdn.net/jiantoushi/article/details/104081846
おすすめ