Timer_A 延遲時間問題

2019-03-24 11:57发布

void TimerInit(void)
{
  BCSCTL1 = CALBC1_8MHZ;
  DCOCTL =  CALDCO_8MHZ;
  CCR0 = 1000;
  TACTL = TASSEL_1 + MC_1 + TACLR;    // ACLK, upmode  
  while (TAR != countCycle);
}

請問我Timer_A選用ACLK作為時鐘源,以上述函式來說
執行到1000次所需的時間是:
1000*(1/32768)嘛?
但我實際計時卻是17秒左右...
請各位幫忙謝謝! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
jqh_111
1楼-- · 2019-03-24 18:55
你是怎么确定你这17秒的?
back2001
2楼-- · 2019-03-24 23:52
< :TI_MSP430_内容页_SA7 --> 用碼表計時出來的...
jqh_111
3楼-- · 2019-03-25 01:48
 精彩回答 2  元偷偷看……
back2001
4楼-- · 2019-03-25 06:12
#include  <msp430x24x.h>

void TimerInit(int countCycle);

void main(void)
{   
  WDTCTL = WDTPW + WDTHOLD;                           // Stop WDT
  if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)     // If calibration constants erased                                 
    while(1);                                         // do not load, trap CPU!!         
  
  BCSCTL1 = CALBC1_8MHZ;                              
  DCOCTL = CALDCO_8MHZ;
  P1DIR |= 0x01;   
  while (1)
  {
    TimerInit(1000);
    P1OUT ^= 0x01;  
  }
}

void TimerInit(int countCycle)
{
  CCR0 = countCycle;
  TACTL = TASSEL_1 + MC_1 + TACLR;    // ACLK, upmode  
  while (TAR != countCycle);
}

我有觀看TAR的值有到1000,LED才會轉態一次
jqh_111
5楼-- · 2019-03-25 08:20
这段程序是不能完成用CCR0定时1000/32768这么长时间的功能。这段程序只是让TAR自由计数,从1计到65535,周而复始,用系统程序中while语句检测TAR的值,当TAR等于1000时才退出循环。在C语言中,while(TAR!=countCycle);这句代码的汇编有好几句,在判断TAR值是不是等于1000时决定退出while循环还得看运气。这么给你说吧,你的定时器运行频率时32KHZ,而系统CPU运行频率是8MHZ,时钟是不同步的。举个例子,别以为while只是一句,在汇编里有好几句,每一句可能需要几个时钟周期(TAR加1只要一个时钟周期),假设有4句,判断TAR=1000是第4句。1、当TAR等于999时,执行到第一句,TAR等于1001时,执行到第二句,显然执行第四句时,TAR早已大于1001了。2、运气好,TAT等于1000时,刚好在执行第四句,满足条件退出循环。但此时可能TAR已经周而复始好几遍了。这好几遍可能就是你的17秒,相信如果一直运行,就可能不是17秒了
解决办法,你要实现CCR0定时功能。应该把它的功能好好看看,明显写出这样的程序是没有好好看它的用户指导书。
小右派
6楼-- · 2019-03-25 08:38
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章