我设置了带有继电器的Atmel Atmega32U4(使用NPN晶体管来控制对继电器的5V电源,而不是直接使用微控制器驾驶)。我想将PD4用作数字输出来控制继电器状态。由于我稍后会使用USB通信,因此我设置了一个外部晶体振荡器,因此我设置了适当的保险丝并将其他保险丝留在默认情况下。
当我运行一个非常简单的程序时,例如下面的程序,它应该只打开一次继电器,相反,我会听到继电器以约10 Hz的速度打开和关闭。
#include <avr/io.h>
int main(void)
{
// toggle PD4 as an output
DDRD |= _BV(4);
// set output high
PORTD |= _BV(4);
}
我注意到发表PORTD |= _BV(4);
线路会阻止振荡,但这当然不能解决我的问题。无论如何,似乎是在创造问题的行。
我正在使用Atmel Studio 6.2,通过Atmel-Ice程序员与JTAG进行编程。
在黑暗中进行野生刺,我想这可能与PD4的替代功能作为ICP1/ADC8
有关,如数据表中所示(第10.3.3节,P78),但我不知道如何禁用此功能。
有人有什么想法我要在哪里?
问题是看门狗计时器。将WDTON(始终打开的看门分机计时器)设置为false没有帮助解决振荡问题 - 我想将其设置为false确保它不是始终在上,但不能确保它肯定是 off 。在main()
中放置以下行确实:
MCUSR &= ~(1 << WDRF);
您还需要在脚本顶部或标题文件中导入看门狗计时器标题avr/wdt.h
:
#include <avr/wdt.h>
所以现在代码读取:
#include <avr/io.h>
#include <avr/wdt.h>
int main(void)
{
// turn off watchdog
MCUSR &= ~(1 << WDRF);
// toggle PD4 as an output
DDRD |= _BV(4);
// set output high
PORTD |= _BV(4);
// wait
while(1)
{
// do nothing
}
}