tianyiran02 发表于 2014-1-15 23:25:12

求求帮忙看下这个程序啊,timerA的问题。完全无法理解啊。

本来想做一个一秒翻转一次的LED,写出来根本不是这样一回事啊。用的CCR0 50000,up-down mode. 全局变量i 累加来定时。但是每次进中断i 能加1,但是出中断之后i 又清零了啊。怎么回事啊。脑袋都要爆炸了啊。

#include <msp430g2553.h>

unsigned char i=0;

void main()
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
if((CALBC1_1MHZ==0xff)||(CALDCO_1MHZ==0xff))//切换DCO频率         
    while(1);
else
{
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1= CALBC1_1MHZ;
}

    TACTL = TASSEL_2 + TAIE + MC_3;                      //SMCLK
CCR0 = 50000;
CCTL0 = CCIE;
    P1DIR |= BIT0;
    _EINT();
    LPM0;
    while(1);
}


#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
i++;
   if(i>=10)
{
    i=0;
    P1OUT ^= BIT0;
}
_NOP();
}

helloshi 发表于 2014-1-16 09:52:44

volatile unsigned char i=0;

tianyiran02 发表于 2014-1-16 18:14:33

helloshi 发表于 2014-1-16 09:52
volatile unsigned char i=0;

我使用了volatile 之后还是一样。传不出去。。。我又把程序改成这样了,更直观。结果就是跑不到最下面去。

#include <msp430g2553.h>

unsigned char i;

void main()
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
if((CALBC1_1MHZ==0xff)||(CALDCO_1MHZ==0xff))//切换DCO频率         
    while(1);
else
{
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1= CALBC1_1MHZ;
}

i=0;
TACTL = TASSEL_2 + TAIE + MC_1;                      //SMCLK
CCR0 = 50000;
CCTL0 = CCIE;
P1DIR |= BIT0;
_EINT();
//LPM0;
while(i!=20);
while(1);
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void ctimer_A0(void)
{
i++;
}

他根本就没法跑到最后。debug 下载之后点GO, 等个几十秒stop了看还是 i=0。在定时器里面设一个break, 然后点go, 就发现i 会累加,然后再突然某次随机的go之后就又清零了(一般不会累加过10,go几次就清零了)。神啊。我这是在和谁玩啊。

tianyiran02 发表于 2014-1-16 18:29:38

我用指针来传也传不出去。这种感觉好像是学了10年的1+1突然不等于2了啊。。。我整个人都要崩溃了。。。

tianyiran02 发表于 2014-1-19 07:32:31

问题找到了,但是不知道为什么会产生这个问题。在CCTL中打开了CCIE,在TACTL中打开了TAIE. 两个中断都打开之后程序就复位了。

dalarang 发表于 2014-1-20 10:51:09

我记得CCTL0中的中断是单独一个中断服务函数。
故两个都开的话,复位了肯定是少一个中断服务函数的入口。

tianyiran02 发表于 2014-1-21 04:24:51

dalarang 发表于 2014-1-20 10:51
我记得CCTL0中的中断是单独一个中断服务函数。
故两个都开的话,复位了肯定是少一个中断服务函数的入口。 ...

是的,一个向量是TIMER0-A0,一个向量是TIMER0-A1

activeleo 发表于 2014-1-25 22:30:41

如果没有猜错的话,你的系统在一直复位中...........

tianyiran02 发表于 2014-1-28 02:08:10

activeleo 发表于 2014-1-25 22:30
如果没有猜错的话,你的系统在一直复位中...........

是的。。。

activeleo 发表于 2014-1-28 09:19:36

仿真......好好分析下!

zspzwal 发表于 2014-2-11 14:23:50

你用连续计数模式打开了溢出中断又没有写对应的中断服务函数,溢出中断发生时装载中断向量,由于没有写对应的中断服务函数,中断向量指向0,程序就会跳到启动位置,发生复位,msp430使能的中断必须写中断函数,哪怕是空函数
页: [1]
查看完整版本: 求求帮忙看下这个程序啊,timerA的问题。完全无法理解啊。