加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Arduino的定时器中断,使用出错1例

(2019-04-04 17:47:01)

Arduino的定时器中断

如果在主程序设置开启定时器,可能会出现定时器被反复开启的情况,每开启一次相当于定时器重置,导致定时器无法工作。如下图极端情况。

Arduino的定时器中断,使用出错1例
主程序只有定时器开启一项命令,这句被反复执行,导致定时器还没记完一个计时周期,就被复原,导致子程序一直不能执行,13号引脚上的LED不会闪烁。解决办法有多种。

1、开启后停止程序

Arduino的定时器中断,使用出错1例
2、在初始化阶段,设置好定时器后接着开启,不在主程序开定时器,主程序为空。

Arduino的定时器中断,使用出错1例
关于arduino定时器可以参考以下详细内容:

当你想让代码在一个固定的时间间隔后执行时,你可以很容易的用delay()函数来实现。但是,这只是让程序暂停一个特定的时间段。特别是如果你需要同时让处理器做其他处理时,这么做同时也是一种浪费。

 这时候就是定时器(Timer)和中断(Interrupt)的用武之地了。

 Arduino UNO有三个timer

 timer0 - 一个被Arduino delay() millis() micros()使用的8位定时器

timer1 - 一个被ArduinoServo()库使用的16位定时器

timer2 - 一个被ArduinoTone()库使用的8位定时器

"Arduino Mega"板有另外三个可使用的timer3,4,5,而不是只有timer0,1,2

 在以下的例子中,我们将在我们的中断使用timer1。显然,如果你用了Servo()库就会有冲突,所以你应该选择其他timer

 下面是一个基本的中断驱动程序。这是基本的LED闪光灯程序。但是现在我们用中断而不是delay()来每半秒开启和关闭LED灯一次,从而实现让LED每秒闪一次的效果。

 

 #define ledPin 13 //设置输出口为13

int timer1_counter;

void setup()

{

  pinMode(ledPin, OUTPUT);

   //初始化定时器1

  noInterrupts();           //禁止所有中断

  TCCR1A = 0;

  TCCR1B = 0;

   //为我们的中断设置timer1_counter为正确的时间间隔

  // timer1_counter = 64911; //预加载timer1 65536-16MHz/256/100Hz

  // timer1_counter = 64286; //预加载timer1 65536-16MHz/256/50HZ

  timer1_counter = 34286;    //预加载timer1 65536-16MHz/256/2Hz

   TCNT1 = timer1_counter;   //预加载 timer

  TCCR1B |= (1 << CS12);    //256 分频器(256 prescaler?)

  TIMSK1 |= (1 << TOIE1);   //启用定时器溢出中断

  interrupts();             //允许所有中断

}

 ISR(TIMER1_OVF_vect)        //常规中断服务

{

  TCNT1 = timer1_counter;   //预加载 timer

  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);

}

 void loop()

{

  //你自己的程序

}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有