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

关于检查程序问题的讨论

[复制链接]
楼主: Rain_King
手机看帖
扫描二维码
随时随地手机跟帖
21
Rain_King|  楼主 | 2013-11-18 18:27 | 只看该作者 回帖奖励 |倒序浏览
**n1131 发表于 2013-11-18 18:08
呵呵

大神就不要呵呵了啊....给个方法吧....说说你的看法也行啊...

使用特权

评论回复
22
黄小俊| | 2013-11-18 18:37 | 只看该作者
Rain_King 发表于 2013-11-18 18:27
大神就不要呵呵了啊....给个方法吧....说说你的看法也行啊...

我可不是大神。。我觉得你还是仔细放在你的程序上。是不是每一个细节你都考虑到了。

使用特权

评论回复
23
Rain_King|  楼主 | 2013-11-18 18:50 | 只看该作者
**n1131 发表于 2013-11-18 18:37
我可不是大神。。我觉得你还是仔细放在你的程序上。是不是每一个细节你都考虑到了。 ...

最主要的是....加一些完全无关的语句后,就正常了,这是最没法理解的.....完全没法检测...

使用特权

评论回复
24
黄小俊| | 2013-11-18 19:38 | 只看该作者
Rain_King 发表于 2013-11-18 18:50
最主要的是....加一些完全无关的语句后,就正常了,这是最没法理解的.....完全没法检测... ...

还是耐心点,总会把问题找出来。也没遇到过这样的问题,没办法给你建议。

使用特权

评论回复
25
sysdriver| | 2013-11-18 21:55 | 只看该作者
呵呵,肯定是你的程序问题
问题从来没有诡异的说法,存在必定有其原因
成长的过程就是要善于发现问题和解决问题,不要浮躁,细心的学习和总结

从你描述的程序中,按键扫描弄的太复杂了吧?什么消息之类的要弄的怎么专业么,程序的精髓在于讲究简单和易懂。你可以考虑一下其他的扫键方式。

一般用AD来做扫键,说明是IO口不够用,AD比较忌讳的是处理按键组合了,如果你的要求是没有必要按键组合,那么你的硬件可以弄成不管多少个按键只响应排靠前的那个,这样子就不会有问题了。

使用特权

评论回复
26
xyz549040622| | 2013-11-19 07:34 | 只看该作者
pic时钟配置是否正确,示波器测试,AD的配置需要等待的时间,中断只有一个入口,无法判断优先级的。既然在41上测试通过的程序,那就考虑硬件的差异,还考虑你是否把代码优化了...

使用特权

评论回复
27
ayb_ice| | 2013-11-19 08:08 | 只看该作者
按键源程序是不是你写的
我表示怀疑

使用特权

评论回复
28
Rain_King|  楼主 | 2013-11-19 08:12 | 只看该作者
sysdriver 发表于 2013-11-18 21:55
呵呵,肯定是你的程序问题
问题从来没有诡异的说法,存在必定有其原因
成长的过程就是要善于发现问题和解决 ...

这是我系统架构决定了.....我系统的架构就是利用消息来处理的.....我也觉得是程序问题....连问题的方向都木有,最主要的是加一些完全无关的语句运行后,就正常工作了,没法理解...

使用特权

评论回复
29
Rain_King|  楼主 | 2013-11-19 08:14 | 只看该作者
xyz549040622 发表于 2013-11-19 07:34
pic时钟配置是否正确,示波器测试,AD的配置需要等待的时间,中断只有一个入口,无法判断优先级的。既然在4 ...

时钟这些我测试了....因为和我测试中断的时间是吻合的....代码优化...每时每刻都在想....

使用特权

评论回复
30
Rain_King|  楼主 | 2013-11-19 08:16 | 只看该作者
ayb_ice 发表于 2013-11-19 08:08
按键源程序是不是你写的
我表示怀疑

能不能说一下你的理由呢....程序百分百是我写的.....我从来不抄别人的程序,即使看到别人的程序思路好,我也会自己根据自己的理解写出来。。。。。。。。。

使用特权

评论回复
31
ayb_ice| | 2013-11-19 08:27 | 只看该作者
Rain_King 发表于 2013-11-19 08:16
能不能说一下你的理由呢....程序百分百是我写的.....我从来不抄别人的程序,即使看到别人的程序思路好, ...

没有必要生气
我只是怀疑而已,
既然是你写的,而且已经在其它MCU上OK,如果移植没有修改主要程序的,那么很可能是芯片编译器差异引起的,
另外不要问题盯着那个地方,很可能问题在其它地方

程序贴的太少,很难看出问题

使用特权

评论回复
32
Rain_King|  楼主 | 2013-11-19 08:33 | 只看该作者
ayb_ice 发表于 2013-11-19 08:27
没有必要生气
我只是怀疑而已,
既然是你写的,而且已经在其它MCU上OK,如果移植没有修改主要程序的,那 ...

我没有生气....你太敏感了....我程序太长了...好几千行.....不可能发上来的....我也在想是不是其他地方的问题.....其实我找问题的方法还是很多的,一般都可以找出来,现在最奇怪的地方是,加一个完全无关的语句后,程序就能正常工作,而且这个语句与整个程序都木有关系....实在是没法理解,上次出现这种事的时候,发现单片机坏了,这次换过了,还是不行。。。。

使用特权

评论回复
33
ayb_ice| | 2013-11-19 08:39 | 只看该作者
Rain_King 发表于 2013-11-19 08:33
我没有生气....你太敏感了....我程序太长了...好几千行.....不可能发上来的....我也在想是不是其他地方的 ...

