怎么在一个程序中调用2两个定时器中断函数
大家好,我使用FlexiTimer2库,想要根据超声测距的结果,改变LED点阵闪烁的时间(注意是点阵,所以无法状态取反),同时还要其他程序要是处理,它们必须实时扫描。延时函数不合适,中断是我能想到的方法,可是,怎么调用2个中断函数呢?(一个用来开点阵,一个用来关点阵)或者你们有其他方法解决我描述的问题?希望得到帮助,感谢! 只要一个中断就可以了,
设一个全局变量,在外面控制是关还是开就行了。 本帖最后由 jxwns 于 2015-2-10 18:40 编辑
Pyrrhus 发表于 2015-2-10 14:13 static/image/common/back.gif
只要一个中断就可以了,
设一个全局变量,在外面控制是关还是开就行了。
感谢,这一点我已经明白了,我是在中断函数里设置一个逻辑变量,用if语句选择是开还是关,在中断函数末尾使逻辑变量状态取反,实现了一个中端函数完成开关的交替。
现在的问题是不论是FlexiTimer2库(Ms timer2)还是timer库(http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:timer)他们在设置中断时间是总是放在set()函数里,但是我想要根据超声传感器的数值相应的改变定时时间,这就要将设定中断事件的语句放在loop()函数里。可是当我这么做的时候,定时器并没有正常工作。
/*我上传的代码是整个代码的一部分,但是对于LED点阵来说他是完整的。运行的结果是闪烁的频率并没有根据超声传感器得到的结果作出改变。*/
int delaytime = 2000;
//定义超声波引脚
#define TRIG_PIN 40
#define ECHO_PIN 42
//超声库库及定义超声类型
#include "SR04.h"
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);
long distance;
//定义LED点阵类型
#include "LedControl.h"
//DIN(MOSI)/ CLK(SCK)/ CS(SS)/ 数量
LedControl lc = LedControl(51, 52, 53, 1);
//定时器库
#include <Event.h>
#include <Timer.h>
Timer t;
//❤形图案
bytexin[] =
{
B00000000,
B01100110,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000,
B00000000
};
void setup() {
//初始化LED点阵
// do a wakeup call
lc.shutdown(0, false);
/* Set the brightness to a medium values */
lc.setIntensity(0, 1);
/* and clear the display */
lc.clearDisplay(0);
}
void loop() {
distance = sr04.Distance();
delaytime = map(distance, 10, 200, 180, 2500);
t.every(delaytime, heart);
t.update();
}
//LED点阵显示函数
void heart()
{
static boolean state = true;
if (state == true)
{
lc.setRow(0, 0, xin);
lc.setRow(0, 1, xin);
lc.setRow(0, 2, xin);
lc.setRow(0, 3, xin);
lc.setRow(0, 4, xin);
lc.setRow(0, 5, xin);
lc.setRow(0, 6, xin);
lc.setRow(0, 7, xin);
}
else
lc.clearDisplay(0);
state = !state;
} 你这个需求根本不需要用中断。
你的目的就是隔一段时间运行一下heart(),而时间间隔根据距离变化而变化,
那么用
if((millis()/1000)%delaytime == 0) {
heart();
}
就可以达到效果了。 当然,如果主循环里处理比较多的话可能会跳过取模为零的时机,
那么也可以记住上一次取模结果,用结果从大变小的时机做条件。
页:
[1]