定时器问题求助
//例程描述:利用定时器定时功能,实现P1.0方波输出。
#include
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗WDT,不使用内部看门狗定时器。
P1DIR |= 0x01; //设置P1.0口方向为输出。
CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。
CCR0 = 50000; //捕获/比较控制寄存器CCR0初值为5000。
TACTL = TASSEL_2 + MC_2; //设置定时器A控制寄存器TACTL,使时钟源选择为SMCLK辅助时钟。
_BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断
}
//定时器A 中断服务程序区
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; //P1.0取反输出
CCR0 += 50000; //重新载入CCR0捕获/比较数据寄存器数据
}
为什么在中断服务程序里给CCR0重新赋值不用CCR0 = 50000;而用CCR0 += 50000; ?????求解释!!
重新赋值 的话 周期就不对了?脉冲宽度就不固定了
MC_2时TAR运行在连续增模式,增加到0FFFFH再到0,然后重新开始,TAIE中断没有开,
这个中断服务程序写的是 CCR0中断服务程序,即 当TAR增加到 CCR0的值时, CCR0寄存器产生的中断,如果此时,CCR0增加50000,则 再过上 50000个SMCLK, TAR又和CCR0 EQU了,所以又会产生一个CCR0的中断, 在CCR0中断服务里不断的给 CCR0加50000, 就能每5000个SMCLK 产生一个CCR0中断, 如果直接给 CCR0赋值50000,(此时TAR已经从0增加到了50000),那么TAR要等到从50000增到0ffffh 到0,再 从0到50000,才能产生 下一个 CCR0中断, 此时距上一个中断 已经有 (0ffffh - 50000 ) + (50000-0)+1(从0ffffh 到 0 的那一下 ) 个SMCLK了!
怎么看不到,难道要回复一下才可以看到吗?那我就回复一下吧,
这不就是例程吗,楼主就解释了一下语句的意思,具体的还是要看DATASHEET和一些资料的!
回复 4楼 lyk027 的帖子
5楼正解,多看资料