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

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

[复制链接]
4698|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sevenwolf|  楼主 | 2014-6-9 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sevenwolf 于 2014-6-9 14:00 编辑

问题描述:
使用PICC8.90编译,在程序中用到PWM中断,平均时间200US,主程序中进行运算,现在碰到一个情况,这个确认是中断引起的,比如下边代码
unsigned char temp;
void main()
{
//开PWM中断;
while(1)
{
   if(temp<10)
  {
    temp++;
  }
else  if(temp>10)
{
    temp--;
}
if(temp==11)
{
LED1=~LED1;
}
}
}
temp的值可以到11,LED1会闪烁;
如果程序在这段代码中关中断再做temp的值就不会到11,也就是LED不会闪烁,求帮助,谢谢



沙发
ayb_ice| | 2014-6-9 14:11 | 只看该作者
中断不要改变temp的值

使用特权

评论回复
板凳
sevenwolf|  楼主 | 2014-6-9 14:15 | 只看该作者
绝对没有在中断中使用过temp

使用特权

评论回复
地板
sevenwolf|  楼主 | 2014-6-9 14:41 | 只看该作者
中断处理中的入栈和出栈编译后的代码,这是PICC自己生成的,我不知是否是对的,但是看出栈和入栈不对称应该是由问题的
///////////////入栈///////////////////////////////////
        MOVWF 0x7e                        ;//把W保存在0X7F
   005    0803     MOVF 0x3, W               
   006    00F3     MOVWF 0x73     
   007    0804     MOVF 0x4, W               
   008    00F4     MOVWF 0x74      
   009    080A     MOVF 0xa, W               
   00A    00F5     MOVWF 0x75                       

///////////////出栈////////////////////////////////////
///////////////////////////////////////////////////////
MOVF 0x75, W

使用特权

评论回复
5
yewuyi| | 2014-6-9 14:50 | 只看该作者
程序逻辑就是一个错误。

temp=10的时候执行那个代码?

使用特权

评论回复
6
sevenwolf|  楼主 | 2014-6-9 14:58 | 只看该作者
yewuyi 发表于 2014-6-9 14:50
程序逻辑就是一个错误。

temp=10的时候执行那个代码?

这个本身就是一个逼近操作,本来无需>10这步的,但是代码失控所以加了>10,这段代码只是例子,在程序中运行LED就在闪。TEMP=10,是无操作的

使用特权

评论回复
7
yklstudent| | 2014-6-9 15:13 | 只看该作者
楼主说的确定由中断引起的 我们怎么去判断是不是
要不工程打包上来看看是不是

使用特权

评论回复
8
sevenwolf|  楼主 | 2014-6-9 15:17 | 只看该作者
本帖最后由 sevenwolf 于 2014-6-9 15:55 编辑
yklstudent 发表于 2014-6-9 15:13
楼主说的确定由中断引起的 我们怎么去判断是不是
要不工程打包上来看看是不是 ...

void main()
{
//开PWM中断;
while(1)
{
   di();
if(temp<10)
  {
    temp++;
  }
else  if(temp>10)
{
    temp--;
}
if(temp==11)
{
LED1=~LED1;
}
ei();
}

//其他代码
}

在执行这段代码时像上边一样进行关中断,然后处理,处理完后开中断,就没有问题了。

使用特权

评论回复
9
sevenwolf|  楼主 | 2014-6-9 15:20 | 只看该作者
上边只是一个变量的问题,不涉及到运算,所以可以使用禁止中断,但我要进行数列运算现在就不好处理了。PIC是刚开始接触,所以用的是PICC,以前都是做51的,根本没有这种问题,希望有了解的指点下,谢谢

使用特权

评论回复
10
kvdong| | 2014-6-9 15:21 | 只看该作者
很奇怪在temp等于10以后是什么程序把它加到11的

使用特权

评论回复
11
kvdong| | 2014-6-9 15:25 | 只看该作者
另外你确定你后来这个程序的ei();得到执行了吗?

使用特权

评论回复
12
sevenwolf|  楼主 | 2014-6-9 15:38 | 只看该作者
肯定

