打印

定时器初始化问题

[复制链接]
4317|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xmrforever|  楼主 | 2010-2-21 19:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//------------------------------------------------------------------
//TMR0初始化子程序
void init_tmr0()
{
TMR0=0xFF;
T0CS=0; //TMR0工作于定时器方式
T0IE=1;//Timer0中断允许
GIE=1;
T0IF=0; //清除TMR0的中断标志
}

//------------------------------------------------------------------
//中断入口函数
void interrupt compare()
{
//定时器中断
if(T0IF && T0IE)
{
TMR0=0xFF; //对TMR0写入一个调整值。因为写入TMR0后接着的
//两个周期不能增量,中断需要3个周期的响应时间,
//以及C语言自动进行现场保护要消耗周期
T0IF=0; //清除中断标志
if(++ms==25)
{
ms=0;
if(++s==1000)
{
s=0;
RB3=!RB3;
}
}
}
}

RB3是连接的LED,为什么出来的时间不准确?
沙发
xmrforever|  楼主 | 2010-2-22 10:12 | 只看该作者
而且差的非常多,我这个定时是1us的,结果出来将近40us
这是什么原因?请大侠指教

使用特权

评论回复
板凳
xymxym| | 2010-2-25 11:55 | 只看该作者
指令周期是多少?
定时时间这么短,中断里又有那么多指令运行,时间偏差是有可能的.按PIC的极限晶振,定时1us很难精确,这么短的时间,以其在中断和主程序之间跳来跳去的,还不如用程序模拟更好掌握.进入中断还有压栈和退栈时间.
T0IF=0; 这句应该放在前面去.

使用特权

评论回复
地板
xmrforever|  楼主 | 2010-2-25 18:22 | 只看该作者
4M的晶振,指令周期应该是1us
但是我用delay试了一下,指令周期好像只有0.01us

使用特权

评论回复
5
xymxym| | 2010-2-26 11:36 | 只看该作者
4M当然是1us 了,怎么会是0.01us!
反汇编看一下.
另外还是那句话,要求这么短的定时间,不应该用中断

使用特权

评论回复
6
leizi2008| | 2010-2-26 13:12 | 只看该作者
定时1us???用4M的晶振??我觉得很不合理啊

使用特权

评论回复
7
xmrforever|  楼主 | 2010-2-26 21:08 | 只看该作者
我现在一直开着定时器0
然后读TMR0的值解决了问题
还是比较准确的

使用特权

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

本版积分规则

个人签名:忍一忍就过去了

27

主题

177

帖子

0

粉丝