我可以使用一些编程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错了?
答案 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,中断向量发生器)。