51-PIC-ARM的I/O口比较(希望大家补充)

[复制链接]
5789|9
 楼主| 兰天白云 发表于 2007-7-25 07:38 | 显示全部楼层 |阅读模式
ARM, I/O, pic, IO, se
51-PIC-ARM的I/O口比较(希望大家补充)<br />**********************<br />51的I/O口:<br />1:准双向口<br />2:单独控制I/O口输出的置位或清零(位方式CLR,SETB)<br />3:复位后上拉成高电平,可以用做输入<br />4:带载能很弱(未考虑变异产品)<br />P1等直接控制<br /><br />**********************<br />PIC的I/O口:<br />1:真正的双向口<br />2:单独控制I/O口输出的置位或清零(位方式BSF,BCF)<br />3:所有I/O口在复位后默认为输入<br />4:带载能力强<br />由2个寄存器控制(忽略其他功能)以PORTC为例<br />TRISC:I/O口方向控制寄存器&nbsp;输入为1,输出为0<br />PORTC:I/O引脚值寄存器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />***********************<br />ARM7的I/O口:<br />1:真正的双向口<br />2:单独控制I/O口输出的置位或清零(其实还是字方式)<br />3:所有I/O口在复位后默认为输入<br />4:带载能力不强<br />由4个寄存器控制(忽略其他功能)<br />IOPIN:IO引脚值寄存器,引脚的当前状态可从该寄存器中读出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(不管I/O口是输入还是输出)其实PIC的也一样<br />IOSET:I/O输出置位寄存器,写入1输出高电平,写入0无效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好象不存在读-修改-写的问题,这个比较特殊<br />IOCLR:I/O输出清0寄存器,作用同上<br />IODIR:I/O口方向控制寄存器(同PIC的TRISC等)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入为0,输出为1(同PIC的相反)<br />注:IOSET与IOCLR是一对<br />***************<br />***************<br /><br /><br />I/O口优缺点(个人愚见):<br /><br />1:输出1或0<br />&nbsp;&nbsp;&nbsp;51:&nbsp;SETB&nbsp;P1.0<br />&nbsp;&nbsp;&nbsp;PIC:BSF&nbsp;&nbsp;PORTC,0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;或<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;&nbsp;PORTC,0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要注意其他端口的情况(读-修改-写的问题)<br />&nbsp;&nbsp;&nbsp;ARM:如要求在P0.0输出1,只要IO0SET=0x00000001即可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不用担心其他引脚的情况<br />2:取反(例对第0位)<br />&nbsp;&nbsp;&nbsp;51:&nbsp;可以用异或也可用取反(因为有布尔取反指令)<br />&nbsp;&nbsp;&nbsp;PIC:用异或&nbsp;PORTB=PORTB^0x01;<br />&nbsp;&nbsp;&nbsp;ARM:只能分开搞了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(IO0SET&0x00000001==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{IO0SET=0x00000001;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{IO0CLR=0x00000001;}<br />3:同时改变P0口的某几位为1,某几位为0<br />&nbsp;&nbsp;&nbsp;如原P0=0x00000055,现要求P0=0x000000aa<br />&nbsp;&nbsp;&nbsp;51:&nbsp;P0=0xaa;<br />&nbsp;&nbsp;&nbsp;PIC:PORTC=0xaa;<br />&nbsp;&nbsp;&nbsp;ARM:比较麻烦了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写法1:IO0SET=0x0000aaaa<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=0xffff5555<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不但要分2次写,而且还出现了中间状态<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种情况在51和PIC中是不会出现的<br />4:读I/O口状态<br />&nbsp;&nbsp;&nbsp;51:&nbsp;必须先对端口写1(SETB&nbsp;&nbsp;P1.0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后再判断是1还是0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PIC:先设为输入,然后判断<br />&nbsp;&nbsp;&nbsp;ARM:先设为输入,然后判断<br /><br />4:驱动能力<br />&nbsp;&nbsp;&nbsp;51最低,PIC最强<br />&nbsp;&nbsp;&nbsp;例:在I/O口与地间接一个100欧的电阻<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I/O口输出1,然后读此I/O口,只有PIC可读回高电平<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果ARM读的是IOSET则读到高电平,如果读IOPIN则读到<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;低电平,输出和实际电平不符
martin 发表于 2007-7-25 10:10 | 显示全部楼层

客观!赞一个!

补充一丁点,PIC的18及以上系列的IO还有LATx寄存器。
mcubest 发表于 2007-7-31 22:41 | 显示全部楼层

总结很好,学习!

  
w321 发表于 2007-8-1 16:32 | 显示全部楼层

PIC的带载能力的确不错!

  
李丰涛 发表于 2007-8-2 14:48 | 显示全部楼层

PIC比51的数据寄存器多很多,而且用起来超方便!

  
 楼主| 兰天白云 发表于 2007-8-3 08:45 | 显示全部楼层

寄存器的位寻址是PIC的强项

18FXXX的有LATx(输出锁存),但我从未使用,有用过的朋友说说感受
su_mj000 发表于 2007-8-4 11:32 | 显示全部楼层

2:取反(例对第0位)

2:取反(例对第0位)<br />&nbsp;&nbsp;&nbsp;51:&nbsp;...<br />&nbsp;&nbsp;&nbsp;PIC:用异或&nbsp;PORTB=PORTB^0x01;<br /><br />对于PIC18系列,有专门的取反指令:<br /><br />&nbsp;&nbsp;&nbsp;BTF&nbsp;LATB,&nbsp;0<br />
dcp 发表于 2007-8-24 13:23 | 显示全部楼层
pppking 发表于 2007-8-28 15:20 | 显示全部楼层

聊一聊ARM的IOSET和IOCLR

只有将IOSET的相应位设置为1时,该IO口才输出1<br />只有将IOCLR的相应位设置为1时,该IO口才输出0<br /><br />为什么这么设置?<br />答:方便修改单个IO的输出<br /><br />取反很确实比较麻烦?<br />答:是的<br /><br />这么麻烦为什么还要这第搞?<br />答:控制系统对IO输出的操作一般都非常频繁(尤其是遇到使用IO模拟外部总线时),而ARM的主频及性能都很优秀(相对相说),适用于较为复杂的控制场合,在这种场合下,更多的工程师会使用实时操作系统。<br />&nbsp;&nbsp;&nbsp;&nbsp;如果IO口的设置与PIC一样,当某一个进程设置某些IO口时就不得不采用性号量保护或关闭系统中断。这非常浪费CPU资源。<br />&nbsp;&nbsp;&nbsp;&nbsp;在使用了IOSET和IOCLR之后,每个进程对自已管理的那部分IO就可以“肆无忌惮”地操作了。
5_0_5 发表于 2007-8-30 12:51 | 显示全部楼层

PIC位操作不错

另外其中的&nbsp;读-修改-写&nbsp;功能不知道是否在什么特殊的应用领域中有应用,作为普通用户感觉不是很爽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

2961

帖子

7

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