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

[复制链接]
2434|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秒那么多哦

那是有点大
ayb_ice 发表于 2018-4-27 10:25 | 显示全部楼层
20/(10*60)=0.033
 楼主| 风林书屋 发表于 2018-4-27 10:44 | 显示全部楼层

我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间大概就是这么多。datasheet上面说晶振有正负百分之1误差
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吗,我看不出来是怎么来的
 楼主| 风林书屋 发表于 2018-4-27 11:51 | 显示全部楼层
ayb_ice 发表于 2018-4-27 11:00
if(TMR0 >= 0XEA)         // 查询是否到达时间

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

不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样
lyjian 发表于 2018-4-27 21:08 | 显示全部楼层
风林书屋 发表于 2018-4-27 10:44
我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间 ...

要达到1%精度是要把工厂的校准数据写到OSCCAL寄存器的,没看到你的软件哪里有写校准数据。
m564522634 发表于 2018-4-28 09:49 | 显示全部楼层
风林书屋 发表于 2018-4-27 11:51
不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样 ...

晶振的问题吧
m564522634 发表于 2018-4-28 09:53 | 显示全部楼层

你拿 这种精度的定时器,做这么长的定时积累的误差当然大了。 不行的话外置一个RTC 芯片不过估计成本不行,你看下能提高晶振的精度不。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部