历史上的今天
今天是:2025年02月05日(星期三)
2020年02月05日 | AVR的I/O用法笔记
2020-02-05 来源:eefocus
AVR的I/O有三个寄存器,DDRX,PORTX,PINX。
DDRX 方向,DDRX=1,输出;DDRX=0,输入。
例如设置PA0口为输入,即可写成DDRA&=~(1<
PORTX 分两种情况
如果DDR=1,即在输出状态的话,那么通过设置PORTX的值改变IO端口的电平
如果DDR=0,即在输入状态的话,那么PORT=1则使能上拉电阻,否则不使能。
PINX 此寄存器表示了该端口的实际电平,所以读I/O口的话,应该读PINX,而不是PORTX。
每个I/O口可以输出或吸纳20mA的电流,这一点在设计上要注意。
比如连接LED,键盘等。
以LED为例,LED上的压降是2v左右,正常的工作电流应该是10mA-20mA,可以通过此计算限流电阻的值。
如供电电压为5V,则限流电阻应为(5-2)/10mA=300(Ohm).
一旦将I/O口的工作方式设为输入方式后,必须等待一个时钟周期才能正确读到PIN值。
AVR单片机复位之后所有的I/O均为输入方式,上拉电阻不使能,所以呈现三态高阻输入态。
AVR的I/O寄存器被分配在SRAM地址空间中,可以通过IN、OUT、SBI、CBI这些指令直接访问I/O寄存器,也可以通过访问SRAM访问它们。
如数据手册中所示,例如PORTA,前面的$1B是I/O寄存器的空间地址,括号内的$3B是数据存储器的实际映射地址。
可以通过SBI和CBI指令方便地设置某一位,但是只能对$00-$1f即前32个I/O寄存器进行这种操作。
例如SBI 0x1B,0即是设置PORTA0为1,在速度要求很高的情况下可以直接嵌入这种汇编语句。
上一篇:AVR单片机I²C总线实验
下一篇:AVR使用手记
史海拾趣
|
应用很简单,2003输入接MCU的IO,输出接一个加热丝(加热丝电阻100欧姆左右),现在的现象是不管MCU的IO是什么信号,加热丝都一直进行加热。现在批量生产的10台机器中有一台出现了这个问题,是元件本身的问题,还是电路的问题呢,小弟很着急,请大 ...… 查看全部问答> |
|
我在PB4.2下定制WINCE,build时出现1个错误,系统提示参考WINCE420目录下的build.err文件,文件的内容如下: Starting sysgen phase for project ( common ) Found localized resources for Languages ( 0404 0407 040C 0410 0411 0412 0413 041 ...… 查看全部问答> |
|
u-boot引导linux,在出现如下问题后就不动了……请求帮助! 网上有两种解决方案: 一是串口的问题,即ttySAC0; 二是时钟频率的问题。 这两个我都排除了,但还是不行! 出现的问题如下: Starting kernel ... Uncompressing Linux................................................................... ...… 查看全部问答> |
|
请问:如果某一个timer到时间而没有被关闭,将会有什么结果产生? 我是这样想: 设置并且启动timer后,timer开始计时,一旦指定的延时结束,函数立即被调用。 可是如果timer到时间没有被关闭,将会产生什么样的结果呢? 请高手们帮助解答一下… 查看全部问答> |
|
现象:使用查询模式能够实现正常收发,使用串口中断时,没有中断时,在主程序循环中正常运行,如果收到字符,不是跳到USART1_IRQHandler,而是跳到了 HardFaultException中断,可能是哪里的原因,如果说硬件有问题,可查询模式很正常。请高手 ...… 查看全部问答> |
|
STM32F103VE 能从电脑上看到USB盘符,文件也能读出,速度也不慢。 可就是一往上写就不行,提示超时错误。 用USBlyer抓包,一大堆都是success,只有一个Remova Relation 显示Not surportted. 只要一写,就卡住。。。。。。N久后说设备超时 ...… 查看全部问答> |




