极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23786|回复: 4

怎么在一个程序中调用2两个定时器中断函数

[复制链接]
发表于 2015-2-9 21:16:47 | 显示全部楼层 |阅读模式
大家好,我使用FlexiTimer2库,想要根据超声测距的结果,改变LED点阵闪烁的时间(注意是点阵,所以无法状态取反),同时还要其他程序要是处理,它们必须实时扫描。延时函数不合适,中断是我能想到的方法,可是,怎么调用2个中断函数呢?(一个用来开点阵,一个用来关点阵)或者你们有其他方法解决我描述的问题?
希望得到帮助,感谢!
回复

使用道具 举报

发表于 2015-2-10 14:13:39 | 显示全部楼层
只要一个中断就可以了,
设一个全局变量,在外面控制是关还是开就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-10 18:37:13 | 显示全部楼层
本帖最后由 jxwns 于 2015-2-10 18:40 编辑
Pyrrhus 发表于 2015-2-10 14:13
只要一个中断就可以了,
设一个全局变量,在外面控制是关还是开就行了。


感谢,这一点我已经明白了,我是在中断函数里设置一个逻辑变量,用if语句选择是开还是关,在中断函数末尾使逻辑变量状态取反,实现了一个中端函数完成开关的交替。

现在的问题是不论是FlexiTimer2库(Ms timer2)还是timer库(http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:timer)他们在设置中断时间是总是放在set()函数里,但是我想要根据超声传感器的数值相应的改变定时时间,这就要将设定中断事件的语句放在loop()函数里。可是当我这么做的时候,定时器并没有正常工作。

  1. /*我上传的代码是整个代码的一部分,但是对于LED点阵来说他是完整的。运行的结果是闪烁的频率并没有根据超声传感器得到的结果作出改变。*/
  2. int delaytime = 2000;
  3. //定义超声波引脚
  4. #define TRIG_PIN 40
  5. #define ECHO_PIN 42
  6. //超声库库及定义超声类型
  7. #include "SR04.h"
  8. SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);
  9. long distance;

  10. //定义LED点阵类型
  11. #include "LedControl.h"
  12. //DIN(MOSI)/ CLK(SCK)/ CS(SS)/ 数量
  13. LedControl lc = LedControl(51, 52, 53, 1);

  14. //定时器库
  15. #include <Event.h>
  16. #include <Timer.h>
  17. Timer t;

  18. //&#10084;形图案
  19. byte  xin[] =
  20. {
  21.   B00000000,
  22.   B01100110,
  23.   B11111111,
  24.   B11111111,
  25.   B01111110,
  26.   B00111100,
  27.   B00011000,
  28.   B00000000
  29. };

  30. void setup() {
  31.   //初始化LED点阵
  32.   // do a wakeup call
  33.   lc.shutdown(0, false);
  34.   /* Set the brightness to a medium values */
  35.   lc.setIntensity(0, 1);
  36.   /* and clear the display */
  37.   lc.clearDisplay(0);
  38. }

  39. void loop() {
  40.   distance = sr04.Distance();
  41.   delaytime = map(distance, 10, 200, 180, 2500);
  42.   t.every(delaytime, heart);
  43.   t.update();

  44. }

  45. //LED点阵显示函数
  46. void heart()
  47. {
  48.   static boolean state = true;
  49.   if (state == true)
  50.   {
  51.     lc.setRow(0, 0, xin[0]);
  52.     lc.setRow(0, 1, xin[1]);
  53.     lc.setRow(0, 2, xin[2]);
  54.     lc.setRow(0, 3, xin[3]);
  55.     lc.setRow(0, 4, xin[4]);
  56.     lc.setRow(0, 5, xin[5]);
  57.     lc.setRow(0, 6, xin[6]);
  58.     lc.setRow(0, 7, xin[7]);
  59.   }
  60.   else
  61.     lc.clearDisplay(0);
  62.   state = !state;
  63. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-2-12 09:55:25 | 显示全部楼层
你这个需求根本不需要用中断。

你的目的就是隔一段时间运行一下heart(),而时间间隔根据距离变化而变化,
那么用

  1. if((millis()/1000)%delaytime == 0) {
  2.     heart();
  3. }
复制代码
就可以达到效果了。
回复 支持 反对

使用道具 举报

发表于 2015-2-12 10:01:01 | 显示全部楼层
当然,如果主循环里处理比较多的话可能会跳过取模为零的时机,
那么也可以记住上一次取模结果,用结果从大变小的时机做条件。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 11:00 , Processed in 0.065678 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表