“第三十三课--Microduino Reset/zh”的版本间的差异
(Created page with "Microduino Reset {| style="width: 800px;" |- | ==目的== 本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。 ==设备== *'''Microd...") |
|||
第17行: | 第17行: | ||
|相关硬件||数量||功能 | |相关硬件||数量||功能 | ||
|- | |- | ||
− | |可调电源|| | + | |可调电源||1个||0-30V电压可调。 |
|- | |- | ||
|万用表 ||1个||胜利仪表 VC890+。 | |万用表 ||1个||胜利仪表 VC890+。 | ||
第47行: | 第47行: | ||
</source> | </source> | ||
[[File: IO_Reset.jpg|600px|center|thumb]] | [[File: IO_Reset.jpg|600px|center|thumb]] | ||
+ | |||
*实验二:通过PC(程序计数器)指针定位到地址0处实现重启。 | *实验二:通过PC(程序计数器)指针定位到地址0处实现重启。 | ||
第72行: | 第73行: | ||
</source> | </source> | ||
[[File: PCtoZero_Reset.jpg|600px|center|thumb]] | [[File: PCtoZero_Reset.jpg|600px|center|thumb]] | ||
− | |||
再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 | 再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 | ||
第96行: | 第96行: | ||
</source> | </source> | ||
[[File: functionPointer_Call.jpg|600px|center|thumb]] | [[File: functionPointer_Call.jpg|600px|center|thumb]] | ||
+ | |||
*实验三:通过看门狗,实现Microduino的复位。 | *实验三:通过看门狗,实现Microduino的复位。 | ||
第114行: | 第115行: | ||
</source> | </source> | ||
[[File: WDT_Reset.jpg|600px|center|thumb]] | [[File: WDT_Reset.jpg|600px|center|thumb]] | ||
+ | |||
*实验四:不使用USB线供电,通过可调电源调低电压使BOD(Brown-out Reset 低压重启)电路动作,实现Microduino的复位。(实现该实验时,可不接Microduino-USBTTL) | *实验四:不使用USB线供电,通过可调电源调低电压使BOD(Brown-out Reset 低压重启)电路动作,实现Microduino的复位。(实现该实验时,可不接Microduino-USBTTL) | ||
− | + | Microduino-core的5V引脚连接可调电源+,GND连接可调电源的- (请注意:可调电源初始电压不应超过5V)。Microduino-core的D2通过100Ω电阻串接红色led,led的正极 | |
− | BOD的复位电压由熔丝位决定,程序运行过程中不可更改。下图是笔者用智峰软件配合USBasp读出的Microduino熔丝位,很明显,BOD的复位电压设定为2. | + | 接到D13。 |
+ | BOD的复位电压由熔丝位决定,程序运行过程中不可更改。下图是笔者用智峰软件配合USBasp读出的Microduino熔丝位,很明显,BOD的复位电压设定为2.7V。通过观察LED的 | ||
+ | 闪烁情况,用胜利VC890C+万用表实测复位电压为2.76V。 | ||
[[File: fuse and lock wizard.jpg|600px|center|thumb]] | [[File: fuse and lock wizard.jpg|600px|center|thumb]] | ||
<source lang="cpp"> | <source lang="cpp"> | ||
第145行: | 第149行: | ||
下载程序,观察不同的输出结果。对比不同实验以加深对Reset理解。 | 下载程序,观察不同的输出结果。对比不同实验以加深对Reset理解。 | ||
==结果== | ==结果== | ||
− | 该示例展示了Microduino的几种不同复位方法,读者可根据需求灵活运用。同时该示例未提及上电复位,实际上328芯片每次得电时都经历了上电复位的过程。Reset引脚上电容电阻二极管以及复位按键的设计读者可参考[http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf Arduino 官网提供的UNO Rev3原理图] | + | 该示例展示了Microduino的几种不同复位方法,读者可根据需求灵活运用。同时该示例未提及上电复位,实际上328芯片每次得电时都经历了上电复位的过程。Reset引脚上电容电阻二极管以及复位按键的设计读者可参考[http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf Arduino 官网提供的UNO Rev3原理图] 。读者亦可参考[http://www.atmel.com/Images/doc8161.pdf 328 Datasheet]中的46至49页,有上电复位以及其它复位方式的时序图。 |
==视频== | ==视频== | ||
|} | |} |
2014年10月3日 (五) 14:46的版本
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 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页,有上电复位以及其它复位方式的时序图。 视频 |