AVR ATmega32U4 数字输出上的振荡信号
Oscillating signal on a digital output of AVR ATmega32U4
我用继电器设置了我的 Atmel ATMega32U4(使用 NPN 晶体管控制继电器的 5V 电源,而不是直接用微控制器驱动它)。我想使用 PD4 作为数字输出来控制继电器的状态。由于稍后我将使用 USB 通信,我连接了一个外部 crystal 振荡器,因此我设置了适当的保险丝并将其他保险丝保留为默认值。
当我 运行 一个非常简单的程序(如下所示)时,它应该只打开一次继电器,但我听到继电器以大约 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 的替代功能有关,如 datasheet(第 10.3.3 节,第 78 页)所示的 ICP1/ADC8
,但是我不知道如何禁用此功能。
有人知道我哪里出错了吗?
问题出在看门狗定时器上。将 WDTON(看门狗定时器始终开启)保险丝设置为 false 对解决振荡问题没有帮助——我想将其设置为 false 可以确保它不是 always on,但不能确定肯定是关闭。将以下行放入 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
}
}
我用继电器设置了我的 Atmel ATMega32U4(使用 NPN 晶体管控制继电器的 5V 电源,而不是直接用微控制器驱动它)。我想使用 PD4 作为数字输出来控制继电器的状态。由于稍后我将使用 USB 通信,我连接了一个外部 crystal 振荡器,因此我设置了适当的保险丝并将其他保险丝保留为默认值。
当我 运行 一个非常简单的程序(如下所示)时,它应该只打开一次继电器,但我听到继电器以大约 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 的替代功能有关,如 datasheet(第 10.3.3 节,第 78 页)所示的 ICP1/ADC8
,但是我不知道如何禁用此功能。
有人知道我哪里出错了吗?
问题出在看门狗定时器上。将 WDTON(看门狗定时器始终开启)保险丝设置为 false 对解决振荡问题没有帮助——我想将其设置为 false 可以确保它不是 always on,但不能确定肯定是关闭。将以下行放入 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
}
}