打印

看I/O端口都快入魔了,请大家指点!!!!

[复制链接]
4436|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沧海之道|  楼主 | 2013-1-3 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是16f1824的I/o端口结构图:
问题1:当TRISx清零时,端口应处于输出状态,3处(即PORTx)写1数据总线上数据(数据可为0也可为1)通过D触发器被传至引脚,当PORTx写0时数据不输出
问题2:当PORTx写1时,2处读PORTx也应为1,三态们打开数据能够输入,与TRISx应无关
问题3:当ANSELx置1时,本应为模拟输入状态,但1处是与门,难道模拟值与1与后传至外设AD转换处或数据总线处(PORTx写1时 )?当ANSELx清0时,0与引脚状态值与后传至外设AD转换处或数据总线处(PORTx写1时 )
以上都成什么了,感觉很费解,是不能根据硬件分析,还是我分析的完全错误?请大家指点,救救处于迷途的我吧,快走火入魔了!

clip_image002.jpg (15.7 KB )

clip_image002.jpg
沙发
huangxz| | 2013-1-3 21:46 | 只看该作者
呵呵,示意图而已,辅助理解.至于怎么解释只有画示意图的知道了,数模混合的io口我觉的没有这么简单可以表达原理。

使用特权

评论回复
板凳
沧海之道|  楼主 | 2013-1-4 08:28 | 只看该作者
示意图应该起到有助于理解的作用吧,抛开模拟部分,哪位能给正确分析下?让我不要再疑惑了,拜谢了!

使用特权

评论回复
地板
yewuyi| | 2013-1-4 09:14 | 只看该作者
不清楚有啥问题?
1、TRISX设置为输出,此时LATX输出1则IO引脚输出高电平,LATX输出0则IO引脚输出低电平。
2、你图中2处的读PORTX为读控制信号,不是逻辑信号输入输出。
3、PIC16F182X具备LATX、PORTX、TRISX三个寄存器,LATX为PORTX的输出缓冲寄存器,IO输出信号时,操作LATX即可,读IO口电平时,读PORTX即可,这主要为了解决老芯片的读-修改-写现象而设计的。

使用特权

评论回复
5
沧海之道|  楼主 | 2013-1-4 10:10 | 只看该作者
wuyi哥,可根据那引脚结构图,LATx写1时,读LATx为1时LATx处三态门开,数据从右到左,到不了引脚处,即便TRISX设置为输出,LATX输出1则IO引脚也不会输出高电平,LATx写0时,读LATx为0时LATx处三态门关,LATX输出0则IO引脚也不会输出低电平。不符合运用,是我理解的不着边际,还是结构图错误?求分析

使用特权

评论回复
6
XIEYUANBIN| | 2013-1-4 14:07 | 只看该作者
LAT并非三态门,TRISX才是三态门。逻辑图并无错。在某些有AD的引脚,AD功能的开关也会影响TRISX的状态。

使用特权

评论回复
7
沧海之道|  楼主 | 2013-1-4 14:48 | 只看该作者
XIEYUANBIN 发表于 2013-1-4 14:07
LAT并非三态门,TRISX才是三态门。逻辑图并无错。在某些有AD的引脚,AD功能的开关也会影响TRISX的状态。 ...

谢谢指点,能帮我分析下吗?看硬件端口与写程序时不对应,感觉毛骨悚然啊,无比郁闷!

使用特权

评论回复
8
yewuyi| | 2013-1-4 15:47 | 只看该作者
LATX是个寄存器,读LATX就是读这个寄存器的数值,不是读IO口。

读PORTX才是读IO口。

TRISX是三态门的输入输出控制开关。

使用特权

评论回复
9
沧海之道|  楼主 | 2013-1-4 19:51 | 只看该作者
wuyi哥,2处画红圆圈的那个三角形符号的是三态门吗?若不是是什么?应该怎么分析它的数据流向?

使用特权

评论回复
10
yewuyi| | 2013-1-5 09:45 | 只看该作者
那个三角相当于带控制端的一个门电路,意思是由那个控制端控制将1号电路的输出传给数据总线。

使用特权

评论回复
11
沧海之道|  楼主 | 2013-1-5 11:23 | 只看该作者
yewuyi 发表于 2013-1-5 09:45
那个三角相当于带控制端的一个门电路,意思是由那个控制端控制将1号电路的输出传给数据总线。 ...

如果那样的话,那不就是读到的PORTx值控制I/O引脚的数据进入数据总线,这岂不是输入吗?是不是这个地方应该是读TRISx?当TRISx为1时处于输入状态,输出三态门高阻,才符合编程应用!wuyi哥,您看下,图是不是有误呀?

使用特权

评论回复
12
yewuyi| | 2013-1-5 13:31 | 只看该作者
沧海之道 发表于 2013-1-5 11:23
如果那样的话,那不就是读到的PORTx值控制I/O引脚的数据进入数据总线,这岂不是输入吗?是不是这个地方应 ...

3是控制输出部分,2是控制输入部分。

这是个示意图,从示意的角度说,没有错误,只是你理解不了而已。

使用特权

评论回复
13
沧海之道|  楼主 | 2013-1-5 14:32 | 只看该作者
yewuyi 发表于 2013-1-5 13:31
3是控制输出部分,2是控制输入部分。

这是个示意图,从示意的角度说,没有错误,只是你理解不了而已。 ...

我觉得2处读PORTx改为TRISx方才正确,请wuyi哥指点下,我理解时在哪个地方进入误区了?十分感谢!

使用特权

