“第三十三课--Microduino Reset/zh”的版本间的差异
第69行: | 第69行: | ||
Serial.println(); | Serial.println(); | ||
delay(2000); | delay(2000); | ||
− | myReset();//if we call setup(); directly , the testNumber will be 7 | + | myReset();//if we call setup(); directly , the print testNumber will be 7 always |
} | } | ||
</source> | </source> | ||
第87行: | 第87行: | ||
Serial.println("This is loop function print"); | Serial.println("This is loop function print"); | ||
delay(2000); | delay(2000); | ||
− | myCall();//the same as direcly call myTest(); | + | myCall();//the same as direcly call myTest(); |
} | } | ||
void myTest(void) | void myTest(void) |
2014年10月3日 (五) 14:54的版本
Microduino Reset
目的本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。 设备Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。 下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。
程序
void setup()
{
Serial.begin(9600);
Serial.println("This is setup function print");
delay(2000);
}
void loop()
{
Serial.println("This is loop function print");
delay(2000);
pinMode(2,OUTPUT);
digitalWrite(2,LOW);
}
// use this method ,when reset, bootloader area will not be performed.
void(* myReset)(void)=0;//myReset 是一个指向函数的指针变量
int testNumber=9;
void setup()
{
Serial.begin(9600);
Serial.println("This is setup function print");
Serial.println(testNumber);
Serial.println();
delay(2000);
}
void loop()
{
testNumber=7;
Serial.println("This is loop function print");
Serial.println(testNumber);
Serial.println();
delay(2000);
myReset();//if we call setup(); directly , the print testNumber will be 7 always
}
再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 void(* myCall)(void)=myTest;//函数指针myCall指向myTest函数
void setup()
{
Serial.begin(9600);
Serial.println("This is setup function print");
delay(2000);
}
void loop()
{
Serial.println("This is loop function print");
delay(2000);
myCall();//the same as direcly call myTest();
}
void myTest(void)
{
Serial.println("This is myTest function print");
delay(2000);
}
void setup()
{
Serial.begin(9600);
Serial.println("This is setup function print");
WDTCSR |= (1<<WDCE) | (1<<WDE);//if we want to modify the WDT time,this line is needed.
WDTCSR =(1<<WDE) |(1<<WDP2) | (1<<WDP1);// please refer the 328 datasheet (WDP3~0 ) 0 1 1 0 -- cycles 1.0 s
}
void loop()
{
//while(1);
delay(1200);//change this value (800 for example) to have a try
asm("wdr"); //feed
}
Microduino-core的5V引脚连接可调电源+,GND连接可调电源的- (请注意:可调电源初始电压不应超过5V)。Microduino-core的D2通过100Ω电阻串接红色led,led的正极 接到D13。 BOD的复位电压由熔丝位决定,程序运行过程中不可更改。下图是笔者用智峰软件配合USBasp读出的Microduino熔丝位,很明显,BOD的复位电压设定为2.7V。通过观察LED的 闪烁情况,用胜利VC890C+万用表实测复位电压为2.76V。 void setup()
{
pinMode(2,OUTPUT);
digitalWrite(2,LOW);//D2 connect the led negative.
pinMode(13,OUTPUT);
for(int i=0;i<5;i++)
{
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
}
void loop()
{
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
delay(100);
}
调试下载程序,观察不同的输出结果。对比不同实验以加深对Reset理解。 结果该示例展示了Microduino的几种不同复位方法,读者可根据需求灵活运用。同时该示例未提及上电复位,实际上328芯片每次得电时都经历了上电复位的过程。Reset引脚上电容电阻二极管以及复位按键的设计读者可参考Arduino 官网提供的UNO Rev3原理图 。读者亦可参考328 Datasheet中的46至49页,有上电复位以及其它复位方式的时序图。 视频 |