This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于MSP430G2553的定时器计算

Other Parts Discussed in Thread: TCA6416A

void timer_init()

{

TACCR0 = 520;

TACTL |= TASSEL_2+ID_3+MC_1;

TACCTL0 |= CCIE;

}

void main()

{

WDTCTL = WDTPW+WDTHOLD;

BCSCTL1 = CALBC1_1MHZ;

DCOCTL = CALDCO_1MHZ;

TCA6416A_Init();

HT1621_init();

timer_init();

while(1)

{

display();

}

}

#pragma vector = TIMER0_A0_VECTOR __interrupt void Timer_A(void)

{

static int i=0;

i++;

switch(i)

{

case 20:sec++,i=0;break;

default: break;

}

switch(sec)

{

case 60:min++,sec=0;break;

default: break;

}

switch(min)

{

case 60:min=0,hou++;break;

default: break;

}

switch(hou)

{

case 24:hou=0;break;

default: break;

}

}

以上是我自己写的程序,第一段是定时器的初始化,第二段是主程序。在第一段中设置了CCR0的初值,设置了时钟源,设置了分频,设置了技术模式。在第二段主程序中设置了系统时钟。 因为我是打算用430的配件那块显示屏来设置一个时钟,类似于23-59-58这种,但是现在碰到的问题是:定时器的静态变量计时和实际计时相差很大,就是程序中我觉得是已经算好了,但是实际中这个秒位是不正常加数的。 下面是我的计算时间的方法,各位大神帮我看下有没有错误,请帮小弟多多指正。

BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;这两句就是数控振荡器选择了1MHZ的频率,那么主时钟就是1MHZ,TACTL |= TASSEL_2+ID_3+MC_1;这句话中ID_3为8分频,那么频率就是1/8=0.125MHZ,那么12*(1/(0.125 * 1000 000))=96us,那么50ms/96us=520,那么CCR0的初值就为520,但是实际显示秒位计数过快。