MSP430 TIMERA1中断

时间:2016-07-18 04:31:13

标签: c timer msp430

快速提问。如何使用此特定中断设置10秒和1分钟的中断?我尝试使用下面的计数器,但它不起作用。正如该程序所示,它会中断1秒钟。我通常会在这样的时候去找教授,但是,他在日本...... .... .... ....

#include <msp430.h>

#define RedLED BIT0
#define GreenLED BIT6

#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)



unsigned int i = 0;

void main(void)
{

WDTCTL = WDTPW|WDTHOLD;


 P1DIR = RedLED|GreenLED;
 P1OUT = RedLED|GreenLED;

 TACTL = TASSEL_2|ID_3|MC_3|TAIE;

 TACCR0 = 62500;



 _enable_interrupts();

 LPM1;
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void){

if (int i == 10)
{
    switch(TAIV)
         {
          case 0x02: break;
          case 0x04: break;
          case 0x0A: RedLEDToggle|GreenLEDToggle;;
          break;
         }
}
else
{
i++;
}
}

1 个答案:

答案 0 :(得分:1)

要实现10秒的中断间隔,您需要将输入分频器应用于定时器。如果没有外围设备支持,则无法实现1分钟(但您可以使用软件计数器实现)。

问题是msp430微控制器有16位寄存器,不能保持大于65535的数值。使用32768 Hz的低频振荡器(通常情况下 - 你不提供任何有关的信息。系统的硬件时钟源,如果它们的频率不同,请注意除非应用输入分频器,否则寄存器每2秒溢出一次。 MSP430x2xxx系列MCU上的输入分频器的最大值为8,因此将来不可能将硬件定时器设置为8 * 2 = 16秒以上。有关详细信息,请参阅MSP430x2xxx family user's guide

此代码在10秒后调用中断:

#include <msp430.h>

#define RedLED BIT0
#define GreenLED BIT6

#define RedLEDToggle (P1OUT ^= RedLED)
#define GreenLEDToggle (P1OUT ^= GreenLED)

// 10 seconds, assuming 32768 Hz ACLK source and divider 8
#define TIMER_PERIOD (10u * (32768 / 8))

void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;

    P1DIR = RedLED | GreenLED;
    P1OUT = RedLED | GreenLED;

    // reset timer A config (not strictly needed)
    TACTL = TACLR;

    // ACLK as clock source, divider 8, continuous mode, interrupt enabled
    TACTL = TASSEL_1 | ID_3 | MC_2 | TAIE;

    // set the period
    TACCR1 = TIMER_PERIOD;

    // enable capture/compare interrupts for CCR1
    TACCTL1 = CCIE;

    _enable_interrupts();

    LPM1;
}

#pragma vector=TIMER0_A1_VECTOR

__interrupt void Timer_A(void)
{
    switch (TAIV) {
    case TA0IV_TACCR1:
        // CCR1 interrupt
        RedLEDToggle;
        GreenLEDToggle;
        // set the time of the next interrupt
        TACCR1 += TIMER_PERIOD;
        break;
    }
}