在我的代码的初始化例程中,我用于执行以下操作:
clr r0 ; will always stay zero
和:
out PORTA, r0; initialize ports
out DDRA, r0
out PORTB, r0
...
这真的有必要吗?还是可以确定重置后自动完成此操作?特别是,我是否可以默认将所有端口设置为输入,以便在不执行任何代码时外部电压没有问题?
在我的代码的初始化例程中,我用于执行以下操作:
clr r0 ; will always stay zero
和:
out PORTA, r0; initialize ports
out DDRA, r0
out PORTB, r0
...
这真的有必要吗?还是可以确定重置后自动完成此操作?特别是,我是否可以默认将所有端口设置为输入,以便在不执行任何代码时外部电压没有问题?
Answers:
复位后,AVR的I / O端口设置为INPUT /三态/ Hi-Z(DDRx = 0x00)。大多数微控制器(如果不是全部?)都有此行为。插入引脚是最安全的状态。因此,可以,您可以依靠端口将其自动设置为输入。
ATmega16的一些摘录准确地表明:
复位条件生效时,即使时钟未运行,端口C引脚也处于三态。
不管数据手册说什么,端口初始化总是一个好主意。
如果数据表什么也没说,那么这是一个至关重要的想法。
如果您关心程序运行时将发生的情况,则仅需要定义端口数据内容。
如果您不关心结果,则不必设置端口数据位:-)。
如果制造商在数据表中明确说过设置或清除了端口数据位,则可能是它们,但无论如何都要自己进行初始化还是一个非常好的主意。“边界条件”是大多数事情出错的地方-例如循环的开始,循环的结束,循环缓冲区包装圆点,...。处理器启动与硬件等效。在一个充满噪音,故障和人员的现实世界中,尽可能多地负责程序的命运是一个好主意。端口初始化是其中的简单部分。
复位后,寄存器和SRAM都不会初始化,只有一些外设寄存器才会初始化。您应该初始化您使用的东西。
UCSRC
在数据表中找到了一些“初始值” 。I / O端口,尤其是数据方向如何?