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
    }
}