CTC:比較匹配時(shí)清零計(jì)數(shù)器模式,。當(dāng)計(jì)數(shù)器TCNT0的數(shù)值等于比較寄存器OCR0時(shí)計(jì)數(shù)器TCNT0自動(dòng)清零。OCR0定義了計(jì)數(shù)器的最大(TOP)值,這個(gè)模式使得用戶可以很容易地控制比較匹配輸出的頻率。T/C0的比較輸出腳為OC0(PB3),PB口的第三腳,在此模式下可以在OC0上輸出PWM控制外部設(shè)備。
例如:在OC0腳上輸出20HZ的方波信號(hào),方波的周期時(shí)間為T=1/20HZ=0.05秒=50ms,半個(gè)周期為25ms,系統(tǒng)采用8MHZ晶振,1024分頻,時(shí)鐘計(jì)數(shù)頻率為8000000/1024=7812.5HZ,每個(gè)時(shí)鐘脈沖時(shí)間為1/7812.5=0.128ms, 定時(shí)25ms的計(jì)數(shù)值為25ms/0.128ms=195,將195賦值為T/C0的比較寄存器OCR0,啟動(dòng)定時(shí)器后,TCNT0從0開始計(jì)數(shù),當(dāng)計(jì)數(shù)到195時(shí),產(chǎn)生比較中斷,在OC0腳上輸出20HZ的占空比為50%的方波信號(hào)。
操作過程如下:
一、I/O管腳初始化:PB3(OC0)腳設(shè)為輸出,DDRB|=(1< 二、使能全局中斷:SREG=0X80; 三、T/C0比較中斷允許:TIMSK|=(1< 四、TCCR0配置:分頻系數(shù)為1024, TCCR0|=(1< CTC模式設(shè)置, TCCR0|=(1< 比較匹配時(shí)OC0取反 TCCR0|=(1< 五、計(jì)數(shù)器付初值: TCNT0=0; OCR0=195; //付初值后定時(shí)器開始工作 //函數(shù)功能:在PB3上輸出20HZ的方波,并在PD7上產(chǎn)生周期2秒的周期信號(hào)。(代碼來自輕松玩轉(zhuǎn)avr單片機(jī)c語言cd) #include
char Counter = 0; // 計(jì)數(shù)變量清零
void port_init()
{
DDRB|=(1<
void timer0_init()
{
SREG = 0x80; //使能全局中斷
TIMSK= (1<< OCIE0); //T/C0比較匹配中斷允許
TCCR0=(1<
TCNT0 = 0; //定時(shí)初值設(shè)置,
OCR0 = 195; //比較匹配寄存器初值
}
void main()
{
port_init();
timer0_init();
while(1);
}
#pragma interrupt_handler timer0_COMP:20
void timer0_COMP(void)
{
TCNT0 = 0; //定時(shí)初值設(shè)置,
OCR0 = 195; //比較匹配寄存器初值
if(++Counter >= 40) //定時(shí)時(shí)間到1S嗎?定時(shí)中斷溢出40次為1S
{
PORTD^=(1<
}
}