定时器初始化问题

[复制链接]
5192|6
 楼主| xmrforever 发表于 2010-2-21 19:17 | 显示全部楼层 |阅读模式
  1. //------------------------------------------------------------------
  2. //TMR0初始化子程序
  3. void init_tmr0()
  4. {
  5. TMR0=0xFF;
  6. T0CS=0; //TMR0工作于定时器方式
  7. T0IE=1;//Timer0中断允许
  8. GIE=1;
  9. T0IF=0; //清除TMR0的中断标志
  10. }

  11. //------------------------------------------------------------------
  12. //中断入口函数
  13. void interrupt compare()
  14. {
  15. //定时器中断
  16. if(T0IF && T0IE)
  17. {
  18. TMR0=0xFF; //对TMR0写入一个调整值。因为写入TMR0后接着的
  19. //两个周期不能增量,中断需要3个周期的响应时间,
  20. //以及C语言自动进行现场保护要消耗周期
  21. T0IF=0; //清除中断标志
  22. if(++ms==25)
  23. {
  24. ms=0;
  25. if(++s==1000)
  26. {
  27. s=0;
  28. RB3=!RB3;
  29. }
  30. }
  31. }
  32. }

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
xymxym 发表于 2010-2-26 11:36 | 显示全部楼层
4M当然是1us 了,怎么会是0.01us!
反汇编看一下.
另外还是那句话,要求这么短的定时间,不应该用中断
leizi2008 发表于 2010-2-26 13:12 | 显示全部楼层
定时1us???用4M的晶振??我觉得很不合理啊
 楼主| xmrforever 发表于 2010-2-26 21:08 | 显示全部楼层
我现在一直开着定时器0
然后读TMR0的值解决了问题
还是比较准确的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

27

主题

177

帖子

0

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