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

时间:2016-12-12 17:59:09

标签: io avr atmega digital-logic

我设置了带有继电器的Atmel ATMega32U4(使用NPN晶体管来控制继电器的5V电源,而不是直接用微控制器驱动它)。我想用PD4作为数字输出来控制继电器的状态。由于我稍后将使用USB通信,我已经连接了一个外部晶体振荡器,所以我设置了适当的保险丝,并将其他保险丝保留为默认值。

当我运行一个如下所示的非常简单的程序时,应该只打开继电器一次,而不是听到继电器在大约10 Hz时快速开关。

import sys
import numpy as np

fn=sys.argv[1]

d={}

with open(fn,'rb') as f:

for i,line in enumerate(f):

    if np.mod(i+1,2)==0:
        d[lastVal]=line.replace('\n','')
    else:   
        lastVal=line.replace('\n','')

print d         

我注意到#include <avr/io.h> int main(void) { // toggle PD4 as an output DDRD |= _BV(4); // set output high PORTD |= _BV(4); } 行的注释会阻止振荡,但当然这并不能解决我的问题。无论如何,这似乎是造成问题的那条线。

我正在使用Atmel Studio 6.2,通过Atmel-ICE编程器使用JTAG进行编程。

在黑暗中进行狂野刺杀,我想这可能与PD {PORTD |= _BV(4);的替代功能有关,如datasheet(第10.3.3节,第78页)所示,但我不知道我不知道如何禁用此功能。

有没有人有任何想法我错了?

1 个答案:

答案 0 :(得分:1)

问题是看门狗定时器。将WDTON(看门狗定时器始终打开)保险丝设置为假并没有帮助解决振荡问题 - 我想将其设置为假是确保它总是在上,但不是&# 39;确保它确实关闭。将以下行添加到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
    }
}