打印
[国产单片机]

求助:STC 12C5A60S2.测试出定时器真实的运行时间

[复制链接]
3335|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jrcsh|  楼主 | 2013-5-22 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从STC 89C52 上移植到 STC12C5A60S2

本来也是简单的事,

但是 12C 的定时器 上的记时时间和理论上的或弟三方提供的都不对

按 老妖说的 12C 1T     1Mhz 下 定时器每一脉冲因当为 1us

弟三方给出现  12C 1T  1Mhz 下   是 1.5us


写了代码

定时器 0  用 16位的方式     跑约一分钟   得出来的数值

定时器0  用 8位自装的方式 跑约 一分钟 得出来的数值

都和 上边的理论值出入比较大 ,为此俺就迷茫了~~~~ 看看 12C的PDF上也没有准确的说到这个定时器怎么样算的

看了他的示例代码是 完全按 1T 的理论方法来算的

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

/* define constants */
#define FOSC 18432000L
#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode

#ifdef MODE1T
#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
#endif

/* define SFR */
sfr AUXR = 0x8e;                    //Auxiliary register
sbit TEST_LED = P0^0;               //work LED, flash once per second

/* define variables */
WORD count;                         //1000 times counter

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
    if (count-- == 0)               //1ms * 1000 -> 1s
    {
        count = 1000;               //reset counter
        TEST_LED = ! TEST_LED;      //work LED flash
    }
}

//-----------------------------------------------

/* main program */
void main()
{
#ifdef MODE1T
    AUXR = 0x80;                    //timer0 work in 1T mode
#endif
    TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
    count = 0;                      //initial counter

    while (1);                      //loop
}


   


#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode





求提点   这 STC 12C  的定时器到底是多少的   , 我都怀疑他自己的代码有没验证过

评分
参与人数 1威望 +1 收起 理由
ttl_web + 1 赞一个!

相关帖子

沙发
wh6ic| | 2013-5-23 18:03 | 只看该作者
STC的片子至少用六年了,定时没出过这种问题。
你的中断里面没做余数补偿,定时中断比较频繁的时候累积误差就比较可观了。
简单的办法是选择定时常数低八位只设为0x00(选择离散的定时时间),这样中断处理时基本不用考虑余数补偿。否则需要处理余数。

使用特权

评论回复
板凳
jrcsh|  楼主 | 2013-5-23 20:46 | 只看该作者
wh6ic 发表于 2013-5-23 18:03
STC的片子至少用六年了,定时没出过这种问题。
你的中断里面没做余数补偿,定时中断比较频繁的时候累积误差 ...

  认真看~~~这是STC 提供的代码~~~ 不是我我写的

使用特权

评论回复
地板
wh6ic| | 2013-5-24 14:33 | 只看该作者
他没有说是精确的1mS定时中断! 这种方法给出来的是大概的1毫秒。你现在1分钟数出来了几次LED闪动?
另外看你写的,你的CPU好像没有工作在老妖设定的18.432MHz?!

使用特权

评论回复
5
jrcsh|  楼主 | 2013-5-25 09:59 | 只看该作者
wh6ic 发表于 2013-5-24 14:33
他没有说是精确的1mS定时中断! 这种方法给出来的是大概的1毫秒。你现在1分钟数出来了几次LED闪动?
另外看 ...

好搞笑~~~~ 都是你自己单方面想象。。。。。。。   

我没说你就能想象出这么多来。。。。。。


注意到红色的代码没!

使用特权

评论回复
6
wh6ic| | 2013-5-25 11:47 | 只看该作者
  老妖的PDF中写得很明白“如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1”,不知道你为什么说“12C的PDF上也没有准确的说到这个定时器怎么样算的”。
  我昨天专门做过,老妖的代码16Bit模式误差应该不到1%,五分钟只差1秒!我用的是11.0592MHz晶振
  

使用特权

评论回复
7
jrcsh|  楼主 | 2013-5-25 15:40 | 只看该作者
wh6ic 发表于 2013-5-25 11:47
老妖的PDF中写得很明白“如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1 ...

12C的PDF上也没有准确的说到这个定时器怎么样算的


你可以自动无视上下句?



使用特权

评论回复
8
naofei67| | 2013-5-25 22:37 | 只看该作者
i 服了 u.
LZ是学什么专业的?
STC的这个破片子出来好几年了,怎么别人没发现这个问题哩?

使用特权

评论回复
9
jrcsh|  楼主 | 2013-5-26 02:16 | 只看该作者
naofei67 发表于 2013-5-25 22:37
i 服了 u.
LZ是学什么专业的?
STC的这个破片子出来好几年了,怎么别人没发现这个问题哩? ...

就是断断续续不断传出哪有问题这有问题, 而我这次是要比较精确的时间计算, 于是检验了他的定时器的时间

粗糙的结果就是徘徊在 1T~1.5T 的结果 ,  


目前是使用 他的 软件件延时1S  读定时器时间出来,结果是1T , 但这样还是有漏洞的如果软件延时是1.5T 我读出来的数结果还是1.5T 的只是我认了1T的1S 所以会以为 定时器也是1T

使用特权

评论回复
10
jrcsh|  楼主 | 2013-5-26 02:17 | 只看该作者
  他哪客服和老妖一个得性~~~~~   

使用特权

评论回复
11
jrcsh|  楼主 | 2013-5-26 02:18 | 只看该作者
还是去找个 AT51 或 STC98C52 来作时间源,给 12C信号计时,看看结果是多少。

使用特权

评论回复
12
jrcsh|  楼主 | 2013-7-14 01:20 | 只看该作者
持续测试一些代码~~~~~  真的好晕阿

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以上以下纯属瞎扯,概不承认!!!!! 感谢  应试教育 培养了我的基础    感谢自己  没吧应试教作为各种借口

228

主题

2350

帖子

18

粉丝