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.

关闭定时中断使能后还在计时吗

Other Parts Discussed in Thread: MSP430G2553

先说我用的单片机是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
    }

  • 你在中断程序里面把控制寄存器置0,就是模式选为停止模式,计数器清0,但是退出程序后又关闭中断,因此还是3种都有可能。

    我觉的可以不用关闭中断,往TACCR0写0就可以停止定时,当然为保证下次从0开始定时,计数器清0。下次只要往TACCR0写数就开启定时,你觉的可以吗

    或者停止模式+计数器清0来停止定时可不可行。

    我试过只关闭中断,但是下次开启定中断时,第一次定时不准。

  •  同意你的观点,

    定时器用完之后,关掉的操作:停止定时器(停止模式)+ TAR寄存器清零 ;如果下次还要定时,重新设定 TACCR0(如果设定时间与上一次不一致) + 开启定时器。

    只关闭中断,只是不响应中断程序而已,定时器其实还是在工作的。

    我关掉中断是因为下面可能还有别的模块初始化语句,建议在初始化代码之后,while(1)之前开总中断。

  • 你的问题其实是几个:

    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秒。暂停模式行不通,不知道你的情况是什么样的,能测试一下吗?