极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: raydead

新人求教,中断方面

[复制链接]
发表于 2014-5-6 16:28:17 | 显示全部楼层
本帖最后由 Super169 于 2014-5-6 16:32 编辑

在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了, 卡死在這裡也很正常.

嘗試看看 IR 是否可接收到 HIGH / LOW, 以及 max_high 的值吧, 這都是決定程式進行的路徑的元素.


  1.     while(!exit)                                                               
  2.     {
  3.       Serial.println("loop for IR LOW");
  4.       while( digitalRead(IR_LED) == LOW )
  5.         delayMicroseconds(MICRO_STEP);
  6.       unsigned long start = micros();
  7.       int max_high = 0;

  8.       Serial.println("loop for IR HIGH");
  9.       while( digitalRead(IR_LED) == HIGH )
  10.       {
  11.         delayMicroseconds(MICRO_STEP);
  12.         max_high += MICRO_STEP;
  13.         Serial.println(max_high);
  14.         if( max_high > IDLE_PULSE )
  15.         {
  16.           exit = 1;
  17.           break;
  18.         }
  19.       }
  20.       unsigned long duration = micros() - start;
  21.       pulses[count++] = duration;
  22.     }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 16:37:46 | 显示全部楼层
Super169 发表于 2014-5-6 16:28
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

这部分代码被完全跳过了,在上一个判断IR是不是LOW的那个地方,看着是做判断,然后就跳过了这一段。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 16:47:45 | 显示全部楼层
Super169 发表于 2014-5-6 16:28
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

理论上这个地方的红外线接收IR_LED应该是低电平的,但是这里一直是高电平。难道是硬件上的问题了?我一直担心的就是温度传感器和这个红外线的通信会不会冲突
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 18:27:34 | 显示全部楼层
Super169 发表于 2014-5-6 16:28
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

我换了另一套代码,不检测输入口的电平,直接解码。现在做出来了。就是感觉没有这个那么灵敏
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 18:31:19 | 显示全部楼层
解决方案,换了一套红外接收代码,如下
  1. #include <Adafruit_ssd1306syp.h>
  2. #define SDA_PIN 8
  3. #define SCL_PIN 9
  4. Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
  5. #include <IRremote.h>  // 使用IRRemote函数库
  6. const int irReceiverPin = 2;  // 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接口
  7. IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
  8. decode_results results;    // 定义results变量为红外结果存放位置
  9. int n;                                                //整形变量n遥控器键位
  10. int level;                          //转速等级
  11. int mspeed;                         //电机转速
  12. void setup()
  13. {
  14.   delay(1000);
  15.   display.initialize();
  16.   level=0;//assignment speed level
  17.   mspeed=0;
  18.   pinMode(5,OUTPUT);
  19.   irrecv.enableIRIn();   // 启动红外解码
  20.   Serial.begin(9600);   // 开启串口,波特率为9600
  21. }
  22. void loop()
  23. {  
  24.   int mode;
  25.   double T;
  26.   T=(analogRead(A5)*0.488);//assignment temperature
  27.   mode=1;//Mode number
  28. if (irrecv.decode(&results))
  29.   {   // 解码成功,把数据放入results变量中
  30.     // 把数据输入到串口
  31.     n=int(results.value);   
  32.     irrecv.resume();    // 继续等待接收下一组信号
  33.   }  
  34.   mspeed=map(level,1,50,35,255);
  35.   
  36.           if(n==-23971)
  37.                 {
  38.                         Serial.println("CH-");
  39.                         level--;
  40.                         n=0;
  41.                 }
  42.         else if(n==25245)
  43.                 {
  44.                         Serial.println("CH");
  45.                         level=0;
  46.                         n=0;
  47.                 }
  48.         else if(n==-7651)
  49.                 {
  50.                         Serial.println("CH+");
  51.                         level++;
  52.                         n=0;
  53.                 }
  54.         if(((level)==(0)))
  55.                 {
  56.                         mspeed=0;
  57.                 }
  58.         analogWrite(5,mspeed);
  59.         Serial.println(level);
  60.           display.clear();
  61.   display.setTextSize(1);
  62.   display.setCursor(0,0);
  63.   display.println("Temperature:");
  64.   display.setTextSize(2);
  65.   display.print(T);
  66.   display.setTextSize(1);
  67.   display.print("o");
  68.   display.setTextSize(2);
  69.   display.println("C");
  70.   display.println("");
  71.   display.setTextSize(1);
  72.   display.print("Speed Level:");
  73.   display.print(level);
  74.   display.println("");
  75.   display.setTextSize(1);
  76.   display.println("");
  77.   display.print("Mode:");
  78.   display.print(mode);
  79.   display.update();
  80. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 22:55 , Processed in 0.034422 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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