请教一个关于430定时器的问题,高手进来看看
源程序如下:#include"msp430x42x.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
P1DIR |= BIT3;
TACTL |= TASSEL_1 + MC_2+TAIE;//选择ACLK,连续模式
TAR=65536-3277;
_EINT();
LPM3;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TACCR1_ISR(void) // 计至TACCR0中断
{
TAR=65536-3277;
P1OUT ^= BIT3;//灯闪烁
}
想利用定时器A的溢出中断定时闪烁的,但是程序下进去灯一直亮,不知道怎么回事,加上TACCTL0|=CCIE;灯就可以闪了。按理说主计数器可以溢出中断的,跟捕获比较没关系的。期待高手解答 中断程序内要清掉中断标志位,否则中断退出后又马上进入。
TACTL &= ~TAIFG;
TAIFG 不会自动清零。 响应中断后可以自动清除的 回复【2楼】cike
-----------------------------------------------------------------------
MSP430只有CCR0的中断(它的优先级最高)可以自动清除,TAR计数溢出的中断需要手动或者访问TAIV时可以被清除。
你用下面程序试试,F2013的(手头没有F42x),定时100us左右。
#include <msp430x20x3.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt
TAR=65536-100;
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
TAR=65536-100;
switch( TAIV )
{
case2: break; // CCR1 not used
case4: break; // CCR2 not used
case 10: P1OUT ^= 0x01;// overflow
break;
}
} 【3楼】 wanpujame 说得对,只要在中断内访问一次TAIV,或用软件清掉TAIFG,都能达到目的。你看到灯一直亮,是因为不断的执行中断服务程序,灯闪的频率太高。 恩,调试通了,终于弄懂了,谢谢各位大牛了。。。。 mark; 这么复杂啊 比51复杂多了 mark,学习中 多源中断,必须清标志 对, 我原来 以为加个 CCIE.... 原来是中断标志位的问题... 明白了 赶紧试试 正发愁这个东西呢!我说用示波器看波形怎么总是不对!
页:
[1]