3843|8

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于MSP430G2553的定时计算 [复制链接]

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,但是实际显示秒位计数过快。

最新回复

加油,,,,,,,  详情 回复 发表于 2015-12-6 14:04
 
点赞 关注

回复
举报

366

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
DCO是内部的RC振荡器,不会非常精准,有误差是正常的,你微调一下CCR0吧
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
飞翔荷兰人号 发表于 2015-11-8 21:12
DCO是内部的RC振荡器,不会非常精准,有误差是正常的,你微调一下CCR0吧

好吧、、、我想说的是我这样的计算方法对不对、
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

4
 
12*(1/(0.125 * 1000 000))=96us
12什么意思?
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

5
 
楼上批评的有理,果然人心浮躁了。
这几天在顾着剁手,虽然好几次打开楼主的帖子,都没能静下心来仔细算算频率。

楼上正解,MSP430的机器周期就是外部时钟源的周期,不需要再分频,外设周期也是一样,
这与51是有区别的,51的晶振频率是12M,实际机器周期只有1μs,对晶振频率分频照成的。

其实很多时候我更喜欢用时间而不是频率来计算这个数值,1M的时钟源,那么MSP430的机器周期就是1μs,TimerA对其8分频,那么TimerA的时钟间隙就是8μs。于是只要计算50ms里面有多少个8μs就好了。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

6
 
wangfuchong 发表于 2015-11-9 21:12
12*(1/(0.125 * 1000 000))=96us
12什么意思?

这个我是参照51单片机的定时器计算的方法计算的,郭天祥著的51单片机C语言教程第73页,书上说要计算机器周期就要知道系统时间频率也就是单片机晶振频率如果单片机时钟频率为11.0592MHZ,那么机器周期为12*(1/11059200)≈1.09us。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

7
 
qiushenghua 发表于 2015-11-10 02:30
楼上批评的有理,果然人心浮躁了。
这几天在顾着剁手,虽然好几次打开楼主的帖子,都没能静下心来仔细算算 ...

那所以说CCR0=(50 000)/8=6250,那么在中断当中static int i 的 i 的值等于 20 的时候就是走过了 1 秒咯?

点评

粗略看可以这么理解。希望精确计时还得用32768Hz的LFXT1  详情 回复 发表于 2015-11-10 09:39
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

8
 
阿祖_电子 发表于 2015-11-10 08:54
那所以说CCR0=(50 000)/8=6250,那么在中断当中static int i 的 i 的值等于 20 的时候就是走过了 1 秒 ...

粗略看可以这么理解。希望精确计时还得用32768Hz的LFXT1
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

9
 
加油,,,,,,,
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表