第三十三课--Microduino Reset/zh

来自Microduino Wikipedia
LJD讨论 | 贡献2014年10月3日 (五) 15:05的版本
跳转至: 导航搜索

Microduino Reset

目的

本教程讲解了Microduino 复位的相关知识,希望对用到的读者有些帮助。

设备

Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。

下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。

  • 其他硬件设备
相关硬件 数量 功能
可调电源 1个 0-30V电压可调。
万用表 1个 胜利仪表 VC890+。
电阻 100欧姆 1个 LED 限流。
LED 白发红 1个 指示。
USB数据连接线 1条 连通Microduino模块与计算机。

程序

  • 实验一:Microduino的D2用导线直连到RST引脚,程序中通过D2口置低电平实现Reset。
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);
}



  • 实验二:通过PC(程序计数器)指针定位到地址0处实现重启。
// 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);
}



  • 实验三:通过看门狗,实现Microduino的复位。
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
}



  • 实验四:不使用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。

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页,有上电复位以及其它复位方式的时序图。

视频