如何触发MSP430的中断?

时间:2015-03-13 02:10:12

标签: msp430

我可以使用一些编程MSP430的帮助。这是课堂作业。我需要生成一个正弦波,我试图通过使用TimerA每1/50周期更改一个输出来实现。我使用以下设置:

int main(void) {
WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer
TACCTL0 = CCIE;
TACTL = TASSEL_2 + MC_1 + ID_3 + TAIE; //CLK(1MHz) /8
TACCR0 = 25; //25-100 Hz 250-10Hz

P1DIR   = 0x00;
P2DIR   = 0xFF; //DAC Ouptut
P3DIR   = 0x00; //ADC Input
P4DIR   = 0x00; //Digital Input
P3SEL  |= BIT6 + BIT7;

ADC10CTL0  = SREF_0 + ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
ADC10CTL1  = INCH_7 + ADC10DIV_3 + CONSEQ_1;
ADC10AE0  |= 0xC0; //Turn on ADC of 3.6 and 3.7
ADC10DTC1  = 2;

double amp = 0;
double freq = 0;
unsigned int ADC[2];

for(;;)
{
    wave_sel =P4IN;

    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);
    ADC10SA = (unsigned int)ADC;
    ADC10CTL0 |= ENC + ADC10SC;

    freq = (double)ADC[0]/1023;
    amp  = (double)ADC[1]/1023;

    TACCR0 = 25 + (freq*225);
    dout *= amp;
    dac_write(dout);
}
}

以及具有以下标题的中断:

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0(void)
{

但是当我运行程序时,我无法触发中断。我可以在调试器中看到计时器向上计数,并且一旦它按照应该的那样点击TACCR0就会重置,但是中断没有发生。我给了一个断点,它从来没有击中它。我是否宣布ISR错了?

2 个答案:

答案 0 :(得分:1)

确保启用了常规中断。要启用它们,请设置状态寄存器的GIE位。

常见的习惯用法是在初始化代码结束时启用低功耗模式和中断。为此,请将此行放在TACCR0 = 25之后:

 _BIS_SR(LPM0_bits + GIE);

答案 1 :(得分:1)

看起来您正在使用两个中断:一个用于定时器A0(CCIE)上的捕获比较以及定时器A溢出(TAIE)。如果您陷入ISR_trap,那可以解释为您没有定时器A溢出中断的处理程序。

如果您不打算使用计时器溢出,则需要更改此行:

TACTL = TASSEL_2 + MC_1 + ID_3 + TAIE; //CLK(1MHz) /8

到此:

TACTL = TASSEL_2 + MC_1 + ID_3; //CLK(1MHz) /8

如果您打算在定时器A溢出时使用第二个中断,那么每次进入中断时都需要确保读取TAIV寄存器。有多个源会导致该中断,该寄存器会告诉您哪一个引起了中断。但是,在您阅读之前不会将其清除(参见“MSP430 F2xx系列用户指南”中第12.2.6.2节TAIV,中断向量发生器)。