我设置了带有继电器的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页)所示,但我不知道我不知道如何禁用此功能。
有没有人有任何想法我错了?
答案 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
}
}