查看“第三十三课--Microduino Reset/zh”的源代码
←
第三十三课--Microduino Reset/zh
跳转至:
导航
、
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
{| style="width: 800px;" |- | ==目的== 本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。 ==设备== *'''[[Microduino-Core/zh]]''' Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。 *'''[[Microduino-USBTTL/zh]]''' 下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。 *其他硬件设备 {|class="wikitable" |- |相关硬件||数量||功能 |- |可调电源||1个||0-30V电压可调。 |- |万用表 ||1个||胜利仪表 VC890+。 |- |电阻 100欧姆 ||1个||LED 限流。 |- |LED 白发红 ||1个||指示。 |- |USB数据连接线 ||1条||连通Microduino模块与计算机。 |- |} ==程序== *实验一:Microduino的D2用导线直连到RST引脚,程序中通过D2口置低电平实现Reset。 <source lang="cpp"> 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); } </source> [[File: IO_Reset_Modify.jpg|600px|center|thumb]] *实验二:通过PC(程序计数器)指针定位到地址0处实现重启。 <source lang="cpp"> // 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 } </source> [[File: PCtoZero_Reset.jpg|600px|center|thumb]] 再扩展一下,其实通过函数指针(函数指针定义时需匹配函数返回值类型,函数参数类型),可以实现任意函数的调用。 <source lang="cpp"> 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); } </source> [[File: functionPointer_Call.jpg|600px|center|thumb]] *实验三:通过看门狗,实现Microduino的复位。 <source lang="cpp"> 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 } </source> [[File: WDT_Reset.jpg|600px|center|thumb]] *实验四:不使用USB线供电,通过可调电源调低电压使BOD(Brown-out Reset 低压重启)电路动作,实现Microduino的复位(实现该实验时,可不接Microduino-USBTTL)。 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]] <source lang="cpp"> 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); } </source> ==调试== 下载程序,观察不同的输出结果。对比不同实验以加深对Reset理解。 ==结果== 该示例展示了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页,有上电复位以及其它复位方式的时序图。 ==视频== |}
返回至
第三十三课--Microduino Reset/zh
。
导航菜单
个人工具
创建账户
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
Welcome
首页
创客大赛
大赛详情
3D打印
安装月球车
图形化编程
操控月球车
升级月球车
编程工具下载
软件下载
Arduino
Processing
Mixly
Scratch
模块套件
Microduino 102
mCookie 102
mCookie 202
mCookie 302
IBC
其他
应用套件
四轴飞行器
平衡车
小车CUBE
音乐播放器
刷卡音乐播放器
wifi气象站
彩虹音乐触摸灯
分贝检测仪
迎门汇报
LED点阵时钟
LED点阵屏幕
硬件
mCookie
Sensor
Microduino
MicroWrt
MicroNux
MicroRobot-Core
MicroRobot-CoreESP
ideaBoard
ideaBox
MicroMV
MicroAI
帮助
常见问题
帮助
工具
链入页面
相关更改
特殊页面
页面信息