你这问题也不难,
先搞个循环,只调用按键相关程序,然后跟踪一定次数的循环,看每次结果,
也不排除编译错误的可能,建议先大大降低优化级别,再不行就只能看反汇编了

使用特权

评论回复
34
xyz549040622| | 2013-11-19 08:40 | 只看该作者
最好上你有疑问地方的代码

使用特权

评论回复
35
ayb_ice| | 2013-11-19 08:47 | 只看该作者
                if(RA7_NU==1)       //加这个端口就正常了,不加就不正常
                {
                        RA7_NU=0;
                }
                else
                {
                        RA7_NU=1;
                }
这段代码什么意思,这不是取反RA7_NU吗,有什么意义吗
PIC的GPIO有点不同于51或其它MCU的,他总是读取外部引脚电平的

使用特权

评论回复
36
Rain_King|  楼主 | 2013-11-19 08:50 | 只看该作者
xyz549040622 发表于 2013-11-19 08:40
最好上你有疑问地方的代码



这个就是我整个一个扫描程序...我删除了其他的,只是为了好截个全图.....中间加了一条端口测试语句,这是个没有用的端口,原先只是测试,可是结果发现只要加了这条语句后,程序正常了..........下面加入更加完整的程序...

使用特权

评论回复
37
Rain_King|  楼主 | 2013-11-19 08:51 | 只看该作者
if(AdcValue[1]>=DOWN_B_KEY)       //This is  B Key scan
        {
                switch(KeyKindB)
                {
                        case DOWNB_KEY:
                        {
                                if(LongKeyB==SHORT_KEY)
                                {
                                        WriteMessage(1,KeyStatus|PRESS_SBS_MSG);
                                        WriteMessage(1,KeyStatus|RELEASE_SBS_MSG);
                                }
                                else if(LongKeyB==LONG_KEY)
                                {
                                        WriteMessage(1,SaveKStatus|RELEASE_LBS_MSG);
                                }
                                LongKeyB=NO_KEY;
                                KeyKindB=OTHER_KEY;
                                break;
                        }
                        case UPB_KEY:
                        {
                                if(LongKeyB==SHORT_KEY)
                                {
                                        WriteMessage(1,KeyStatus|PRESS_SBI_MSG);
                                        WriteMessage(1,KeyStatus|RELEASE_SBI_MSG);
                                }
                                else if(LongKeyB==LONG_KEY)
                                {
                                        WriteMessage(1,SaveKStatus|RELEASE_LBI_MSG);
                                }
                                LongKeyB=NO_KEY;
                                KeyKindB=OTHER_KEY;
                                break;
                        }
                        default :
                        {
                                break;
                        }
                }
                KeyCntB=0;
        }
        else if(AdcValue[1]<DOWN_B_KEY&&AdcValue[1]>=UP_B_KEY)                  //this is Down Key
        {
                ++KeyCntB;
                if((KeyCntB>=CNTS_KEY)&&(KeyCntB<=CNTS_KEY+2))
                {
                        if(LongKeyB!=LONG_KEY)
                        {
                                LongKeyB=SHORT_KEY;
                        }
                        KeyKindB=DOWNB_KEY;
                }
                else if(KeyCntB>=CNTL_KEY)
                {
                        if(RA7_NU==1)
                        {
                                RA7_NU=0;
                        }
                        else
                        {
                                RA7_NU=1;
                        }
                        SaveKStatus=KeyStatus;
                        KeyCntB=0;
                        LongKeyB=LONG_KEY;
                        WriteMessage(1,KeyStatus|PRESS_LBS_MSG);
                }
        }
        else if(AdcValue[1]<UP_B_KEY)                                              //This is Up Key
        {
                ++KeyCntB;
                if((KeyCntB>=CNTS_KEY)&&(KeyCntB<=CNTS_KEY+2))
                {
                        if(LongKeyB!=LONG_KEY)
                        {
                                LongKeyB=SHORT_KEY;
                        }
                        KeyKindB=UPB_KEY;
                }
                else if(KeyCntB>=CNTL_KEY)
                {
                        SaveKStatus=KeyStatus;
                        KeyCntB=0;
                        LongKeyB=LONG_KEY;
                        WriteMessage(1,KeyStatus|PRESS_LBI_MSG);
                }
        }

使用特权

评论回复
38
Rain_King|  楼主 | 2013-11-19 08:57 | 只看该作者
对上面的程序进行说明....
我的消息是这样的,对于一个短按和长按,只有按键释放才能确定,所以短按按下和释放的消息是同时产生的...
KeyKindB是用来区别哪个adc的, LongKeyB是为了区别是否长按了....KeyCntB是用来消抖和确认长按的...SaveKStatus和KeyStatus可以不用理会....
问题如下:如果不加那个端口测试代码,就会在短按的时候,只是轻轻一按,就会有很多按键消息,包括长按,短按....总觉得跳过KeyCntB>=CNTL_KEY这个判断条件....

使用特权

评论回复
39
ayb_ice| | 2013-11-19 08:58 | 只看该作者
既然说那句话没有意义,
换成个普通的变量试试,很有可能就有问题

使用特权

评论回复
40
Rain_King|  楼主 | 2013-11-19 08:59 | 只看该作者
ayb_ice 发表于 2013-11-19 08:47
if(RA7_NU==1)       //加这个端口就正常了,不加就不正常
                {
            ...

这个是测试端口啊....我可以用示波器来测这个脚,这个端口没有使用,这就是没法理解的地方嘛,加这个测试端口,就正常了,不加,问题依旧...........

使用特权

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

本版积分规则