定时器计数 记到18就清零了

[复制链接]
2489|12
 楼主| 看见未来 发表于 2012-8-6 21:51 | 显示全部楼层 |阅读模式
void interrupt ISR(void)
{
if(T0IE&T0IF)
{
  T0IF=0;
  TMR0=0X09;
  ledrefresh_flag++;
  DigitTime++;
  if(ledrefresh_flag == LedTime)//LedTime=100
  {
   ledrefresh_flag=0;
   ledrefresh=1;
  }
  if(DigitTime == DIGITTIME)//DIGITTIME=1000
  {
   DigitTime=0;
   DigitSym=1;
  }
}
}
在watch里观察的ledrefresh_flag、DigitTime都是走到18就清零了。谁能说说是怎么回事?
Ryanhsiung 发表于 2012-8-7 08:06 | 显示全部楼层
断点看一下
  if(ledrefresh_flag == LedTime)//LedTime=100
  {
   ledrefresh_flag=0;
   ledrefresh=1;
  }
循环有没有进入?看下LedTime,DIGITTIME,ledrefresh_flag值各是多少!
会不会是你LedTime,DIGITTIME变量先前就被你改成18了!
 楼主| 看见未来 发表于 2012-8-7 08:27 | 显示全部楼层
2# Ryanhsiung
应该没有改过的。我只是在一个头文件里define了一下LedTime和DIGITTIME,其他地方没有任何赋值的。
zzyfidy 发表于 2012-8-7 14:59 | 显示全部楼层
可以检查一下看门狗
 楼主| 看见未来 发表于 2012-8-7 19:29 | 显示全部楼层
4# zzyfidy
木有看门狗
兰天白云 发表于 2012-8-9 17:10 | 显示全部楼层
采用模拟仿真测试,断点设置在清0处,看看是哪个变量有问题
yewuyi 发表于 2012-8-9 21:03 | 显示全部楼层
在其它程序中是否使用了ledrefresh_flag、DigitTime变量
 楼主| 看见未来 发表于 2012-8-10 18:47 | 显示全部楼层
7# yewuyi
程序很简单,没有其他地方使用。我是用MPLAB+proteus仿真看的,一到0X12就清零。
yewuyi 发表于 2012-8-11 08:58 | 显示全部楼层
本帖最后由 yewuyi 于 2012-8-11 09:00 编辑

1、if(T0IE&&T0IF)
请把中断函数这么写!
2、TMR0+=0x09;
TMR0的赋值请这么写!
3、if(ledrefresh_flag>=LedTime)//LedTime=100
ledrefresh_flag的判断请这么写!
4、 if(DigitTime >= DIGITTIME)//DIGITTIME=1000
DigitTime的判断请这么写!
5、我对MPLAB+proteus的联合操作不清楚是否有问题,如何只是软仿真的话,直接用MPLAB的debug下面的sim即可
6、短短几行代码,隐藏的小问题很多,其它如变量命名、标志量定义和置位较为随意,大小写混乱,代码的可读性、可移植性较差等问题!!!
yewuyi 发表于 2012-8-11 09:00 | 显示全部楼层
重点见红色字体部分
 楼主| 看见未来 发表于 2012-8-11 21:39 | 显示全部楼层
10# yewuyi
非常感谢叶大哥,我本身现在做硬件,只是自学单片机,所以单片机很菜。很谢谢您的提点。
 楼主| 看见未来 发表于 2012-8-11 22:00 | 显示全部楼层
9# yewuyi
置位比较随意。怎么讲呢?
yewuyi 发表于 2012-8-12 12:29 | 显示全部楼层
标志位和变量的赋值应当进行区分,这样便于程序的阅读和移植。

例如标志位的赋值可以用true,false来表示,而变量直接0x00,0x01等等,在阅读的时候,可以一目了然
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:loser

17

主题

1073

帖子

1

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