msp430 单片机定时器输出模式的问题,求大神解答!!!!!

程序如下:
#include <msp430x14x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1SEL |= 0x0E; // P1.1 - P1.4 option select
P1DIR |= 0x0F; // P1.0 - P1.4 outputs
CCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled
CCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
CCTL2 = OUTMOD_4 + CCIE; // CCR2 toggle, interrupt enabled
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, Contmode, int enabled

_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
CCR0 += 200; // Add Offset to CCR0
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch( TAIV )
{
case 2: CCR1 += 1000; // Add Offset to CCR1
break;
case 4: CCR2 += 10000; // Add Offset to CCR2
break;
case 10: P1OUT ^= 0x01; // Timer_A3 overflow
break;
}
}

想问的是P1.1 P1.2 P1.3为什么会分别输出2000Hz,400Hz,40Hz的方波?(这个希望有非常详细解答)
还有在定时器中断服务函数中为什么要给CCRx增加偏移量,这样的话CCRx的值就变了(这个我用Jtag调试过的),这样做有什么用处呢?
这个程序的问题困惑了我很久了,希望各位大神能够回答我的问题,小弟万分感激!!!

首先来说说ccr0为什么中断里面要加200,因为定时器工作在连续计数模式,也就是从0-65535.为了产生2kHZ的方波(具体是不是2k我没算你自己算算吧应该是SMCLK/400)必须每隔200个周期P1.1翻转一次也就是CCR0输出翻转.至于P1.2,P1.3和p1.1都是大同小异,其实P1.0应该还有一个比40HZ更低的方波你不信看看因为有这一条
case 10: P1OUT ^= 0x01; // Timer_A3 overflow
楼主其实你还有很多定时器的知识不懂多看手册吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-19
CCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled
CCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
CCTL2 = OUTMOD_4 + CCIE; // CCR2 toggle, interrupt enabled

看看这个就明白了,P1.1 P1.2 P1.3分别是CCR0、CCR1、CCR2的比较输出,定时器工作在比较模式下,和51不同的,好好看看手册。

CCR0是单一中断源使用的是TIMERA0_VECTOR,CCR1和CCR2是复用中断源使用的是TIMERA1_VECTOR

至于那个方波周期就是时间决定的,我就不帮你算了,很好懂的。

不明白的在hi我
相似回答