12521843 发表于 2010-7-1 12:06:19

关于定时器A的一个简单定时

程序如下:
#include <msp430x11x1.h>

int main( void )
{
// Stop watchdog timer to prevent time out reset
//unsigned int i;
WDTCTL = WDTPW + WDTHOLD;
P1DIR=0x01;
TACTL=TASSEL_1+MC_2+TAIE;
_BIS_SR(LPM3_bits+GIE);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_a(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:P1OUT^=0x01;
break;

}

}
程序很简单,但是无法得到P1OUT ^= 0x01;
请问里面TAIV是怎么变化的,哪位明白人愿意花时间帮弟理解下,
小弟打心底赞扬回复的耿直兄!

ringan865 发表于 2010-7-1 13:32:20

_BIS_SR(LPM3_bits+GIE);这句应该是把定时器的时钟给禁止了,所以定时器压根儿就没工作

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;         
P1DIR |= 0x01;                        
TACTL = TASSEL_2 + MC_2 + TAIE;         

_BIS_SR(LPM0_bits + GIE);         
}

12521843 发表于 2010-7-1 18:07:26

回复【1楼】ringan865
-----------------------------------------------------------------------

谢谢,你说的这个我下来试试
下面是调试好的程序:
#include <msp430x11x1.h>

int main( void )
{
// Stop watchdog timer to prevent time out reset
//unsigned int i;
WDTCTL = WDTPW + WDTHOLD;
P1DIR=0x01;
CCTL0 = CCIE;
TACTL=TASSEL_2+MC_2+TAIE;
_BIS_SR(LPM4_bits+GIE);
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_a(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:P1OUT^=0x01;
break;
TASSEL_2,这个的意思是用SMCLK,
如果用TASSEL_1,则用的是ACLK,
其中ACLK需要的是LFXT1,这个晶振需要外接
#pragma vector=TIMERA0_VECTOR
之前我用的是TIMERA1,这个要区别一下
现在我还没搞明白TAIV是怎么变化的,希望谁来解释一下!

20050710212 发表于 2010-7-2 14:11:48

您好
楼主的程序我直接复制就可以用
TACTL=TASSEL_1+MC_2+TAIE
上面这个语句过后 定时器A就启动了
TAR开始计数,直到0xFFFF 然后溢出 发生中断
此时TAIV=0x0A 转到 CASE 10 P1.0就翻转了
周期是T=65536*(1/32K)*2=4S
我大概测了一下 一切正常

weiweidounai 发表于 2010-7-21 16:47:14

满16位定时器后产生中断溢出,进入中断。2、4、10都是它们的中断向量值,因为只使用了定时器溢出,故只有在中断向量值等于10的时候才会发生取反!应该是这样吧···

ccmj4708 发表于 2011-6-9 15:54:51

记号

Lincy 发表于 2012-7-19 20:29:03

TAIV用来确定中断请求的中断源,TAIV为10的时候,定时器溢出,TAIFG1置位。

xuxiarong114 发表于 2012-7-19 20:42:15

认真看下手册!你的程序中断错啦;只能是第三种情况才能取反!
页: [1]
查看完整版本: 关于定时器A的一个简单定时