2436|10

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Timer_A 延遲時間問題 [复制链接]

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秒左右...
請各位幫忙謝謝!

最新回复

我找不到对应的user's guide  详情 回复 发表于 2013-12-22 18:42

点评

楼主,你如果定时1s中何必这么复杂。  详情 回复 发表于 2013-12-22 18:36
你是怎么确定你这17秒的?  详情 回复 发表于 2013-12-18 12:44
 
点赞 关注

回复
举报

396

帖子

5

TA的资源

纯净的硅(中级)

沙发
 

回复 楼主back2001 的帖子

你是怎么确定你这17秒的?

点评

用碼表計時出來的...  详情 回复 发表于 2013-12-18 13:23
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发jqh_111 的帖子

用碼表計時出來的...

点评

不是,你没理解我的意思。我的意思是,你这17秒真的对应了CCR0计数到1000这个事件吗?你有记过CCR0从0计数到1000这个过程的时间吗?或者你把你完整的代码贴上来看看。。:handshake  详情 回复 发表于 2013-12-18 13:52
 
 
 

回复

396

帖子

5

TA的资源

纯净的硅(中级)

4
 

回复 板凳back2001 的帖子

不是,你没理解我的意思。我的意思是,你这17秒真的对应了CCR0计数到1000这个事件吗?你有记过CCR0从0计数到1000这个过程的时间吗?或者你把你完整的代码贴上来看看。。

点评

#include void TimerInit(int countCycle); void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF) // If  详情 回复 发表于 2013-12-18 14:18
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼jqh_111 的帖子

#include  

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才會轉態一次

点评

这段程序是不能完成用CCR0定时1000/32768这么长时间的功能。这段程序只是让TAR自由计数,从1计到65535,周而复始,用系统程序中while语句检测TAR的值,当TAR等于1000时才退出循环。在C语言中,while(TAR!=countCycl  详情 回复 发表于 2013-12-18 19:36
 
 
 

回复

396

帖子

5

TA的资源

纯净的硅(中级)

6
 

回复 5楼back2001 的帖子

这段程序是不能完成用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定时功能。应该把它的功能好好看看,明显写出这样的程序是没有好好看它的用户指导书。

点评

謝謝jqh_111~相當清楚!!! 已解決問題  详情 回复 发表于 2013-12-30 16:17
版主彪悍犀利的解读醍醐灌顶。  详情 回复 发表于 2013-12-22 18:36
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

139

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼jqh_111 的帖子

版主彪悍犀利的解读醍醐灌顶。
 
 
 

回复

139

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 楼主back2001 的帖子

楼主,你如果定时1s中何必这么复杂。
 
 
 

回复

139

帖子

0

TA的资源

一粒金砂(高级)

9
 
什么型号的CPU?
 
 
 

回复

139

帖子

0

TA的资源

一粒金砂(高级)

10
 
我找不到对应的user's guide
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

11
 
jqh_111 发表于 2013-12-18 19:36
这段程序是不能完成用CCR0定时1000/32768这么长时间的功能。这段程序只是让TAR自由计数,从1计到65535,周 ...

謝謝jqh_111~相當清楚!!!
已解決問題
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表