打印

一个匪夷所思的错误。。。。求高手帮忙~~~谢谢

[复制链接]
5450|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hyhlfq|  楼主 | 2008-8-29 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, ce, CD, RS, FOR
程序如下~~
这个是其中一段,编译通过

sbit WR=P3^5;
sbit RD=P3^3;
sbit RST=P2^3;
sbit CD=P2^7;
sbit CE=P3^1;

{
         CE=0;
    RST=1;
    delay(1000);
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
}

按以上程序可以单步执行到WR=0这句,如果改成调用,如下所示


{
         CE=0;
    RST=1;
    delay(1000);
         wrdat(0x00);
}
void wrdat(unsigned char dat)
{
    CD=0;
    P0=dat;
    WR=0;
    delay(10);
    WR=1;
}

就无法单步到WR=0;
提示错误是
cannot perform requested operation!
no address correlation for line number 71

现在用的单片机是C8051F020,其他的设置都没有问题,而且整个程序不大。。
现在处于极度迷茫的状态~~~

希望有遇到并解决过的人能帮下~~~谢谢

相关帖子

沙发
coldra| | 2008-8-29 15:50 | 只看该作者

void wrdat(unsigned char dat)在调用前声明了没有

使用特权

评论回复
板凳
luckyjjjjj| | 2008-8-29 15:57 | 只看该作者

能够debug肯定是编译通过了的

使用特权

评论回复
地板
hyhlfq|  楼主 | 2008-8-29 17:09 | 只看该作者

现在还发现这样的问题

首先,调用前已经申明过了


现在还发现这样的问题,如果连续写多个,即使不调用也无法单步到WR=0处
程序如下所示。    
        CE=0;
    RST=1;
    delay(1000);
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
    st01();
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
    CD=0;
    P0=0x00;
    WR=0;
    delay(10);
    WR=1;
请高手指教~~~谢谢
由于是C8051F系列,所以
编译器用的是由厂家直接提供的Silicon Laboratories
在KEILC中编译也通过了,问题一样~~~

使用特权

评论回复
5
coldra| | 2008-8-29 17:29 | 只看该作者

参考这几方面考虑

看门狗复位,程序会跳到程序初始入口
堆栈不够,导致异常
程序过度优化,某些语句不能执行

使用特权

评论回复
6
天雨粟| | 2008-8-29 18:30 | 只看该作者

提个思路:

头文件<reg51.H>等中,WR定义为0xB6,RD定义为0xb7,采用sbit定义.

用sbit定义的位能否重新定义,书上没讲,请高手看看!

你先改改这两个位变量,再试试!

使用特权

评论回复
7
murenxiu| | 2008-8-29 20:57 | 只看该作者

我以前也遇到过这问题

好像是堆栈溢出了,你这函数有没有重入啊?

使用特权

评论回复
8
hyhlfq|  楼主 | 2008-8-29 21:33 | 只看该作者

解决了,但是不明白~~~~

谢谢楼上的朋友们~~
我又重新验证了下一些情况~~
第一:我没有调用<reg51.h>以及<reg52.h>,头文件只有
#include <c8051f020.h>
#include <intrins.h>
里面没有定义过WR及RD,我也改成过其他的,结果一样
第二:看门狗问题,我在程序开头已经禁止看门狗了,应该不是这个原因
第三:我将程序的其他部分全部删除,仅仅剩下如上的一段程序,还是一样的问题


刚我把delay()去掉调试了下,发现通过了。。。
后来自己又验证了下
当delay()定义如下的时候,程序会出问题

void delay(unsigned int n)
{
    unsigned int qq,pp;
    for(pp=0;pp<n;pp++)
    {
        for(qq=0;qq<n;qq++)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
        qq=0;
    }
}

而将int改为char之后还是会出问题~~~
最后直接将他改成如下就通过了。 。。
void delay(unsigned char n)
{
    unsigned char qq;
    for(qq=0;qq<n;qq++)
       {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
    qq=0;
}

虽然运行通过了。。。。不过有谁能帮忙具体的解释下啊?
感觉将这个C51编译为汇编程序后,即使是两层循环应该也不会使调用出问题啊
还望高手解答~~~谢谢

使用特权

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

本版积分规则

20

主题

40

帖子

0

粉丝