打印

抓狂,所有问题竟然都是一个原因

[复制链接]
1882|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2008-11-27 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
困扰了一天,一大堆问题不能解释,结果所有的原因竟然是把keil的Memory Model设成Compact,就是默认把变量放在PDATA.

直到遇到一个现象,定义一个变量,赋值,立刻通过串口把它打印出来,没有错,什么都没有做,只是延时一段时间,再打印,立刻就变成另外一个值了.才把疑点落在这里.

那么这个PDATA到底有没有这个东西的?变量到底放到了哪里去了,怎么会过一段时间立刻就改变的呢??

相关帖子

沙发
zq1987731| | 2008-11-27 22:38 | 只看该作者

pdata用来访问存储器“页”的

    具体用P2口输出控制相关的“页”,具体值是由你自己给出的,相当于你自己用IO口来模拟地址总线的高8位输出,P0口输出0x00~0xFF的地址偏移量,这个是参照你pdata变量的地址(最大0xFF的限制就是因为P0是8位口)
    注意:如果多于一页需要在Startup.A51指明pdata的长度。

    那么你用P2输出是0x00就是选中第1页,0xFF就是256页。
    假设你现在选中了第3页,并且你的pdata指针指向的地址为0x0F,那么你实际访问的物理地址就是0x20F,这就是页面的概念。
    关于pdata,一般用得很少,除非你的数据集中在存储器的某页256字节中速度上有一点优势,或者你的存储器容量很小,比如1K,那么你可以用P2.0和P2.1连接存储器的高2位地址控制4个页面的选择,其余8跟地址线用P0口来,这样就省下6根P2口线了。不然绝对是用xdata的,就因为方便,以及访问地址范围广(0x0000~0xFFFF)...

    你碰上的问题可能就是P2口的输出被改变导致选择了不同的页面,但是从“什么都没有做”来看,这个概率不大,那么可能是你的Startup.A51中没有指明pdata的长度,这些因素加起来就导致读出的值不同....试着在读之前给P2口一个0x00,即选中第一页,然后看看是否正常,如果你的 Startup.A51中有过相关更改了,那么也可以试着选中其他页面看看...

使用特权

评论回复
板凳
箫笑|  楼主 | 2008-11-28 10:32 | 只看该作者

这些?

PPAGEENABLE     EQU     1       

PPAGE           EQU     0

PPAGE_SFR       DATA    0A0H

我觉得只是延时一段时间就跳到了别的页去的可能性不大吧?而且我说的改变之后的那个值是一直稳定的.比如我赋值给i等于0x01,一段时间后它变成0x0A,之后它一直都是0x0A,

在startup里找到上面几个,第二行是不是定义了页码是0?

有个更费解的,如果我把一个带初始化的数组定义在默认区(PDATA),芯片会要很长一段时间来启动. 做了个实验,上电就把一I/O口置高,那么我上电后可以用万用表看着那个引脚慢慢的从几十毫伏增加到高电平5V,大概花了几十秒的时间.

使用特权

评论回复
地板
zq1987731| | 2008-11-28 19:12 | 只看该作者

这个...

PAGE设置就是你所列出来的这些
PPAGEENABLE   EQU 1   ; 这个是页的使能
PPAGE         EQU 0   ; 页的初值设置,0就代表初始页码是0,可以理解为P2口的初始输出,在此需要注意keil中BL51 location选项中有让你设置pdata地址的地方,这里对应你设的地址初值,如果想让地址初值在0x4000就填40H到PPAGE EQU后面,同时把0x4000填入BL51 location的pdata中
PPAGE_SFR DATA 0A0H   ; 这里的0A0H指的是P2口的地址
========================================================
    现在按你所说的情况来看,可能是初始化不正常(BL51 location中的设置确定没搞错先)...电压慢慢升高的IO脚..建议用示波器看看其输出波形,万一是单片机正在不断得输出地址,同时你正好测的是地址脚其中之一,而地址脚上1和0的输出比较有规律,弄得跟PWM一样(开始0很多最后1很多),就可能这样..
    另外建议换个单片机试试,以防硬件有问题。

使用特权

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

本版积分规则

78

主题

368

帖子

0

粉丝