论坛风格切换切换到宽版
  • 4580阅读
  • 20回复

关于P0口的问题? [复制链接]

上一主题 下一主题
离线qingdao_569
 
发帖
11
只看楼主 倒序阅读 0楼 发表于: 2008-01-23
我的电路是这样的p0口和外部ram io口,cpld io口(作为输入口),1k上拉电阻连接起来,现在我把p0口赋值为0x01,然后启动cpld读取外部ram的数据,读取结果竟然是正确的,也就是说数据没有被p0口拉低,这是为什么?

上个模块图,sch图就不上了。
离线FMer
发帖
2549
只看该作者 1楼 发表于: 2008-01-23
不知道你说什么.上图才是硬道理.
离线BD7IAV
发帖
6229
只看该作者 2楼 发表于: 2008-01-23
我知道你说什么,但我不懂
离线qingdao_569
发帖
11
只看该作者 3楼 发表于: 2008-01-23
cpu我换了at89c52的了,但是在p0口赋值为0x01的情况下,cpld读入的数据还是正确的,也就是没有被拉低,哪位大侠能分析原因?
离线albert
发帖
4807
只看该作者 4楼 发表于: 2008-01-24
上万用表测量下,看是mcu还是cpld没按常理出牌
离线qingdao_569
发帖
11
只看该作者 5楼 发表于: 2008-01-24
cpld是输入的啊,假如ram输出是高祖态的话,p0输出0x00的时候测到低电平。
离线小比尔/5
发帖
2582
只看该作者 6楼 发表于: 2008-01-24
是不是排阻接错了?
离线BG7TBL
发帖
2965
只看该作者 7楼 发表于: 2008-01-24
[quote=qingdao_569]cpu我换了at89c52的了,但是在p0口赋值为0x01的情况下,cpld读入的数据还是正确的,也就是没有被拉低,哪位大侠能分析原因?[/quote]
如果是用at89c52控制cpld读写,读出的数据应该不是0x01,因为p0口是分时复用的.如果单独运行一个p0=0x01的指令,那么用万用表应该能测量出0x01;
离线qingdao_569
发帖
11
只看该作者 8楼 发表于: 2008-01-24
引用:
作者qingdao_569
cpu我换了at89c52的了,但是在p0口赋值为0x01的情况下,cpld读入的数据还是正确的,也就是没有被拉低,哪位大侠能分析原因?


如果是用at89c52控制cpld读写,读出的数据应该不是0x01,因为p0口是分时复用的.如果单独运行一个p0=0x01的指令,那么用万用表应该能测量出0x01;

现在不是cpu读取数据,是cpld读取数据
离线qingdao_569
发帖
11
只看该作者 9楼 发表于: 2008-01-24
而且我觉得端口读写上面的问题比较奇怪,比如我用下面的语句
while(p10)
{}
来检测p10口是否为低的话,它应该是读锁存器,而不是读端口,但在使用的时候确实能够检测端口。
离线qingdao_569
发帖
11
只看该作者 10楼 发表于: 2008-01-24
实测了一下:
p0 = 0x00,ram io口有输出:p0引脚:1.04v
p0 = 0x00,ram io口高阻态:p0引脚:0.27v
p0 = 0xff,ram io口有输出:p0引脚:2.45v
p0 = 0xff,ram io口高阻态:p0引脚:4.48v

谁能分析一下啊?
离线qingdao_569
发帖
11
只看该作者 11楼 发表于: 2008-01-24
实测了一下,现在去掉上拉电阻,ram 输出ff:
p0 = 0x00,ram io口有输出:p0引脚:2.0v
p0 = 0x00,ram io口高阻态:p0引脚:0.27v
p0 = 0xff,ram io口有输出:p0引脚:4.5v
p0 = 0xff,ram io口高阻态:p0引脚:4.48v

谁能分析一下啊?
离线FMer
发帖
2549
只看该作者 12楼 发表于: 2008-01-25
你是要p0口的地址还是数据?如果要地址的话,需要一个地址锁存器,地址数据是瞬间输出的,不锁存不行.或者你不想用锁存就要和ale信号同步才读得到.而且你的写法是在往p0口送数据,不是送地址.
离线qingdao_569
发帖
11
只看该作者 13楼 发表于: 2008-01-25
我觉得你没有明白我的意思,我现在不是需要cpu去读取ram,而是cpld去读取ram,给p0口赋值为0xff的本意是希望它不要把ram输出的数据拉低了。现在的情况是ram能把p0口拉低,而p0口并不能把ram拉低,最多就到2v
离线BG4UVR
发帖
11288
只看该作者 14楼 发表于: 2008-01-25
[quote=qingdao_569]我觉得你没有明白我的意思,我现在不是需要cpu去读取ram,而是cpld去读取ram,给p0口赋值为0xff的本意是希望它不要把ram输出的数据拉低了。现在的情况是ram能把p0口拉低,而p0口并不能把ram拉低,最多就到2v[/quote]

你到现在也没明白,p0口本来就是在分时复用的,如果不锁存,怎么可能一直拉低呢……

还有用万用表去量复用的p0口电平,有意义么?

没有么?有么?没有么?研究下而已,何必太认真~   有么?
离线FMer
发帖
2549
只看该作者 15楼 发表于: 2008-01-25
如果数据总线不全是oc或者od状态,你是拉不低的..会出现半电平.....
离线小比尔/5
发帖
2582
只看该作者 16楼 发表于: 2008-01-25
[quote=qingdao_569]而且我觉得端口读写上面的问题比较奇怪,比如我用下面的语句
while(p10)
{}
来检测p10口是否为低的话,它应该是读锁存器,而不是读端口,但在使用的时候确实能够检测端口。[/quote]
如果是读引脚,那么读的是端口
离线小比尔/5
发帖
2582
只看该作者 17楼 发表于: 2008-01-25
[quote=qingdao_569]我觉得你没有明白我的意思,我现在不是需要cpu去读取ram,而是cpld去读取ram,给p0口赋值为0xff的本意是希望它不要把ram输出的数据拉低了。现在的情况是ram能把p0口拉低,而p0口并不能把ram拉低,最多就到2v[/quote]

原来我觉得可能是上拉电阻太小,p0拉不动,但想想自己还没有遇到过这样的情况。
我觉得楼上说的有道理,看一下ram是互补输出的还是开漏(开集)输出。
要不这样试试,在某根ram数据线上串一个1n4148二极管,负极朝ram,正极朝p0,然后接上上拉电阻,试试那根数据线正不正常。
离线qingdao_569
发帖
11
只看该作者 18楼 发表于: 2008-01-25
我现在觉得这样解释是可以的,就是说ram输出为1的话相当于vcc,而p0输出为0的话相当于gnd,所以现在是把vcc和gnd直接连接起来了输出的是一个中间电平。
离线oxalis
发帖
958
只看该作者 19楼 发表于: 2008-01-28
'
你是要p0口的地址还是数据?如果要地址的话,需要一个地址锁存器,地址数据是瞬间输出的,不锁存不行.或者你不想用锁存就要和ale信号同步才读得到.而且你的写法是在往p0口送数据,不是送地址.
'
正解!