“第三十三课--Microduino Reset/zh”的版本间的差异
853387039@qq.com(讨论 | 贡献) |
|||
(未显示2个用户的7个中间版本) | |||
第1行: | 第1行: | ||
− | |||
{| style="width: 800px;" | {| style="width: 800px;" | ||
|- | |- | ||
第6行: | 第5行: | ||
本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。 | 本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。 | ||
==设备== | ==设备== | ||
− | *'''[[Microduino-Core]]''' | + | *'''[[Microduino-Core/zh]]''' |
Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。 | Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。 | ||
− | *'''[[Microduino-USBTTL]]''' | + | *'''[[Microduino-USBTTL/zh]]''' |
下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。 | 下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。 | ||
第46行: | 第45行: | ||
} | } | ||
</source> | </source> | ||
− | [[File: | + | [[File: IO_Reset_Modify.jpg|600px|center|thumb]] |
+ | |||
+ | |||
第66行: | 第67行: | ||
testNumber=7; | testNumber=7; | ||
Serial.println("This is loop function print"); | Serial.println("This is loop function print"); | ||
− | Serial.println(testNumber); | + | Serial.println(testNumber); |
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> | ||
[[File: PCtoZero_Reset.jpg|600px|center|thumb]] | [[File: PCtoZero_Reset.jpg|600px|center|thumb]] | ||
+ | |||
再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 | 再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 | ||
第87行: | 第89行: | ||
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) | ||
第96行: | 第98行: | ||
</source> | </source> | ||
[[File: functionPointer_Call.jpg|600px|center|thumb]] | [[File: functionPointer_Call.jpg|600px|center|thumb]] | ||
+ | |||
+ | |||
第117行: | 第121行: | ||
− | *实验四:不使用USB线供电,通过可调电源调低电压使BOD(Brown-out Reset 低压重启) | + | |
+ | |||
+ | *实验四:不使用USB线供电,通过可调电源调低电压使BOD(Brown-out Reset 低压重启)电路动作,实现Microduino的复位(实现该实验时,可不接Microduino-USBTTL)。 | ||
Microduino-core的5V引脚连接可调电源+,GND连接可调电源的- (请注意:可调电源初始电压不应超过5V)。Microduino-core的D2通过100Ω电阻串接红色led,led的正极 | Microduino-core的5V引脚连接可调电源+,GND连接可调电源的- (请注意:可调电源初始电压不应超过5V)。Microduino-core的D2通过100Ω电阻串接红色led,led的正极 | ||
− | + | 接到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"> |
2014年11月5日 (三) 07:08的最新版本
目的本教程讲解了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页,有上电复位以及其它复位方式的时序图。 视频 |