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

[复制链接]
9309|18
手机看帖
扫描二维码
随时随地手机跟帖
renyaq|  楼主 | 2021-6-14 23:10 | 显示全部楼层 |阅读模式
PIC12F508同一个程序,换一片单片机定时时间不一样什么问题。

使用特权

评论回复
zhuhuis| | 2021-6-14 23:12 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
renyaq|  楼主 | 2021-6-14 23:15 | 显示全部楼层
是不是哪里配置不对。程序应该额米有问题吧。
#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| | 2021-6-14 23:17 | 显示全部楼层
如果差别不大,那就是正常的。

使用特权

评论回复
renyaq|  楼主 | 2021-6-14 23:19 | 显示全部楼层
10分钟差别有20秒那么多哦

使用特权

评论回复
llljh| | 2021-6-14 23:22 | 显示全部楼层
那是有点大

使用特权

评论回复
xxrs| | 2021-6-14 23:23 | 显示全部楼层
20/(10*60)=0.033

使用特权

评论回复
renyaq|  楼主 | 2021-6-14 23:26 | 显示全部楼层
我用示波器看了,一个指令差0.04us,10分钟就是600000000us,600000000*0.04=24000000uS=24S,相差的时间大概就是这么多。datasheet上面说晶振有正负百分之1误差

使用特权

评论回复
wyjie| | 2021-6-14 23:28 | 显示全部楼层

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

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

使用特权

评论回复
renyaq|  楼主 | 2021-6-14 23:31 | 显示全部楼层
不是10MS,程序改过了,不过重点不是这个10MS.而是同一款单片机,运行的时间不一样

使用特权

评论回复
supernan| | 2021-6-14 23:33 | 显示全部楼层
要达到1%精度是要把工厂的校准数据写到OSCCAL寄存器的,没看到你的软件哪里有写校准数据。

使用特权

评论回复
chuxh| | 2021-6-14 23:46 | 显示全部楼层
晶振的问题吧

使用特权

评论回复
pengf| | 2021-6-14 23:50 | 显示全部楼层
你拿 这种精度的定时器,做这么长的定时积累的误差当然大了。

使用特权

评论回复
supernan| | 2021-6-14 23:52 | 显示全部楼层
不行的话外置一个RTC 芯片不过估计成本不行,你看下能提高晶振的精度不。

使用特权

评论回复
jiaxw| | 2021-6-14 23:54 | 显示全部楼层
内置还是外置晶振?

使用特权

评论回复
zhanghqi| | 2021-6-14 23:55 | 显示全部楼层
听说内置晶振会受温度影响,有较大误差。

使用特权

评论回复
jlyuan| | 2021-6-14 23:58 | 显示全部楼层
你是直接换MCU还是整块板换?

使用特权

评论回复
dingy| | 2021-6-15 21:13 | 显示全部楼层
有外置晶振?

使用特权

评论回复
renyaq|  楼主 | 2021-6-15 21:15 | 显示全部楼层
哦,那我就知道怎么回事了,多谢大家

使用特权

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

本版积分规则

700

主题

10138

帖子

4

粉丝