while(1)
{
Doucon_Long_Press(); 如果有长时间按按钮的话就标志Doucontrol_Flag=1
WDTCTL = WDTPW+WDTCNTCL+(WDTCTL&0x00ff);
if(Doucontrol_Flag == 1) //如果发送了双控主开关触摸标志
{ testtest =10;
P2OUT &= ~BUZ; //蜂鸣器响一声
delay_ms(1);
P2OUT |= BUZ;
WDTCTL = WDTPW+WDTCNTCL+(WDTCTL&0x00ff);
Turn_On_TA1(); //开启定时器,定时6S
while(Doucontrol_Flag)
{
WDTCTL = WDTPW+WDTCNTCL+(WDTCTL&0x00ff); //清看门狗 // if((ReceiveValue == 0xa1)||(ReceiveValue == 0xa0)||(ReceiveValue == 0xb1)||(ReceiveValue == 0xb0)||(ReceiveValue == 0xc1)||(ReceiveValue == 0xc0))
// {
// P2OUT &= ~BUZ; //蜂鸣器响一声,代表双控连接上
// delay_ms(1);
// P2OUT |= BUZ;
// ReceiveValue = 0;
// Doucontrol_Flag = 0; // Bein_Host_Doucontrol = 1; //可以进入双控模式的标志位
// }
}
void Init_TA1(void)
{
TA1CCR0 = 60000; //0.6s
TA1CCTL0 |= CCIE;
TA1CCTL0 &= ~(CAP+CCIFG);
}
void Turn_On_TA1(void)
{
TA1CTL |= TASSEL_2 + MC_1;
//_BIS_SR(GIE);
__bis_SR_register(GIE);
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{
static int countnum = 0;
// TA1CCTL0 &= ~CCIFG;
countnum++;
我的主体函数基本上就这样,有一个很严重的问题就是,定时器开启不了。
我在测试的时候,如果把while(Doucontrol_Flag)注释掉了,那么定时器是可以开启的,可以看到countnum在变化。
如果我加上while(Doucontrol_Flag),但是里面什么都不做,可以看到可以开启定时器countnum在变化。但是程序会复位,因为开启了开门狗了。
如果我加上了while(Doucontrol_Flag),在循环里再加上 WDTCTL = WDTPW+WDTCNTCL+(WDTCTL&0x00ff); 喂看门狗或者其他的程序,countnum就一直是0,貌似定时器启动不了,是什么原因?????
Lina Lian:
tesla nigus,
从你的描述看,好像是因为while(Doucontrol_Flag)的循环里增加了内容或者清看门狗,导致定时器启动不了。这里可能需要你做更多的实验,来定位一下问题。首先排除看门狗的影响—禁止看门狗,看看while(Doucontrol_Flag)中增加内容,timer可否正常运行。另外,你使用的是哪个芯片啊?你可以看看Errata上有没有相关问题。
tesla nigus:
回复 Lina Lian:
我使用的是MSP430G2553,用的是时钟TA1。
Lina Lian:
回复 tesla nigus:
我查看了Errata, Timer_A和WDT不存在你所描述的问题。先逐步定位问题吧,排除看门狗的影响—禁止看门狗,看看while(Doucontrol_Flag)中增加内容,timer可否正常运行。
tesla nigus:
回复 Lina Lian:
我又重新调试了一边,发现是开启了定时器,但是进不了中断函数。
tesla nigus:
回复 Lina Lian:
我的定时器进不了中断,定时器的TA1CCTL0是1049,发现CCIE为置1使能了,中断标志位CCIFG也置1了,但是就是进不了中断,用的是MSP430g2553单片机
Lina Lian:
回复 tesla nigus:
tesla nigus,请问是在while(Doucontrol_Flag)中增加内容后,才发生CCIFG置1, GIE bit 也为1,但是就是不进TIMER1_A0_VECTOR中断的现象吗? 不添加的时候,timer中断是否可以正常进入?请问不开看门狗是否还发生同样的情况?麻烦你详细测试一下并描述。我们需要定位一下问题,看看究竟是什么引起这种情况的发生。
Shi JianHua:
告诉你个简单的解决问题的办法,先用ti的例程基本不动,测试程序的运行情况,然后再改。多用仿真其仿真运行,都很快找的问踢的,你找不到问题就是仿真运行不熟练。