AVR ATMEGA32U4的数字输出上的振荡信号



我设置了带有继电器的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
    }
}

最新更新