打印

PIC12F508同一个程序,换一片单片机定时时间不一样什么问题。

[复制链接]
2235|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风林书屋|  楼主 | 2018-4-26 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是不是哪里配置不对。程序应该额米有问题吧。
#include<pic.h>
__CONFIG(0X00A);
#define uchar unsigned char
#define uint unsigned int
#define LED GP2
#define Key GP1
volatile uchar Flag,Flag1,Flag2;
volatile uint Count=0,sum=0;
void Delay_ms(uchar a)
{
        uint i,j;
        for(i=0;i<a;i++)
                for(j=0;j<1000;j++);
}

void Register_Init()     // 配置定时器
{
        TMR0 = 0X00;         // 4m ,64分频,T0 =255-50ms/((4/4*64)us/1000)
}
void GPIO_Port_Init()    //配置I/O口
{
        TRIS =0X02 ;  //GP2S 输出,GP1输入;
}
void main()
{
        Delay_ms(5000);
        LED = 1;
    GPIO_Port_Init();
        OPTION = 0X16;       
        Register_Init();
    Flag1 = 0;
        Flag = 0;
        while(1)
        {   
                if(Key==0)
                     {
                                   Flag = 1;
                            }
            if(TMR0 >= 0XEA)         // 查询是否到达时间
                {
                        OPTION = 0X16;
                        TMR0 = 0X00;         // 定时器初值,定时10MS
                        if(Flag ==1)
                        {                                  
                                switch (Flag1)
                                {
                                        case 0: LED = 0;Count++;
                                                        if(Count==18930)
                                                        {
                                                                Count=0;
                                                                Flag1 = 1;
                                                                LED = 1;                       
                                                        } break;
                                        case 1: Count++;
                                                        if(Count==469)
                                                        {
                                                                Count=0;
                                                                Flag = 0;
                                                                Flag1 = 0;
                                                        } break;

                                default :  break;
                                }                                        
                          }                                                                                
             }
    }       
}
沙发
Cjy_JDxy| | 2018-4-26 17:07 | 只看该作者
如果差别不大,那就是正常的。

使用特权

评论回复
板凳
风林书屋|  楼主 | 2018-4-27 09:12 | 只看该作者
Cjy_JDxy 发表于 2018-4-26 17:07
如果差别不大,那就是正常的。

10分钟差别有20秒那么多哦

使用特权

评论回复
地板
Cjy_JDxy| | 2018-4-27 09:21 | 只看该作者
风林书屋 发表于 2018-4-27 09:12
10分钟差别有20秒那么多哦

那是有点大

使用特权

评论回复
5
ayb_ice| | 2018-4-27 10:25 | 只看该作者
20/(10*60)=0.033

使用特权

评论回复
6
风林书屋|  楼主 | 2018-4-27 10:44 | 只看该作者

我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间大概就是这么多。datasheet上面说晶振有正负百分之1误差

使用特权

评论回复
7
ayb_ice| | 2018-4-27 11:00 | 只看该作者
风林书屋 发表于 2018-4-27 10:44
我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间 ...

if(TMR0 >= 0XEA)         // 查询是否到达时间

这个是10MS吗,我看不出来是怎么来的

使用特权

评论回复
8
风林书屋|  楼主 | 2018-4-27 11:51 | 只看该作者
ayb_ice 发表于 2018-4-27 11:00
if(TMR0 >= 0XEA)         // 查询是否到达时间

这个是10MS吗,我看不出来是怎么来的 ...

不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样

使用特权

评论回复
9
lyjian| | 2018-4-27 21:08 | 只看该作者
风林书屋 发表于 2018-4-27 10:44
我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间 ...

要达到1%精度是要把工厂的校准数据写到OSCCAL寄存器的,没看到你的软件哪里有写校准数据。

使用特权

评论回复
10
m564522634| | 2018-4-28 09:49 | 只看该作者
风林书屋 发表于 2018-4-27 11:51
不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样 ...

晶振的问题吧

使用特权

评论回复
11
m564522634| | 2018-4-28 09:53 | 只看该作者

你拿 这种精度的定时器,做这么长的定时积累的误差当然大了。 不行的话外置一个RTC 芯片不过估计成本不行,你看下能提高晶振的精度不。

使用特权

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

本版积分规则

3

主题

26

帖子

0

粉丝