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

[复制链接]
5960|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中编译也通过了,问题一样~~~
coldra 发表于 2008-8-29 17:29 | 显示全部楼层

参考这几方面考虑

看门狗复位,程序会跳到程序初始入口
堆栈不够,导致异常
程序过度优化,某些语句不能执行
天雨粟 发表于 2008-8-29 18:30 | 显示全部楼层

提个思路:

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

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

你先改改这两个位变量,再试试!
murenxiu 发表于 2008-8-29 20:57 | 显示全部楼层

我以前也遇到过这问题

好像是堆栈溢出了,你这函数有没有重入啊?
 楼主| 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

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