基于通用数字I/O的端口
发表:2023-08-29 12:05:35 阅读:68

ATmegal 28有5 3个I/O引脚,分成7个8位端口A~G。所有端Vl都是具有上拉电阻(可选的功能)的双向I/O。图2-11为一个I/O端口引脚。

每个端口引脚都具有3个寄存器位:DDxn、PORTxn和PINxn。DDxn位于DDRx寄存器,PORTxn位于PORTx寄存器,PINxn位于PINx寄存器。

 

在ATmegal03兼容模式下,DDRC和PINC寄存器初始化为输出低电平。即使在没有时钟的情况下口线也将保持初始值。要注意的是,在ATmegal 03兼容模式下DDRC和PINC寄存器是不可见的。为了保持l00%的向后兼容,请不要在ATmegal03兼容模式下访问这两个寄存器。

DDxn来选择引脚的方向,当DDxn为“l"’时,Pxn配置为输出;否则,为输入。

当引脚配置为输入时,若PORTxn为“l’’,上拉电阻将使能。如果需要关闭这个上拉电阻,可以将PORTxn清零,或者将这个引脚配置为输出。复位时各引脚为三态,即使此时没有时钟在运行。

当引脚配置为输出时,若PORTxn为“l’’,引脚输出高电平(“1’’);否则,输出低电平(“0’’)。表2—2总结了引脚的配置。

 

Bit Z——PUD:禁止上拉电阻

置位时,即使将寄存器DDxn和PORTxn配置为使能上拉电阻({DDxn,PoRTxn}=Ob01),I/o端El的上拉电阻也被禁止。

在(高阻态)三态({DDxn,PORTxn}=0b00)与输出高电平({DDxn,PORTxn}=0 b1 1)两种状态之间进行切换时,上拉电阻使能({DDxn.P()RTxn}=O b0 1)或输出低电平({DDxn,PORTxn)=0b1 0)这两种模式必然会有一个发生。通常,上拉电阻使能是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。如果使用情况不是这样,则可以通过置位SFIOR寄存器的PUD来禁止所有端口的上拉电阻。

在上拉输入和输出低电平之间切换也有同样的问题。用户必须选高阻态({DDxn,PORTxn)=0b00)或输出高电平({DDxn,PORTxn}=0 b1 1)作为中间步骤。

不论如何配置DDxn,都可以通过读取PINxn寄存器来获得引脚电平。如图2—1 2所示,PINxn寄存器的各个位与其前面的锁存器组成了一个同步器,这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定;其缺点是引人了延时。图2—1 2为读取引脚数据时同步器的时序图。最大和最小传输延时分别为tpd.max和tpd.min。

下面考虑第1个系统时钟下降沿之后起始的时钟周期。当时钟信号为低时.锁存器是关闭的;而时钟信号为高时,信号可以自由通过,如图2—1 2中SYNC l.,ATC H信号的阴影区所示:时钟为低时信号即被锁存,然后在紧接着的系统时钟上升沿锁存到PINxn寄存器。如tpd.max和tpd.min示,引脚上的信号转换延时界于0.5"~1.5个系统时钟.如同2-13所示,读取软件赋予的引脚电平时需要在赋值指令out和读取指令in之间有一个时钟周期的间隔,女口nop指令。out指令在时钟的上升沿置位SYNC LATCH信号,此时同步器的延时时间tpd为一个系统时钟。下面的例子演示了如何置位端口B的引脚o和1,清零引脚2和3.以及将引脚4~7设置为输入,并且为引脚6和7设置上拉电阻,然后将各个引脚的数据读回来。如前面讨论的那样,我们在输出和输入语句之间插入了一个nop指令。

 

 

电子街推荐您阅读:

ATmegal28 SRAM数据存储器 

ATmegal28的I/O寄存器 

I/O端口描述

推荐品牌: