void TA1_Init()
{
P2DIR &=~ BIT0; //CAPTURE
P2SEL |= BIT0;
TA1CCTL1 = CAP + CCIS_0 + CM_1 + SCS+CCIE; // Capture CCIxA, pos edge, interrupt enable.
TA1CTL = TASSEL_2 + MC_1 + ID__1; // SMCLK, up mode.
}
void TA0_Init(void)
{
TA0CCTL0 &=~ CCIE; //比较功能0(定时计数)开启CCIFG位中断
TA0CTL = TACLR | TASSEL_2 | MC_1 | ID__1;
//计数器清零,选择SMCLK作为时钟(16MHz),选用増计数模式
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
//_disable_interrupts();
TA1CCTL1 &= ~CCIFG;
folg=~folg;
if(folg)
{
if(yx==0)
fb_L;
//TA1CCTL1 &= ~CM_2;
TA1CCTL1 |= CM_1; //捕获方式切换
}
else
{
if(yx==0)
fb_H;
//TA1CCTL1 &= ~CM_1;
TA1CCTL1 |= CM_2; //捕获方式切换
}
if(yx!=0)
{
if(yx<179)
{
TA0CCR0=time[yx]; //
//TA0R=0;
//TA0CTL|=TAIE;
TA0CCTL0 |= CCIE; //TR0=1;
}
else
{
TA0CCR0=time[180];
//TA0R=0;
//TA0CTL|=TAIE;
TA0CCTL0 |= CCIE; //TR0=1;
}
}
//_enable_interrupts();
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TimerA0(void)
{
//_disable_interrupts();
//TA0CTL &= ~TAIFG;
TA0CCTL0 &=~ CCIFG;
TA0CCTL0 &=~ CCIE;
if(folg)
fb_L;
else
fb_H;
//_enable_interrupts();
}
/********************************************************/
我想用定时器1捕获方波,当捕获到上升沿或下降延时开定时器0延时输出。起到输出方波与被采集的方波存在相位差。但是现在经过测试,发现并不能达到效果。捕获中断进去后,定时器的CCR0能被赋值,然后定时器0中断也能进去,但是延时输出的效果没有。就像没有定时一样。TA0CCR0的赋值由time[]这个数组提供,不论给TA0CCR0赋多大的值,延时效果都是一样的。
原先我的定时器0和1都配的SMCLK(8MHz),延时后能出来波形但是不管定是多少时间波形都是一样的。听了你的意见将定时器1的改为ACLCK(32k),定时器0不变。结果波形出现了抖动还是没有延时效果。
然后我将两个定时器的时钟对掉,情况还是差不多没有延时效果。并且延时时间稍长,发现I/O口输出的波形不是1KHz(我设置的波形是1KHz)
这是我的工程。用的LAUNCHPAD 430F5529 。
问题已经解决,是在重新打开CCR0中断前(TA0CCTL0 |= CCIE;) 没有清除中断标志位。原因是定时器0在程序运行时一直在计数,只要达到CCRO,中断标志就会置位。