极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10493|回复: 3

求教~如何在中断函数中监控时间?

[复制链接]
发表于 2015-4-18 21:30:26 | 显示全部楼层 |阅读模式
现在就是一个阀门条件触发开了之后要开10秒后关闭,所以即使阀门开启后遇到中断,也必须监控时间以便及时关闭。不需要很精确,精确到0.1秒就可以。但是中断了之后millis()不能用了。我现在只想了一个办法,就是从时钟模块读取时间,再计算出时间戳,可是好麻烦啊。请教各位大大有没有更好的实现方法?
{:soso_e110:}
回复

使用道具 举报

发表于 2015-4-18 23:25:41 | 显示全部楼层
用个时钟模块 貌似也可以用中断的。
只是不知道单片机的中断是否也有优先级设置。
回复 支持 反对

使用道具 举报

发表于 2015-4-19 01:38:41 | 显示全部楼层
這精确到0.001秒

  1. volatile int hasInt = 0;
  2. volatile int moreInt = 0;
  3. boolean doorIsOpen = false;
  4. unsigned long doorOpenTime = 0;  // 记住 阀门 被打开的时间
  5. const unsigned int openLimit = 10 * 1000;  // 10秒
  6. your_ISR(中断程序){   // 中断 ?
  7.    if(hasInt == 1){  // 前次中断事情还没处理完
  8.       ++moreInt;
  9.       return;
  10.    }
  11.    hasInt = 1;  // 标记中断刚发生
  12. }
  13. void setup( ) {
  14.   //...
  15. }
  16. void loop( ) {
  17.    checkDoor( );
  18.    //...
  19.    if(该开阀门){
  20.        开阀门;
  21.        doorOpenTime = millis( ); // 记住开阀门时间
  22.        doorIsOpen = true;
  23.    } // if(
  24.    //..
  25.    if(hasInt) {
  26.       processInt( );   // 触屏中断刚发生
  27.       hasInt = moreInt = 0;  // clear the Flag
  28.    }
  29.    //...
  30. }
  31. void processInt( ) {  // 你触屏中断 !
  32.    moreInt = 0;
  33.    // 要 5秒 timeout 或 User 确定就退出
  34.    // 把 5 秒切成 5000 个 ms; 或 2500次每次 delay(2); 或 1000次每次delay(5)
  35.    for(int i=0; i< 5000; ++i) {  // 可把 5000 改为 4998 可能比较接近 5 秒
  36.        delay(1);  // 1 ms
  37.        checkDoor( );  // 看看是否该关闭阀门
  38.        if(moreInt !=0) {
  39.           又发生了中断 !  又点触屏  ??
  40.           //.. 准备离开这循环
  41.           return;    //up to you ?????
  42.        }
  43.        if(用户点了确定){
  44.           //.. 做你要做的事
  45.           return;
  46.        } // if(
  47.    } // for(  // 注意这样总共会超过 5 秒一点点 !
  48.    Serial.println("Time out");
  49.    //.. 做 time out 要做的事
  50. } // processInt(
  51. void checkDoor( ) {   // 检查看看是否该关闭阀门
  52.    if( doorIsOpen == false ) return;
  53.    if( millis( ) - doorOpenTime < openLimit) return; // 时间还没到
  54.    doorIsOpen = false;
  55.    做关闭阀门;
  56. }
  57. ////////////  End
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-4-19 12:23:37 | 显示全部楼层
一般情况下,中断服务程序都很短,应该<0.1s而且要大大小于的。所以只要在关阀门时记住当时的时间,在主程序中进行判断就可以及时关闭阀门的。或者在主程序中启动一个定时中断启动关闭动作更精确些。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 10:52 , Processed in 0.046648 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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