12C508计数器的应用问题,请各位高手帮忙分析

[复制链接]
3918|8
 楼主| windlrh 发表于 2007-7-28 18:19 | 显示全部楼层 |阅读模式
下面是我写的部分程序,初始化部分是从汇编中移过来的(汇编的程序是能运行,这是前提),问题是在利用计数器作计数延时时,延时函数不能变化,我的测试是GP4驱动LED作一亮一灭的变化,但是延时不能产生应有的时间,计数源是利用外接50HZ的变压器交流信号。LED一直是亮的,没产生灭的现象,请各位看看我的程序是哪里出了问题?初始化么?希望大家给点建议,或者给个参考,谢谢拉!<br /><br />//初始化<br />void&nbsp;&nbsp;InitPIC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OPTION&nbsp;=0xE0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1110&nbsp;0000&nbsp;&nbsp;&nbsp;TOSE=0,TOSC=1,PSA=1<br />&nbsp;&nbsp;&nbsp;&nbsp;TRIS=0x1c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0001&nbsp;1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMR0=0&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计数置0<br />}<br /><br /><br />//********利用50HZ交流信号作计数输入信号***********************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.02*2*250=10s<br />void&nbsp;delay_count()&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TMR0=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这句存在与不存在是一样的结果<br />&nbsp;&nbsp;&nbsp;&nbsp;CLRWDT()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//WDT清0<br />&nbsp;&nbsp;&nbsp;&nbsp;while(TMR0==0Xfa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMR0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
兰天白云 发表于 2007-7-31 07:52 | 显示全部楼层

驱动GP4的部分呢?

  
dcp 发表于 2007-8-24 13:04 | 显示全部楼层

做定时扩展吧

  
平艳 发表于 2007-9-23 15:20 | 显示全部楼层

re

首先明确&nbsp;OPTION&nbsp;=0xE0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1110&nbsp;0000&nbsp;&nbsp;&nbsp;TOSE=0,TOSC=1,PSA=1<br />是绝对的错误。如没有分频可取0xcf&nbsp;&nbsp;&nbsp;//TOSE=0&nbsp;TOCS=0<br />其二&nbsp;while(TMR0==0Xfa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMR0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />这一部份不知道是你笔误还是刻意这样写的。while();的这个&quot;;&quot;号就是停在此处了。但后面的{}又是什么呢??从你的意思中我可以看出,是当TMR0==0xfa时清0,那么&quot;;&quot;就应去掉。<br />你按我这样再试试。我已用SIM测试过没有问题。请注意TMRO的查询时间!!
hjh002 发表于 2007-9-24 01:03 | 显示全部楼层

呵呵,都不对。

OPTION=0xE0&nbsp;是没有问题的,<br />有问题的是WHile循环,要明白,WHile循环的原理,是当whle(条件结果为真)时执行循环体里的程序,按LZ的程序,如果while(TMR0==0Xfa);&nbsp;后面的“;”不是错误的话,后面的{}两个符号是多余的,因为只有当TMR0==0Xfa时才执行一个循环判断的程序,所以大部分时间是根本不执行这个循环体,直接跳到后面的“TMR0=0;”去了,所以达不到延时的目的,程序可改为:<br />void&nbsp;delay_count()&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TMR0=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(TMR0&nbsp;&lt&nbsp;0Xfa)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLRWDT()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//WDT清0<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;TMR0=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />
平艳 发表于 2007-9-24 09:04 | 显示全部楼层

re

0xe0绝对错误,定时器0打开是TOSC=0,的条件.如果这个条件都不成立就根本谈不上定时了。<br />http://pwfd.blog.**/
hjh002 发表于 2007-9-24 13:17 | 显示全部楼层

RE 平艳

是TOCS&nbsp;非TOSC,这个位并不是定时器0的开关,只是定时器时钟源的选择位。TOCS=1时是选择外部时钟源,LZ也说了用外部的50HZ交流信号。好象没听说PIC的定时器能关掉的。
平艳 发表于 2007-9-24 13:38 | 显示全部楼层

不好意思,没看清前提,是外部.那就没有问题。

不好意思,没看清前提,是外部.那就没有问题。那就是while有问题
sunlimcu 发表于 2007-9-26 10:44 | 显示全部楼层

就是while有问题!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

22

帖子

2

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