先说我用的单片机是MSP430g2553。进入定时中断程序后,定时器还在计时,因此要让定时器关闭。我的问题是如何真正关闭定时器呢?因为这里有好几个设置,关闭使能位,ccr0清0,停止模式,标志位清零,计数器清零。我只要定时一次,在需要的时候再定时,不要连续定时,所以我在定时中断程序里关闭了使能位。请问定时器还在定时吗,仅仅是不产生中断?
简单点就是如何在下次定时开始的时候从0开始定时呢?,在上次定时中断程序里该关掉什么呢?(这里的上次下次是我自己控制的,不是连续的定时)
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
先说我用的单片机是MSP430g2553。进入定时中断程序后,定时器还在计时,因此要让定时器关闭。我的问题是如何真正关闭定时器呢?因为这里有好几个设置,关闭使能位,ccr0清0,停止模式,标志位清零,计数器清零。我只要定时一次,在需要的时候再定时,不要连续定时,所以我在定时中断程序里关闭了使能位。请问定时器还在定时吗,仅仅是不产生中断?
简单点就是如何在下次定时开始的时候从0开始定时呢?,在上次定时中断程序里该关掉什么呢?(这里的上次下次是我自己控制的,不是连续的定时)
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
xxxxx;
__enable_interrupt(); // Enable interrupts.
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 + MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
__disable_interrupt();
xxxxxxx;
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupts
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}
你的问题其实是几个:
1. 如何让定时器停止?
在TACTL控制寄存器中MCx位用来定义定时器的工作模式,MCx=00b时,定时器暂停工作。
2. 如何清零定时器的计数值?
在TACTL控制器的TACLR位用来清零定时器的计数值TAR,该为置1时会清零TAR的值
3. 如何让每次定时从0开始,定时中断后不让定时器继续计时?
在每次定时前清零TAR(置位TACLR), 在中断中设置MCx=0,下次需要时再设置具体的工作模式.
我试了一下,发现暂停模式进不了中断。main函数里写:
CCR0 = 32768;//4分频后定时4秒,时钟为32.768khz
TACTL = TASSEL_1 + ID_2 + MC_0;//Aclk时钟源,4分频,暂停模式
CCTL0 = CCIE;//定时中断开启
_EINT(); //开总中断
按键中断程序里写
TACTL = MC_1;//连续模式
定时中断程序里写
TACTL = MC_0 + TACLR;//暂停模式,计数器清零
我按完键之后。等待,一直进不了中断程序。后来我把程序改为在main函数里写
CCR0 = 0;//清零
TACTL = TASSEL_1 + ID_2 + MC_1;//Aclk时钟源,4分频,连续模式
CCTL0 = CCIE;//定时中断开启
_EINT(); //开总中断
按键中断程序里写
CCR0 = 32768;//4分频后定时4秒,时钟为32.768khz
定时中断程序里写
CCR0 = 0;//清零
发现可以了,每次当我按键的时候,都可以从0开始计时4秒。暂停模式行不通,不知道你的情况是什么样的,能测试一下吗?
我试了一下,发现暂停模式进不了中断。main函数里写:
CCR0 = 32768;//4分频后定时4秒,时钟为32.768khz
TACTL = TASSEL_1 + ID_2 + MC_0;//Aclk时钟源,4分频,暂停模式
CCTL0 = CCIE;//定时中断开启
_EINT(); //开总中断
按键中断程序里写
TACTL = MC_1;//连续模式
定时中断程序里写
TACTL = MC_0 + TACLR;//暂停模式,计数器清零
我按完键之后。等待,一直进不了中断程序。后来我把程序改为在main函数里写
CCR0 = 0;//清零
TACTL = TASSEL_1 + ID_2 + MC_1;//Aclk时钟源,4分频,连续模式
CCTL0 = CCIE;//定时中断开启
_EINT(); //开总中断
按键中断程序里写
CCR0 = 32768;//4分频后定时4秒,时钟为32.768khz
定时中断程序里写
CCR0 = 0;//清零
发现可以了,每次当我按键的时候,都可以从0开始计时4秒。暂停模式行不通,不知道你的情况是什么样的,能测试一下吗?