专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR单片机i/o(输入/输出)端口详解

作者:未知   来源:不详   点击数:  更新时间:2013年12月27日   【字体:

 通过前面示例的讲解,已基本知道了单片机I/O端口的用法。为了更好、更深入地运用好I/O端口,下面再来详细讨论一下AVR单片机ATMega16的端口结构。
输入/输出端口(I/O端口)是单片机所能依赖进行控制的唯一通道,如果把单片机内核比作人的大脑,那I/O端口就相当于人的五官和四肢,负责着信息的获取和动作的执行,如果没有I/O端口单片机本身就变得毫无意义,因此很有必要来详细了解它们的内部结构。ATMega16的端口为具有可选上拉电阻的双向I/O端口,下面是其中某一位I/O口的内部结构图(来自于Datasheet)。
 
在上图中,Pxn就是这一位的输入/输出端口,也就是单片机的某个外部引脚。它通过PORTxn寄存器和数据总线(DATA BUS)相连。前面示例中对PORTxn的赋值其实就是通过数据总线来写这个寄存器实现的。在图中还可以看到,在Pxn和PORTxn之间实际上还串有一个门控位,如果要让PORTxn的结果输出至Pxn,那这个门控位必须得打开,而该门控位的受控信号来自于DDxn(DDRx中的一位)寄存器。通过数据总线对该寄存器位写1,就可打开门控位,让输出信号直接输出至引脚Pxn。这也正是为什么单片机引脚要处于输出状态就必须要给DDRx方向寄存器赋值1的原因所在。如果给DDxn赋值0,则门控位断开,引脚Pxn不能做为输出,只能做为输入。但输入信号可以取自两个地方,一个是直接从外部引脚Pxn来取(图中的下半部分),实际上是把外部引脚的信号锁存到PINxn寄存器中来读取;另一个则是从输出寄存器PORTxn来取(图中门控位控制信号为RRx的地方)。一般称“从外部引脚(PINxn)来取”为读引脚,称“从寄存器PORTxn来取”为读端口寄存器。
从图中还可以看出,在引脚Pxn的上方,有一个受控于MOS管的上拉电阻。而MOS管又同时受到PUD位、DDxn位和PORTxn位的共同控制。当引脚做为输入时(DDxn=0),在给PORTxn赋值1后,通过PUD就可以控制引脚是否使用上拉电阻。当PUD位为0时,上拉电阻有效,否则相反。PUD存在于寄存器SFIOR中的第2位,见下图。
 
下面几个图给出了以端口A为代表的三个寄存器配置的具体情况:
 
从图中可以看出,PORT和DDR两个寄存器为可读可写的,而PIN寄存器为只读的。对于寄存器中每一位的操作,在IAR开发环境中可以直接引用,这在第二个示例中已经阐述过了。下表给出了这几个寄存器组合配置的具体情况:
 
在使用I/O端口时还有几点需要说明一下:
1、作为通用数字I/O使用时,所有I/O端口都具有真正的读――修改――写的功能。
2、不论如何配置DDxn,都可以通过读取PINxn寄存器来获得引脚电平。
3、读取软件赋予的引脚电平时,需要在赋值指令和读取指令之间至少有一个时钟周期的间隔(可插入一条nop指令)。
4、如果某些引脚未被使用,建议还是给这些引脚赋予一个确定电平。
5、复位时,上拉电阻将被禁用,各引脚为高阻态。
6、稳定状态条件下每个I/O端口可以承受的拉电流或灌电流为:VCC=5V时为20mA、VCC=3V时为10mA。
7、所有端口拉电流或灌电流的总和不能超过400mA,且端口A、B、C、D各自的拉电流或灌电流总和不能超过200mA(在DIP封装方式下,端口B、C、D可达300mA)。
除了通用数字I/O功能之外,大多数端口引脚都还具有第二功能,这也就是所谓的端口复用。因为单片机的引脚毕竟是有限的,而且在大多数时候做为通用数字I/O口的引脚不一定全部用完,所以不必为单片机再实现其它功能而单独制作引脚。比如A/D(模/数)转换,就可不必再单独为单片机做输入引脚,而直接把这个功能附属在PORTA的I/O口上就可以了。这样PORTA的八个引脚就有了第二功能,即做为A/D转换的信号输入端。当然,在某个时刻只能使用其中的一种功能,不可能两种功能同时使用,所以才称之为复用。这里要注意,所谓的第二功能只是一种说法,有些单片机的引脚复用的很厉害,可以实现两种以上的功能。
要实现引脚的第二功能,其端口内部结构较为复杂,这里就不再进行深入探讨了,以下仅给出ATMega16单片机引脚复用的第二功能。
 
要实现端口的第二功能,当然还必须得有相关的寄存器来进行选择控制。不同的第二功能所配置的寄存器不同,配置方式也不一样,因此要根据实际情况来确定。引脚第二功能的具体使用会在后续的相关讨论中进行详细讲述

关闭窗口

相关文章