使用特权

评论回复
13
sevenwolf|  楼主 | 2014-6-9 15:39 | 只看该作者
本帖最后由 sevenwolf 于 2014-6-9 15:40 编辑
kvdong 发表于 2014-6-9 15:25
另外你确定你后来这个程序的ei();得到执行了吗?

肯定
if(temp==10)LED1=0;
else LED1=1;
这个写进去一测试就知道了,用示波器测试的,无跳变

使用特权

评论回复
14
kvdong| | 2014-6-9 15:51 | 只看该作者
本帖最后由 kvdong 于 2014-6-9 15:53 编辑

我的前一个问题你还没说明。
第二个问题可能是我说的有些模糊,你的di();肯定执行了,这我清楚,所以中断关掉了。但是你的ei()的位置在while(1)循环之外,而你的while(1)循环又没有跳出机制,那ei()是在什么时候执行的呢?所以你后来的这个程序不是关中断、开中断的反复,而是关中断以后一直没有再开。没有达到你所谓的关中断,处理,再开中断的效果。

使用特权

评论回复
15
sevenwolf|  楼主 | 2014-6-9 15:55 | 只看该作者
本帖最后由 sevenwolf 于 2014-6-9 16:02 编辑
kvdong 发表于 2014-6-9 15:51
我的前一个问题你还没说明。
第二个问题可能是我说的有些模糊,你的di();肯定执行了,这我清楚,所以中断关 ...

哦,我写错了,不好意思,代码时在回复里写的,不是拷贝过来的。搞错了
你前一个问题也是我的问题,我要是知道怎么加到11的,我就自己去处理了,你说是吧。

使用特权

评论回复
16
kvdong| | 2014-6-9 16:03 | 只看该作者
sevenwolf 发表于 2014-6-9 15:55
哦,我写错了,不好意思,代码时在回复里写的,不是拷贝过来的。搞错了
...

其实我现在已经快被你搞晕了。
你在1楼的代码是你认为的好的还是坏的呢?你认为的LED闪是好还是坏呢。
8楼的代码时LED闪不闪,你认为是好是坏?

使用特权

评论回复
17
kvdong| | 2014-6-9 16:14 | 只看该作者
如果你的程序没有在其它地方使用尤其是修改过temp的话,可以明确的告诉你,你的程序里temp不会变成11,它自加到10以后就不会再变化了。单片机是一门科学,绝不是聊斋……
为什么灯会闪呢?灯闪不代表temp等于11了,可以有其它原因导致灯闪,比如单片机反复复位什么的。
你可以试着在1楼的程序中屏蔽掉LED1 ~= LED1;看看灯还闪不闪。反正我是不相信temp会变成11。

使用特权

评论回复
18
sevenwolf|  楼主 | 2014-6-9 16:20 | 只看该作者
程序都是在MALAB 中测试过的,实际上TEMP的值也是变为11的,我用ICD2测试,停下来TMEP也能到11,这就是我不能理解的地方,我准备用CCS 的编译器测试下,说实话,我自己也不能理解,但是现实是这样,TEMP绝对没有在中断中操作过。我再把代码慢慢的功能去掉,然后测试看看。谢谢

使用特权

评论回复
19
kvdong| | 2014-6-9 16:30 | 只看该作者
sevenwolf 发表于 2014-6-9 16:20
程序都是在MALAB 中测试过的,实际上TEMP的值也是变为11的,我用ICD2测试,停下来TMEP也能到11,这就是我不 ...

确实比较奇怪啊!
如果是temp变成11从而出现的灯闪,可能是其它地方累加或赋值了,而且根据你8楼描述应该是在中断中。
或者可以把temp处理那块先屏蔽掉,循环外直接赋值为10,看看灯闪不闪。
有了结果希望可以说下,让大家都开开窍!

使用特权

评论回复
20
kvdong| | 2014-6-9 16:31 | 只看该作者
另外试试把temp定义成volatile试试。

使用特权

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

本版积分规则

17

主题

72

帖子

1

粉丝