打印
[PIC®/AVR®/dsPIC®产品]

PIC单片机程序问题,求DX解答,谢谢

[复制链接]
楼主: sevenwolf
手机看帖
扫描二维码
随时随地手机跟帖
21
sevenwolf|  楼主 | 2014-6-9 16:49 | 只看该作者 回帖奖励 |倒序浏览
上图中的gPowerRatio怎么会到23?我完全不可能加上去,从0开始,按照程序逻辑是不可能出现23的,但是实际调试出现了,看到我注释掉的禁止中断了吗,我如果放开注释,就不会到23了。

使用特权

评论回复
22
sevenwolf|  楼主 | 2014-6-9 16:49 | 只看该作者
volatile注释有没有都是一个效果,本身这个变量中断里边没有操作过

使用特权

评论回复
23
sevenwolf|  楼主 | 2014-6-9 16:53 | 只看该作者
看下边的实际调试的图片

1.jpg (79.44 KB )

1.jpg

使用特权

评论回复
24
sevenwolf|  楼主 | 2014-6-9 16:58 | 只看该作者
上边gPowerRatio变成了23,按程序的逻辑是绝对不可能变为23的,但是实际上它有变为23了,看到我注释掉的禁止中断代码了吗,我释放它后就不会有变为23的可能了,本身初始化后是从0开始的,volatile参数加或不加都不影响,应为gPowerRatio变量本身未在中断中操作过,仅仅在主程序中操作。所以我搞不懂这个问题,51中绝对没遇到过。

使用特权

评论回复
25
sevenwolf|  楼主 | 2014-6-9 17:03 | 只看该作者
怎么上传了好几次都不能发表

1.jpg (79.44 KB )

1.jpg

使用特权

评论回复
26
sevenwolf|  楼主 | 2014-6-9 17:04 | 只看该作者
kvdong 发表于 2014-6-9 16:31
另外试试把temp定义成volatile试试。

我图片传不上来,发表了几次都不行

使用特权

评论回复
27
yklstudent| | 2014-6-9 20:31 | 只看该作者
编译器是PICC9.80版本吧
楼主的现象很诡异 但感觉多半还是程序的问题

使用特权

评论回复
28
sevenwolf|  楼主 | 2014-6-9 20:56 | 只看该作者
不知道,第一次用PIC做程序,不太了解他的结构,好几个变量都会这样,但是说程序本身有问题的可能性我想不是很大,我只有代码一段段注释掉再找找了。

使用特权

评论回复
29
sevenwolf|  楼主 | 2014-6-9 20:59 | 只看该作者
有哪位碰到过这种问题指点下,谢谢

使用特权

评论回复
30
ZG11211| | 2014-6-9 21:08 | 只看该作者
本帖最后由 ZG11211 于 2014-6-9 21:10 编辑

楼主还没解释等于10的时候程序怎么跑呢。而且永远不会执行最后那句==11的LED,因为上一句只要>10就会被减下来了。

使用特权

评论回复
31
sevenwolf|  楼主 | 2014-6-9 21:29 | 只看该作者
ZG11211 发表于 2014-6-9 21:08
楼主还没解释等于10的时候程序怎么跑呢。而且永远不会执行最后那句==11的LED,因为上一句只要>10就会被减下 ...

用的是if else语句中间有0.5S的延时,怎么可能测不出来

使用特权

评论回复
32
ZG11211| | 2014-6-9 21:35 | 只看该作者
sevenwolf 发表于 2014-6-9 21:29
用的是if else语句中间有0.5S的延时,怎么可能测不出来

你怎么会认为你这两句话之间会有0.5S的延迟?如果你真这么想的话,我也无语了。

使用特权

评论回复
33
sevenwolf|  楼主 | 2014-6-9 21:36 | 只看该作者
其实大家说程序有问题,我也相信有可能,但是软件仿真没有这个现象,用ICD2仿真就有这个问题,直接写芯片里边测试也有这个问题,这就是我不明白的地方,现在其实关键是要找问题,不然这样怎么做产品,是吧。

使用特权

评论回复
34
sevenwolf|  楼主 | 2014-6-9 21:51 | 只看该作者
ZG11211 发表于 2014-6-9 21:35
你怎么会认为你这两句话之间会有0.5S的延迟?如果你真这么想的话,我也无语了。 ...

呵呵

使用特权

评论回复
35
sevenwolf|  楼主 | 2014-6-10 08:14 | 只看该作者
再次寻求帮助:软件仿真没有这个现象,用ICD2仿真就有这个问题,直接写芯片里边测试也有这个问题;

使用特权

评论回复
36
sevenwolf|  楼主 | 2014-6-10 09:55 | 只看该作者
问题发生点在什么地方已经确定,请了解PIC  B口端口中断的DX帮忙看看应该如何使用B口电平中断
if(RBIF)
{
  if(RB5==1)LED1=0;
   RBIF   = 0;                 //清RB中断标志
}
问题发生在上述这段代码,这是在中断中的,如果我不开B口中断,就是这段代码不执行就不会有问题,如果开了B口电平中断,前边的变量就不受控了。

使用特权

评论回复
37
kvdong| | 2014-6-10 10:52 | 只看该作者
sevenwolf 发表于 2014-6-10 09:55
问题发生点在什么地方已经确定,请了解PIC  B口端口中断的DX帮忙看看应该如何使用B口电平中断
if(RBIF)
{

恭喜你找到问题所在
有一点可以肯定的是,中断不会和未使用的变量发生关系的。
还可以用屏蔽程序的方式,把电平中断中的过程全屏蔽掉,开着中断试试看。

使用特权

评论回复
38
sevenwolf|  楼主 | 2014-6-10 10:58 | 只看该作者
kvdong 发表于 2014-6-10 10:52
恭喜你找到问题所在
有一点可以肯定的是,中断不会和未使用的变量发生关系的。
还可以用屏蔽程序的方式, ...

感谢您的一直关注,现在发现比较有趣的问题,编译器尽然把我定义的常量搞错,这个非常奇怪,同样是先前的问题,进一步分析,看调试的汇编代码,你看看能发现什么,到底是什么原因导致编译器将常量改变。看下图gcPower是这样定义的const uchar gcPower =12;

使用特权

评论回复
39
sevenwolf|  楼主 | 2014-6-10 11:00 | 只看该作者
看这张图

1.jpg (33.25 KB )

1.jpg

使用特权

评论回复
40
sevenwolf|  楼主 | 2014-6-10 11:06 | 只看该作者
本帖最后由 sevenwolf 于 2014-6-10 11:11 编辑

不好意思,上图的代码是对的,我理解错 了。

使用特权

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

本版积分规则