本帖最后由 zjyylj 于 2013-6-1 17:00 编辑
首先有些概念上的错误:
【1】MsTimer2::set(unsigned long ms, void (*f)())这个函数第一个参数的类型是unsigned long,不是int。
【2】setup()中的函数只执行一遍,也就是MsTimer2::set(i, flash);执行完之后,虽然 i 改变了,但是定时器的间隔并没有变化。
【3】在中断函数发生时,delay的值不会变化。
我的板子是Mega2560,用不了MsTimer2,用FlexiTimer2代替,按你的要求写了个类似的程序,测试通过。- /* 用FlexiTimer2实现不同时间间隔的中断
- 要点:在中断函数的子块中要暂停原来的中断,开始新的中断
- 这样新的时间间隔才能生效
- 如果只是执行一个LED的通断,
- 最好不要使用delay(),
- 在需要控制的时候再调用函数,
- 其他时间释放MCU。
- 功能:13脚的LED点亮2秒,熄灭0.5秒。
- 在case中添加更多情况可实现更多功能。
- ******* Made by zjyylj *********
- */
- #include <FlexiTimer2.h> //定时器库的 头文件
- unsigned long i=1000; //定义初始值,1000MS执行中断
- int flag=1; //中断index号
- void flash() //中断处理函数
- {
- Serial.println("main");
- switch (flag) {
- case 1: //第一次中断后设置下一次中断的时间
- {
- FlexiTimer2::stop;
- digitalWrite(13, HIGH);
- i=i+1000; //下次中断的时间设置2秒
- flag=2;
- Serial.println("case1");
- FlexiTimer2::set(i, flash);
- FlexiTimer2::start();
- break;
- }
- case 2 : //第二次中断后设置下一次中断的时间
- {
- FlexiTimer2::stop;
- digitalWrite(13, LOW);
- i=500; //下次中断的时间设置0.5秒
- flag=1;
- Serial.println("case2");
- FlexiTimer2::set(i, flash);
- FlexiTimer2::start();
- break;
- }
- }
- }
- void setup()
- {
- Serial.begin(9600);
- pinMode(13, OUTPUT);
- FlexiTimer2::set(i, flash); // 中断设置函数,
- FlexiTimer2::start(); //开始计时
- }
- void loop()
- {
- }
复制代码 这个同时只能启用一个中断,过段时间我写个用第三方Timer库做的多种间隔中断同时启用。
|