打印

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

[复制链接]
466|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renyaq|  楼主 | 2020-2-9 12:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC12F508同一个程序,换一片单片机定时时间不一样什么问题。

使用特权

评论回复
沙发
zhuhuis| | 2020-2-9 12:33 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
renyaq|  楼主 | 2020-2-9 12:36 | 只看该作者
是不是哪里配置不对。程序应该额米有问题吧。
#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;
                                }                                         
                          }                                                                                
             }
    }        
}

使用特权

评论回复
地板
zhaoxqi| | 2020-2-9 12:39 | 只看该作者
如果差别不大,那就是正常的。

使用特权

评论回复
5
renyaq|  楼主 | 2020-2-9 12:42 | 只看该作者
10分钟差别有20秒那么多哦

使用特权

评论回复
6
chenho| | 2020-2-9 12:48 | 只看该作者
那是有点大

使用特权

评论回复
7
houcs| | 2020-2-9 12:54 | 只看该作者
20/(10*60)=0.033

使用特权

评论回复
8
renyaq|  楼主 | 2020-2-9 12:56 | 只看该作者
我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间大概就是这么多。datasheet上面说晶振有正负百分之1误差

使用特权

评论回复
9
huanghuac| | 2020-2-9 12:59 | 只看该作者

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

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

使用特权

评论回复
10
renyaq|  楼主 | 2020-2-9 13:03 | 只看该作者
不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样

使用特权

评论回复
11
xxmmi| | 2020-2-9 13:07 | 只看该作者
要达到1%精度是要把工厂的校准数据写到OSCCAL寄存器的,没看到你的软件哪里有写校准数据。

使用特权

评论回复
12
guoyt| | 2020-2-9 13:13 | 只看该作者
晶振的问题吧

使用特权

评论回复
13
llia| | 2020-2-9 13:16 | 只看该作者
你拿 这种精度的定时器,做这么长的定时积累的误差当然大了。

使用特权

评论回复
14
zhanglli| | 2020-2-9 13:18 | 只看该作者
不行的话外置一个RTC 芯片不过估计成本不行,你看下能提高晶振的精度不。

使用特权

评论回复
15
renyaq|  楼主 | 2020-2-9 13:21 | 只看该作者

哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
16
eanry| | 2020-2-18 18:03 | 只看该作者
内置还是外置晶振?

使用特权

评论回复
17
eanry| | 2020-2-20 10:32 | 只看该作者
听说内置晶振会受温度影响,有较大误差。你是直接换MCU还是整块板换?有外置晶振?

使用特权

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

本版积分规则

700

主题

10138

帖子

4

粉丝