求教PIC单片机定时器如何精确计时

2020-02-08 09:09发布

最近在弄U2270B,需要对曼码解码,使用PIC16F946芯片的定时器2进行计时,但我发现有时计时不准,真是恼火,设定的阈值总是改来改去的。
对脉冲的高低电平进行计时,算出编码的。大家有木有好的意见??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
705192166
1楼-- · 2020-02-08 20:27
好像每次更新定时器的值,都延时2个指令周期,才开始计数,参考一下有用没
wangjiati
2楼-- · 2020-02-09 01:26
 精彩回答 2  元偷偷看……
hmsfeng
3楼-- · 2020-02-09 03:34
705192166 发表于 2012-6-25 17:28
好像每次更新定时器的值,都延时2个指令周期,才开始计数,参考一下有用没 ...

我看了下汇编,TMR2=0  被译成一条清零指令,也就一个指令周期;
是不是执行了这条指令后,硬件还得在过2个指令周期?我现在单片机用的是内部8M的振荡器,系统时钟就是2M,定时器是4分频。这样一次就有几us差距。
hmsfeng
4楼-- · 2020-02-09 06:08
wangjiati 发表于 2012-6-25 17:50
死等.什么事情不做就等着定时器到你设定的数据.  这样准了...可就是其他事情??     建议使用中断. 这样 ...

不太想用中断,中断有其他用处,PIC中断就一个服务函数吗?中断函数里还要查询,很恼火
surf_131
5楼-- · 2020-02-09 11:20
感觉是程序设计思想有问题。
你每次读到一个值,这个时间上有误差,然后清0 TMR2,你这次的误差就加入到下次判断中,然后每次都累加,终致“滑码”。
你应该给TMR2一个确定的溢出值,每次发现溢出(发现时机有误差)就相应动作。定时器溢出之后自动翻转继续计数,不会有误差累加。
万一需要调整门限值,也是调整那个确定的值。有些型号16位计数要先写H, 再写L, 否则些不进去云云,手册会有交待。
hmsfeng
6楼-- · 2020-02-09 15:14
surf_131 发表于 2012-6-26 21:49
感觉是程序设计思想有问题。
你每次读到一个值,这个时间上有误差,然后清0 TMR2,你这次的误差就加入到下 ...

LS的意思是每次就是读TMR2的值和判断溢出标志,然后和上次的做减法从而得到时间差?这样会不会导致效率比较低呢?至少汇编出来的应该会多几条指令吧。

一周热门 更多>