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();
}
波形チャート