AVR单片机IO口结构和上拉和下拉电阻的作用
五、AVR单片机IO口(千呼万唤始出来)
本文引用地址:https://www.eepw.com.cn/article/201811/394646.htm端口引脚配置
DDxn PORTxn PUD (in SFIOR) I/O 上拉电阻 说明
0 0 X 输入 No 高阻态 (Hi-Z)
0 1 0 输入Yes 被外部电路拉低时将输出电流
0 1 1 输入 No 高阻态(Hi-Z)
1 0 X 输出 No 输出低电平 ( 漏电流)
1 1 X 输出 No 输出高电平 ( 源电流)
//////////////////////////////////////////

输入状态:
一、上拉输入状态:
1、在IO口线悬空时读入PINxn的值为1,状态稳定
2、在IO口线外接输入信号时读入PINxn的值随外部信号高低电平变化而变化
二、高阻输入状态:
1、在IO口线悬空时读入PINxn的值为0,且极易受到干挠,状态很不稳定
2、外接上拉电阻,在IO口线外接输入信号时读入PINxn的值随外部信号高低电平变化而变化(等同于内接上拉电阻)
输出状态:
在输出状态下,PORTxn=0则输出为低电平,PORTxn=1则输出为高电平
1、输出低电平,IO口线悬空时读入PINxn的值为0
2、输出低电平,IO口线连接VCC或强上拉(指上拉阻值很小,相当于直接连接VCC,能提供足够的上拉电流)时读入PINxn的值为1
3、输出高电平,IO口线悬空时读入PINxn的值为1
4、输出高电平,IO口线连接GND或强下拉(指下拉阻值很小,相当于直接连接GND,能吸收足够的下拉电流)时读入PINxn的值为0
由于无论如何配置DDRxn,我们都可以读取PINxn值,综上所述,我们在读取PINxn的值时,要想获得正确且稳定的值,
应该选择在内部上拉输入或高阻输入且外部上拉这两种方式中进行。当然在选择内部上拉输入且外部也上拉的方式也是
可以的,只是内部和外部都加上拉(重复上拉)没有什么意义。
还有一点就是我们在读取软件赋予的电平时,读PINxn值之前,要插入一个NOP。
也就是说在IO口输出逻辑电平之后再读入这个输出的值中间应插入一个NOP。
AVR的真正双向IO结构就复杂多了,单是控制端口的寄存器也有4个
PORTx.DDRx,PINx,SFIOR(PUD位),不过功能也强劲多了
作为通用数字I/O 使用时,所有AVR I/O 端口都具有真正的读- 修改- 写功能。
这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会无意地改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC 和地相连。
* (很多数字器件都有保护二极管,在低功耗应用时要考虑保护二极管的电流倒灌的影响)
每个端口都有三个I/O 存储器地址:
数据寄存器 –PORTx
数据方向寄存器–DDRx
端口输入引脚 –PINx。
数据寄存器PORTx和数据方向寄存器DDRx为读/ 写寄存器,而端口输入引脚PINx为只读寄存器。
但是需要特别注意的是,对PINx 寄存器某一位写入逻辑"1“ 将造成数据寄存器相应位的数据发生"0“ 与“1“ 的交替变化。
当寄存器MCUCR 的上拉禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。
在( 高阻态) 三态({DDxn, PORTxn} = 0b00) 输出高电平({DDxn, PORTxn} = 0b11) 两种状态之间进行切换时,
上拉电阻使能({DDxn, PORTxn} = 0b01) 或输出低电平({DDxn,PORTxn} = 0b10) 这两种模式必然会有一个发生。
通常,上拉电阻使能是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。
如果使用情况不是这样子,可以通过置位SFIOR 寄存器的PUD 来禁止所有端口的上拉电阻。
在上拉输入和输出低电平之间切换也有同样的问题。
用户必须选择高阻态({DDxn,PORTxn} = 0b00) 或输出高电平({DDxn, PORTxn} = 0b10) 作为中间步骤。
评论