有关PIC TMIER0 为何计算的初值和实测的时间不准?

2020-02-08 09:20发布

芯片 PIC16F877A  晶振4M  程序如下:

void timer0_init() //
{
//TMR0=61;的前提下:
        OPTION=0x00;//不同的分频用示波器实测时间  00:410us  01:800us  02:1.58ms  03:3.16ms  04:6.24ms
                //05:12.6ms 06:25ms   07:50ms
        INTCON=0xa0;
        TMR0=61;
}

中断如下:

void interrupt ISR()
{
/*******timer0********/
        if(T0IE&&T0IF)//T0IE:timer0溢出中断使能位/T0IF:溢出标志位.要软件清零
        {
        T0IF=0;
        TMR0=61;//初值61 50ms溢出一次
        RD0=!RD0;   //测RD0引脚的电平变化时间  
        }
}

当2分频的时候 初值61  定时的时间应该是  (256-61)*2=390us 实测有410us  这个误差很大,是怎么出现的?

是实测的准还是要看理论上算出来的?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
sn516952
1楼-- · 2020-02-08 10:10
我在MPLAB SIM 里面以下三条指令分别占用的时间

                T0IF=0; //1us
                TMR0=61;//4us
                RD0=!RD0;//2us

相差20us  加上这几个还是对不上时间差.
mplk
2楼-- · 2020-02-08 14:56
写入TMR0的时候会有两个指令周期的停顿。
millwood0
3楼-- · 2020-02-08 18:03
 精彩回答 2  元偷偷看……
sn516952
4楼-- · 2020-02-08 22:50
回复【3楼】millwood0  
"tmr0=61;//初值61 50ms溢出一次  "
something like that should be avoided at all costs: because of interrupt latency, tmr0 has a value (of potentially 20 ticks or so) before the isr gets executed. so overwriting it with another value will lengthen the isr.
a better approach is
tmr0+=-tmr0_period + error_term;
where tmr0_period is the desired period for tmr0 (in ticks) and error_term is an error term to ad......
-----------------------------------------------------------------------
哪位朋友帮我将这段翻译一下好吗? 英文太差.看的沆沆洼洼的,不理解啊
sn516952
5楼-- · 2020-02-09 03:50
这么说来.理论算起来的是不准的,因为没有加上指令执行的时间和装载初值的时间,所以还是实测的准,是这样吧?
mplk
6楼-- · 2020-02-09 05:26
用软件仿真吧,根本不需要计算什么,调多几次就得出你所要的数值。我从来就这么懒的。

一周热门 更多>