评论回复
14
yewuyi| | 2013-1-5 14:58 | 只看该作者
沧海之道 发表于 2013-1-5 14:32
我觉得2处读PORTx改为TRISx方才正确,请wuyi哥指点下,我理解时在哪个地方进入误区了?十分感谢! ...

你向LATX和TRISX写入什么数据,这两个寄存器中就是什么数据,根本不需要这些IO控制端,直接读寄存器就能得到寄存器的值,而PORTX则不同,需要从IO引脚读到外部信号的数值,此时需要控制相应的逻辑门导通将信号送进来。

使用特权

评论回复
15
沧海之道|  楼主 | 2013-1-5 15:54 | 只看该作者
谢谢wuyi哥再次讲解,通过看手册、前辈的例程、各位的回帖、特别是wuyi哥的回帖讲解,使我很清楚写程序该怎么写!但我仍然没弄懂这个结构示意图,哪位高手大神愿意抛去经验,只根据结构示意图,分析并总结下这个端口的编程写法,让我对比下,看我到底为什么得出一个与不正确的编程思路,脱离这么一个迷茫苦闷的状态!无限感谢!!

使用特权

评论回复
16
XIEYUANBIN| | 2013-1-6 18:47 | 只看该作者
仅以无AD作用的普通IO看,如果要PORTx 输出某些电平,并且读入某个IO口电平,以PORTC口为例,0,1,2,3为输出口,4,5,6,7为输入口,程序这样写:

    TRISC = 0xF0;  //设置端口方向
    LATC =  0x5A;  //此时读入 PORTC,PORTC == 0xXA ; 高4位电平不定,为当时端口实际电平输入,低4位被写入 1010b;
        TEMP  = PORTC;   //读入PORTC 口状态,TEMP 应等于 0xXA ;.二进制为 xxxx1010b;
        TEMP  = LATC;    //读入 端口锁存器 LATC ,此时 TEMP 应为 0x5A;
           

使用特权

评论回复
17
沧海之道|  楼主 | 2013-1-6 21:14 | 只看该作者
先谢谢XIEYUANBIN!可能是我没表达清楚吧,大家没能理解我的意思,等我自己某一日恍然大悟吧!最后还是谢谢各位热心的帮助!

使用特权

评论回复
18
diweo| | 2013-1-13 11:02 | 只看该作者
'TRISx',‘读PORTx’,‘读LATx’是类似的。只不过‘TRISx’上有个小圆圈起反相作用,说明它是控制信号低电平打开,而另外两个是控制信号高电平打开。
对于LZ的问题:
1:TRISx清零,三态门打开,允许信号通过,触发器的Q输出与引脚相连。这时写LATx或PORTx具有相同效果,都把数据送到输出引脚。
LZ说“当PORTx写0时数据不输出”是不对的,也输出,只不过是输出0。假设原来有个输出1的,现在写0,不输出的话那不还是1了?显然是不对的。
图中写LATx或PORTx连接到触发器CK端,而数据总线连接到D端,所以我猜测(可能不对):虽然程序里我们写LATA=0xFF,就一个语句,实际上硬件会自动帮我们处理成2步。
2:“当PORTx写1时,2处读PORTx也应为1,”,写PORTx和读PORTx是不一样的!!写PORTx实际上就写LATx,上面已经提到。而读PORTx实际上读的不是LATx了,而是真正的引脚。请仔细阅读数据手册,必要时参考PIC18或者PIC24的数据手册和参考手册。
     “三态们打开数据能够输入,与TRISx应无关”,从图上来看是这样没错。但是有个隐含的问题。如果TRISx为1,那么引脚上的电平会输入到三态门输入端,这时读PORTx能得到正确的值。但若再把TRISx设为0,那么引脚就被强制驱动为LAT的输出值,这个值不能反映外部电路的实际情况,虽然也可以读进来,但其实是没有意义的。
3:这是很基础但需要体会理解的。一个二输入与门,只有当两个输入都是1时,输出才是1,否则就是0。当ANSELx清0时,表明不论外部信号是什么情况,与门输出(至外设)都是0。这样,在功能上,相当于把模拟输入给禁止了。

使用特权

评论回复
19
沧海之道|  楼主 | 2013-1-13 15:58 | 只看该作者
diweo 发表于 2013-1-13 11:02
'TRISx',‘读PORTx’,‘读LATx’是类似的。只不过‘TRISx’上有个小圆圈起反相作用,说明它是控制信号低 ...

谢谢diweo的讲解!1和3很好的解答了我心中的疑惑,唯2处您所言:“如果TRISx为1,那么引脚上的电平会输入到三态门输入端,这时读PORTx能得到正确的值”令我依然不解。2处图中若TRISx为1,读PORTx即引脚处电平,若为1,则三态门开,引脚电平输入为1;若为0,则三态门关,引脚电平不输入;难道硬件自动辨别:为1则读为1,不为1则读为0?如此则大可不用三态们,或门足矣!请您再看下,帮我再解释下?

使用特权

评论回复
20
diweo| | 2013-1-13 18:05 | 只看该作者
本帖最后由 diweo 于 2013-1-13 18:14 编辑
沧海之道 发表于 2013-1-13 15:58
谢谢diweo的讲解!1和3很好的解答了我心中的疑惑,唯2处您所言:“如果TRISx为1,那么引脚上的电平会输入 ...

要读引脚的时候,我们这样写程序 var=PORTx。硬件上应该会自动识别这是读操作,会自动打开3处那个控制信号,使得引脚信号通过三态门到达数据总线,也就是PORTx的相应位得到了正确的数据。用或门的话就起不到隔离作用了,因为引脚上信号(不论是来自LAT还是外部电路)总能到达内部总线。

使用特权

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

本版积分规则

2

主题

12

帖子

0

粉丝